package cl.monsoon.s1next; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import java.net.CookieManager; import java.net.CookiePolicy; import java.util.concurrent.TimeUnit; import javax.inject.Singleton; import cl.monsoon.s1next.data.User; import cl.monsoon.s1next.data.Wifi; import cl.monsoon.s1next.data.api.Api; import cl.monsoon.s1next.data.api.S1Service; import cl.monsoon.s1next.data.api.UserValidator; import cl.monsoon.s1next.data.pref.DownloadPreferencesManager; import cl.monsoon.s1next.data.pref.DownloadPreferencesRepository; import cl.monsoon.s1next.data.pref.GeneralPreferencesManager; import cl.monsoon.s1next.data.pref.GeneralPreferencesRepository; import cl.monsoon.s1next.data.pref.ThemeManager; import cl.monsoon.s1next.viewmodel.UserViewModel; import cl.monsoon.s1next.widget.EventBus; import cl.monsoon.s1next.widget.PersistentHttpCookieStore; import dagger.Module; import dagger.Provides; import okhttp3.JavaNetCookieJar; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.jackson.JacksonConverterFactory; import retrofit2.converter.scalars.ScalarsConverterFactory; /** * Provides instances of the objects when we need to inject. */ @Module final class AppModule { private final App mApp; public AppModule(App app) { this.mApp = app; } @Provides @Singleton Context provideContext() { return mApp; } @Provides @Singleton CookieManager providerCookieManager(Context context) { return new CookieManager(new PersistentHttpCookieStore(context), CookiePolicy.ACCEPT_ALL); } @Provides @Singleton OkHttpClient providerOkHttpClient(CookieManager cookieManager) { OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(17, TimeUnit.SECONDS); builder.writeTimeout(17, TimeUnit.SECONDS); builder.readTimeout(77, TimeUnit.SECONDS); builder.cookieJar(new JavaNetCookieJar(cookieManager)); if (BuildConfig.DEBUG) { HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS); builder.interceptors().add(httpLoggingInterceptor); } return builder.build(); } @Provides @Singleton S1Service providerRetrofit(OkHttpClient okHttpClient) { return new Retrofit.Builder() .client(okHttpClient) .baseUrl(Api.BASE_API_URL) .addConverterFactory(ScalarsConverterFactory.create()) .addConverterFactory(JacksonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build() .create(S1Service.class); } @Provides @Singleton EventBus providerEventBus() { return new EventBus(); } @Provides @Singleton User providerUser(UserViewModel userViewModel) { return userViewModel.getUser(); } @Provides @Singleton UserValidator providerUserValidator(User user) { return new UserValidator(user); } @Provides @Singleton UserViewModel providerUserViewModel() { return new UserViewModel(); } @Provides @Singleton Wifi providerWifi() { return new Wifi(); } @Provides @Singleton SharedPreferences provideSharedPreferences(Context context) { return PreferenceManager.getDefaultSharedPreferences(context); } @Provides @Singleton GeneralPreferencesRepository provideGeneralPreferencesProvider(Context context, SharedPreferences sharedPreferences) { return new GeneralPreferencesRepository(context, sharedPreferences); } @Provides @Singleton GeneralPreferencesManager provideGeneralPreferencesManager(GeneralPreferencesRepository generalPreferencesProvider) { return new GeneralPreferencesManager(generalPreferencesProvider); } @Provides @Singleton ThemeManager provideThemeManager(Context context, GeneralPreferencesRepository generalPreferencesProvider) { return new ThemeManager(context, generalPreferencesProvider); } @Provides @Singleton DownloadPreferencesRepository provideDownloadPreferencesProvider(Context context, SharedPreferences sharedPreferences) { return new DownloadPreferencesRepository(context, sharedPreferences); } @Provides @Singleton DownloadPreferencesManager provideDownloadPreferencesManager(DownloadPreferencesRepository downloadPreferencesProvider, Wifi wifi) { return new DownloadPreferencesManager(downloadPreferencesProvider, wifi); } }