package com.elmz.drift.drawer;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBarDrawerToggle;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import com.elmz.drift.R;
public abstract class AbstractDrawerActivity extends ActionBarActivity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private RelativeLayout mDrawerContainer;
private ListView mDrawerList;
private NavDrawerAdapter mDrawerAdapter;
private NavDrawerActivityConfig navConf;
private int lastItemChecked;
public abstract NavDrawerActivityConfig getNavDrawerConfiguration();
public abstract void onNavItemSelected(int id);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
navConf = getNavDrawerConfiguration();
setContentView(navConf.getMainLayout());
if (savedInstanceState == null) {
lastItemChecked = navConf.getCheckedPosition();
} else {
lastItemChecked = savedInstanceState.getInt("lastItemChecked");
}
mDrawerLayout = (DrawerLayout) findViewById(navConf.getDrawerLayoutId());
mDrawerContainer = (RelativeLayout) findViewById(navConf.getDrawerContainerId());
mDrawerList = (ListView) findViewById(navConf.getLeftDrawerId());
mDrawerAdapter = navConf.getAdapter();
mDrawerAdapter.check(lastItemChecked);
mDrawerList.setAdapter(mDrawerAdapter);
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
this.initDrawerShadow();
// Use material design toolbar
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
}
final ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar,
navConf.getDrawerOpenDesc(), navConf.getDrawerCloseDesc()) {
public void onDrawerClosed(View view) {
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
// Do this last for it to show
if (lastItemChecked != -1) {
mDrawerList.setItemChecked(lastItemChecked, true);
}
}
protected void initDrawerShadow() {
mDrawerLayout.setDrawerShadow(navConf.getDrawerShadow(), GravityCompat.START);
}
protected int getDrawerIcon() {
return R.drawable.ic_launcher;
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (navConf.getActionMenuItemsToHideWhenDrawerOpen() != null) {
final boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerContainer);
for(int iItem : navConf.getActionMenuItemsToHideWhenDrawerOpen()) {
menu.findItem(iItem).setVisible(!drawerOpen);
}
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return mDrawerToggle.onOptionsItemSelected(item);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
if (mDrawerLayout.isDrawerOpen(mDrawerContainer)) {
mDrawerLayout.closeDrawer(mDrawerContainer);
}
else {
mDrawerLayout.openDrawer(mDrawerContainer);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
protected DrawerLayout getDrawerLayout() {
return mDrawerLayout;
}
protected ActionBarDrawerToggle getDrawerToggle() {
return mDrawerToggle;
}
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final NavDrawerItem selectedItem = mDrawerAdapter.getItem(position);
onNavItemSelected(selectedItem.getListId());
if (selectedItem.isCheckable()) {
mDrawerAdapter.check(position);
// Checking is automatically done
lastItemChecked = position;
} else if (lastItemChecked != -1) {
// Check other position instead
mDrawerList.setItemChecked(lastItemChecked, true);
}
if (mDrawerLayout.isDrawerOpen(mDrawerContainer)) {
mDrawerLayout.closeDrawer(mDrawerContainer);
}
}
}
@Override
public void onBackPressed() {
if(mDrawerLayout.isDrawerOpen(Gravity.START| Gravity.LEFT)){
mDrawerLayout.closeDrawers();
return;
}
super.onBackPressed();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("lastItemChecked", this.lastItemChecked);
}
}