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; 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |