package com.truckmuncher.app.dagger; import android.content.Context; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.preference.PreferenceManager; import com.squareup.okhttp.Cache; import com.squareup.okhttp.OkHttpClient; import com.squareup.otto.Bus; import com.squareup.otto.ThreadEnforcer; import com.truckmuncher.api.auth.AuthService; import com.truckmuncher.api.menu.MenuService; import com.truckmuncher.api.search.SearchService; import com.truckmuncher.api.trucks.TruckService; import com.truckmuncher.app.BuildConfig; import com.truckmuncher.app.MainActivity; import com.truckmuncher.app.authentication.LoginFragment; import com.truckmuncher.app.customer.ActiveTrucksService; import com.truckmuncher.app.customer.GetTruckProfilesService; import com.truckmuncher.app.customer.SimpleSearchService; import com.truckmuncher.app.data.ApiErrorHandler; import com.truckmuncher.app.data.AuthErrorHandler; import com.truckmuncher.app.data.AuthRequestInterceptor; import com.truckmuncher.app.data.AuthenticatedRequestInterceptor; import com.truckmuncher.app.data.TruckMuncherContentProvider; import com.truckmuncher.app.data.sql.SqlOpenHelper; import com.truckmuncher.app.data.sync.SyncAdapter; import com.truckmuncher.app.menu.MenuUpdateService; import com.truckmuncher.app.vendor.VendorHomeActivity; import com.truckmuncher.app.vendor.VendorTrucksService; import java.io.File; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; import retrofit.RestAdapter; import retrofit.client.OkClient; import retrofit.converter.WireConverter; @Module(injects = { ActiveTrucksService.class, GetTruckProfilesService.class, LoginFragment.class, MainActivity.class, MenuUpdateService.class, SimpleSearchService.class, SyncAdapter.class, TruckMuncherContentProvider.class, VendorHomeActivity.class, VendorTrucksService.class }) public class GlobalModule { private static final int DISK_CACHE_SIZE = 50 * 1024 * 1024; // 50MB private final Context appContext; public GlobalModule(Context context) { appContext = context.getApplicationContext(); } public static void configureHttpCache(Context context, OkHttpClient client) { // Install an HTTP cache in the application cache directory. File cacheDir = new File(context.getApplicationContext().getCacheDir(), "http"); Cache cache = new Cache(cacheDir, DISK_CACHE_SIZE); client.setCache(cache); } @Provides public Context provideContext() { return appContext; } @Provides public OkHttpClient provideOkHttpClient(Context context) { OkHttpClient client = new OkHttpClient(); configureHttpCache(context, client); return client; } @Singleton @Provides public RestAdapter.Builder provideRestAdapterBuilder(OkHttpClient client) { RestAdapter.Builder builder = new RestAdapter.Builder() .setConverter(new WireConverter()) .setEndpoint(BuildConfig.API_ENDPOINT) .setClient(new OkClient(client)); if (BuildConfig.DEBUG) { builder.setLogLevel(RestAdapter.LogLevel.FULL); } return builder; } @Singleton @Provides public RestAdapter provideRestAdapter(RestAdapter.Builder builder, AuthenticatedRequestInterceptor interceptor, ApiErrorHandler errorHandler) { return builder .setRequestInterceptor(interceptor) .setErrorHandler(errorHandler) .build(); } @Singleton @Provides public TruckService provideTruckService(RestAdapter adapter) { return adapter.create(TruckService.class); } @Singleton @Provides public MenuService provideMenuService(RestAdapter adapter) { return adapter.create(MenuService.class); } @Singleton @Provides public AuthService provideAuthService(RestAdapter.Builder builder, AuthErrorHandler errorHandler, AuthRequestInterceptor interceptor) { builder.setErrorHandler(errorHandler) .setRequestInterceptor(interceptor); return builder.build().create(AuthService.class); } @Singleton @Provides public SearchService provideSearchService(RestAdapter adapter) { return adapter.create(SearchService.class); } @Singleton @Provides public SQLiteOpenHelper provideSQLiteOpenHelper(Context context) { return SqlOpenHelper.newInstance(context); } @Provides public SQLiteDatabase provideSQLiteDatabase(SQLiteOpenHelper openHelper) { return openHelper.getWritableDatabase(); } @Provides public SharedPreferences provideSharedPreferences(Context context) { return PreferenceManager.getDefaultSharedPreferences(context); } @Provides @Singleton Bus provideBus() { return new Bus(ThreadEnforcer.ANY); } }