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