content: /**
    * Copyright 2017 JessYan
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
  package <%= appPackage %>.di.module;
  
  import android.app.Application;
  import android.content.Context;
  import android.support.annotation.Nullable;
  
  import com.google.gson.Gson;
  import <%= appPackage %>.http.GlobalHttpHandler;
  import <%= appPackage %>.http.RequestInterceptor;
  import <%= appPackage %>.utils.DataHelper;
  
  import java.io.File;
  import java.io.IOException;
  import java.util.List;
  import java.util.concurrent.TimeUnit;
  
  import javax.inject.Named;
  import javax.inject.Singleton;
  
  import dagger.Module;
  import dagger.Provides;
  import io.rx_cache2.internal.RxCache;
  import io.victoralbertos.jolyglot.GsonSpeaker;
  import me.jessyan.rxerrorhandler.core.RxErrorHandler;
  import me.jessyan.rxerrorhandler.handler.listener.ResponseErrorListener;
  import okhttp3.HttpUrl;
  import okhttp3.Interceptor;
  import okhttp3.OkHttpClient;
  import okhttp3.Response;
  import retrofit2.Retrofit;
  import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
  import retrofit2.converter.gson.GsonConverterFactory;
  
  /**
   * ================================================
   * 提供一些三方库客户端实例的 {@link Module}
   * <p>
   * Created by JessYan on 2016/3/14.
   * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
   * <a href="https://github.com/JessYanCoding">Follow me</a>
   * ================================================
   */
  @Module
  public class ClientModule {
      private static final int TIME_OUT = 10;
  
  
      /**
       * 提供 {@link Retrofit}
       *
       * @param builder
       * @param client
       * @param httpUrl
       * @return
       * @author: jess
       * @date 8/30/16 1:15 PM
       */
      @Singleton
      @Provides
      Retrofit provideRetrofit(Application application, @Nullable RetrofitConfiguration configuration, Retrofit.Builder builder, OkHttpClient client
              , HttpUrl httpUrl, Gson gson) {
          builder
                  .baseUrl(httpUrl)//域名
                  .client(client);//设置okhttp
  
          if (configuration != null)
              configuration.configRetrofit(application, builder);
  
          builder
                  .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//使用 Rxjava
                  .addConverterFactory(GsonConverterFactory.create(gson));//使用 Gson
          return builder.build();
      }
  
      /**
       * 提供 {@link OkHttpClient}
       *
       * @param builder
       * @return
       */
      @Singleton
      @Provides
      OkHttpClient provideClient(Application application, @Nullable OkhttpConfiguration configuration, OkHttpClient.Builder builder, Interceptor intercept
              , @Nullable List<Interceptor> interceptors, @Nullable GlobalHttpHandler handler) {
          builder
                  .connectTimeout(TIME_OUT, TimeUnit.SECONDS)
                  .readTimeout(TIME_OUT, TimeUnit.SECONDS)
                  .addNetworkInterceptor(intercept);
  
          if (handler != null)
              builder.addInterceptor(new Interceptor() {
                  @Override
                  public Response intercept(Chain chain) throws IOException {
                      return chain.proceed(handler.onHttpRequestBefore(chain, chain.request()));
                  }
              });
  
          if (interceptors != null) {//如果外部提供了interceptor的集合则遍历添加
              for (Interceptor interceptor : interceptors) {
                  builder.addInterceptor(interceptor);
              }
          }
  
          if (configuration != null)
              configuration.configOkhttp(application, builder);
          return builder.build();
      }
  
  
      @Singleton
      @Provides
      Retrofit.Builder provideRetrofitBuilder() {
          return new Retrofit.Builder();
      }
  
  
      @Singleton
      @Provides
      OkHttpClient.Builder provideClientBuilder() {
          return new OkHttpClient.Builder();
      }
  
  
      @Singleton
      @Provides
      Interceptor provideInterceptor(RequestInterceptor intercept) {
          return intercept;//打印请求信息的拦截器
      }
  
  
      /**
       * 提供 {@link RxCache}
       *
       * @param cacheDirectory RxCache缓存路径
       * @return
       */
      @Singleton
      @Provides
      RxCache provideRxCache(Application application, @Nullable RxCacheConfiguration configuration, @Named("RxCacheDirectory") File cacheDirectory) {
          RxCache.Builder builder = new RxCache.Builder();
          if (configuration != null)
              configuration.configRxCache(application, builder);
          return builder
                  .persistence(cacheDirectory, new GsonSpeaker());
      }
  
      /**
       * 需要单独给 {@link RxCache} 提供缓存路径
       *
       * @param cacheDir
       * @return
       */
      @Singleton
      @Provides
      @Named("RxCacheDirectory")
      File provideRxCacheDirectory(File cacheDir) {
          File cacheDirectory = new File(cacheDir, "RxCache");
          return DataHelper.makeDirs(cacheDirectory);
      }
  
      /**
       * 提供处理 RxJava 错误的管理器
       *
       * @return
       */
      @Singleton
      @Provides
      RxErrorHandler proRxErrorHandler(Application application, ResponseErrorListener listener) {
          return RxErrorHandler
                  .builder()
                  .with(application)
                  .responseErrorListener(listener)
                  .build();
      }
  
      public interface RetrofitConfiguration {
          void configRetrofit(Context context, Retrofit.Builder builder);
      }
  
      public interface OkhttpConfiguration {
          void configOkhttp(Context context, OkHttpClient.Builder builder);
      }
  
      public interface RxCacheConfiguration {
          void configRxCache(Context context, RxCache.Builder builder);
      }
  }
  