package com.jakewharton.u2020.data.api; import com.f2prateek.rx.preferences.Preference; import com.jakewharton.u2020.data.ApiEndpoint; import com.jakewharton.u2020.data.IsMockMode; import com.jakewharton.u2020.data.NetworkDelay; import com.jakewharton.u2020.data.NetworkFailurePercent; import com.jakewharton.u2020.data.NetworkVariancePercent; import com.jakewharton.u2020.data.api.oauth.OauthInterceptor; import com.squareup.okhttp.HttpUrl; import com.squareup.okhttp.OkHttpClient; import dagger.Module; import dagger.Provides; import javax.inject.Named; import javax.inject.Singleton; import retrofit.Retrofit; import retrofit.mock.MockRetrofit; import retrofit.mock.NetworkBehavior; import retrofit.mock.RxJavaBehaviorAdapter; import static java.util.concurrent.TimeUnit.MILLISECONDS; @Module( complete = false, library = true, overrides = true ) public final class DebugApiModule { @Provides @Singleton HttpUrl provideHttpUrl(@ApiEndpoint Preference<String> apiEndpoint) { return HttpUrl.parse(apiEndpoint.get()); } @Provides @Singleton @Named("Api") OkHttpClient provideApiClient(OkHttpClient client, OauthInterceptor oauthInterceptor, LoggingInterceptor loggingInterceptor) { client = ApiModule.createApiClient(client, oauthInterceptor); client.interceptors().add(loggingInterceptor); return client; } @Provides @Singleton NetworkBehavior provideBehavior(@NetworkDelay Preference<Long> networkDelay, @NetworkFailurePercent Preference<Integer> networkFailurePercent, @NetworkVariancePercent Preference<Integer> networkVariancePercent) { NetworkBehavior behavior = NetworkBehavior.create(); behavior.setDelay(networkDelay.get(), MILLISECONDS); behavior.setFailurePercent(networkFailurePercent.get()); behavior.setVariancePercent(networkVariancePercent.get()); return behavior; } @Provides @Singleton MockRetrofit provideMockRetrofit(NetworkBehavior behavior) { return new MockRetrofit(behavior, RxJavaBehaviorAdapter.create()); } @Provides @Singleton GithubService provideGithubService(Retrofit retrofit, MockRetrofit mockRetrofit, @IsMockMode boolean isMockMode, MockGithubService mockService) { if (isMockMode) { return mockRetrofit.create(GithubService.class, mockService); } return retrofit.create(GithubService.class); } }