package com.darkrockstudios.apps.tminus.base.activities;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.darkrockstudios.apps.tminus.R;
import com.darkrockstudios.apps.tminus.experiences.agency.browse.AgencyBrowserActivity;
import com.darkrockstudios.apps.tminus.experiences.launch.browse.LaunchListActivity;
import com.darkrockstudios.apps.tminus.experiences.location.browse.LocationBrowserActivity;
import com.darkrockstudios.apps.tminus.experiences.rocket.browse.RocketBrowserActivity;
import com.darkrockstudios.apps.tminus.experiences.settings.SettingsActivity;
/**
* Created by Adam on 10/6/13.
* A convenience class for Activities need a Nav Drawer and
* will be handling Database actions.
*/
public abstract class NavigationDatabaseActivity extends DatabaseActivity
{
protected DrawerLayout m_drawerLayout;
protected ActionBarDrawerToggle m_drawerToggle;
protected ListView m_navigationList;
protected void initNavDrawer()
{
m_drawerLayout = (DrawerLayout) findViewById( R.id.NAVDRAWER_drawer_layout );
m_drawerToggle =
new NavigationDrawerToggle( this, m_drawerLayout, R.drawable.ic_drawer, R.string.NAVDRAWER_open_description,
R.string.NAVDRAWER_close_description );
// Set the drawer toggle as the DrawerListener
m_drawerLayout.setDrawerListener( m_drawerToggle );
m_navigationList = (ListView) findViewById( R.id.NAVDRAWER_left_drawer );
NavigationListAdapter navListAdapter = new NavigationListAdapter( this );
m_navigationList.setOnItemClickListener( new NavigationItemClickListener() );
m_navigationList.setAdapter( navListAdapter );
ActionBar actionBar = getActionBar();
if( actionBar != null )
{
actionBar.setDisplayHomeAsUpEnabled( true );
actionBar.setHomeButtonEnabled( true );
}
}
private class NavigationItemClickListener implements AdapterView.OnItemClickListener
{
@Override
public void onItemClick( final AdapterView<?> parent, final View view, final int position, final long id )
{
final Intent intent;
NavigationItem item = (NavigationItem) parent.getItemAtPosition( position );
// Don't launch a new Activity if is the same as the current one
if( (item != null) && (item.m_activityClass != NavigationDatabaseActivity.this.getClass()) )
{
intent = new Intent( NavigationDatabaseActivity.this, item.m_activityClass );
intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
}
else
{
intent = null;
}
if( intent != null )
{
startActivity( intent );
finish();
}
// If we aren't moving to a new Activity, close the drawer
else
{
m_drawerLayout.closeDrawers();
}
}
}
private static class NavigationItem
{
public String m_title;
public Drawable m_iconResource;
public Class m_activityClass;
public NavigationItem( final Context context, final Class activityClass, final int titleResourceId, final int iconResourceId )
{
m_activityClass = activityClass;
m_title = context.getString( titleResourceId );
m_iconResource = context.getResources().getDrawable( iconResourceId );
}
}
private class NavigationListAdapter extends ArrayAdapter<NavigationItem>
{
public NavigationListAdapter( final Context context )
{
super( context, R.layout.row_navigation_item, R.id.NAVDRAWER_nav_item_title );
NavigationItem launchListItem = new NavigationItem( context,
LaunchListActivity.class,
R.string.NAVDRAWER_item_title_launch_list,
R.drawable.ic_navdrawer_launch_list );
add( launchListItem );
NavigationItem rocketListItem = new NavigationItem( context,
RocketBrowserActivity.class,
R.string.NAVDRAWER_item_title_rocket_list,
R.drawable.ic_navdrawer_rocket_list );
add( rocketListItem );
NavigationItem locationListItem = new NavigationItem( context,
LocationBrowserActivity.class,
R.string.NAVDRAWER_item_title_location_list,
R.drawable.ic_navdrawer_location_list );
add( locationListItem );
NavigationItem agencyListItem = new NavigationItem( context,
AgencyBrowserActivity.class,
R.string.NAVDRAWER_item_title_agency_list,
R.drawable.ic_navdrawer_location_list );
add( agencyListItem );
}
public View getView( final int position, final View convertView, final ViewGroup parent )
{
final View row;
if( convertView == null )
{
row = getLayoutInflater().inflate( R.layout.row_navigation_item, parent, false );
}
else
{
row = convertView;
}
NavigationItem item = getItem( position );
TextView titleView = (TextView) row.findViewById( R.id.NAVDRAWER_nav_item_title );
titleView.setText( item.m_title );
ImageView iconView = (ImageView) row.findViewById( R.id.NAVDRAWER_nav_item_icon );
iconView.setImageDrawable( item.m_iconResource );
return row;
}
@Override
public boolean hasStableIds()
{
return true;
}
}
private class NavigationDrawerToggle extends ActionBarDrawerToggle
{
public NavigationDrawerToggle( final Activity activity, final DrawerLayout drawerLayout, final int drawerImageRes, final int openDrawerContentDescRes, final int closeDrawerContentDescRes )
{
super( activity, drawerLayout, drawerImageRes, openDrawerContentDescRes, closeDrawerContentDescRes );
}
/**
* Called when a drawer has settled in a completely closed state.
*/
public void onDrawerClosed( final View view )
{
ActionBar actionBar = getActionBar();
if( actionBar != null )
{
actionBar.setTitle( getTitle() );
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
}
/**
* Called when a drawer has settled in a completely open state.
*/
public void onDrawerOpened( final View drawerView )
{
ActionBar actionBar = getActionBar();
if( actionBar != null )
{
actionBar.setTitle( getTitle() );
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
}
}
@Override
public boolean onOptionsItemSelected( final MenuItem item )
{
boolean handled = m_drawerToggle.onOptionsItemSelected( item );
if( !handled )
{
// Handle item selection
switch( item.getItemId() )
{
case R.id.action_settings:
{
Intent intent = new Intent( this, SettingsActivity.class );
startActivity( intent );
handled = true;
}
break;
default:
handled = super.onOptionsItemSelected( item );
}
}
return handled;
}
@Override
protected void onPostCreate( final Bundle savedInstanceState )
{
super.onPostCreate( savedInstanceState );
// Sync the toggle state after onRestoreInstanceState has occurred.
m_drawerToggle.syncState();
}
@Override
public void onConfigurationChanged( final Configuration newConfig )
{
super.onConfigurationChanged( newConfig );
m_drawerToggle.onConfigurationChanged( newConfig );
}
}