/* * 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.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.media.AudioManager; import android.os.Bundle; import android.os.Debug; import android.util.DisplayMetrics; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.TextView; /** * Core activity for the game. Sets up a surface view for OpenGL, bootstraps * the game engine, and manages UI events. Also manages game progression, * transitioning to other activites, save game, and input events. */ public class AndouKun extends Activity implements SensorEventListener { private static final int ACTIVITY_CHANGE_LEVELS = 0; private static final int ACTIVITY_CONVERSATION = 1; private static final int ACTIVITY_DIARY = 2; private static final int ACTIVITY_ANIMATION_PLAYER = 3; private static final int CHANGE_LEVEL_ID = Menu.FIRST; private static final int TEST_ANIMATION_ID = CHANGE_LEVEL_ID + 1; private static final int TEST_DIARY_ID = CHANGE_LEVEL_ID + 2; private static final int METHOD_TRACING_ID = CHANGE_LEVEL_ID + 3; private static final int ROLL_TO_FACE_BUTTON_DELAY = 400; public static final int QUIT_GAME_DIALOG = 0; // If the version is a negative number, debug features (logging and a debug menu) // are enabled. public static final int VERSION = 14; private GLSurfaceView mGLSurfaceView; private Game mGame; private boolean mMethodTracing; private int mLevelRow; private int mLevelIndex; private float mTotalGameTime; private int mRobotsDestroyed; private int mPearlsCollected; private int mPearlsTotal; private int mLastEnding = -1; private int mLinearMode = 0; private int mDifficulty = 1; private boolean mExtrasUnlocked; private SensorManager mSensorManager; private SharedPreferences.Editor mPrefsEditor; private long mLastTouchTime = 0L; private long mLastRollTime = 0L; private View mPauseMessage = null; private View mWaitMessage = null; private View mLevelNameBox = null; private TextView mLevelName = null; private Animation mWaitFadeAnimation = null; private EventReporter mEventReporter; private Thread mEventReporterThread; private long mSessionId = 0L; /** Called when the activity is first created. */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences prefs = getSharedPreferences(PreferenceConstants.PREFERENCE_NAME, MODE_PRIVATE); final boolean debugLogs = prefs.getBoolean(PreferenceConstants.PREFERENCE_ENABLE_DEBUG, false); if (VERSION < 0 || debugLogs) { DebugLog.setDebugLogging(true); } else { DebugLog.setDebugLogging(false); } DebugLog.d("AndouKun", "onCreate"); setContentView(R.layout.main); mGLSurfaceView = (GLSurfaceView) findViewById(R.id.glsurfaceview); mPauseMessage = findViewById(R.id.pausedMessage); mWaitMessage = findViewById(R.id.pleaseWaitMessage); mLevelNameBox = findViewById(R.id.levelNameBox); mLevelName = (TextView)findViewById(R.id.levelName); mWaitFadeAnimation = AnimationUtils.loadAnimation(this, R.anim.wait_message_fade); //mGLSurfaceView.setGLWrapper(new GLErrorLogger()); mGLSurfaceView.setEGLConfigChooser(false); // 16 bit, no z-buffer //mGLSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR | GLSurfaceView.DEBUG_LOG_GL_CALLS); mGame = new Game(); mGame.setSurfaceView(mGLSurfaceView); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int defaultWidth = 480; int defaultHeight = 320; if (dm.widthPixels != defaultWidth) { float ratio =((float)dm.widthPixels) / dm.heightPixels; defaultWidth = (int)(defaultHeight * ratio); } mLevelRow = 0; mLevelIndex = 0; mPrefsEditor = prefs.edit(); // Make sure that old game information is cleared when we start a new game. // CTS: clear settings to force start from beginning mPrefsEditor.remove(PreferenceConstants.PREFERENCE_LEVEL_ROW); mPrefsEditor.remove(PreferenceConstants.PREFERENCE_LEVEL_INDEX); mPrefsEditor.remove(PreferenceConstants.PREFERENCE_LEVEL_COMPLETED); mPrefsEditor.remove(PreferenceConstants.PREFERENCE_LINEAR_MODE); mPrefsEditor.remove(PreferenceConstants.PREFERENCE_TOTAL_GAME_TIME); mPrefsEditor.remove(PreferenceConstants.PREFERENCE_PEARLS_COLLECTED); mPrefsEditor.remove(PreferenceConstants.PREFERENCE_PEARLS_TOTAL); mPrefsEditor.remove(PreferenceConstants.PREFERENCE_ROBOTS_DESTROYED); mPrefsEditor.remove(PreferenceConstants.PREFERENCE_DIFFICULTY); mPrefsEditor.commit(); mLevelRow = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_ROW, 0); mLevelIndex = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_INDEX, 0); int completed = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_COMPLETED, 0); mTotalGameTime = prefs.getFloat(PreferenceConstants.PREFERENCE_TOTAL_GAME_TIME, 0.0f); mRobotsDestroyed = prefs.getInt(PreferenceConstants.PREFERENCE_ROBOTS_DESTROYED, 0); mPearlsCollected = prefs.getInt(PreferenceConstants.PREFERENCE_PEARLS_COLLECTED, 0); mPearlsTotal = prefs.getInt(PreferenceConstants.PREFERENCE_PEARLS_TOTAL, 0); mLinearMode = prefs.getInt(PreferenceConstants.PREFERENCE_LINEAR_MODE, getIntent().getBooleanExtra("linearMode", false) ? 1 : 0); mExtrasUnlocked = prefs.getBoolean(PreferenceConstants.PREFERENCE_EXTRAS_UNLOCKED, false); mDifficulty = prefs.getInt(PreferenceConstants.PREFERENCE_DIFFICULTY, getIntent().getIntExtra("difficulty", 1)); mGame.bootstrap(this, dm.widthPixels, dm.heightPixels, defaultWidth, defaultHeight, mDifficulty); mGLSurfaceView.setRenderer(mGame.getRenderer()); int levelTreeResource = R.xml.level_tree; if (mLinearMode != 0) { levelTreeResource = R.xml.linear_level_tree; } // Android activity lifecycle rules make it possible for this activity to be created // and come to the foreground without the MainMenu Activity ever running, so in that // case we need to make sure that this static data is valid. if (!LevelTree.isLoaded(levelTreeResource)) { LevelTree.loadLevelTree(levelTreeResource, this); LevelTree.loadAllDialog(this); } if (getIntent().getBooleanExtra("startAtLevelSelect", false)) { Intent i = new Intent(this, LevelSelectActivity.class); i.putExtra("unlockAll", true); startActivityForResult(i, ACTIVITY_CHANGE_LEVELS); } else { if (!LevelTree.levelIsValid(mLevelRow, mLevelIndex)) { // bad data? Let's try to recover. // is the row valid? if (LevelTree.rowIsValid(mLevelRow)) { // In that case, just start the row over. mLevelIndex = 0; completed = 0; } else if (LevelTree.rowIsValid(mLevelRow - 1)) { // If not, try to back up a row. mLevelRow--; mLevelIndex = 0; completed = 0; } if (!LevelTree.levelIsValid(mLevelRow, mLevelIndex)) { // if all else fails, start the game over. mLevelRow = 0; mLevelIndex = 0; completed = 0; } } LevelTree.updateCompletedState(mLevelRow, completed); mGame.setPendingLevel(LevelTree.get(mLevelRow, mLevelIndex)); if (LevelTree.get(mLevelRow, mLevelIndex).showWaitMessage) { showWaitMessage(); } else { hideWaitMessage(); } } mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); // This activity uses the media stream. setVolumeControlStream(AudioManager.STREAM_MUSIC); mSessionId = prefs.getLong(PreferenceConstants.PREFERENCE_SESSION_ID, System.currentTimeMillis()); mEventReporter = null; mEventReporterThread = null; final boolean statsEnabled = prefs.getBoolean(PreferenceConstants.PREFERENCE_STATS_ENABLED, true); if (statsEnabled) { mEventReporter = new EventReporter(); mEventReporterThread = new Thread(mEventReporter); mEventReporterThread.setName("EventReporter"); mEventReporterThread.start(); } } @Override protected void onDestroy() { DebugLog.d("AndouKun", "onDestroy()"); mGame.stop(); if (mEventReporterThread != null) { mEventReporter.stop(); try { mEventReporterThread.join(); } catch (InterruptedException e) { mEventReporterThread.interrupt(); } } super.onDestroy(); } @Override protected void onPause() { super.onPause(); DebugLog.d("AndouKun", "onPause"); hidePauseMessage(); mGame.onPause(); mGLSurfaceView.onPause(); mGame.getRenderer().onPause(); // hack! if (mMethodTracing) { Debug.stopMethodTracing(); mMethodTracing = false; } if (mSensorManager != null) { mSensorManager.unregisterListener(this); } } @Override protected void onResume() { super.onResume(); // Preferences may have changed while we were paused. SharedPreferences prefs = getSharedPreferences(PreferenceConstants.PREFERENCE_NAME, MODE_PRIVATE); final boolean debugLogs = prefs.getBoolean(PreferenceConstants.PREFERENCE_ENABLE_DEBUG, false); if (VERSION < 0 || debugLogs) { DebugLog.setDebugLogging(true); } else { DebugLog.setDebugLogging(false); } DebugLog.d("AndouKun", "onResume"); mGLSurfaceView.onResume(); mGame.onResume(this, false); final boolean soundEnabled = prefs.getBoolean(PreferenceConstants.PREFERENCE_SOUND_ENABLED, true); final boolean safeMode = prefs.getBoolean(PreferenceConstants.PREFERENCE_SAFE_MODE, false); final boolean clickAttack = prefs.getBoolean(PreferenceConstants.PREFERENCE_CLICK_ATTACK, true); final boolean tiltControls = prefs.getBoolean(PreferenceConstants.PREFERENCE_TILT_CONTROLS, false); final int tiltSensitivity = prefs.getInt(PreferenceConstants.PREFERENCE_TILT_SENSITIVITY, 50); final int movementSensitivity = prefs.getInt(PreferenceConstants.PREFERENCE_MOVEMENT_SENSITIVITY, 100); final boolean onScreenControls = prefs.getBoolean(PreferenceConstants.PREFERENCE_SCREEN_CONTROLS, false); final int leftKey = prefs.getInt(PreferenceConstants.PREFERENCE_LEFT_KEY, KeyEvent.KEYCODE_DPAD_LEFT); final int rightKey = prefs.getInt(PreferenceConstants.PREFERENCE_RIGHT_KEY, KeyEvent.KEYCODE_DPAD_RIGHT); final int jumpKey = prefs.getInt(PreferenceConstants.PREFERENCE_JUMP_KEY, KeyEvent.KEYCODE_SPACE); final int attackKey = prefs.getInt(PreferenceConstants.PREFERENCE_ATTACK_KEY, KeyEvent.KEYCODE_SHIFT_LEFT); mGame.setSoundEnabled(soundEnabled); mGame.setControlOptions(clickAttack, tiltControls, tiltSensitivity, movementSensitivity, onScreenControls); mGame.setKeyConfig(leftKey, rightKey, jumpKey, attackKey); mGame.setSafeMode(safeMode); if (mSensorManager != null) { Sensor orientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); if (orientation != null) { mSensorManager.registerListener(this, orientation, SensorManager.SENSOR_DELAY_GAME, null); } } } @Override public boolean onTrackballEvent(MotionEvent event) { if (!mGame.isPaused()) { mGame.onTrackballEvent(event); final long time = System.currentTimeMillis(); mLastRollTime = time; } return true; } @Override public boolean onTouchEvent(MotionEvent event) { if (!mGame.isPaused()) { mGame.onTouchEvent(event); final long time = System.currentTimeMillis(); if (event.getAction() == MotionEvent.ACTION_MOVE && time - mLastTouchTime < 32) { // Sleep so that the main thread doesn't get flooded with UI events. try { Thread.sleep(32); } catch (InterruptedException e) { // No big deal if this sleep is interrupted. } mGame.getRenderer().waitDrawingComplete(); } mLastTouchTime = time; } return true; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { boolean result = true; if (keyCode == KeyEvent.KEYCODE_BACK) { final long time = System.currentTimeMillis(); if (time - mLastRollTime > ROLL_TO_FACE_BUTTON_DELAY && time - mLastTouchTime > ROLL_TO_FACE_BUTTON_DELAY) { showDialog(QUIT_GAME_DIALOG); result = true; } } else if (keyCode == KeyEvent.KEYCODE_MENU) { result = true; if (mGame.isPaused()) { hidePauseMessage(); mGame.onResume(this, true); } else { final long time = System.currentTimeMillis(); if (time - mLastRollTime > ROLL_TO_FACE_BUTTON_DELAY && time - mLastTouchTime > ROLL_TO_FACE_BUTTON_DELAY) { showPauseMessage(); mGame.onPause(); } if (VERSION < 0) { result = false; // Allow the debug menu to come up in debug mode. } } } else { result = mGame.onKeyDownEvent(keyCode); // Sleep so that the main thread doesn't get flooded with UI events. try { Thread.sleep(4); } catch (InterruptedException e) { // No big deal if this sleep is interrupted. } } return result; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { boolean result = false; if (keyCode == KeyEvent.KEYCODE_BACK) { result = true; } else if (keyCode == KeyEvent.KEYCODE_MENU){ if (VERSION < 0) { result = false; // Allow the debug menu to come up in debug mode. } } else { result = mGame.onKeyUpEvent(keyCode); // Sleep so that the main thread doesn't get flooded with UI events. try { Thread.sleep(4); } catch (InterruptedException e) { // No big deal if this sleep is interrupted. } } return result; } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); boolean handled = false; // Only allow the debug menu in development versions. if (VERSION < 0) { menu.add(0, CHANGE_LEVEL_ID, 0, R.string.change_level); menu.add(0, TEST_ANIMATION_ID, 0, R.string.test_animation); menu.add(0, TEST_DIARY_ID, 0, R.string.test_diary); menu.add(0, METHOD_TRACING_ID, 0, R.string.method_tracing); handled = true; } return handled; } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { Intent i; switch(item.getItemId()) { case CHANGE_LEVEL_ID: i = new Intent(this, LevelSelectActivity.class); startActivityForResult(i, ACTIVITY_CHANGE_LEVELS); return true; case TEST_ANIMATION_ID: i = new Intent(this, AnimationPlayerActivity.class); i.putExtra("animation", AnimationPlayerActivity.ROKUDOU_ENDING); startActivity(i); return true; case TEST_DIARY_ID: i = new Intent(this, DiaryActivity.class); i.putExtra("text", R.string.Diary10); startActivity(i); return true; case METHOD_TRACING_ID: if (mMethodTracing) { Debug.stopMethodTracing(); } else { Debug.startMethodTracing("andou"); } mMethodTracing = !mMethodTracing; return true; } return super.onMenuItemSelected(featureId, item); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (requestCode == ACTIVITY_CHANGE_LEVELS) { if (resultCode == RESULT_OK) { mLevelRow = intent.getExtras().getInt("row"); mLevelIndex = intent.getExtras().getInt("index"); LevelTree.updateCompletedState(mLevelRow, 0); saveGame(); mGame.setPendingLevel(LevelTree.get(mLevelRow, mLevelIndex)); if (LevelTree.get(mLevelRow, mLevelIndex).showWaitMessage) { showWaitMessage(); } else { hideWaitMessage(); } } } else if (requestCode == ACTIVITY_ANIMATION_PLAYER) { int lastAnimation = intent.getIntExtra("animation", -1); // record ending events. if (lastAnimation > -1) { mGame.setLastEnding(lastAnimation); } // on finishing animation playback, force a level change. onGameFlowEvent(GameFlowEvent.EVENT_GO_TO_NEXT_LEVEL, 0); } } /* * When the game thread needs to stop its own execution (to go to a new level, or restart the * current level), it registers a runnable on the main thread which orders the action via this * function. */ public void onGameFlowEvent(int eventCode, int index) { switch (eventCode) { case GameFlowEvent.EVENT_END_GAME: mGame.stop(); finish(); break; case GameFlowEvent.EVENT_RESTART_LEVEL: if (LevelTree.get(mLevelRow, mLevelIndex).restartable) { if (mEventReporter != null) { mEventReporter.addEvent(EventReporter.EVENT_DEATH, mGame.getLastDeathPosition().x, mGame.getLastDeathPosition().y, mGame.getGameTime(), LevelTree.get(mLevelRow, mLevelIndex).name, VERSION, mSessionId); } mGame.restartLevel(); break; } // else, fall through and go to the next level. case GameFlowEvent.EVENT_GO_TO_NEXT_LEVEL: LevelTree.get(mLevelRow, mLevelIndex).completed = true; final LevelTree.LevelGroup currentGroup = LevelTree.levels.get(mLevelRow); final int count = currentGroup.levels.size(); boolean groupCompleted = true; if (mEventReporter != null) { mEventReporter.addEvent(EventReporter.EVENT_BEAT_LEVEL, 0, 0, mGame.getGameTime(), LevelTree.get(mLevelRow, mLevelIndex).name, VERSION, mSessionId); } for (int x = 0; x < count; x++) { if (currentGroup.levels.get(x).completed == false) { // We haven't completed the group yet. mLevelIndex = x; groupCompleted = false; break; } } if (groupCompleted) { mLevelIndex = 0; mLevelRow++; } mTotalGameTime += mGame.getGameTime(); mRobotsDestroyed += mGame.getRobotsDestroyed(); mPearlsCollected += mGame.getPearlsCollected(); mPearlsTotal += mGame.getPearlsTotal(); if (mLevelRow < LevelTree.levels.size()) { final LevelTree.Level currentLevel = LevelTree.get(mLevelRow, mLevelIndex); if (currentLevel.inThePast || LevelTree.levels.get(mLevelRow).levels.size() > 1) { // go to the level select. Intent i = new Intent(this, LevelSelectActivity.class); startActivityForResult(i, ACTIVITY_CHANGE_LEVELS); if (UIConstants.mOverridePendingTransition != null) { try { UIConstants.mOverridePendingTransition.invoke(AndouKun.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"); } } } else { // go directly to the next level mGame.setPendingLevel(currentLevel); if (currentLevel.showWaitMessage) { showWaitMessage(); } else { hideWaitMessage(); } mGame.requestNewLevel(); } saveGame(); } else { if (mEventReporter != null) { mEventReporter.addEvent(EventReporter.EVENT_BEAT_GAME, 0, 0, mGame.getGameTime(), "end", VERSION, mSessionId); } // We beat the game! mLevelRow = 0; mLevelIndex = 0; mLastEnding = mGame.getLastEnding(); mExtrasUnlocked = true; saveGame(); mGame.stop(); Intent i = new Intent(this, GameOverActivity.class); startActivity(i); if (UIConstants.mOverridePendingTransition != null) { try { UIConstants.mOverridePendingTransition.invoke(AndouKun.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"); } } finish(); } break; case GameFlowEvent.EVENT_SHOW_DIARY: Intent i = new Intent(this, DiaryActivity.class); LevelTree.Level level = LevelTree.get(mLevelRow, mLevelIndex); level.diaryCollected = true; i.putExtra("text", level.dialogResources.diaryEntry); startActivity(i); if (UIConstants.mOverridePendingTransition != null) { try { UIConstants.mOverridePendingTransition.invoke(AndouKun.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"); } } break; case GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER1: i = new Intent(this, ConversationDialogActivity.class); i.putExtra("levelRow", mLevelRow); i.putExtra("levelIndex", mLevelIndex); i.putExtra("index", index); i.putExtra("character", 1); startActivity(i); break; case GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2: i = new Intent(this, ConversationDialogActivity.class); i.putExtra("levelRow", mLevelRow); i.putExtra("levelIndex", mLevelIndex); i.putExtra("index", index); i.putExtra("character", 2); startActivity(i); break; case GameFlowEvent.EVENT_SHOW_ANIMATION: i = new Intent(this, AnimationPlayerActivity.class); i.putExtra("animation", index); startActivityForResult(i, ACTIVITY_ANIMATION_PLAYER); if (UIConstants.mOverridePendingTransition != null) { try { UIConstants.mOverridePendingTransition.invoke(AndouKun.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"); } } break; } } protected void saveGame() { if (mPrefsEditor != null) { final int completed = LevelTree.packCompletedLevels(mLevelRow); mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_LEVEL_ROW, mLevelRow); mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_LEVEL_INDEX, mLevelIndex); mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_LEVEL_COMPLETED, completed); mPrefsEditor.putLong(PreferenceConstants.PREFERENCE_SESSION_ID, mSessionId); mPrefsEditor.putFloat(PreferenceConstants.PREFERENCE_TOTAL_GAME_TIME, mTotalGameTime); mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_LAST_ENDING, mLastEnding); mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_ROBOTS_DESTROYED, mRobotsDestroyed); mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_PEARLS_COLLECTED, mPearlsCollected); mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_PEARLS_TOTAL, mPearlsTotal); mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_LINEAR_MODE, mLinearMode); mPrefsEditor.putBoolean(PreferenceConstants.PREFERENCE_EXTRAS_UNLOCKED, mExtrasUnlocked); mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_DIFFICULTY, mDifficulty); mPrefsEditor.commit(); } } protected void showPauseMessage() { if (mPauseMessage != null) { mPauseMessage.setVisibility(View.VISIBLE); } if (mLevelNameBox != null && mLevelName != null) { mLevelName.setText(LevelTree.get(mLevelRow, mLevelIndex).name); mLevelNameBox.setVisibility(View.VISIBLE); } } protected void hidePauseMessage() { if (mPauseMessage != null) { mPauseMessage.setVisibility(View.GONE); } if (mLevelNameBox != null) { mLevelNameBox.setVisibility(View.GONE); } } protected void showWaitMessage() { if (mWaitMessage != null) { mWaitMessage.setVisibility(View.VISIBLE); mWaitMessage.startAnimation(mWaitFadeAnimation); } } protected void hideWaitMessage() { if (mWaitMessage != null) { mWaitMessage.setVisibility(View.GONE); mWaitMessage.clearAnimation(); } } public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } public void onSensorChanged(SensorEvent event) { synchronized (this) { if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { final float x = event.values[1]; final float y = event.values[2]; final float z = event.values[0]; mGame.onOrientationEvent(x, y, z); } } } @Override protected Dialog onCreateDialog(int id) { Dialog dialog = null; if (id == QUIT_GAME_DIALOG) { dialog = new AlertDialog.Builder(this) .setTitle(R.string.quit_game_dialog_title) .setPositiveButton(R.string.quit_game_dialog_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { finish(); if (UIConstants.mOverridePendingTransition != null) { try { UIConstants.mOverridePendingTransition.invoke(AndouKun.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"); } } } }) .setNegativeButton(R.string.quit_game_dialog_cancel, null) .setMessage(R.string.quit_game_dialog_message) .create(); } return dialog; } }