package com.pedrocarrillo.expensetracker.ui; import android.content.Intent; import android.graphics.drawable.Icon; import android.os.Bundle; import android.os.PersistableBundle; import android.support.annotation.DrawableRes; import android.support.annotation.IntDef; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.NavigationView; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.support.v7.widget.Toolbar; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.pedrocarrillo.expensetracker.R; import com.pedrocarrillo.expensetracker.entities.Expense; import com.pedrocarrillo.expensetracker.interfaces.IConstants; import com.pedrocarrillo.expensetracker.interfaces.IDateMode; import com.pedrocarrillo.expensetracker.interfaces.IMainActivityListener; import com.pedrocarrillo.expensetracker.ui.categories.CategoriesFragment; import com.pedrocarrillo.expensetracker.ui.expenses.ExpensesContainerFragment; import com.pedrocarrillo.expensetracker.ui.expenses.ExpensesFragment; import com.pedrocarrillo.expensetracker.ui.expenses.ExpensesViewPagerAdapter; import com.pedrocarrillo.expensetracker.ui.help.HelpActivity; import com.pedrocarrillo.expensetracker.ui.history.HistoryFragment; import com.pedrocarrillo.expensetracker.ui.reminders.ReminderFragment; import com.pedrocarrillo.expensetracker.ui.settings.SettingsActivity; import com.pedrocarrillo.expensetracker.ui.statistics.StatisticsFragment; import com.pedrocarrillo.expensetracker.utils.DateUtils; import com.pedrocarrillo.expensetracker.utils.Util; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; public class MainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener, IMainActivityListener { @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_TABS}) @Retention(RetentionPolicy.SOURCE) public @interface NavigationMode {} public static final int NAVIGATION_MODE_STANDARD = 0; public static final int NAVIGATION_MODE_TABS = 1; public static final String NAVIGATION_POSITION = "navigation_position"; private int mCurrentMode = NAVIGATION_MODE_STANDARD; private int idSelectedNavigationItem; private DrawerLayout mainDrawerLayout; private NavigationView mainNavigationView; private Toolbar mToolbar; private TabLayout mainTabLayout; private FloatingActionButton mFloatingActionButton; // Expenses Summary related views private LinearLayout llExpensesSummary; private TextView tvDate; private TextView tvDescription; private TextView tvTotal; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initUI(); setUpDrawer(); setUpToolbar(); if ( savedInstanceState != null) { int menuItemId = savedInstanceState.getInt(NAVIGATION_POSITION); mainNavigationView.setCheckedItem(menuItemId); mainNavigationView.getMenu().performIdentifierAction(menuItemId, 0); } else { mainNavigationView.getMenu().performIdentifierAction(R.id.nav_expenses, 0); } } @NavigationMode public int getNavigationMode() { return mCurrentMode; } private void initUI() { mainDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); mainTabLayout = (TabLayout)findViewById(R.id.tab_layout); mainNavigationView = (NavigationView)findViewById(R.id.nav_view); mFloatingActionButton = (FloatingActionButton)findViewById(R.id.fab_main); llExpensesSummary = (LinearLayout)findViewById(R.id.ll_expense_container); tvDate = (TextView)findViewById(R.id.tv_date); tvDescription = (TextView)findViewById(R.id.tv_description); tvTotal = (TextView)findViewById(R.id.tv_total); } private void setUpDrawer() { mainNavigationView.setNavigationItemSelectedListener(this); } private void setUpToolbar() { mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mainDrawerLayout.openDrawer(GravityCompat.START); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { startActivity(new Intent(this, SettingsActivity.class)); return true; } else if (id == R.id.action_help) { startActivity(new Intent(this, HelpActivity.class)); return true; } return super.onOptionsItemSelected(item); } @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt(NAVIGATION_POSITION, idSelectedNavigationItem); super.onSaveInstanceState(outState); } @Override public boolean onNavigationItemSelected(MenuItem menuItem) { menuItem.setChecked(true); mainDrawerLayout.closeDrawers(); switchFragment(menuItem.getItemId()); return false; } @Override public void setTabs(List<String> tabList, final TabLayout.OnTabSelectedListener onTabSelectedListener) { mainTabLayout.removeAllTabs(); mainTabLayout.setVisibility(View.VISIBLE); mainTabLayout.setOnTabSelectedListener(onTabSelectedListener); for (String tab : tabList) { mainTabLayout.addTab(mainTabLayout.newTab().setText(tab).setTag(tab)); } } @Override public void setMode(@NavigationMode int mode) { mFloatingActionButton.setVisibility(View.GONE); llExpensesSummary.setVisibility(View.GONE); mCurrentMode = mode; switch (mode) { case NAVIGATION_MODE_STANDARD: setNavigationModeStandard(); break; case NAVIGATION_MODE_TABS: setNavigationModeTabs(); break; } } @Override public void setExpensesSummary(@IDateMode int dateMode) { float total = Expense.getTotalExpensesByDateMode(dateMode); tvTotal.setText(Util.getFormattedCurrency(total)); String date; switch (dateMode) { case IDateMode.MODE_TODAY: date = Util.formatDateToString(DateUtils.getToday(), Util.getCurrentDateFormat()); break; case IDateMode.MODE_WEEK: date = Util.formatDateToString(DateUtils.getFirstDateOfCurrentWeek(), Util.getCurrentDateFormat()).concat(" - ").concat(Util.formatDateToString(DateUtils.getRealLastDateOfCurrentWeek(), Util.getCurrentDateFormat())); break; case IDateMode.MODE_MONTH: date = Util.formatDateToString(DateUtils.getFirstDateOfCurrentMonth(), Util.getCurrentDateFormat()).concat(" - ").concat(Util.formatDateToString(DateUtils.getRealLastDateOfCurrentMonth(), Util.getCurrentDateFormat())); break; default: date = ""; break; } tvDate.setText(date); } @Override public void setFAB(@DrawableRes int drawableId, View.OnClickListener onClickListener) { mFloatingActionButton.setImageDrawable(getResources().getDrawable(drawableId)); mFloatingActionButton.setOnClickListener(onClickListener); mFloatingActionButton.show(); } @Override public void setTitle(String title) { getSupportActionBar().setTitle(title); } @Override public void setPager(ViewPager vp, final TabLayout.ViewPagerOnTabSelectedListener viewPagerOnTabSelectedListener) { mainTabLayout.setupWithViewPager(vp); mainTabLayout.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(vp) { @Override public void onTabSelected(TabLayout.Tab tab) { @IDateMode int dateMode; switch (tab.getPosition()) { case 0: dateMode = IDateMode.MODE_TODAY; break; case 1: dateMode = IDateMode.MODE_WEEK; break; case 2: dateMode = IDateMode.MODE_MONTH; break; default: dateMode = IDateMode.MODE_TODAY; } setExpensesSummary(dateMode); viewPagerOnTabSelectedListener.onTabSelected(tab); } @Override public void onTabUnselected(TabLayout.Tab tab) { viewPagerOnTabSelectedListener.onTabUnselected(tab); } }); setExpensesSummary(IDateMode.MODE_TODAY); } public ActionMode setActionMode(final ActionMode.Callback actionModeCallback) { return mToolbar.startActionMode(new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mainDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); return actionModeCallback.onCreateActionMode(mode,menu); } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return actionModeCallback.onPrepareActionMode(mode, menu); } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return actionModeCallback.onActionItemClicked(mode, item); } @Override public void onDestroyActionMode(ActionMode mode) { mainDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); actionModeCallback.onDestroyActionMode(mode); } }); } private void setNavigationModeTabs() { mainTabLayout.setVisibility(View.VISIBLE); llExpensesSummary.setVisibility(View.VISIBLE); } private void setNavigationModeStandard() { CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.main_coordinator); AppBarLayout appbar = (AppBarLayout) findViewById(R.id.app_bar_layout); CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbar.getLayoutParams(); AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior(); if (behavior != null && appbar != null) { int[] consumed = new int[2]; behavior.onNestedPreScroll(coordinator, appbar, null, 0, -1000, consumed); } mainTabLayout.setVisibility(View.GONE); } private void switchFragment(int menuItemId) { Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.main_content); switch (menuItemId) { case R.id.nav_expenses: if (!(currentFragment instanceof ExpensesContainerFragment)) replaceFragment(ExpensesContainerFragment.newInstance(), false); break; case R.id.nav_categories: if (!(currentFragment instanceof CategoriesFragment)) replaceFragment(CategoriesFragment.newInstance(), false); break; case R.id.nav_statistics: if (!(currentFragment instanceof StatisticsFragment)) replaceFragment(StatisticsFragment.newInstance(), false); break; case R.id.nav_reminders: if (!(currentFragment instanceof ReminderFragment)) replaceFragment(ReminderFragment.newInstance(), false); break; case R.id.nav_history: if (!(currentFragment instanceof HistoryFragment)) replaceFragment(HistoryFragment.newInstance(), false); break; } } }