package com.nilhcem.bblfr.ui.navigationdrawer; import android.content.Intent; import android.os.Bundle; import android.support.v4.content.IntentCompat; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import com.nilhcem.bblfr.BBLApplication; import com.nilhcem.bblfr.R; import com.nilhcem.bblfr.core.prefs.Preferences; import com.nilhcem.bblfr.ui.BaseActivity; import com.nilhcem.bblfr.ui.about.AboutActivity; import com.nilhcem.bblfr.ui.baggers.cities.CitiesMapActivity; import com.nilhcem.bblfr.ui.baggers.list.BaggersListActivity; import com.nilhcem.bblfr.ui.locations.LocationsMapActivity; import com.nilhcem.bblfr.ui.settings.SettingsActivity; import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; import timber.log.Timber; public abstract class NavigationDrawerActivity extends BaseActivity implements View.OnClickListener { @Inject protected Preferences mPrefs; private static final String EXTRA_DRAWER_ITEM = "mSelectedDrawerItem"; protected static final String EXTRA_DISABLE_DRAWER = "mDisableDrawer"; private ActionBarDrawerToggle mDrawerToggle; /* Some activities can decide not to have a navigation drawer */ private boolean mHasNavigationDrawer; /* Intent to launch when an item was selected and the drawer has closed */ private Intent mPendingDrawerIntent; /* The MenuDrawerItem corresponding to the actual activity (useful for highlighting the selected category) */ private NavigationDrawerEntry mSelectedDrawerItem; /* A way to perform multiple ButterKnife injections on the same instance object */ NavigationDrawerViewHolder mNavigationDrawer; static class NavigationDrawerViewHolder { @BindView(R.id.navigation_drawer_layout) DrawerLayout mLayout; @BindView(R.id.navigation_content_frame) FrameLayout mContent; @BindView(R.id.navigation_drawer_view) RecyclerView mRecyclerView; } private NavigationDrawerAdapter mDrawerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); BBLApplication.get(this).component().inject(this); setDataFromExtra(); initLayout(); } @Override public void onBackPressed() { if (!mHasNavigationDrawer) { super.onBackPressed(); return; } DrawerLayout drawer = mNavigationDrawer.mLayout; if (drawer.isDrawerVisible(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { if (NavigationDrawerEntry.FIND_BAGGER.equals(mSelectedDrawerItem)) { super.onBackPressed(); } else { Intent intent = BaggersListActivity.createLaunchIntent(this, mPrefs.getCity()); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); startActivityWithoutTransition(intent); finish(); } } } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); if (mHasNavigationDrawer) { mDrawerToggle.syncState(); mDrawerAdapter.setSelectedItem(mSelectedDrawerItem); } } @Override public boolean onOptionsItemSelected(MenuItem item) { if (mHasNavigationDrawer && mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } @Override public void onClick(View v) { if (!(v.getTag() instanceof NavigationDrawerEntryView)) { Timber.w("onClick called with an unexpected object"); return; } NavigationDrawerEntryView view = (NavigationDrawerEntryView) v.getTag(); NavigationDrawerEntry entry = view.getData(); onNavigationDrawerEntryClicked(entry); if (!mSelectedDrawerItem.equals(entry)) { switch (entry) { case CHANGE_CITY: mPendingDrawerIntent = CitiesMapActivity.createLaunchIntent(this, true); break; case ABOUT: mPendingDrawerIntent = AboutActivity.createLaunchIntent(this); break; case HOSTS: mPendingDrawerIntent = LocationsMapActivity.createLaunchIntent(this); break; case SETTINGS: mPendingDrawerIntent = SettingsActivity.createLaunchIntent(this); break; case FIND_BAGGER: default: mPendingDrawerIntent = BaggersListActivity.createLaunchIntent(this, mPrefs.getCity()); break; } mPendingDrawerIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); mPendingDrawerIntent.putExtra(EXTRA_DRAWER_ITEM, entry.name()); } mNavigationDrawer.mLayout.closeDrawer(GravityCompat.START); } @Override public void finish() { super.finish(); if (mHasNavigationDrawer) { overridePendingTransition(0, 0); } } @Override public void setContentView(int layoutResID) { // Override setContentView to have a specific view injection in the drawer layout. View inflated = LayoutInflater.from(this).inflate(layoutResID, getParentView(), false); ButterKnife.bind(this, inflated); if (mToolbar != null) { setSupportActionBar(mToolbar); } setContentView(inflated); } @Override public void setContentView(View view) { setContentView(view, null); } @Override public void setContentView(View view, ViewGroup.LayoutParams params) { mNavigationDrawer.mContent.addView(view); initNavigationDrawer(); } private void initLayout() { mNavigationDrawer = new NavigationDrawerViewHolder(); super.setContentView(R.layout.navigation_drawer_activity); ButterKnife.bind(mNavigationDrawer, this); RecyclerView recyclerView = mNavigationDrawer.mRecyclerView; recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); mDrawerAdapter = new NavigationDrawerAdapter(this, mPrefs.isUsingHrMode(), this); recyclerView.setAdapter(mDrawerAdapter); if (!mHasNavigationDrawer) { lockNavigationDrawer(); } } private void initNavigationDrawer() { if (mHasNavigationDrawer) { final DrawerLayout drawer = mNavigationDrawer.mLayout; mDrawerToggle = new ActionBarDrawerToggle(this, drawer, R.string.drawer_open, R.string.drawer_close) { @Override public void onDrawerClosed(View drawerView) { if (mPendingDrawerIntent != null) { startActivityWithoutTransition(mPendingDrawerIntent); finish(); mPendingDrawerIntent = null; } super.onDrawerClosed(drawerView); } }; drawer.setDrawerListener(mDrawerToggle); drawer.setDrawerShadow(R.drawable.drawer_shadow_start, GravityCompat.START); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); } } private void setDataFromExtra() { Bundle extras = getIntent().getExtras(); String drawerItemValue = null; if (extras != null) { mHasNavigationDrawer = !extras.getBoolean(EXTRA_DISABLE_DRAWER); drawerItemValue = extras.getString(EXTRA_DRAWER_ITEM); } mSelectedDrawerItem = NavigationDrawerEntry.valueOf(drawerItemValue, NavigationDrawerEntry.FIND_BAGGER); } private void startActivityWithoutTransition(Intent intent) { startActivity(intent); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); } protected boolean isNavigationDrawerVisible() { return mNavigationDrawer.mLayout.isDrawerVisible(GravityCompat.START); } protected void lockNavigationDrawer() { mNavigationDrawer.mLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); } protected void unlockNavigationDrawer() { mNavigationDrawer.mLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); } protected void onNavigationDrawerEntryClicked(NavigationDrawerEntry entry) { // Hook that may be overridden. } protected ViewGroup getParentView() { return mNavigationDrawer.mContent; } }