package com.code44.finance.ui.currencies; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.util.Pair; import android.view.Menu; import android.view.View; import android.widget.ListView; import android.widget.TextView; import com.code44.finance.R; import com.code44.finance.api.currencies.CurrenciesApi; import com.code44.finance.api.currencies.ExchangeRateRequest; import com.code44.finance.data.db.Tables; import com.code44.finance.data.model.Currency; import com.code44.finance.data.providers.AccountsProvider; import com.code44.finance.data.providers.CurrenciesProvider; import com.code44.finance.qualifiers.Main; import com.code44.finance.ui.common.ModelActivity; import com.code44.finance.utils.MoneyFormatter; import com.code44.finance.utils.analytics.Analytics; import com.code44.finance.views.FabImageButton; import com.squareup.otto.Subscribe; import javax.inject.Inject; import fr.castorflex.android.smoothprogressbar.SmoothProgressBar; import fr.castorflex.android.smoothprogressbar.SmoothProgressDrawable; public class CurrencyActivity extends ModelActivity<Currency> implements View.OnClickListener { private static final int LOADER_ACCOUNTS = 1; @Inject CurrenciesApi currenciesApi; @Inject @Main Currency mainCurrency; private TextView codeTextView; private TextView formatTextView; private TextView exchangeRateTextView; private SmoothProgressBar loadingView; private FabImageButton refreshRateButton; private CurrencyAccountsAdapter adapter; public static void start(Context context, String currencyId) { final Intent intent = makeIntent(context, CurrencyActivity.class, currencyId); startActivity(context, intent); } @Override public void onResume() { super.onResume(); setRefreshing(false); getEventBus().register(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.findItem(R.id.action_settings).setVisible(false); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); menu.findItem(R.id.action_delete).setVisible(model != null && !model.isDefault()); return true; } @Override public void onPause() { super.onPause(); getEventBus().unregister(this); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { if (id == LOADER_ACCOUNTS) { return Tables.Accounts.getQuery().asCursorLoader(this, AccountsProvider.uriAccounts()); } return super.onCreateLoader(id, args); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { if (loader.getId() == LOADER_ACCOUNTS) { adapter.swapCursor(data); return; } super.onLoadFinished(loader, data); } @Override public void onLoaderReset(Loader<Cursor> loader) { if (loader.getId() == LOADER_ACCOUNTS) { adapter.swapCursor(null); return; } super.onLoaderReset(loader); } @Override protected int getLayoutId() { return R.layout.activity_currency; } @Override protected void onViewCreated(Bundle savedInstanceState) { super.onViewCreated(savedInstanceState); // Get views codeTextView = (TextView) findViewById(R.id.codeTextView); formatTextView = (TextView) findViewById(R.id.formatTextView); exchangeRateTextView = (TextView) findViewById(R.id.exchangeRateTextView); loadingView = (SmoothProgressBar) findViewById(R.id.loadingView); refreshRateButton = (FabImageButton) findViewById(R.id.refreshRateButton); final ListView listView = (ListView) findViewById(R.id.listView); // Setup adapter = new CurrencyAccountsAdapter(this); listView.setAdapter(adapter); refreshRateButton.setOnClickListener(this); } @Override protected CursorLoader getModelCursorLoader(String modelId) { return Tables.Currencies.getQuery().asCursorLoader(this, CurrenciesProvider.uriCurrency(modelId)); } @Override protected Currency getModelFrom(Cursor cursor) { return Currency.from(cursor); } @Override protected void onModelLoaded(Currency currency) { adapter.setCurrency(currency); codeTextView.setText(currency.getCode()); if (currency.isDefault()) { exchangeRateTextView.setText(R.string.main_currency); } else { exchangeRateTextView.setText(String.valueOf(currency.getExchangeRate())); } formatTextView.setText(MoneyFormatter.format(currency, 100000)); // TODO This doesn't seem to be working on first load. Check after Android L is released. refreshRateButton.setVisibility(!currency.isDefault() ? View.VISIBLE : View.GONE); supportInvalidateOptionsMenu(); // Loader getSupportLoaderManager().restartLoader(LOADER_ACCOUNTS, null, this); } @Override protected Uri getDeleteUri() { return CurrenciesProvider.uriCurrencies(); } @Override protected Pair<String, String[]> getDeleteSelection() { return Pair.create(Tables.Currencies.ID + "=?", new String[]{String.valueOf(modelId)}); } @Override protected void startModelEdit(String modelId) { CurrencyEditActivity.start(this, modelId); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.refreshRateButton: refreshRate(); break; } } @Override protected Analytics.Screen getScreen() { return Analytics.Screen.Currency; } @Subscribe public void onRefreshFinished(ExchangeRateRequest request) { if (model != null && model.getCode().equals(request.getFromCode())) { setRefreshing(false); } } private void refreshRate() { currenciesApi.updateExchangeRate(model.getCode(), mainCurrency.getCode()); setRefreshing(true); } private void setRefreshing(boolean refreshing) { if (refreshing) { loadingView.setVisibility(View.VISIBLE); loadingView.progressiveStart(); } else { loadingView.progressiveStop(); loadingView.setSmoothProgressDrawableCallbacks(new SmoothProgressDrawable.Callbacks() { @Override public void onStop() { loadingView.setSmoothProgressDrawableCallbacks(null); loadingView.setVisibility(View.GONE); } @Override public void onStart() { } }); } } }