package io.github.droidkaigi.confsched.di; import com.google.android.gms.analytics.GoogleAnalytics; import com.google.android.gms.analytics.Tracker; import com.github.gfx.android.orma.AccessThreadConstraint; import com.github.gfx.android.orma.migration.ManualStepMigration; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; import android.net.ConnectivityManager; import android.support.annotation.NonNull; import java.io.File; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; import io.github.droidkaigi.confsched.BuildConfig; import io.github.droidkaigi.confsched.activity.ActivityNavigator; import io.github.droidkaigi.confsched.api.RequestInterceptor; import io.github.droidkaigi.confsched.model.OrmaDatabase; import okhttp3.Cache; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import rx.subscriptions.CompositeSubscription; @Module public class AppModule { static final String CACHE_FILE_NAME = "okhttp.cache"; static final long MAX_CACHE_SIZE = 4 * 1024 * 1024; static final String SHARED_PREF_NAME = "preferences"; private Context context; public AppModule(Application app) { context = app; } @Provides public Context provideContext() { return context; } @Singleton @Provides public Tracker provideGoogleAnalyticsTracker(Context context) { GoogleAnalytics ga = GoogleAnalytics.getInstance(context); Tracker tracker = ga.newTracker(BuildConfig.GA_TRACKING_ID); tracker.enableAdvertisingIdCollection(true); tracker.enableExceptionReporting(true); return tracker; } @Provides public ConnectivityManager provideConnectivityManager(Context context) { return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } @Singleton @Provides public OkHttpClient provideHttpClient(Context context, Interceptor interceptor) { File cacheDir = new File(context.getCacheDir(), CACHE_FILE_NAME); Cache cache = new Cache(cacheDir, MAX_CACHE_SIZE); OkHttpClient.Builder c = new OkHttpClient.Builder() .cache(cache) .addInterceptor(interceptor); return c.build(); } @Provides public Interceptor provideRequestInterceptor(ConnectivityManager connectivityManager) { return new RequestInterceptor(connectivityManager); } @Provides public SharedPreferences provideSharedPreferences(Context context) { return context.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); } @Provides public CompositeSubscription provideCompositeSubscription() { return new CompositeSubscription(); } @Singleton @Provides public OrmaDatabase provideOrmaDatabase(Context context) { return OrmaDatabase.builder(context) .migrationStep(115, new ManualStepMigration.ChangeStep() { @Override public void change(@NonNull ManualStepMigration.Helper helper) { helper.renameColumn("Session", "placeId", "place"); helper.renameColumn("Session", "speakerId", "speaker"); helper.renameColumn("Session", "categoryId", "category"); } }) .writeOnMainThread(AccessThreadConstraint.WARNING) .build(); } @Singleton @Provides public ActivityNavigator provideActivityNavigator() { return new ActivityNavigator(); } }