package rabbitescape.ui.android;
import android.content.Intent;
import android.support.v7.app.ActionBar;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import net.artificialworlds.rabbitescape.R;
import rabbitescape.engine.config.TapTimer;
import rabbitescape.engine.menu.ByNameConfigBasedLevelsCompleted;
import rabbitescape.engine.menu.LevelMenuItem;
import rabbitescape.engine.menu.LevelsList;
import rabbitescape.engine.menu.LoadLevelsList;
import rabbitescape.engine.menu.Menu;
import rabbitescape.engine.menu.MenuDefinition;
import rabbitescape.engine.menu.MenuItem;
public class AndroidMenuActivity extends RabbitEscapeActivity
{
private static final String POSITION = "rabbitescape.position";
private static final String STATE_SELECTED_ITEM = "rabbitescape.selected_menu_item";
private int[] positions;
private Menu menu = null;
private ListView listView = null;
private Button muteButton = null;
// Saved state
public int selectedItemPosition = -1;
@Override
protected void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
sound.setMusic( "tryad-let_them_run" );
setContentView( R.layout.activity_android_menu );
muteButton = (Button)findViewById( R.id.menuMuteButton );
LevelsList levelsList;
if ( TapTimer.matched )
{
levelsList = LoadLevelsList.load( MenuDefinition.allLevels );
}
else
{
levelsList = LoadLevelsList.load( LevelsList.excludingHidden( MenuDefinition.allLevels ) );
}
Menu mainMenu = MenuDefinition.mainMenu(
new ByNameConfigBasedLevelsCompleted( getConfig(), levelsList ),
levelsList,
false
);
if ( savedInstanceState != null )
{
selectedItemPosition = savedInstanceState.getInt( STATE_SELECTED_ITEM, -1 );
}
Intent intent = getIntent();
positions = intent.getIntArrayExtra( POSITION );
if ( positions == null )
{
positions = new int[ 0 ];
}
if ( positions.length > 0 )
{
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled( true );
}
menu = navigateToMenu( positions, mainMenu );
listView = (ListView)findViewById( R.id.listView );
listView.setSelection( selectedItemPosition );
addItemListener( menu, listView );
}
@Override
public void onSaveInstanceState( Bundle outState )
{
super.onSaveInstanceState( outState );
outState.putInt( STATE_SELECTED_ITEM, listView.getSelectedItemPosition() );
}
@Override
public void onResume()
{
super.onResume();
sound.setMusic( "tryad-let_them_run" );
menu.refresh();
listView.setAdapter( new MenuListAdapter( this, menu ) );
listView.setSelection( selectedItemPosition );
}
@Override
public void updateMuteButton( boolean muted )
{
muteButton.setCompoundDrawablesWithIntrinsicBounds(
getResources().getDrawable( muted ? R.drawable.menu_muted : R.drawable.menu_unmuted ),
null,
null,
null
);
muteButton.invalidate();
}
private void addItemListener( final Menu menu, ListView listView )
{
final AndroidMenuActivity parentActivity = this;
listView.setOnItemClickListener(
new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(
AdapterView<?> adapterView, View view, int position, long id )
{
selectedItemPosition = position;
MenuItem item = menu.items[position];
switch( item.type )
{
case MENU:
{
Intent intent = new Intent( parentActivity, AndroidMenuActivity.class );
intent.putExtra( POSITION, appendToArray( positions, position ) );
startActivity( intent );
return;
}
case ABOUT:
{
about( parentActivity );
return;
}
case LEVEL:
{
level( parentActivity, (LevelMenuItem)item );
return;
}
case QUIT:
{
exit();
return;
}
case DEMO:
{
return;
}
default:
{
throw new UnknownMenuItemType( item );
}
}
}
}
);
}
private void exit()
{
finish();
}
private void about( AndroidMenuActivity parentActivity )
{
Intent intent = new Intent( parentActivity, AndroidAboutActivity.class );
startActivity( intent );
}
private void level( AndroidMenuActivity parentActivity, LevelMenuItem item )
{
Intent intent = new Intent( parentActivity, AndroidGameActivity.class );
intent.putExtra( AndroidGameActivity.INTENT_LEVELS_DIR, item.levelsDir );
intent.putExtra( AndroidGameActivity.INTENT_LEVEL, item.fileName );
intent.putExtra( AndroidGameActivity.INTENT_LEVEL_NUMBER, item.levelNumber );
startActivity( intent );
}
private int[] appendToArray( int[] positions, int position )
{
int[] ret = new int[ positions.length + 1 ];
System.arraycopy( positions, 0, ret, 0, positions.length );
ret[positions.length] = position;
return ret;
}
private int[] shrunk( int[] positions )
{
int[] ret = new int[ positions.length - 1 ];
System.arraycopy( positions, 0, ret, 0, positions.length - 1 );
return ret;
}
private Menu navigateToMenu( int[] positions, Menu mainMenu )
{
Menu ret = mainMenu;
for ( int pos : positions )
{
if ( pos < 0 || pos >= ret.items.length )
{
return mainMenu;
}
ret = ret.items[pos].menu;
if ( ret == null )
{
return mainMenu;
}
}
return ret;
}
@Override
public Intent getSupportParentActivityIntent()
{
Intent intent = new Intent( this, AndroidMenuActivity.class );
intent.putExtra( POSITION, shrunk( positions ) );
return intent;
}
@Override
public boolean onCreateOptionsMenu( android.view.Menu menu )
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate( R.menu.android_menu, menu );
return true;
}
@Override
public boolean onOptionsItemSelected( android.view.MenuItem item )
{
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if ( id == R.id.action_settings )
{
return true;
}
return super.onOptionsItemSelected( item );
}
}