package com.code44.finance.modules; import android.content.Context; import com.code44.finance.api.Api; import com.code44.finance.api.GcmRegistration; import com.code44.finance.api.User; import com.code44.finance.common.Constants; import com.code44.finance.data.db.DBHelper; import com.code44.finance.qualifiers.ApplicationContext; import com.code44.finance.qualifiers.Network; import com.code44.finance.services.StartupService; import com.code44.finance.utils.EventBus; import com.google.api.client.extensions.android.http.AndroidHttp; import com.google.api.client.extensions.android.json.AndroidJsonFactory; import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; import com.google.api.client.json.JsonFactory; import java.util.concurrent.Executor; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; @Module( library = true, complete = false, injects = { StartupService.class } ) public class ApiModule { @Provides @Singleton public Api providesApi(@Network Executor executor, @ApplicationContext Context context, EventBus eventBus, DBHelper dbHelper, User user, GcmRegistration gcmRegistration, HttpTransport httpTransport, JsonFactory jsonFactory, Api.HttpRequestInitializerFactory httpRequestInitializerFactory) { return new Api(executor, context, eventBus, dbHelper, user, gcmRegistration, httpTransport, jsonFactory, httpRequestInitializerFactory); } @Provides public HttpTransport provideHttpTransport() { return AndroidHttp.newCompatibleTransport(); } @Provides public JsonFactory provideJsonFactory() { return new AndroidJsonFactory(); } @Provides public Api.HttpRequestInitializerFactory provideHttpRequestInitializerFactory(User user) { return new DefaultHttpRequestInitializerFactory(); } private static class DefaultHttpRequestInitializerFactory implements Api.HttpRequestInitializerFactory { @Override public HttpRequestInitializer newHttpRequestInitializer(Context context, User user) { final GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(context, "server:client_id:" + Constants.ANDROID_AUDIENCE); credential.setSelectedAccountName(user.getEmail()); return credential; } } }