package com.doumee.lib_coremodel.di.module;
|
|
|
import android.content.Context;
|
|
import androidx.annotation.NonNull;
|
import androidx.annotation.Nullable;
|
import androidx.room.RoomDatabase;
|
|
import com.doumee.lib_coremodel.config.AppliesOptions;
|
import com.doumee.lib_coremodel.config.FrameConfigModule;
|
import com.doumee.lib_coremodel.config.ManifestParser;
|
import com.doumee.lib_coremodel.util.Preconditions;
|
import com.king.retrofit.retrofithelper.RetrofitHelper;
|
|
import java.util.List;
|
|
import javax.inject.Singleton;
|
|
import dagger.Module;
|
import dagger.Provides;
|
import dagger.hilt.InstallIn;
|
import dagger.hilt.android.qualifiers.ApplicationContext;
|
import dagger.hilt.components.SingletonComponent;
|
import okhttp3.HttpUrl;
|
|
|
/**
|
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
|
*/
|
@InstallIn(SingletonComponent.class)
|
@Module
|
public class ConfigModule {
|
|
|
@Singleton
|
@Provides
|
HttpUrl provideBaseUrl(@NonNull Builder builder){
|
HttpUrl baseUrl = builder.baseUrl;
|
if(baseUrl == null){//如果 mBaseUrl 为空表示没有在自定义配置 FrameConfigModule 中配过 BaseUrl
|
//尝试去 RetrofitHelper 中取一次 BaseUrl,这里相当于多支持一种配置 BaseUrl 的方式
|
baseUrl = RetrofitHelper.getInstance().getBaseUrl();
|
}
|
//再次检测 mBaseUrl 是否为空,如果依旧为空,表示两种配置方式都没有配置过,则直接抛出异常
|
Preconditions.checkNotNull(baseUrl,"Base URL required.");
|
return baseUrl;
|
}
|
|
@Singleton
|
@Provides
|
@Nullable
|
AppliesOptions.RetrofitOptions provideRetrofitOptions(@NonNull Builder builder){
|
return builder.retrofitOptions;
|
}
|
|
@Singleton
|
@Provides
|
@Nullable
|
AppliesOptions.OkHttpClientOptions provideOkHttpClientOptions(@NonNull Builder builder){
|
return builder.okHttpClientOptions;
|
}
|
|
@Singleton
|
@Provides
|
@Nullable
|
AppliesOptions.GsonOptions provideGsonOptions(@NonNull Builder builder){
|
return builder.gsonOptions;
|
}
|
|
@Singleton
|
@Provides
|
@Nullable
|
AppliesOptions.InterceptorConfigOptions provideInterceptorConfigOptions(@NonNull Builder builder){
|
return builder.interceptorConfigOptions;
|
}
|
|
@Singleton
|
@Provides
|
AppliesOptions.RoomDatabaseOptions provideRoomDatabaseOptions(@NonNull Builder builder){
|
if(builder.roomDatabaseOptions != null){
|
return builder.roomDatabaseOptions;
|
}
|
return it -> {};
|
}
|
|
@Singleton
|
@Provides
|
Builder provideConfigModuleBuilder(@ApplicationContext Context context){
|
Builder builder = new Builder();
|
//解析配置
|
List<FrameConfigModule> modules = new ManifestParser(context).parse();
|
//遍历配置
|
for (FrameConfigModule configModule: modules){
|
//如果启用则申请配置参数
|
if(configModule.isManifestParsingEnabled()){
|
configModule.applyOptions(context,builder);
|
}
|
}
|
return builder;
|
}
|
|
public static final class Builder {
|
|
private HttpUrl baseUrl;
|
|
private AppliesOptions.RetrofitOptions retrofitOptions;
|
|
private AppliesOptions.OkHttpClientOptions okHttpClientOptions;
|
|
private AppliesOptions.GsonOptions gsonOptions;
|
|
private AppliesOptions.InterceptorConfigOptions interceptorConfigOptions;
|
|
private AppliesOptions.RoomDatabaseOptions roomDatabaseOptions;
|
|
public Builder(){
|
|
}
|
|
public Builder baseUrl(@NonNull String baseUrl) {
|
this.baseUrl = HttpUrl.parse(baseUrl);
|
return this;
|
}
|
|
public Builder baseUrl(@NonNull HttpUrl baseUrl){
|
this.baseUrl = baseUrl;
|
return this;
|
}
|
|
public Builder retrofitOptions(AppliesOptions.RetrofitOptions retrofitOptions) {
|
this.retrofitOptions = retrofitOptions;
|
return this;
|
}
|
|
public Builder okHttpClientOptions(AppliesOptions.OkHttpClientOptions okHttpClientOptions) {
|
this.okHttpClientOptions = okHttpClientOptions;
|
return this;
|
}
|
|
public Builder gsonOptions(AppliesOptions.GsonOptions gsonOptions){
|
this.gsonOptions = gsonOptions;
|
return this;
|
}
|
|
public Builder interceptorConfigOptions(AppliesOptions.InterceptorConfigOptions interceptorConfigOptions){
|
this.interceptorConfigOptions = interceptorConfigOptions;
|
return this;
|
}
|
|
public Builder roomDatabaseOptions(AppliesOptions.RoomDatabaseOptions<? extends RoomDatabase> roomDatabaseOptions){
|
this.roomDatabaseOptions = roomDatabaseOptions;
|
return this;
|
}
|
|
}
|
|
|
}
|