package com.code44.finance.services; import android.app.IntentService; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.text.format.DateUtils; import com.code44.finance.App; import com.code44.finance.api.Api; import com.code44.finance.api.GcmRegistration; import com.code44.finance.api.User; import com.code44.finance.api.currencies.CurrenciesApi; import com.code44.finance.common.model.ModelState; import com.code44.finance.data.Query; import com.code44.finance.data.db.Tables; import com.code44.finance.data.model.Currency; import com.code44.finance.data.providers.CurrenciesProvider; import com.code44.finance.qualifiers.Main; import com.code44.finance.utils.GeneralPrefs; import com.code44.finance.utils.IOUtils; import javax.inject.Inject; public class StartupService extends IntentService { @Inject User user; @Inject GcmRegistration gcmRegistration; @Inject Api api; @Inject CurrenciesApi currenciesApi; @Inject GeneralPrefs generalPrefs; @Inject @Main Currency mainCurrency; public StartupService() { super(StartupService.class.getSimpleName()); } public static void start(Context context) { context.startService(new Intent(context, StartupService.class)); } @Override public void onCreate() { super.onCreate(); App.with(getApplicationContext()).inject(this); } @Override protected void onHandleIntent(Intent intent) { undoUncommittedDeletes(); updateCurrenciesIfNecessary(); if (user.isPremium()) { api.sync(); if (!gcmRegistration.isRegisteredWithServer()) { api.registerDevice(); } } } private void undoUncommittedDeletes() { // This is necessary, because while DeleteFragment is visible, the app can terminate and we would need to handle // uncommitted deletes. // TODO Undo } private void updateCurrenciesIfNecessary() { if (!generalPrefs.isAutoUpdateCurrencies() || DateUtils.isToday(generalPrefs.getAutoUpdateCurrenciesTimestamp())) { return; } final Cursor cursor = Query.create() .projection(Tables.Currencies.CODE.getName()) .selection(Tables.Currencies.MODEL_STATE + "=?", String.valueOf(ModelState.Normal.asInt())) .from(getApplicationContext(), CurrenciesProvider.uriCurrencies()) .execute(); if (cursor.moveToFirst()) { final int iCode = cursor.getColumnIndex(Tables.Currencies.CODE.getName()); do { currenciesApi.updateExchangeRate(cursor.getString(iCode), mainCurrency.getCode()); } while (cursor.moveToNext()); } IOUtils.closeQuietly(cursor); generalPrefs.setAutoUpdateCurrenciesTimestamp(System.currentTimeMillis()); } }