package com.code44.finance.ui.overview;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.view.View;
import com.code44.finance.R;
import com.code44.finance.adapters.NavigationAdapter;
import com.code44.finance.common.model.TransactionType;
import com.code44.finance.data.db.Tables;
import com.code44.finance.data.model.Account;
import com.code44.finance.data.model.Currency;
import com.code44.finance.data.providers.AccountsProvider;
import com.code44.finance.data.providers.TransactionsProvider;
import com.code44.finance.qualifiers.Main;
import com.code44.finance.ui.DrawerActivity;
import com.code44.finance.ui.reports.categories.CategoriesReportData;
import com.code44.finance.ui.reports.trends.TrendsGraphData;
import com.code44.finance.ui.reports.trends.TrendsGraphView;
import com.code44.finance.ui.transactions.TransactionEditActivity;
import com.code44.finance.utils.CurrentInterval;
import com.code44.finance.utils.analytics.Analytics;
import com.code44.finance.views.AccountsView;
import com.code44.finance.views.FabImageButton;
import com.squareup.otto.Subscribe;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
public class OverviewActivity extends DrawerActivity implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener {
private static final int LOADER_TRANSACTIONS = 1;
private static final int LOADER_ACCOUNTS = 2;
@Inject CurrentInterval currentInterval;
@Inject @Main Currency mainCurrency;
private OverviewGraphView overviewGraphView;
private AccountsView accountsView;
private TrendsGraphView trendsGraphView;
public static Intent makeIntent(Context context) {
return makeIntentForActivity(context, OverviewActivity.class);
}
public static void start(Context context) {
final Intent intent = makeIntent(context);
startActivity(context, intent);
}
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setShowDrawer(true);
setShowDrawerToggle(true);
setContentView(R.layout.activity_overview);
// Get views
final FabImageButton newTransactionView = (FabImageButton) findViewById(R.id.newTransaction);
overviewGraphView = (OverviewGraphView) findViewById(R.id.overviewGraphView);
accountsView = (AccountsView) findViewById(R.id.accounts);
trendsGraphView = (TrendsGraphView) findViewById(R.id.trendsGraphView);
// Setup
newTransactionView.setOnClickListener(this);
overviewGraphView.setOnClickListener(this);
accountsView.setOnClickListener(this);
trendsGraphView.setOnClickListener(this);
// Loader
getSupportLoaderManager().initLoader(LOADER_TRANSACTIONS, null, this);
getSupportLoaderManager().initLoader(LOADER_ACCOUNTS, null, this);
}
@Override public void onResume() {
super.onResume();
getEventBus().register(this);
}
@Override public void onPause() {
super.onPause();
getEventBus().unregister(this);
}
@Override protected NavigationAdapter.NavigationScreen getNavigationScreen() {
return NavigationAdapter.NavigationScreen.Overview;
}
@Override protected Analytics.Screen getScreen() {
return Analytics.Screen.Overview;
}
@Override public Loader<Cursor> onCreateLoader(int id, Bundle args) {
switch (id) {
case LOADER_TRANSACTIONS:
return Tables.Transactions
.getQuery()
.selection(" and " + Tables.Transactions.DATE + " between ? and ?", String.valueOf(currentInterval.getInterval().getStartMillis()), String.valueOf(currentInterval.getInterval().getEndMillis() - 1))
.clearSort()
.sortOrder(Tables.Transactions.DATE.getName())
.asCursorLoader(this, TransactionsProvider.uriTransactions());
case LOADER_ACCOUNTS:
return Tables.Accounts
.getQuery()
.selection(" and " + Tables.Accounts.INCLUDE_IN_TOTALS + "=?", "1")
.asCursorLoader(this, AccountsProvider.uriAccounts());
}
return null;
}
@Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
switch (loader.getId()) {
case LOADER_TRANSACTIONS:
onTransactionsLoaded(cursor);
break;
case LOADER_ACCOUNTS:
onAccountsLoaded(cursor);
break;
}
}
@Override public void onLoaderReset(Loader<Cursor> loader) {
}
@Override public void onClick(View view) {
switch (view.getId()) {
case R.id.newTransaction:
TransactionEditActivity.start(this, null);
break;
case R.id.overviewGraphView:
onNavigationItemSelected(NavigationAdapter.NavigationScreen.Reports);
break;
case R.id.accounts:
onNavigationItemSelected(NavigationAdapter.NavigationScreen.Accounts);
break;
case R.id.trendsGraphView:
onNavigationItemSelected(NavigationAdapter.NavigationScreen.Transactions);
break;
}
}
@Subscribe public void onCurrentIntervalChanged(CurrentInterval currentInterval) {
getSupportLoaderManager().restartLoader(LOADER_TRANSACTIONS, null, this);
getSupportActionBar().setTitle(currentInterval.getTitle());
}
private void onTransactionsLoaded(Cursor cursor) {
final CategoriesReportData categoriesReportData = new CategoriesReportData(this, cursor, mainCurrency, TransactionType.Expense);
overviewGraphView.setPieChartData(categoriesReportData.getPieChartData());
overviewGraphView.setTotalExpense(categoriesReportData.getPieChartData().getTotalValue());
final TrendsGraphData trendsGraphData = new TrendsGraphData(this, cursor, mainCurrency, currentInterval);
trendsGraphView.setTotalIncomeAndExpense(trendsGraphData.getTotalIncome(), trendsGraphData.getTotalExpense(), mainCurrency);
trendsGraphView.setLineGraphData(trendsGraphData.getLineGraphData(), mainCurrency);
}
private void onAccountsLoaded(Cursor cursor) {
final List<Account> accounts = new ArrayList<>();
if (cursor.moveToFirst()) {
do {
accounts.add(Account.from(cursor));
} while (cursor.moveToNext());
}
accountsView.setAccounts(accounts);
}
}