package com.code44.finance.ui; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.ViewGroup; import com.code44.finance.R; import com.code44.finance.adapters.NavigationAdapter; import com.code44.finance.ui.accounts.AccountsActivity; import com.code44.finance.ui.common.BaseActivity; import com.code44.finance.ui.overview.OverviewActivity; import com.code44.finance.ui.reports.categories.CategoriesReportActivity; import com.code44.finance.ui.transactions.TransactionsActivity; public abstract class DrawerActivity extends BaseActivity implements NavigationFragment.NavigationListener { private static final int DRAWER_LAUNCH_DELAY = 250; private final Handler handler = new Handler(); protected DrawerLayout drawerLayout; protected ActionBarDrawerToggle drawerToggle; private NavigationFragment navigationFragment; private boolean showDrawer = false; private boolean showDrawerToggle = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_drawer); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); if (drawerToggle != null) { drawerToggle.syncState(); } } @Override public void onAttachFragment(Fragment fragment) { super.onAttachFragment(fragment); if (fragment instanceof NavigationFragment) { navigationFragment = (NavigationFragment) fragment; navigationFragment.setSelected(getNavigationScreen()); } } @Override protected void onResume() { super.onResume(); if (navigationFragment != null) { navigationFragment.setSelected(getNavigationScreen()); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (drawerToggle != null) { drawerToggle.onConfigurationChanged(newConfig); } } @Override public void onBackPressed() { if (drawerLayout != null && (drawerLayout.isDrawerOpen(Gravity.START) || drawerLayout.isDrawerOpen(Gravity.END))) { drawerLayout.closeDrawers(); } else { super.onBackPressed(); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: if (drawerToggle != null && drawerLayout != null) { if (drawerLayout.isDrawerOpen(Gravity.START)) { drawerLayout.closeDrawer(Gravity.START); } else { drawerLayout.openDrawer(Gravity.START); } return true; } } return super.onOptionsItemSelected(item); } @Override public void setContentView(int layoutResID) { LayoutInflater.from(this).inflate(layoutResID, (ViewGroup) findViewById(R.id.content), true); // Get views drawerLayout = (DrawerLayout) findViewById(R.id.drawer); // Setup if (!showDrawer) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); drawerLayout = null; } if (drawerLayout != null && showDrawerToggle) { drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, getToolbar(), R.string.open_navigation, R.string.close_navigation); drawerLayout.setDrawerListener(drawerToggle); } setupToolbar(); } @Override public void onNavigationItemSelected(NavigationAdapter.NavigationScreen navigationScreen) { if (isSameNavigationScreen(navigationScreen)) { drawerLayout.closeDrawers(); return; } final Intent intent; switch (navigationScreen) { case User: intent = null; break; case Overview: intent = OverviewActivity.makeIntent(this); break; case Accounts: intent = AccountsActivity.makeViewIntent(this); break; case Transactions: intent = TransactionsActivity.makeViewIntent(this); break; case Reports: intent = CategoriesReportActivity.makeIntent(this); break; default: intent = null; break; } if (intent != null) { intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); } if (drawerLayout != null) { drawerLayout.closeDrawers(); } handler.postDelayed(new Runnable() { @Override public void run() { startActivity(DrawerActivity.this, intent); if (!(DrawerActivity.this instanceof OverviewActivity)) { finish(); } } }, DRAWER_LAUNCH_DELAY); } protected NavigationAdapter.NavigationScreen getNavigationScreen() { return null; } protected void setShowDrawer(boolean showDrawer) { this.showDrawer = showDrawer; } protected void setShowDrawerToggle(boolean showDrawerToggle) { this.showDrawerToggle = showDrawerToggle; } private boolean isSameNavigationScreen(NavigationAdapter.NavigationScreen navigationScreen) { switch (navigationScreen) { case User: break; case Overview: return this instanceof OverviewActivity; case Accounts: return this instanceof AccountsActivity; case Transactions: return this instanceof TransactionsActivity; case Reports: return this instanceof CategoriesReportActivity; } return false; } }