package com.koushikdutta.boilerplate;
import android.animation.ArgbEvaluator;
import android.annotation.TargetApi;
import android.content.res.Configuration;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
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.Gravity;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
/**
* Created by koush on 3/30/15.
*/
public abstract class DrawerActivity extends WindowChromeCompatActivity {
ActionBarDrawerToggle drawerToggle;
public Fragment getDrawerFragment() {
return getSupportFragmentManager().findFragmentByTag("drawer");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drawer_activity);
if (savedInstanceState == null) {
Fragment drawer = createDrawerFragment();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.drawer_content, drawer, "drawer")
.commitAllowingStateLoss();
}
resetDrawerToggle();
}
@Override
public void setSupportActionBar(@Nullable Toolbar toolbar) {
super.setSupportActionBar(toolbar);
resetDrawerToggle();
}
public ActionBarDrawerToggle getDrawerToggle() {
return drawerToggle;
}
private void resetDrawerToggle() {
getDrawer()
.setDrawerListener(drawerToggle = new ActionBarDrawerToggle(this, getDrawer(), getDrawerOpenString(), getDrawerCloseString()) {
// DecelerateInterpolator interpolator = new DecelerateInterpolator();
ArgbEvaluator evaluator = new ArgbEvaluator();
boolean hasOpened;
int originalStatusBarColor;
@Override
public void onDrawerStateChanged(int newState) {
super.onDrawerStateChanged(newState);
if (newState == DrawerLayout.STATE_DRAGGING && !hasOpened) {
hasOpened = true;
originalStatusBarColor = WindowChromeUtils.getStatusBarColor(getWindow());
}
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
// this check exists in case we want to animate the drawer icon into a back indicator
// and don't erroneously translate this stuff.
if (!getDrawer().isDrawerVisible(Gravity.LEFT))
return;
// View content = getDrawer().getChildAt(0);
// View drawer = getDrawer().getChildAt(1);
// content.setTranslationX(Math.min(content.getMeasuredWidth(), drawer.getMeasuredWidth()) / 3 * interpolator.getInterpolation(slideOffset));
onDrawerOpen();
if (hasOpened)
WindowChromeUtils.setStatusBarColor(getWindow(), (int)evaluator.evaluate(slideOffset, originalStatusBarColor, 0x4D000000));
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (hasOpened) {
WindowChromeUtils.setStatusBarColor(getWindow(), originalStatusBarColor);
}
if (isFinishing())
return;
DrawerActivity.this.onDrawerClosed();
}
});
drawerToggle.syncState();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
if (savedInstanceState == null)
onDrawerReady();
}
protected void onDrawerReady() {
}
protected void onDrawerClosed() {
}
public abstract int getDrawerOpenString();
public abstract int getDrawerCloseString();
protected void onDrawerOpen() {
}
protected abstract Fragment createDrawerFragment();
public Fragment getCurrentContentFragment() {
Fragment ret = getSupportFragmentManager().findFragmentById(R.id.main_content);
if (ret != null && ret.isAdded())
return ret;
return null;
}
public FragmentTransaction beginContentFragmentTransaction(final Fragment content, final String breadcrumb) {
FragmentTransaction ft =
getSupportFragmentManager()
.beginTransaction();
if (breadcrumb != null && null != getSupportFragmentManager().findFragmentById(R.id.main_content))
ft.addToBackStack(breadcrumb);
// ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
// ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.replace(R.id.main_content, content);
return ft;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item) )
return true;
if (item.getItemId() == item.getItemId()) {
getSupportFragmentManager().popBackStackImmediate();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
public DrawerLayout getDrawer() {
return (DrawerLayout)findViewById(R.id.drawer_layout);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (getDrawer().isDrawerOpen(Gravity.LEFT)) {
getDrawer().closeDrawers();
return true;
}
return super.onKeyDown(keyCode, event);
}
}