package com.code44.finance.data.providers; import android.content.ContentValues; import android.content.Intent; import android.net.Uri; import com.code44.finance.common.model.ModelState; import com.code44.finance.data.DataStore; import com.code44.finance.data.Query; import com.code44.finance.data.db.Column; import com.code44.finance.data.db.Tables; import com.code44.finance.data.model.Currency; import com.code44.finance.data.model.SyncState; import com.code44.finance.qualifiers.Main; import com.code44.finance.services.StartupService; import com.code44.finance.utils.MoneyFormatter; import java.util.List; import java.util.Map; import javax.inject.Inject; public class CurrenciesProvider extends BaseModelProvider { @Inject @Main Currency mainCurrency; public static Uri uriCurrencies() { return uriModels(CurrenciesProvider.class, Tables.Currencies.TABLE_NAME); } public static Uri uriCurrency(String currencyServerId) { return uriModel(CurrenciesProvider.class, Tables.Currencies.TABLE_NAME, currencyServerId); } @Override protected String getModelTable() { return Tables.Currencies.TABLE_NAME; } @Override protected String getQueryTables(Uri uri) { return getModelTable(); } @Override protected Column getIdColumn() { return Tables.Currencies.ID; } @Override protected void onBeforeInsertItem(Uri uri, ContentValues values, String serverId, Map<String, Object> outExtras) { super.onBeforeInsertItem(uri, values, serverId, outExtras); makeSureThereIsOnlyOneDefaultCurrency(values); } @Override protected void onAfterInsertItem(Uri uri, ContentValues values, String serverId, Map<String, Object> extras) { super.onAfterInsertItem(uri, values, serverId, extras); Currency.updateDefaultCurrency(getDatabase(), mainCurrency); MoneyFormatter.invalidateCache(); } @Override protected void onBeforeUpdateItems(Uri uri, ContentValues values, String selection, String[] selectionArgs, Map<String, Object> outExtras) { super.onBeforeUpdateItems(uri, values, selection, selectionArgs, outExtras); throw new IllegalArgumentException("Update is not supported."); } @Override protected void onAfterUpdateItems(Uri uri, ContentValues values, String selection, String[] selectionArgs, Map<String, Object> extras) { super.onAfterUpdateItems(uri, values, selection, selectionArgs, extras); MoneyFormatter.invalidateCache(); } @Override protected void onBeforeDeleteItems(Uri uri, String selection, String[] selectionArgs, ModelState modelState, Map<String, Object> outExtras) { super.onBeforeDeleteItems(uri, selection, selectionArgs, modelState, outExtras); final List<String> affectedIds = getIdList(getIdColumn(), selection, selectionArgs); if (modelState.equals(ModelState.DeletedUndo) && affectedIds.contains(mainCurrency.getId())) { throw new IllegalArgumentException("Cannot delete default currency."); } outExtras.put("affectedIds", affectedIds); } @Override protected void onAfterDeleteItems(Uri uri, String selection, String[] selectionArgs, ModelState modelState, Map<String, Object> extras) { super.onAfterDeleteItems(uri, selection, selectionArgs, modelState, extras); MoneyFormatter.invalidateCache(); //noinspection unchecked final List<String> affectedIds = (List<String>) extras.get("affectedIds"); if (affectedIds.size() > 0) { final Query query = Query.create() .selectionInClause(Tables.Accounts.CURRENCY_ID.getName(), affectedIds); final Uri accountsUri = uriForDeleteFromItemState(AccountsProvider.uriAccounts(), modelState); DataStore.delete() .selection(query.getSelection(), query.getSelectionArgs()) .from(getContext(), accountsUri); } } @Override protected void onAfterBulkInsertItems(Uri uri, ContentValues[] valuesArray, Map<String, Object> extras) { super.onAfterBulkInsertItems(uri, valuesArray, extras); Currency.updateDefaultCurrency(getDatabase(), mainCurrency); MoneyFormatter.invalidateCache(); } @Override protected Uri[] getOtherUrisToNotify() { return new Uri[]{AccountsProvider.uriAccounts(), TransactionsProvider.uriTransactions()}; } private void makeSureThereIsOnlyOneDefaultCurrency(ContentValues values) { boolean isDefault = values.getAsBoolean(Tables.Currencies.IS_DEFAULT.getName()); final String currencyId = values.getAsString(Tables.Currencies.ID.getName()); if (isDefault && !currencyId.equals(mainCurrency.getId())) { ContentValues newValues = new ContentValues(); newValues.put(Tables.Currencies.EXCHANGE_RATE.getName(), 1.0); newValues.put(Tables.Currencies.IS_DEFAULT.getName(), false); newValues.put(Tables.Currencies.SYNC_STATE.getName(), SyncState.LocalChanges.asInt()); getDatabase().update(Tables.Currencies.TABLE_NAME, newValues, null, null); getContext().startService(new Intent(getContext(), StartupService.class)); } } }