blob: e25051c017031717e7eb843d610ee3439b1e6d41 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.replica.replicaisland;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
public class MainMenuActivity extends Activity {
private boolean mPaused;
private View mStartButton;
private View mOptionsButton;
private View mExtrasButton;
private View mBackground;
private View mTicker;
private Animation mButtonFlickerAnimation;
private Animation mFadeOutAnimation;
private Animation mAlternateFadeOutAnimation;
private Animation mFadeInAnimation;
private boolean mJustCreated;
private String mSelectedControlsString;
private final static int WHATS_NEW_DIALOG = 0;
private final static int TILT_TO_SCREEN_CONTROLS_DIALOG = 1;
private final static int CONTROL_SETUP_DIALOG = 2;
// Create an anonymous implementation of OnClickListener
private View.OnClickListener sContinueButtonListener = new View.OnClickListener() {
public void onClick(View v) {
if (!mPaused) {
Intent i = new Intent(getBaseContext(), AndouKun.class);
v.startAnimation(mButtonFlickerAnimation);
mFadeOutAnimation.setAnimationListener(new StartActivityAfterAnimation(i));
mBackground.startAnimation(mFadeOutAnimation);
mOptionsButton.startAnimation(mAlternateFadeOutAnimation);
mExtrasButton.startAnimation(mAlternateFadeOutAnimation);
mTicker.startAnimation(mAlternateFadeOutAnimation);
mPaused = true;
}
}
};
private View.OnClickListener sOptionButtonListener = new View.OnClickListener() {
public void onClick(View v) {
if (!mPaused) {
Intent i = new Intent(getBaseContext(), SetPreferencesActivity.class);
v.startAnimation(mButtonFlickerAnimation);
mFadeOutAnimation.setAnimationListener(new StartActivityAfterAnimation(i));
mBackground.startAnimation(mFadeOutAnimation);
mStartButton.startAnimation(mAlternateFadeOutAnimation);
mExtrasButton.startAnimation(mAlternateFadeOutAnimation);
mTicker.startAnimation(mAlternateFadeOutAnimation);
mPaused = true;
}
}
};
private View.OnClickListener sExtrasButtonListener = new View.OnClickListener() {
public void onClick(View v) {
if (!mPaused) {
Intent i = new Intent(getBaseContext(), ExtrasMenuActivity.class);
v.startAnimation(mButtonFlickerAnimation);
mButtonFlickerAnimation.setAnimationListener(new StartActivityAfterAnimation(i));
mPaused = true;
}
}
};
private View.OnClickListener sStartButtonListener = new View.OnClickListener() {
public void onClick(View v) {
if (!mPaused) {
Intent i = new Intent(getBaseContext(), DifficultyMenuActivity.class);
i.putExtra("newGame", true);
v.startAnimation(mButtonFlickerAnimation);
mButtonFlickerAnimation.setAnimationListener(new StartActivityAfterAnimation(i));
mPaused = true;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainmenu);
mPaused = true;
mStartButton = findViewById(R.id.startButton);
mOptionsButton = findViewById(R.id.optionButton);
mBackground = findViewById(R.id.mainMenuBackground);
if (mOptionsButton != null) {
mOptionsButton.setOnClickListener(sOptionButtonListener);
}
mExtrasButton = findViewById(R.id.extrasButton);
mExtrasButton.setOnClickListener(sExtrasButtonListener);
mButtonFlickerAnimation = AnimationUtils.loadAnimation(this, R.anim.button_flicker);
mFadeOutAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);
mAlternateFadeOutAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);
mFadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in);
SharedPreferences prefs = getSharedPreferences(PreferenceConstants.PREFERENCE_NAME, MODE_PRIVATE);
final int row = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_ROW, 0);
final int index = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_INDEX, 0);
int levelTreeResource = R.xml.level_tree;
if (row != 0 || index != 0) {
final int linear = prefs.getInt(PreferenceConstants.PREFERENCE_LINEAR_MODE, 0);
if (linear != 0) {
levelTreeResource = R.xml.linear_level_tree;
}
}
if (!LevelTree.isLoaded(levelTreeResource)) {
LevelTree.loadLevelTree(levelTreeResource, this);
LevelTree.loadAllDialog(this);
}
mTicker = findViewById(R.id.ticker);
if (mTicker != null) {
mTicker.setFocusable(true);
mTicker.requestFocus();
mTicker.setSelected(true);
}
mJustCreated = true;
// Keep the volume control type consistent across all activities.
setVolumeControlStream(AudioManager.STREAM_MUSIC);
//MediaPlayer mp = MediaPlayer.create(this, R.raw.bwv_115);
//mp.start();
}
@Override
protected void onPause() {
super.onPause();
mPaused = true;
}
@Override
protected void onResume() {
super.onResume();
mPaused = false;
mButtonFlickerAnimation.setAnimationListener(null);
if (mStartButton != null) {
// Change "start" to "continue" if there's a saved game.
SharedPreferences prefs = getSharedPreferences(PreferenceConstants.PREFERENCE_NAME, MODE_PRIVATE);
final int row = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_ROW, 0);
final int index = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_INDEX, 0);
if (row != 0 || index != 0) {
((ImageView)mStartButton).setImageDrawable(getResources().getDrawable(R.drawable.ui_button_continue));
mStartButton.setOnClickListener(sContinueButtonListener);
} else {
((ImageView)mStartButton).setImageDrawable(getResources().getDrawable(R.drawable.ui_button_start));
mStartButton.setOnClickListener(sStartButtonListener);
}
TouchFilter touch;
final int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
if (sdkVersion < Build.VERSION_CODES.ECLAIR) {
touch = new SingleTouchFilter();
} else {
touch = new MultiTouchFilter();
}
final int lastVersion = prefs.getInt(PreferenceConstants.PREFERENCE_LAST_VERSION, 0);
if (lastVersion == 0) {
// This is the first time the game has been run.
// Pre-configure the control options to match the device.
// The resource system can tell us what this device has.
// TODO: is there a better way to do this? Seems like a kind of neat
// way to do custom device profiles.
final String navType = getString(R.string.nav_type);
mSelectedControlsString = getString(R.string.control_setup_dialog_trackball);
if (navType != null) {
if (navType.equalsIgnoreCase("DPad")) {
// Turn off the click-to-attack pref on devices that have a dpad.
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(PreferenceConstants.PREFERENCE_CLICK_ATTACK, false);
editor.commit();
mSelectedControlsString = getString(R.string.control_setup_dialog_dpad);
} else if (navType.equalsIgnoreCase("None")) {
SharedPreferences.Editor editor = prefs.edit();
// This test relies on the PackageManager if api version >= 5.
if (touch.supportsMultitouch(this)) {
// Default to screen controls.
editor.putBoolean(PreferenceConstants.PREFERENCE_SCREEN_CONTROLS, true);
mSelectedControlsString = getString(R.string.control_setup_dialog_screen);
} else {
// Turn on tilt controls if there's nothing else.
editor.putBoolean(PreferenceConstants.PREFERENCE_TILT_CONTROLS, true);
mSelectedControlsString = getString(R.string.control_setup_dialog_tilt);
}
editor.commit();
}
}
}
if (Math.abs(lastVersion) < Math.abs(AndouKun.VERSION)) {
// This is a new install or an upgrade.
// Check the safe mode option.
// Useful reference: http://en.wikipedia.org/wiki/List_of_Android_devices
if (Build.PRODUCT.contains("morrison") || // Motorola Cliq/Dext
Build.MODEL.contains("Pulse") || // Huawei Pulse
Build.MODEL.contains("U8220") || // Huawei Pulse
Build.MODEL.contains("U8230") || // Huawei U8230
Build.MODEL.contains("MB300") || // Motorola Backflip
Build.MODEL.contains("MB501") || // Motorola Quench / Cliq XT
Build.MODEL.contains("Behold+II")) { // Samsung Behold II
// These are all models that users have complained about. They likely use
// the same buggy QTC graphics driver. Turn on Safe Mode by default
// for these devices.
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(PreferenceConstants.PREFERENCE_SAFE_MODE, true);
editor.commit();
}
SharedPreferences.Editor editor = prefs.edit();
if (lastVersion > 0 && lastVersion < 14) {
// if the user has beat the game once, go ahead and unlock stuff for them.
if (prefs.getInt(PreferenceConstants.PREFERENCE_LAST_ENDING, -1) != -1) {
editor.putBoolean(PreferenceConstants.PREFERENCE_EXTRAS_UNLOCKED, true);
}
}
// show what's new message
editor.putInt(PreferenceConstants.PREFERENCE_LAST_VERSION, AndouKun.VERSION);
editor.commit();
showDialog(WHATS_NEW_DIALOG);
// screen controls were added in version 14
if (lastVersion > 0 && lastVersion < 14 &&
prefs.getBoolean(PreferenceConstants.PREFERENCE_TILT_CONTROLS, false)) {
if (touch.supportsMultitouch(this)) {
// show message about switching from tilt to screen controls
showDialog(TILT_TO_SCREEN_CONTROLS_DIALOG);
}
} else if (lastVersion == 0) {
// show message about auto-selected control schemes.
showDialog(CONTROL_SETUP_DIALOG);
}
}
}
if (mBackground != null) {
mBackground.clearAnimation();
}
if (mTicker != null) {
mTicker.clearAnimation();
mTicker.setAnimation(mFadeInAnimation);
}
if (mJustCreated) {
if (mStartButton != null) {
mStartButton.startAnimation(AnimationUtils.loadAnimation(this, R.anim.button_slide));
}
if (mExtrasButton != null) {
Animation anim = AnimationUtils.loadAnimation(this, R.anim.button_slide);
anim.setStartOffset(500L);
mExtrasButton.startAnimation(anim);
}
if (mOptionsButton != null) {
Animation anim = AnimationUtils.loadAnimation(this, R.anim.button_slide);
anim.setStartOffset(1000L);
mOptionsButton.startAnimation(anim);
}
mJustCreated = false;
} else {
mStartButton.clearAnimation();
mOptionsButton.clearAnimation();
mExtrasButton.clearAnimation();
}
}
@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog;
if (id == WHATS_NEW_DIALOG) {
dialog = new AlertDialog.Builder(this)
.setTitle(R.string.whats_new_dialog_title)
.setPositiveButton(R.string.whats_new_dialog_ok, null)
.setMessage(R.string.whats_new_dialog_message)
.create();
} else if (id == TILT_TO_SCREEN_CONTROLS_DIALOG) {
dialog = new AlertDialog.Builder(this)
.setTitle(R.string.onscreen_tilt_dialog_title)
.setPositiveButton(R.string.onscreen_tilt_dialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
SharedPreferences prefs = getSharedPreferences(PreferenceConstants.PREFERENCE_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(PreferenceConstants.PREFERENCE_SCREEN_CONTROLS, true);
editor.commit();
}
})
.setNegativeButton(R.string.onscreen_tilt_dialog_cancel, null)
.setMessage(R.string.onscreen_tilt_dialog_message)
.create();
} else if (id == CONTROL_SETUP_DIALOG) {
String messageFormat = getResources().getString(R.string.control_setup_dialog_message);
String message = String.format(messageFormat, mSelectedControlsString);
CharSequence sytledMessage = Html.fromHtml(message); // lame.
dialog = new AlertDialog.Builder(this)
.setTitle(R.string.control_setup_dialog_title)
.setPositiveButton(R.string.control_setup_dialog_ok, null)
.setNegativeButton(R.string.control_setup_dialog_change, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Intent i = new Intent(getBaseContext(), SetPreferencesActivity.class);
i.putExtra("controlConfig", true);
startActivity(i);
}
})
.setMessage(sytledMessage)
.create();
} else {
dialog = super.onCreateDialog(id);
}
return dialog;
}
protected class StartActivityAfterAnimation implements Animation.AnimationListener {
private Intent mIntent;
StartActivityAfterAnimation(Intent intent) {
mIntent = intent;
}
public void onAnimationEnd(Animation animation) {
startActivity(mIntent);
if (UIConstants.mOverridePendingTransition != null) {
try {
UIConstants.mOverridePendingTransition.invoke(MainMenuActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
} catch (InvocationTargetException ite) {
DebugLog.d("Activity Transition", "Invocation Target Exception");
} catch (IllegalAccessException ie) {
DebugLog.d("Activity Transition", "Illegal Access Exception");
}
}
}
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
}
}