package org.michenux.drodrolib.ui.navdrawer; import android.app.Activity; import android.content.res.Configuration; import android.os.Bundle; import android.support.annotation.IdRes; import android.support.annotation.Nullable; import android.support.design.widget.NavigationView; import android.support.v4.app.Fragment; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import org.michenux.drodrolib.MCXApplication; public abstract class NavigationDrawerFragment extends Fragment implements NavigationView.OnNavigationItemSelectedListener { private DrawerLayout mDrawerLayoutView; private ActionBarDrawerToggle mDrawerToggle; private CharSequence mDrawerTitle; private CharSequence mTitle; private NavDrawerActivityConfiguration mNavConf; private Integer mSelectItemOnClosed; private NavigationView mNavigationView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((MCXApplication) getActivity().getApplication()).inject(this); setHasOptionsMenu(true); if (savedInstanceState == null) { mTitle = mDrawerTitle = this.getActivity().getTitle(); } else { mTitle = savedInstanceState.getCharSequence("title"); mDrawerTitle = savedInstanceState.getCharSequence("drawerTitle"); } mNavConf = createNavigurationConfiguration(); } protected abstract NavDrawerActivityConfiguration createNavigurationConfiguration(); /** * @param menuItemId menuItem id */ protected abstract void onNavItemSelected(@IdRes int menuItemId); @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(mNavConf.getLayout(), container, false); return view; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mNavigationView = (NavigationView) view.findViewById(mNavConf.getNavigationViewId()); mNavigationView.setNavigationItemSelectedListener(this); } public boolean onNavigationItemSelected(MenuItem menuItem) { selectItem(menuItem.getItemId(), true); return true; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Activity activity = getActivity(); mDrawerLayoutView = (DrawerLayout) activity.findViewById(mNavConf.getDrawerLayoutViewId()); mDrawerToggle = new ActionBarDrawerToggle( this.getActivity(), mDrawerLayoutView, (Toolbar) activity.findViewById(mNavConf.getToolbarId()), mNavConf.getDrawerOpenDesc(), mNavConf.getDrawerCloseDesc()) { public void onDrawerClosed(View view) { ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(mTitle); if (NavigationDrawerFragment.this.mSelectItemOnClosed != null) { NavigationDrawerFragment.this.deferedOnNavItemSelected(); } } public void onDrawerOpened(View drawerView) { getActivity().setTitle(mDrawerTitle); } }; mDrawerLayoutView.setDrawerListener(mDrawerToggle); mDrawerToggle.syncState(); setTitle(mTitle); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } else { return false; } } /** * Close drawer when back pressed * * @return true if closeDrawer() is invoked. */ public boolean onBackPressed() { if (getDrawerLayoutView().isDrawerOpen(GravityCompat.START)) { getDrawerLayoutView().closeDrawer(GravityCompat.START); return true; } else { return false; } } /** * Select a item in the menu * * @param menuItemId menu item id * @param deferred wait for drawer to close, then select item. */ public void selectItem(@IdRes int menuItemId, boolean deferred) { MenuItem menuItem = mNavigationView.getMenu().findItem(menuItemId); if (menuItem.isCheckable()) { mNavigationView.setCheckedItem(menuItemId); } if (deferred) { this.mSelectItemOnClosed = menuItemId; } else { onNavItemSelected(menuItemId); } if (mNavConf.updateTitleWhenMenuItemClick(menuItemId)) { setTitle(menuItem.getTitle()); } if (mNavConf.closeDrawerWhenMenuItemClick(menuItemId) && this.mDrawerLayoutView.isDrawerOpen(GravityCompat.START)) { mDrawerLayoutView.closeDrawer(GravityCompat.START); } } public void deferedOnNavItemSelected() { onNavItemSelected(this.mSelectItemOnClosed); mSelectItemOnClosed = null; } public void setTitle(CharSequence title) { mTitle = title; ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(mTitle); } public void setTitleWithDrawerTitle() { setTitle(mDrawerTitle); } public NavDrawerActivityConfiguration getNavConf() { return mNavConf; } public void setNavConf(NavDrawerActivityConfiguration mNavConf) { this.mNavConf = mNavConf; } protected DrawerLayout getDrawerLayoutView() { return mDrawerLayoutView; } protected ActionBarDrawerToggle getDrawerToggle() { return mDrawerToggle; } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putCharSequence("title", this.mTitle); outState.putCharSequence("drawerTitle", this.mDrawerTitle); } /** * Close or open drawer when hardware menu button is pressed. * * @param keyCode key code * @param event key event * @return true if key event is consumed. */ public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { if (this.mDrawerLayoutView.isDrawerOpen(GravityCompat.START)) { this.mDrawerLayoutView.closeDrawer(GravityCompat.START); } else { this.mDrawerLayoutView.openDrawer(GravityCompat.START); } return true; } return false; } public CharSequence getDrawerTitle() { return mDrawerTitle; } public void resetSelection() { for (int i = 0; i < mNavigationView.getMenu().size(); i++) { MenuItem menuItem = mNavigationView.getMenu().getItem(i); if (menuItem.isChecked()) { menuItem.setChecked(false); } } } public NavigationView getNavigationView() { return mNavigationView; } }