package cl.monsoon.s1next.view.internal; import android.content.res.Configuration; import android.os.Bundle; import android.support.annotation.CallSuper; import android.support.annotation.Nullable; import android.support.design.widget.NavigationView; import android.support.v4.app.FragmentActivity; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.view.MenuItem; import android.view.View; import cl.monsoon.s1next.R; /** * This class represents a delegate which you can use to add * {@link DrawerLayout} to {@link FragmentActivity}. */ public abstract class DrawerLayoutDelegate { final FragmentActivity mFragmentActivity; private final DrawerLayout mDrawerLayout; private final NavigationView mNavigationView; private ActionBarDrawerToggle mDrawerToggle; private boolean mDrawerIndicatorEnabled = true; DrawerLayoutDelegate(FragmentActivity fragmentActivity, DrawerLayout drawerLayout, NavigationView navigationView) { this.mFragmentActivity = fragmentActivity; this.mDrawerLayout = drawerLayout; this.mNavigationView = navigationView; } /** * @see android.support.v7.app.AppCompatActivity#onPostCreate(Bundle) */ @CallSuper public void onPostCreate() { setupNavDrawer(); // Syncs the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } /** * @see android.support.v7.app.AppCompatActivity#onOptionsItemSelected(MenuItem) */ @CallSuper public boolean onOptionsItemSelected(MenuItem item) { // Pass the event to ActionBarDrawerToggle, if it returns // true, then it has handled the app drawer touch event. return mDrawerToggle.onOptionsItemSelected(item); } /** * @see android.support.v7.app.AppCompatActivity#onConfigurationChanged(Configuration) */ @CallSuper public void onConfigurationChanged(Configuration newConfig) { mDrawerToggle.onConfigurationChanged(newConfig); } /** * Enables or disable the drawer indicator. The indicator defaults to enabled. */ public final void setDrawerIndicatorEnabled(boolean enabled) { mDrawerIndicatorEnabled = enabled; } private void setupNavDrawer() { // see http://stackoverflow.com/a/27487357 mDrawerToggle = new ActionBarDrawerToggle(mFragmentActivity, mDrawerLayout, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, 0); } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); super.onDrawerSlide(drawerView, 0); } /** * @see DrawerLayoutDelegate#closeDrawer(Runnable) */ @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); Object tag = drawerView.getTag(R.id.tag_drawer_runnable); if (tag != null) { Runnable runnable = (Runnable) tag; drawerView.setTag(R.id.tag_drawer_runnable, null); runnable.run(); } } }; mDrawerLayout.addDrawerListener(mDrawerToggle); mDrawerToggle.setDrawerIndicatorEnabled(mDrawerIndicatorEnabled); setupNavDrawerItem(mDrawerLayout, mNavigationView); } /** * Closes the drawer view. * * @param runnable Executes this during the {@link ActionBarDrawerToggle#onDrawerClosed(View)}. */ final void closeDrawer(@Nullable Runnable runnable) { mNavigationView.setTag(R.id.tag_drawer_runnable, runnable); mDrawerLayout.closeDrawer(GravityCompat.START); } protected abstract void setupNavDrawerItem(DrawerLayout drawerLayout, NavigationView navigationView); }