package it.geosolutions.geocollect.android.core.navigation;
import it.geosolutions.geocollect.android.app.R;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
public abstract class AbstractNavDrawerActivity extends SherlockFragmentActivity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
protected ListView mDrawerList;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
protected NavDrawerActivityConfiguration navConf ;
protected abstract NavDrawerActivityConfiguration getNavDrawerConfiguration();
protected abstract void onNavItemSelected( int id );
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
navConf = getNavDrawerConfiguration();
setContentView(navConf.getMainLayout());
mTitle = mDrawerTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(navConf.getDrawerLayoutId());
mDrawerList = (ListView) findViewById(navConf.getLeftDrawerId());
mDrawerList.setAdapter(navConf.getBaseAdapter());
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
mDrawerToggle = new ActionBarDrawerToggle(
this,
mDrawerLayout,
getDrawerIcon(),
navConf.getDrawerOpenDesc(),
navConf.getDrawerCloseDesc()
) {
public void onDrawerClosed(View view) {
getSupportActionBar().setTitle(mTitle);
supportInvalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
getSupportActionBar().setTitle(mDrawerTitle);
supportInvalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
try{//necessary for activity unit test
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}catch(NullPointerException e){
Log.e(AbstractNavDrawerActivity.class.getSimpleName(), "error setting up support actionbar",e);
}
}
protected int getDrawerIcon() {
return R.drawable.ic_drawer;
}
@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 ) {
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
for( int iItem : navConf.getActionMenuItemsToHideWhenDrawerOpen()) {
menu.findItem(iItem).setVisible(!drawerOpen);
}
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
mDrawerLayout.closeDrawer(mDrawerList);
} else {
mDrawerLayout.openDrawer(mDrawerList);
}
//layer menu part
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ( keyCode == KeyEvent.KEYCODE_MENU ) {
if ( this.mDrawerLayout.isDrawerOpen(this.mDrawerList)) {
this.mDrawerLayout.closeDrawer(this.mDrawerList);
}
else {
this.mDrawerLayout.openDrawer(this.mDrawerList);
}
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) {
selectItem(position);
}
}
public void selectItem(int position) {
NavDrawerItem selectedItem = navConf.getNavItems()[position];
this.onNavItemSelected(selectedItem.getId());
mDrawerList.setItemChecked(position, true);
if ( selectedItem.updateActionBarTitle()) {
setTitle(selectedItem.getLabel());
}
if ( this.mDrawerLayout.isDrawerOpen(this.mDrawerList)) {
mDrawerLayout.closeDrawer(mDrawerList);
}
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getSupportActionBar().setTitle(mTitle);
}
}