package com.code44.finance.ui.currencies; import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; import com.code44.finance.R; import com.code44.finance.api.currencies.CurrenciesApi; import com.code44.finance.api.currencies.ExchangeRatesRequest; import com.code44.finance.data.db.Tables; import com.code44.finance.data.model.Currency; import com.code44.finance.data.model.Model; import com.code44.finance.data.providers.CurrenciesProvider; import com.code44.finance.qualifiers.Main; import com.code44.finance.ui.common.BaseModelsAdapter; import com.code44.finance.ui.common.ModelListActivity; import com.code44.finance.utils.GeneralPrefs; import com.code44.finance.utils.analytics.Analytics; import com.squareup.otto.Subscribe; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import fr.castorflex.android.smoothprogressbar.SmoothProgressBar; import fr.castorflex.android.smoothprogressbar.SmoothProgressDrawable; public class CurrenciesActivity extends ModelListActivity implements CompoundButton.OnCheckedChangeListener { private final List<Currency> currencies = new ArrayList<>(); @Inject GeneralPrefs generalPrefs; @Inject CurrenciesApi currenciesApi; @Inject @Main Currency mainCurrency; private SmoothProgressBar loadingView; public static void start(Context context) { startActivity(context, makeViewIntent(context, CurrenciesActivity.class)); } public static void startSelect(Activity activity, int requestCode) { startActivityForResult(activity, makeSelectIntent(activity, CurrenciesActivity.class), requestCode); } @Override protected void onViewCreated() { super.onViewCreated(); // Get views loadingView = (SmoothProgressBar) findViewById(R.id.loadingView); final View settingsContainerView = findViewById(R.id.settingsContainerView); final Switch autoUpdateCurrenciesSwitch = (Switch) findViewById(R.id.autoUpdateCurrenciesSwitch); // Setup autoUpdateCurrenciesSwitch.setChecked(generalPrefs.isAutoUpdateCurrencies()); autoUpdateCurrenciesSwitch.setOnCheckedChangeListener(this); if (getMode() != Mode.VIEW) { settingsContainerView.setVisibility(View.GONE); } } @Override public void onResume() { super.onResume(); setRefreshing(false); getEventBus().register(this); } @Override public void onPause() { super.onPause(); getEventBus().unregister(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.findItem(R.id.action_settings).setVisible(false); getMenuInflater().inflate(R.menu.currencies, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_refresh_rates: refreshRates(); return true; } return super.onOptionsItemSelected(item); } @Override protected BaseModelsAdapter createAdapter() { return new CurrenciesAdapter(this); } @Override protected CursorLoader getModelsCursorLoader() { return Tables.Currencies.getQuery().asCursorLoader(this, CurrenciesProvider.uriCurrencies()); } @Override protected Model modelFrom(Cursor cursor) { return Currency.from(cursor); } @Override protected void onModelClick(View view, int position, String modelId, Model model) { CurrencyActivity.start(this, modelId); } @Override protected void startModelEdit(String modelId) { CurrencyEditActivity.start(this, modelId); } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { generalPrefs.setAutoUpdateCurrencies(isChecked); if (isChecked) { refreshRates(); } } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { if (loader.getId() == LOADER_MODELS) { currencies.clear(); if (data.moveToFirst()) { do { currencies.add(Currency.from(data)); } while (data.moveToNext()); } } super.onLoadFinished(loader, data); } @Override protected int getLayoutId() { return R.layout.activity_currencies; } @Override protected Analytics.Screen getScreen() { return Analytics.Screen.CurrencyList; } @Subscribe public void onRefreshFinished(ExchangeRatesRequest request) { setRefreshing(false); } private void refreshRates() { final List<String> fromCodes = new ArrayList<>(); for (Currency currency : currencies) { if (!currency.isDefault()) { fromCodes.add(currency.getCode()); } } if (!fromCodes.isEmpty()) { currenciesApi.updateExchangeRates(fromCodes, 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() { } }); } } }