package com.code44.finance.api; import android.content.Context; import com.code44.finance.BuildConfig; import com.code44.finance.api.requests.RegisterDeviceRequest; import com.code44.finance.api.requests.RegisterRequest; import com.code44.finance.api.requests.SyncRequest; import com.code44.finance.backend.endpoint.accounts.Accounts; import com.code44.finance.backend.endpoint.categories.Categories; import com.code44.finance.backend.endpoint.currencies.Currencies; import com.code44.finance.backend.endpoint.tags.Tags; import com.code44.finance.backend.endpoint.transactions.Transactions; import com.code44.finance.backend.endpoint.users.Users; import com.code44.finance.common.utils.Preconditions; import com.code44.finance.data.db.DBHelper; import com.code44.finance.utils.EventBus; import com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient; 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; public final class Api { private final Executor executor; private final Context context; private final EventBus eventBus; private final DBHelper dbHelper; private final User user; private final GcmRegistration gcmRegistration; private final HttpTransport httpTransport; private final JsonFactory jsonFactory; private final HttpRequestInitializerFactory httpRequestInitializerFactory; public Api(Executor executor, Context context, EventBus eventBus, DBHelper dbHelper, User user, GcmRegistration gcmRegistration, HttpTransport httpTransport, JsonFactory jsonFactory, HttpRequestInitializerFactory httpRequestInitializerFactory) { Preconditions.notNull(executor, "Executor cannot be null."); Preconditions.notNull(context, "Context cannot be null."); Preconditions.notNull(eventBus, "EventBus cannot be null."); Preconditions.notNull(dbHelper, "DBHelper cannot be null."); Preconditions.notNull(user, "User cannot be null."); Preconditions.notNull(gcmRegistration, "GCM registration cannot be null."); Preconditions.notNull(httpTransport, "Http transport cannot be null."); Preconditions.notNull(jsonFactory, "Json factory cannot be null."); Preconditions.notNull(httpRequestInitializerFactory, "Http request initializer factory cannot be null."); this.executor = executor; this.context = context; this.eventBus = eventBus; this.dbHelper = dbHelper; this.user = user; this.gcmRegistration = gcmRegistration; this.httpTransport = httpTransport; this.jsonFactory = jsonFactory; this.httpRequestInitializerFactory = httpRequestInitializerFactory; } public void register(String email, String googleId, String firstName, String lastName, String photoUrl, String coverUrl) { final RegisterRequest request = new RegisterRequest(eventBus, context, getUsersService(), user, dbHelper, email, googleId, firstName, lastName, photoUrl, coverUrl); execute(request); } public void registerDevice() { final RegisterDeviceRequest request = new RegisterDeviceRequest(context, getUsersService(), gcmRegistration); execute(request); } public void sync() { if (!user.isPremium()) { return; } final SyncRequest request = new SyncRequest(eventBus, context, dbHelper, user, gcmRegistration, getCurrenciesService(), getCategoriesService(), getTagsService(), getAccountsService(), getTransactionsService()); execute(request); } private void execute(Request request) { executor.execute(request); } private Users getUsersService() { final Users.Builder builder = new Users.Builder(httpTransport, jsonFactory, getHttpRequestInitializer()); prepareRootUrl(builder); return builder.build(); } private Currencies getCurrenciesService() { final Currencies.Builder builder = new Currencies.Builder(httpTransport, jsonFactory, getHttpRequestInitializer()); prepareRootUrl(builder); return builder.build(); } private Accounts getAccountsService() { final Accounts.Builder builder = new Accounts.Builder(httpTransport, jsonFactory, getHttpRequestInitializer()); prepareRootUrl(builder); return builder.build(); } private Categories getCategoriesService() { final Categories.Builder builder = new Categories.Builder(httpTransport, jsonFactory, getHttpRequestInitializer()); prepareRootUrl(builder); return builder.build(); } private Tags getTagsService() { final Tags.Builder builder = new Tags.Builder(httpTransport, jsonFactory, getHttpRequestInitializer()); prepareRootUrl(builder); return builder.build(); } private Transactions getTransactionsService() { final Transactions.Builder builder = new Transactions.Builder(httpTransport, jsonFactory, getHttpRequestInitializer()); prepareRootUrl(builder); return builder.build(); } private HttpRequestInitializer getHttpRequestInitializer() { return httpRequestInitializerFactory.newHttpRequestInitializer(context, user); } private void prepareRootUrl(AbstractGoogleJsonClient.Builder builder) { if (BuildConfig.USE_LOCAL_SERVER) { builder.setRootUrl("http://" + BuildConfig.LOCAL_SERVER_IP + ":8080/_ah/api"); } } public interface HttpRequestInitializerFactory { public HttpRequestInitializer newHttpRequestInitializer(Context context, User user); } }