1cfd74d65d832137e20e193c960802afba73b5d38sm/*
23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project
3cfd74d65d832137e20e193c960802afba73b5d38sm *
4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License");
5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License.
6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at
7cfd74d65d832137e20e193c960802afba73b5d38sm *
8cfd74d65d832137e20e193c960802afba73b5d38sm *      http://www.apache.org/licenses/LICENSE-2.0
9cfd74d65d832137e20e193c960802afba73b5d38sm *
10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software
11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS,
12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and
14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License.
15cfd74d65d832137e20e193c960802afba73b5d38sm */
16cfd74d65d832137e20e193c960802afba73b5d38sm
17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland;
18cfd74d65d832137e20e193c960802afba73b5d38sm
192b1168acefb6a4104bb7f008df6ac51fcd1de7ecsmimport java.lang.reflect.InvocationTargetException;
202b1168acefb6a4104bb7f008df6ac51fcd1de7ecsmimport java.lang.reflect.Method;
212b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
22cfd74d65d832137e20e193c960802afba73b5d38smimport android.app.Activity;
23cfd74d65d832137e20e193c960802afba73b5d38smimport android.app.AlertDialog;
24cfd74d65d832137e20e193c960802afba73b5d38smimport android.app.Dialog;
25cfd74d65d832137e20e193c960802afba73b5d38smimport android.content.DialogInterface;
26cfd74d65d832137e20e193c960802afba73b5d38smimport android.content.Intent;
27cfd74d65d832137e20e193c960802afba73b5d38smimport android.content.SharedPreferences;
28cfd74d65d832137e20e193c960802afba73b5d38smimport android.hardware.Sensor;
29cfd74d65d832137e20e193c960802afba73b5d38smimport android.hardware.SensorEvent;
30cfd74d65d832137e20e193c960802afba73b5d38smimport android.hardware.SensorEventListener;
31cfd74d65d832137e20e193c960802afba73b5d38smimport android.hardware.SensorManager;
32cfd74d65d832137e20e193c960802afba73b5d38smimport android.media.AudioManager;
33cfd74d65d832137e20e193c960802afba73b5d38smimport android.os.Bundle;
34cfd74d65d832137e20e193c960802afba73b5d38smimport android.os.Debug;
35cfd74d65d832137e20e193c960802afba73b5d38smimport android.util.DisplayMetrics;
36cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.KeyEvent;
37cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.Menu;
38cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.MenuItem;
39cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.MotionEvent;
40cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.View;
41cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.animation.Animation;
42cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.animation.AnimationUtils;
432b1168acefb6a4104bb7f008df6ac51fcd1de7ecsmimport android.widget.TextView;
44cfd74d65d832137e20e193c960802afba73b5d38sm
45cfd74d65d832137e20e193c960802afba73b5d38sm/**
46cfd74d65d832137e20e193c960802afba73b5d38sm * Core activity for the game.  Sets up a surface view for OpenGL, bootstraps
47cfd74d65d832137e20e193c960802afba73b5d38sm * the game engine, and manages UI events.  Also manages game progression,
48cfd74d65d832137e20e193c960802afba73b5d38sm * transitioning to other activites, save game, and input events.
49cfd74d65d832137e20e193c960802afba73b5d38sm */
50cfd74d65d832137e20e193c960802afba73b5d38smpublic class AndouKun extends Activity implements SensorEventListener {
51cfd74d65d832137e20e193c960802afba73b5d38sm    private static final int ACTIVITY_CHANGE_LEVELS = 0;
52cfd74d65d832137e20e193c960802afba73b5d38sm    private static final int ACTIVITY_CONVERSATION = 1;
53cfd74d65d832137e20e193c960802afba73b5d38sm    private static final int ACTIVITY_DIARY = 2;
54cfd74d65d832137e20e193c960802afba73b5d38sm    private static final int ACTIVITY_ANIMATION_PLAYER = 3;
55cfd74d65d832137e20e193c960802afba73b5d38sm
56cfd74d65d832137e20e193c960802afba73b5d38sm    private static final int CHANGE_LEVEL_ID = Menu.FIRST;
57cfd74d65d832137e20e193c960802afba73b5d38sm    private static final int TEST_ANIMATION_ID = CHANGE_LEVEL_ID + 1;
58cfd74d65d832137e20e193c960802afba73b5d38sm    private static final int TEST_DIARY_ID = CHANGE_LEVEL_ID + 2;
59cfd74d65d832137e20e193c960802afba73b5d38sm    private static final int METHOD_TRACING_ID = CHANGE_LEVEL_ID + 3;
60cfd74d65d832137e20e193c960802afba73b5d38sm
61cfd74d65d832137e20e193c960802afba73b5d38sm    private static final int ROLL_TO_FACE_BUTTON_DELAY = 400;
62cfd74d65d832137e20e193c960802afba73b5d38sm
63cfd74d65d832137e20e193c960802afba73b5d38sm    public static final int QUIT_GAME_DIALOG = 0;
64cfd74d65d832137e20e193c960802afba73b5d38sm
65cfd74d65d832137e20e193c960802afba73b5d38sm    // If the version is a negative number, debug features (logging and a debug menu)
66cfd74d65d832137e20e193c960802afba73b5d38sm    // are enabled.
672b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    public static final int VERSION = 14;
68cfd74d65d832137e20e193c960802afba73b5d38sm
69cfd74d65d832137e20e193c960802afba73b5d38sm    private GLSurfaceView mGLSurfaceView;
70cfd74d65d832137e20e193c960802afba73b5d38sm    private Game mGame;
71cfd74d65d832137e20e193c960802afba73b5d38sm    private boolean mMethodTracing;
72cfd74d65d832137e20e193c960802afba73b5d38sm    private int mLevelRow;
73cfd74d65d832137e20e193c960802afba73b5d38sm    private int mLevelIndex;
742b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private float mTotalGameTime;
752b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private int mRobotsDestroyed;
762b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private int mPearlsCollected;
772b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private int mPearlsTotal;
782b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private int mLastEnding = -1;
792b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private int mLinearMode = 0;
802b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private int mDifficulty = 1;
812b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private boolean mExtrasUnlocked;
82cfd74d65d832137e20e193c960802afba73b5d38sm    private SensorManager mSensorManager;
83cfd74d65d832137e20e193c960802afba73b5d38sm    private SharedPreferences.Editor mPrefsEditor;
84cfd74d65d832137e20e193c960802afba73b5d38sm    private long mLastTouchTime = 0L;
85cfd74d65d832137e20e193c960802afba73b5d38sm    private long mLastRollTime = 0L;
86cfd74d65d832137e20e193c960802afba73b5d38sm    private View mPauseMessage = null;
87cfd74d65d832137e20e193c960802afba73b5d38sm    private View mWaitMessage = null;
882b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private View mLevelNameBox = null;
892b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private TextView mLevelName = null;
90cfd74d65d832137e20e193c960802afba73b5d38sm    private Animation mWaitFadeAnimation = null;
91cfd74d65d832137e20e193c960802afba73b5d38sm
92cfd74d65d832137e20e193c960802afba73b5d38sm    private EventReporter mEventReporter;
93cfd74d65d832137e20e193c960802afba73b5d38sm    private Thread mEventReporterThread;
94cfd74d65d832137e20e193c960802afba73b5d38sm
95cfd74d65d832137e20e193c960802afba73b5d38sm    private long mSessionId = 0L;
96cfd74d65d832137e20e193c960802afba73b5d38sm
97cfd74d65d832137e20e193c960802afba73b5d38sm    /** Called when the activity is first created. */
98cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
99cfd74d65d832137e20e193c960802afba73b5d38sm    protected void onCreate(Bundle savedInstanceState) {
100cfd74d65d832137e20e193c960802afba73b5d38sm        super.onCreate(savedInstanceState);
101e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm
1022b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        SharedPreferences prefs = getSharedPreferences(PreferenceConstants.PREFERENCE_NAME, MODE_PRIVATE);
1032b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final boolean debugLogs = prefs.getBoolean(PreferenceConstants.PREFERENCE_ENABLE_DEBUG, false);
104e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm
105e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm        if (VERSION < 0 || debugLogs) {
106cfd74d65d832137e20e193c960802afba73b5d38sm        	DebugLog.setDebugLogging(true);
107cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
108cfd74d65d832137e20e193c960802afba73b5d38sm        	DebugLog.setDebugLogging(false);
109cfd74d65d832137e20e193c960802afba73b5d38sm        }
110cfd74d65d832137e20e193c960802afba73b5d38sm
111cfd74d65d832137e20e193c960802afba73b5d38sm        DebugLog.d("AndouKun", "onCreate");
112cfd74d65d832137e20e193c960802afba73b5d38sm
113cfd74d65d832137e20e193c960802afba73b5d38sm
114cfd74d65d832137e20e193c960802afba73b5d38sm        setContentView(R.layout.main);
115cfd74d65d832137e20e193c960802afba73b5d38sm        mGLSurfaceView = (GLSurfaceView) findViewById(R.id.glsurfaceview);
116cfd74d65d832137e20e193c960802afba73b5d38sm        mPauseMessage = findViewById(R.id.pausedMessage);
117cfd74d65d832137e20e193c960802afba73b5d38sm        mWaitMessage = findViewById(R.id.pleaseWaitMessage);
1182b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mLevelNameBox = findViewById(R.id.levelNameBox);
1192b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mLevelName = (TextView)findViewById(R.id.levelName);
120cfd74d65d832137e20e193c960802afba73b5d38sm        mWaitFadeAnimation = AnimationUtils.loadAnimation(this, R.anim.wait_message_fade);
121cfd74d65d832137e20e193c960802afba73b5d38sm
122cfd74d65d832137e20e193c960802afba73b5d38sm
123cfd74d65d832137e20e193c960802afba73b5d38sm        //mGLSurfaceView.setGLWrapper(new GLErrorLogger());
124cfd74d65d832137e20e193c960802afba73b5d38sm        mGLSurfaceView.setEGLConfigChooser(false); // 16 bit, no z-buffer
1259d4cc2572d37983607df38b0f4216ed76ac51814sm        //mGLSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR | GLSurfaceView.DEBUG_LOG_GL_CALLS);
126cfd74d65d832137e20e193c960802afba73b5d38sm        mGame = new Game();
127cfd74d65d832137e20e193c960802afba73b5d38sm        mGame.setSurfaceView(mGLSurfaceView);
128cfd74d65d832137e20e193c960802afba73b5d38sm        DisplayMetrics dm = new DisplayMetrics();
129cfd74d65d832137e20e193c960802afba73b5d38sm        getWindowManager().getDefaultDisplay().getMetrics(dm);
130cfd74d65d832137e20e193c960802afba73b5d38sm
131cfd74d65d832137e20e193c960802afba73b5d38sm        int defaultWidth = 480;
132cfd74d65d832137e20e193c960802afba73b5d38sm        int defaultHeight = 320;
133cfd74d65d832137e20e193c960802afba73b5d38sm        if (dm.widthPixels != defaultWidth) {
134cfd74d65d832137e20e193c960802afba73b5d38sm        	float ratio =((float)dm.widthPixels) / dm.heightPixels;
135cfd74d65d832137e20e193c960802afba73b5d38sm        	defaultWidth = (int)(defaultHeight * ratio);
136cfd74d65d832137e20e193c960802afba73b5d38sm        }
137cfd74d65d832137e20e193c960802afba73b5d38sm
1382b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
139cfd74d65d832137e20e193c960802afba73b5d38sm        mLevelRow = 0;
140cfd74d65d832137e20e193c960802afba73b5d38sm        mLevelIndex = 0;
141cfd74d65d832137e20e193c960802afba73b5d38sm
142e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm
143cfd74d65d832137e20e193c960802afba73b5d38sm        mPrefsEditor = prefs.edit();
1442b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        // Make sure that old game information is cleared when we start a new game.
1456cb78e547641bcab6f18ec34badca0840e000992Keun young Park        // CTS: clear settings to force start from beginning
1466cb78e547641bcab6f18ec34badca0840e000992Keun young Park        mPrefsEditor.remove(PreferenceConstants.PREFERENCE_LEVEL_ROW);
1476cb78e547641bcab6f18ec34badca0840e000992Keun young Park        mPrefsEditor.remove(PreferenceConstants.PREFERENCE_LEVEL_INDEX);
1486cb78e547641bcab6f18ec34badca0840e000992Keun young Park        mPrefsEditor.remove(PreferenceConstants.PREFERENCE_LEVEL_COMPLETED);
1496cb78e547641bcab6f18ec34badca0840e000992Keun young Park        mPrefsEditor.remove(PreferenceConstants.PREFERENCE_LINEAR_MODE);
1506cb78e547641bcab6f18ec34badca0840e000992Keun young Park        mPrefsEditor.remove(PreferenceConstants.PREFERENCE_TOTAL_GAME_TIME);
1516cb78e547641bcab6f18ec34badca0840e000992Keun young Park        mPrefsEditor.remove(PreferenceConstants.PREFERENCE_PEARLS_COLLECTED);
1526cb78e547641bcab6f18ec34badca0840e000992Keun young Park        mPrefsEditor.remove(PreferenceConstants.PREFERENCE_PEARLS_TOTAL);
1536cb78e547641bcab6f18ec34badca0840e000992Keun young Park        mPrefsEditor.remove(PreferenceConstants.PREFERENCE_ROBOTS_DESTROYED);
1546cb78e547641bcab6f18ec34badca0840e000992Keun young Park        mPrefsEditor.remove(PreferenceConstants.PREFERENCE_DIFFICULTY);
1556cb78e547641bcab6f18ec34badca0840e000992Keun young Park        mPrefsEditor.commit();
1562b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
1572b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
1582b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mLevelRow = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_ROW, 0);
1592b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mLevelIndex = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_INDEX, 0);
1602b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        int completed = prefs.getInt(PreferenceConstants.PREFERENCE_LEVEL_COMPLETED, 0);
1612b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mTotalGameTime = prefs.getFloat(PreferenceConstants.PREFERENCE_TOTAL_GAME_TIME, 0.0f);
1622b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mRobotsDestroyed = prefs.getInt(PreferenceConstants.PREFERENCE_ROBOTS_DESTROYED, 0);
1632b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mPearlsCollected = prefs.getInt(PreferenceConstants.PREFERENCE_PEARLS_COLLECTED, 0);
1642b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mPearlsTotal = prefs.getInt(PreferenceConstants.PREFERENCE_PEARLS_TOTAL, 0);
1652b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mLinearMode = prefs.getInt(PreferenceConstants.PREFERENCE_LINEAR_MODE,
1662b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        		getIntent().getBooleanExtra("linearMode", false) ? 1 : 0);
1672b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mExtrasUnlocked = prefs.getBoolean(PreferenceConstants.PREFERENCE_EXTRAS_UNLOCKED, false);
1682b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mDifficulty = prefs.getInt(PreferenceConstants.PREFERENCE_DIFFICULTY, getIntent().getIntExtra("difficulty", 1));
1692b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
1702b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mGame.bootstrap(this, dm.widthPixels, dm.heightPixels, defaultWidth, defaultHeight, mDifficulty);
1712b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mGLSurfaceView.setRenderer(mGame.getRenderer());
1722b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
1732b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
1742b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        int levelTreeResource = R.xml.level_tree;
1752b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	    if (mLinearMode != 0) {
1762b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	    	levelTreeResource = R.xml.linear_level_tree;
1772b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	    }
1782b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
179cfd74d65d832137e20e193c960802afba73b5d38sm
180cfd74d65d832137e20e193c960802afba73b5d38sm        // Android activity lifecycle rules make it possible for this activity to be created
181cfd74d65d832137e20e193c960802afba73b5d38sm        // and come to the foreground without the MainMenu Activity ever running, so in that
182cfd74d65d832137e20e193c960802afba73b5d38sm        // case we need to make sure that this static data is valid.
1832b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        if (!LevelTree.isLoaded(levelTreeResource)) {
1842b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	LevelTree.loadLevelTree(levelTreeResource, this);
185cfd74d65d832137e20e193c960802afba73b5d38sm        	LevelTree.loadAllDialog(this);
186cfd74d65d832137e20e193c960802afba73b5d38sm        }
187cfd74d65d832137e20e193c960802afba73b5d38sm
1882b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        if (getIntent().getBooleanExtra("startAtLevelSelect", false)) {
1892b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	Intent i = new Intent(this, LevelSelectActivity.class);
1902b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	i.putExtra("unlockAll", true);
1912b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            startActivityForResult(i, ACTIVITY_CHANGE_LEVELS);
192cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
1932b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        if (!LevelTree.levelIsValid(mLevelRow, mLevelIndex)) {
1942b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        	// bad data?  Let's try to recover.
1952b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
1962b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        	// is the row valid?
1972b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        	if (LevelTree.rowIsValid(mLevelRow)) {
1982b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        		// In that case, just start the row over.
1992b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        		mLevelIndex = 0;
2002b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        		completed = 0;
2012b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        	} else if (LevelTree.rowIsValid(mLevelRow - 1)) {
2022b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        		// If not, try to back up a row.
2032b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        		mLevelRow--;
2042b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        		mLevelIndex = 0;
2052b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        		completed = 0;
2062b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        	}
2072b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
2082b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
2092b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        	if (!LevelTree.levelIsValid(mLevelRow, mLevelIndex)) {
2102b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		        	// if all else fails, start the game over.
2112b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		        	mLevelRow = 0;
2122b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		        	mLevelIndex = 0;
2132b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		        	completed = 0;
2142b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        	}
2152b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        }
2162b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
2172b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        LevelTree.updateCompletedState(mLevelRow, completed);
2182b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
2192b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        mGame.setPendingLevel(LevelTree.get(mLevelRow, mLevelIndex));
2202b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        if (LevelTree.get(mLevelRow, mLevelIndex).showWaitMessage) {
2212b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	    		showWaitMessage();
2222b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        } else {
2232b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	    		hideWaitMessage();
2242b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	        }
225cfd74d65d832137e20e193c960802afba73b5d38sm        }
226cfd74d65d832137e20e193c960802afba73b5d38sm        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
227cfd74d65d832137e20e193c960802afba73b5d38sm
228cfd74d65d832137e20e193c960802afba73b5d38sm        // This activity uses the media stream.
229cfd74d65d832137e20e193c960802afba73b5d38sm        setVolumeControlStream(AudioManager.STREAM_MUSIC);
230cfd74d65d832137e20e193c960802afba73b5d38sm
231cfd74d65d832137e20e193c960802afba73b5d38sm
2322b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mSessionId = prefs.getLong(PreferenceConstants.PREFERENCE_SESSION_ID, System.currentTimeMillis());
233cfd74d65d832137e20e193c960802afba73b5d38sm
234cfd74d65d832137e20e193c960802afba73b5d38sm
235cfd74d65d832137e20e193c960802afba73b5d38sm        mEventReporter = null;
236cfd74d65d832137e20e193c960802afba73b5d38sm        mEventReporterThread = null;
2372b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final boolean statsEnabled = prefs.getBoolean(PreferenceConstants.PREFERENCE_STATS_ENABLED, true);
238cfd74d65d832137e20e193c960802afba73b5d38sm        if (statsEnabled) {
239cfd74d65d832137e20e193c960802afba73b5d38sm	        mEventReporter = new EventReporter();
240cfd74d65d832137e20e193c960802afba73b5d38sm	        mEventReporterThread = new Thread(mEventReporter);
241cfd74d65d832137e20e193c960802afba73b5d38sm	        mEventReporterThread.setName("EventReporter");
242cfd74d65d832137e20e193c960802afba73b5d38sm	        mEventReporterThread.start();
243cfd74d65d832137e20e193c960802afba73b5d38sm        }
244cfd74d65d832137e20e193c960802afba73b5d38sm    }
245cfd74d65d832137e20e193c960802afba73b5d38sm
246cfd74d65d832137e20e193c960802afba73b5d38sm
247cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
248cfd74d65d832137e20e193c960802afba73b5d38sm    protected void onDestroy() {
249cfd74d65d832137e20e193c960802afba73b5d38sm        DebugLog.d("AndouKun", "onDestroy()");
250cfd74d65d832137e20e193c960802afba73b5d38sm        mGame.stop();
251cfd74d65d832137e20e193c960802afba73b5d38sm        if (mEventReporterThread != null) {
252cfd74d65d832137e20e193c960802afba73b5d38sm	        mEventReporter.stop();
253cfd74d65d832137e20e193c960802afba73b5d38sm	        try {
254cfd74d65d832137e20e193c960802afba73b5d38sm				mEventReporterThread.join();
255cfd74d65d832137e20e193c960802afba73b5d38sm			} catch (InterruptedException e) {
256cfd74d65d832137e20e193c960802afba73b5d38sm				mEventReporterThread.interrupt();
257cfd74d65d832137e20e193c960802afba73b5d38sm			}
258cfd74d65d832137e20e193c960802afba73b5d38sm        }
259cfd74d65d832137e20e193c960802afba73b5d38sm        super.onDestroy();
260cfd74d65d832137e20e193c960802afba73b5d38sm
261cfd74d65d832137e20e193c960802afba73b5d38sm    }
262cfd74d65d832137e20e193c960802afba73b5d38sm
263cfd74d65d832137e20e193c960802afba73b5d38sm
264cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
265cfd74d65d832137e20e193c960802afba73b5d38sm    protected void onPause() {
266cfd74d65d832137e20e193c960802afba73b5d38sm        super.onPause();
267cfd74d65d832137e20e193c960802afba73b5d38sm        DebugLog.d("AndouKun", "onPause");
268cfd74d65d832137e20e193c960802afba73b5d38sm
269cfd74d65d832137e20e193c960802afba73b5d38sm        hidePauseMessage();
270cfd74d65d832137e20e193c960802afba73b5d38sm
271cfd74d65d832137e20e193c960802afba73b5d38sm        mGame.onPause();
272cfd74d65d832137e20e193c960802afba73b5d38sm        mGLSurfaceView.onPause();
273cfd74d65d832137e20e193c960802afba73b5d38sm        mGame.getRenderer().onPause();	// hack!
274cfd74d65d832137e20e193c960802afba73b5d38sm
275cfd74d65d832137e20e193c960802afba73b5d38sm        if (mMethodTracing) {
276cfd74d65d832137e20e193c960802afba73b5d38sm            Debug.stopMethodTracing();
277cfd74d65d832137e20e193c960802afba73b5d38sm            mMethodTracing = false;
278cfd74d65d832137e20e193c960802afba73b5d38sm        }
279cfd74d65d832137e20e193c960802afba73b5d38sm        if (mSensorManager != null) {
280cfd74d65d832137e20e193c960802afba73b5d38sm            mSensorManager.unregisterListener(this);
281cfd74d65d832137e20e193c960802afba73b5d38sm        }
282cfd74d65d832137e20e193c960802afba73b5d38sm    }
283cfd74d65d832137e20e193c960802afba73b5d38sm
284cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
285cfd74d65d832137e20e193c960802afba73b5d38sm    protected void onResume() {
286cfd74d65d832137e20e193c960802afba73b5d38sm        super.onResume();
287e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm
288e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm        // Preferences may have changed while we were paused.
2892b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        SharedPreferences prefs = getSharedPreferences(PreferenceConstants.PREFERENCE_NAME, MODE_PRIVATE);
2902b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final boolean debugLogs = prefs.getBoolean(PreferenceConstants.PREFERENCE_ENABLE_DEBUG, false);
291e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm
292e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm        if (VERSION < 0 || debugLogs) {
293e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm        	DebugLog.setDebugLogging(true);
294e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm        } else {
295e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm        	DebugLog.setDebugLogging(false);
296e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm        }
297e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm
298cfd74d65d832137e20e193c960802afba73b5d38sm        DebugLog.d("AndouKun", "onResume");
299cfd74d65d832137e20e193c960802afba73b5d38sm        mGLSurfaceView.onResume();
300cfd74d65d832137e20e193c960802afba73b5d38sm        mGame.onResume(this, false);
301e1fe50fadc9160b2c4ee09350b781c9b80d54e1fsm
302cfd74d65d832137e20e193c960802afba73b5d38sm
3032b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final boolean soundEnabled = prefs.getBoolean(PreferenceConstants.PREFERENCE_SOUND_ENABLED, true);
3042b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final boolean safeMode = prefs.getBoolean(PreferenceConstants.PREFERENCE_SAFE_MODE, false);
3052b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final boolean clickAttack = prefs.getBoolean(PreferenceConstants.PREFERENCE_CLICK_ATTACK, true);
3062b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final boolean tiltControls = prefs.getBoolean(PreferenceConstants.PREFERENCE_TILT_CONTROLS, false);
3072b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final int tiltSensitivity = prefs.getInt(PreferenceConstants.PREFERENCE_TILT_SENSITIVITY, 50);
3082b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final int movementSensitivity = prefs.getInt(PreferenceConstants.PREFERENCE_MOVEMENT_SENSITIVITY, 100);
3092b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final boolean onScreenControls = prefs.getBoolean(PreferenceConstants.PREFERENCE_SCREEN_CONTROLS, false);
3102b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
3112b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final int leftKey = prefs.getInt(PreferenceConstants.PREFERENCE_LEFT_KEY, KeyEvent.KEYCODE_DPAD_LEFT);
3122b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final int rightKey = prefs.getInt(PreferenceConstants.PREFERENCE_RIGHT_KEY, KeyEvent.KEYCODE_DPAD_RIGHT);
3132b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final int jumpKey = prefs.getInt(PreferenceConstants.PREFERENCE_JUMP_KEY, KeyEvent.KEYCODE_SPACE);
3142b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final int attackKey = prefs.getInt(PreferenceConstants.PREFERENCE_ATTACK_KEY, KeyEvent.KEYCODE_SHIFT_LEFT);
315cfd74d65d832137e20e193c960802afba73b5d38sm
316cfd74d65d832137e20e193c960802afba73b5d38sm        mGame.setSoundEnabled(soundEnabled);
3172b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mGame.setControlOptions(clickAttack, tiltControls, tiltSensitivity, movementSensitivity, onScreenControls);
3183c1e67e433728684b5f228c5d4f3e5b1457bb271sm        mGame.setKeyConfig(leftKey, rightKey, jumpKey, attackKey);
3199d4cc2572d37983607df38b0f4216ed76ac51814sm        mGame.setSafeMode(safeMode);
320cfd74d65d832137e20e193c960802afba73b5d38sm
321cfd74d65d832137e20e193c960802afba73b5d38sm        if (mSensorManager != null) {
322cfd74d65d832137e20e193c960802afba73b5d38sm            Sensor orientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
323cfd74d65d832137e20e193c960802afba73b5d38sm            if (orientation != null) {
324cfd74d65d832137e20e193c960802afba73b5d38sm                mSensorManager.registerListener(this,
325cfd74d65d832137e20e193c960802afba73b5d38sm                    orientation,
326cfd74d65d832137e20e193c960802afba73b5d38sm                    SensorManager.SENSOR_DELAY_GAME,
327cfd74d65d832137e20e193c960802afba73b5d38sm                    null);
328cfd74d65d832137e20e193c960802afba73b5d38sm            }
329cfd74d65d832137e20e193c960802afba73b5d38sm        }
330cfd74d65d832137e20e193c960802afba73b5d38sm    }
331cfd74d65d832137e20e193c960802afba73b5d38sm
332cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
333cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onTrackballEvent(MotionEvent event) {
3349d4cc2572d37983607df38b0f4216ed76ac51814sm    	if (!mGame.isPaused()) {
3359d4cc2572d37983607df38b0f4216ed76ac51814sm	        mGame.onTrackballEvent(event);
3369d4cc2572d37983607df38b0f4216ed76ac51814sm	        final long time = System.currentTimeMillis();
3379d4cc2572d37983607df38b0f4216ed76ac51814sm	        mLastRollTime = time;
3389d4cc2572d37983607df38b0f4216ed76ac51814sm    	}
339cfd74d65d832137e20e193c960802afba73b5d38sm        return true;
340cfd74d65d832137e20e193c960802afba73b5d38sm    }
341cfd74d65d832137e20e193c960802afba73b5d38sm
342cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
343cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onTouchEvent(MotionEvent event) {
3449d4cc2572d37983607df38b0f4216ed76ac51814sm    	if (!mGame.isPaused()) {
3459d4cc2572d37983607df38b0f4216ed76ac51814sm    		mGame.onTouchEvent(event);
3469d4cc2572d37983607df38b0f4216ed76ac51814sm
3479d4cc2572d37983607df38b0f4216ed76ac51814sm	        final long time = System.currentTimeMillis();
3489d4cc2572d37983607df38b0f4216ed76ac51814sm	        if (event.getAction() == MotionEvent.ACTION_MOVE && time - mLastTouchTime < 32) {
3499d4cc2572d37983607df38b0f4216ed76ac51814sm		        // Sleep so that the main thread doesn't get flooded with UI events.
3509d4cc2572d37983607df38b0f4216ed76ac51814sm		        try {
3519d4cc2572d37983607df38b0f4216ed76ac51814sm		            Thread.sleep(32);
3529d4cc2572d37983607df38b0f4216ed76ac51814sm		        } catch (InterruptedException e) {
3539d4cc2572d37983607df38b0f4216ed76ac51814sm		            // No big deal if this sleep is interrupted.
3549d4cc2572d37983607df38b0f4216ed76ac51814sm		        }
3559d4cc2572d37983607df38b0f4216ed76ac51814sm		        mGame.getRenderer().waitDrawingComplete();
356cfd74d65d832137e20e193c960802afba73b5d38sm	        }
3579d4cc2572d37983607df38b0f4216ed76ac51814sm	        mLastTouchTime = time;
3589d4cc2572d37983607df38b0f4216ed76ac51814sm    	}
359cfd74d65d832137e20e193c960802afba73b5d38sm        return true;
360cfd74d65d832137e20e193c960802afba73b5d38sm    }
361cfd74d65d832137e20e193c960802afba73b5d38sm
362cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
363cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onKeyDown(int keyCode, KeyEvent event) {
364cfd74d65d832137e20e193c960802afba73b5d38sm    	boolean result = true;
365cfd74d65d832137e20e193c960802afba73b5d38sm    	if (keyCode == KeyEvent.KEYCODE_BACK) {
366cfd74d65d832137e20e193c960802afba73b5d38sm			final long time = System.currentTimeMillis();
3672b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		if (time - mLastRollTime > ROLL_TO_FACE_BUTTON_DELAY &&
3682b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    				time - mLastTouchTime > ROLL_TO_FACE_BUTTON_DELAY) {
369cfd74d65d832137e20e193c960802afba73b5d38sm    			showDialog(QUIT_GAME_DIALOG);
370cfd74d65d832137e20e193c960802afba73b5d38sm    			result = true;
371cfd74d65d832137e20e193c960802afba73b5d38sm    		}
372cfd74d65d832137e20e193c960802afba73b5d38sm    	} else if (keyCode == KeyEvent.KEYCODE_MENU) {
373cfd74d65d832137e20e193c960802afba73b5d38sm    		result = true;
374cfd74d65d832137e20e193c960802afba73b5d38sm    		if (mGame.isPaused()) {
375cfd74d65d832137e20e193c960802afba73b5d38sm    			hidePauseMessage();
376cfd74d65d832137e20e193c960802afba73b5d38sm    			mGame.onResume(this, true);
377cfd74d65d832137e20e193c960802afba73b5d38sm    		} else {
378cfd74d65d832137e20e193c960802afba73b5d38sm    			final long time = System.currentTimeMillis();
3792b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	        if (time - mLastRollTime > ROLL_TO_FACE_BUTTON_DELAY &&
3802b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	        		time - mLastTouchTime > ROLL_TO_FACE_BUTTON_DELAY) {
381cfd74d65d832137e20e193c960802afba73b5d38sm    	        	showPauseMessage();
382cfd74d65d832137e20e193c960802afba73b5d38sm    	        	mGame.onPause();
383cfd74d65d832137e20e193c960802afba73b5d38sm    	        }
384cfd74d65d832137e20e193c960802afba73b5d38sm    	        if (VERSION < 0) {
385cfd74d65d832137e20e193c960802afba73b5d38sm    	        	result = false;	// Allow the debug menu to come up in debug mode.
386cfd74d65d832137e20e193c960802afba73b5d38sm    	        }
387cfd74d65d832137e20e193c960802afba73b5d38sm    		}
388cfd74d65d832137e20e193c960802afba73b5d38sm    	} else {
389cfd74d65d832137e20e193c960802afba73b5d38sm		    result = mGame.onKeyDownEvent(keyCode);
390cfd74d65d832137e20e193c960802afba73b5d38sm		    // Sleep so that the main thread doesn't get flooded with UI events.
391cfd74d65d832137e20e193c960802afba73b5d38sm		    try {
392cfd74d65d832137e20e193c960802afba73b5d38sm		        Thread.sleep(4);
393cfd74d65d832137e20e193c960802afba73b5d38sm		    } catch (InterruptedException e) {
394cfd74d65d832137e20e193c960802afba73b5d38sm		        // No big deal if this sleep is interrupted.
395cfd74d65d832137e20e193c960802afba73b5d38sm		    }
396cfd74d65d832137e20e193c960802afba73b5d38sm    	}
397cfd74d65d832137e20e193c960802afba73b5d38sm        return result;
398cfd74d65d832137e20e193c960802afba73b5d38sm    }
399cfd74d65d832137e20e193c960802afba73b5d38sm
400cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
401cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onKeyUp(int keyCode, KeyEvent event) {
402cfd74d65d832137e20e193c960802afba73b5d38sm    	boolean result = false;
403cfd74d65d832137e20e193c960802afba73b5d38sm    	if (keyCode == KeyEvent.KEYCODE_BACK) {
404cfd74d65d832137e20e193c960802afba73b5d38sm    		result = true;
405cfd74d65d832137e20e193c960802afba73b5d38sm    	} else if (keyCode == KeyEvent.KEYCODE_MENU){
406cfd74d65d832137e20e193c960802afba73b5d38sm	        if (VERSION < 0) {
407cfd74d65d832137e20e193c960802afba73b5d38sm	        	result = false;	// Allow the debug menu to come up in debug mode.
408cfd74d65d832137e20e193c960802afba73b5d38sm	        }
409cfd74d65d832137e20e193c960802afba73b5d38sm    	} else {
410cfd74d65d832137e20e193c960802afba73b5d38sm    		result = mGame.onKeyUpEvent(keyCode);
411cfd74d65d832137e20e193c960802afba73b5d38sm	        // Sleep so that the main thread doesn't get flooded with UI events.
412cfd74d65d832137e20e193c960802afba73b5d38sm	        try {
413cfd74d65d832137e20e193c960802afba73b5d38sm	            Thread.sleep(4);
414cfd74d65d832137e20e193c960802afba73b5d38sm	        } catch (InterruptedException e) {
415cfd74d65d832137e20e193c960802afba73b5d38sm	            // No big deal if this sleep is interrupted.
416cfd74d65d832137e20e193c960802afba73b5d38sm	        }
417cfd74d65d832137e20e193c960802afba73b5d38sm    	}
418cfd74d65d832137e20e193c960802afba73b5d38sm        return result;
419cfd74d65d832137e20e193c960802afba73b5d38sm    }
420cfd74d65d832137e20e193c960802afba73b5d38sm
421cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
422cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onCreateOptionsMenu(Menu menu) {
423cfd74d65d832137e20e193c960802afba73b5d38sm        super.onCreateOptionsMenu(menu);
424cfd74d65d832137e20e193c960802afba73b5d38sm        boolean handled = false;
425cfd74d65d832137e20e193c960802afba73b5d38sm        // Only allow the debug menu in development versions.
426cfd74d65d832137e20e193c960802afba73b5d38sm        if (VERSION < 0) {
427cfd74d65d832137e20e193c960802afba73b5d38sm	        menu.add(0, CHANGE_LEVEL_ID, 0, R.string.change_level);
428cfd74d65d832137e20e193c960802afba73b5d38sm	        menu.add(0, TEST_ANIMATION_ID, 0, R.string.test_animation);
429cfd74d65d832137e20e193c960802afba73b5d38sm	        menu.add(0, TEST_DIARY_ID, 0, R.string.test_diary);
430cfd74d65d832137e20e193c960802afba73b5d38sm
431cfd74d65d832137e20e193c960802afba73b5d38sm	        menu.add(0, METHOD_TRACING_ID, 0, R.string.method_tracing);
432cfd74d65d832137e20e193c960802afba73b5d38sm	        handled = true;
433cfd74d65d832137e20e193c960802afba73b5d38sm        }
434cfd74d65d832137e20e193c960802afba73b5d38sm
435cfd74d65d832137e20e193c960802afba73b5d38sm        return handled;
436cfd74d65d832137e20e193c960802afba73b5d38sm    }
437cfd74d65d832137e20e193c960802afba73b5d38sm
438cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
439cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onMenuItemSelected(int featureId, MenuItem item) {
440cfd74d65d832137e20e193c960802afba73b5d38sm        Intent i;
441cfd74d65d832137e20e193c960802afba73b5d38sm        switch(item.getItemId()) {
442cfd74d65d832137e20e193c960802afba73b5d38sm        case CHANGE_LEVEL_ID:
443cfd74d65d832137e20e193c960802afba73b5d38sm            i = new Intent(this, LevelSelectActivity.class);
444cfd74d65d832137e20e193c960802afba73b5d38sm            startActivityForResult(i, ACTIVITY_CHANGE_LEVELS);
445cfd74d65d832137e20e193c960802afba73b5d38sm            return true;
446cfd74d65d832137e20e193c960802afba73b5d38sm        case TEST_ANIMATION_ID:
447cfd74d65d832137e20e193c960802afba73b5d38sm            i = new Intent(this, AnimationPlayerActivity.class);
448cfd74d65d832137e20e193c960802afba73b5d38sm            i.putExtra("animation", AnimationPlayerActivity.ROKUDOU_ENDING);
449cfd74d65d832137e20e193c960802afba73b5d38sm            startActivity(i);
450cfd74d65d832137e20e193c960802afba73b5d38sm            return true;
451cfd74d65d832137e20e193c960802afba73b5d38sm        case TEST_DIARY_ID:
452cfd74d65d832137e20e193c960802afba73b5d38sm            i = new Intent(this, DiaryActivity.class);
453cfd74d65d832137e20e193c960802afba73b5d38sm            i.putExtra("text", R.string.Diary10);
454cfd74d65d832137e20e193c960802afba73b5d38sm            startActivity(i);
455cfd74d65d832137e20e193c960802afba73b5d38sm            return true;
456cfd74d65d832137e20e193c960802afba73b5d38sm        case METHOD_TRACING_ID:
457cfd74d65d832137e20e193c960802afba73b5d38sm            if (mMethodTracing) {
458cfd74d65d832137e20e193c960802afba73b5d38sm                Debug.stopMethodTracing();
459cfd74d65d832137e20e193c960802afba73b5d38sm            } else {
460cfd74d65d832137e20e193c960802afba73b5d38sm                Debug.startMethodTracing("andou");
461cfd74d65d832137e20e193c960802afba73b5d38sm            }
462cfd74d65d832137e20e193c960802afba73b5d38sm            mMethodTracing = !mMethodTracing;
463cfd74d65d832137e20e193c960802afba73b5d38sm            return true;
464cfd74d65d832137e20e193c960802afba73b5d38sm        }
465cfd74d65d832137e20e193c960802afba73b5d38sm
466cfd74d65d832137e20e193c960802afba73b5d38sm        return super.onMenuItemSelected(featureId, item);
467cfd74d65d832137e20e193c960802afba73b5d38sm    }
468cfd74d65d832137e20e193c960802afba73b5d38sm
469cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
470cfd74d65d832137e20e193c960802afba73b5d38sm    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
471cfd74d65d832137e20e193c960802afba73b5d38sm        super.onActivityResult(requestCode, resultCode, intent);
472cfd74d65d832137e20e193c960802afba73b5d38sm
473cfd74d65d832137e20e193c960802afba73b5d38sm        if (requestCode == ACTIVITY_CHANGE_LEVELS) {
474cfd74d65d832137e20e193c960802afba73b5d38sm	        if (resultCode == RESULT_OK) {
475cfd74d65d832137e20e193c960802afba73b5d38sm	            mLevelRow = intent.getExtras().getInt("row");
476cfd74d65d832137e20e193c960802afba73b5d38sm	            mLevelIndex = intent.getExtras().getInt("index");
4772b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		        LevelTree.updateCompletedState(mLevelRow, 0);
4782b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
479cfd74d65d832137e20e193c960802afba73b5d38sm	            saveGame();
480cfd74d65d832137e20e193c960802afba73b5d38sm
481cfd74d65d832137e20e193c960802afba73b5d38sm	            mGame.setPendingLevel(LevelTree.get(mLevelRow, mLevelIndex));
482cfd74d65d832137e20e193c960802afba73b5d38sm	            if (LevelTree.get(mLevelRow, mLevelIndex).showWaitMessage) {
483cfd74d65d832137e20e193c960802afba73b5d38sm            		showWaitMessage();
484cfd74d65d832137e20e193c960802afba73b5d38sm	            } else {
485cfd74d65d832137e20e193c960802afba73b5d38sm            		hideWaitMessage();
486cfd74d65d832137e20e193c960802afba73b5d38sm	            }
487cfd74d65d832137e20e193c960802afba73b5d38sm
488cfd74d65d832137e20e193c960802afba73b5d38sm	        }
489cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (requestCode == ACTIVITY_ANIMATION_PLAYER) {
4902b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	int lastAnimation = intent.getIntExtra("animation", -1);
4912b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	// record ending events.
4922b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	if (lastAnimation > -1) {
4932b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        		mGame.setLastEnding(lastAnimation);
4942b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	}
495cfd74d65d832137e20e193c960802afba73b5d38sm        	// on finishing animation playback, force a level change.
496cfd74d65d832137e20e193c960802afba73b5d38sm        	onGameFlowEvent(GameFlowEvent.EVENT_GO_TO_NEXT_LEVEL, 0);
497cfd74d65d832137e20e193c960802afba73b5d38sm        }
498cfd74d65d832137e20e193c960802afba73b5d38sm    }
499cfd74d65d832137e20e193c960802afba73b5d38sm
500cfd74d65d832137e20e193c960802afba73b5d38sm    /*
501cfd74d65d832137e20e193c960802afba73b5d38sm     *  When the game thread needs to stop its own execution (to go to a new level, or restart the
502cfd74d65d832137e20e193c960802afba73b5d38sm     *  current level), it registers a runnable on the main thread which orders the action via this
503cfd74d65d832137e20e193c960802afba73b5d38sm     *  function.
504cfd74d65d832137e20e193c960802afba73b5d38sm     */
505cfd74d65d832137e20e193c960802afba73b5d38sm    public void onGameFlowEvent(int eventCode, int index) {
506cfd74d65d832137e20e193c960802afba73b5d38sm       switch (eventCode) {
507cfd74d65d832137e20e193c960802afba73b5d38sm           case GameFlowEvent.EVENT_END_GAME:
508cfd74d65d832137e20e193c960802afba73b5d38sm               mGame.stop();
509cfd74d65d832137e20e193c960802afba73b5d38sm               finish();
510cfd74d65d832137e20e193c960802afba73b5d38sm               break;
511cfd74d65d832137e20e193c960802afba73b5d38sm           case GameFlowEvent.EVENT_RESTART_LEVEL:
512cfd74d65d832137e20e193c960802afba73b5d38sm        	   if (LevelTree.get(mLevelRow, mLevelIndex).restartable) {
513cfd74d65d832137e20e193c960802afba73b5d38sm        		   if (mEventReporter != null) {
514cfd74d65d832137e20e193c960802afba73b5d38sm	        		   mEventReporter.addEvent(EventReporter.EVENT_DEATH,
515cfd74d65d832137e20e193c960802afba73b5d38sm	        				   mGame.getLastDeathPosition().x,
516cfd74d65d832137e20e193c960802afba73b5d38sm	        				   mGame.getLastDeathPosition().y,
517cfd74d65d832137e20e193c960802afba73b5d38sm	        				   mGame.getGameTime(),
518cfd74d65d832137e20e193c960802afba73b5d38sm	        				   LevelTree.get(mLevelRow, mLevelIndex).name,
519cfd74d65d832137e20e193c960802afba73b5d38sm	        				   VERSION,
520cfd74d65d832137e20e193c960802afba73b5d38sm	        				   mSessionId);
521cfd74d65d832137e20e193c960802afba73b5d38sm        		   }
522cfd74d65d832137e20e193c960802afba73b5d38sm        		   mGame.restartLevel();
523cfd74d65d832137e20e193c960802afba73b5d38sm        		   break;
524cfd74d65d832137e20e193c960802afba73b5d38sm        	   }
525cfd74d65d832137e20e193c960802afba73b5d38sm        	   // else, fall through and go to the next level.
526cfd74d65d832137e20e193c960802afba73b5d38sm           case GameFlowEvent.EVENT_GO_TO_NEXT_LEVEL:
527cfd74d65d832137e20e193c960802afba73b5d38sm               LevelTree.get(mLevelRow, mLevelIndex).completed = true;
528cfd74d65d832137e20e193c960802afba73b5d38sm               final LevelTree.LevelGroup currentGroup = LevelTree.levels.get(mLevelRow);
529cfd74d65d832137e20e193c960802afba73b5d38sm               final int count = currentGroup.levels.size();
530cfd74d65d832137e20e193c960802afba73b5d38sm               boolean groupCompleted = true;
531cfd74d65d832137e20e193c960802afba73b5d38sm               if (mEventReporter != null) {
532cfd74d65d832137e20e193c960802afba73b5d38sm	               mEventReporter.addEvent(EventReporter.EVENT_BEAT_LEVEL,
533cfd74d65d832137e20e193c960802afba73b5d38sm	    				   0,
534cfd74d65d832137e20e193c960802afba73b5d38sm	    				   0,
535cfd74d65d832137e20e193c960802afba73b5d38sm	    				   mGame.getGameTime(),
536cfd74d65d832137e20e193c960802afba73b5d38sm	    				   LevelTree.get(mLevelRow, mLevelIndex).name,
537cfd74d65d832137e20e193c960802afba73b5d38sm	    				   VERSION,
538cfd74d65d832137e20e193c960802afba73b5d38sm	    				   mSessionId);
539cfd74d65d832137e20e193c960802afba73b5d38sm               }
540cfd74d65d832137e20e193c960802afba73b5d38sm               for (int x = 0; x < count; x++) {
541cfd74d65d832137e20e193c960802afba73b5d38sm            	   if (currentGroup.levels.get(x).completed == false) {
542cfd74d65d832137e20e193c960802afba73b5d38sm            		   // We haven't completed the group yet.
543cfd74d65d832137e20e193c960802afba73b5d38sm            		   mLevelIndex = x;
544cfd74d65d832137e20e193c960802afba73b5d38sm            		   groupCompleted = false;
545cfd74d65d832137e20e193c960802afba73b5d38sm            		   break;
546cfd74d65d832137e20e193c960802afba73b5d38sm            	   }
547cfd74d65d832137e20e193c960802afba73b5d38sm               }
548cfd74d65d832137e20e193c960802afba73b5d38sm
549cfd74d65d832137e20e193c960802afba73b5d38sm               if (groupCompleted) {
550cfd74d65d832137e20e193c960802afba73b5d38sm                   mLevelIndex = 0;
551cfd74d65d832137e20e193c960802afba73b5d38sm                   mLevelRow++;
552cfd74d65d832137e20e193c960802afba73b5d38sm               }
553cfd74d65d832137e20e193c960802afba73b5d38sm
5542b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		   mTotalGameTime += mGame.getGameTime();
5552b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		   mRobotsDestroyed += mGame.getRobotsDestroyed();
5562b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		   mPearlsCollected += mGame.getPearlsCollected();
5572b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		   mPearlsTotal += mGame.getPearlsTotal();
558cfd74d65d832137e20e193c960802afba73b5d38sm
559cfd74d65d832137e20e193c960802afba73b5d38sm               if (mLevelRow < LevelTree.levels.size()) {
560cfd74d65d832137e20e193c960802afba73b5d38sm            	   final LevelTree.Level currentLevel = LevelTree.get(mLevelRow, mLevelIndex);
561cfd74d65d832137e20e193c960802afba73b5d38sm            	   if (currentLevel.inThePast || LevelTree.levels.get(mLevelRow).levels.size() > 1) {
562cfd74d65d832137e20e193c960802afba73b5d38sm            		   // go to the level select.
563cfd74d65d832137e20e193c960802afba73b5d38sm            		   Intent i = new Intent(this, LevelSelectActivity.class);
564cfd74d65d832137e20e193c960802afba73b5d38sm                       startActivityForResult(i, ACTIVITY_CHANGE_LEVELS);
5652b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                       if (UIConstants.mOverridePendingTransition != null) {
5662b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	 		       try {
5672b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	 		    	  UIConstants.mOverridePendingTransition.invoke(AndouKun.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
5682b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	 		       } catch (InvocationTargetException ite) {
5692b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	 		           DebugLog.d("Activity Transition", "Invocation Target Exception");
5702b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	 		       } catch (IllegalAccessException ie) {
5712b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	 		    	   DebugLog.d("Activity Transition", "Illegal Access Exception");
5722b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	 		       }
5732b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	            }
574cfd74d65d832137e20e193c960802afba73b5d38sm            	   } else {
575cfd74d65d832137e20e193c960802afba73b5d38sm            		   // go directly to the next level
576cfd74d65d832137e20e193c960802afba73b5d38sm	                   mGame.setPendingLevel(currentLevel);
577cfd74d65d832137e20e193c960802afba73b5d38sm	                   if (currentLevel.showWaitMessage) {
578cfd74d65d832137e20e193c960802afba73b5d38sm	                	   showWaitMessage();
579cfd74d65d832137e20e193c960802afba73b5d38sm	                   } else {
580cfd74d65d832137e20e193c960802afba73b5d38sm	                	   hideWaitMessage();
581cfd74d65d832137e20e193c960802afba73b5d38sm	                   }
582cfd74d65d832137e20e193c960802afba73b5d38sm	                   mGame.requestNewLevel();
583cfd74d65d832137e20e193c960802afba73b5d38sm            	   }
584cfd74d65d832137e20e193c960802afba73b5d38sm            	   saveGame();
585cfd74d65d832137e20e193c960802afba73b5d38sm
586cfd74d65d832137e20e193c960802afba73b5d38sm               } else {
587cfd74d65d832137e20e193c960802afba73b5d38sm            	   if (mEventReporter != null) {
588cfd74d65d832137e20e193c960802afba73b5d38sm	            	   mEventReporter.addEvent(EventReporter.EVENT_BEAT_GAME,
589cfd74d65d832137e20e193c960802afba73b5d38sm	        				   0,
590cfd74d65d832137e20e193c960802afba73b5d38sm	        				   0,
591cfd74d65d832137e20e193c960802afba73b5d38sm	        				   mGame.getGameTime(),
592cfd74d65d832137e20e193c960802afba73b5d38sm	        				   "end",
593cfd74d65d832137e20e193c960802afba73b5d38sm	        				   VERSION,
594cfd74d65d832137e20e193c960802afba73b5d38sm	        				   mSessionId);
595cfd74d65d832137e20e193c960802afba73b5d38sm            	   }
596cfd74d65d832137e20e193c960802afba73b5d38sm                   // We beat the game!
597cfd74d65d832137e20e193c960802afba73b5d38sm            	   mLevelRow = 0;
598cfd74d65d832137e20e193c960802afba73b5d38sm            	   mLevelIndex = 0;
5992b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            	   mLastEnding = mGame.getLastEnding();
6002b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            	   mExtrasUnlocked = true;
601cfd74d65d832137e20e193c960802afba73b5d38sm            	   saveGame();
602cfd74d65d832137e20e193c960802afba73b5d38sm                   mGame.stop();
6032b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                   Intent i = new Intent(this, GameOverActivity.class);
6042b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                   startActivity(i);
6052b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                   if (UIConstants.mOverridePendingTransition != null) {
6062b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	 		       try {
6072b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	 		    	  UIConstants.mOverridePendingTransition.invoke(AndouKun.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
6082b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	 		       } catch (InvocationTargetException ite) {
6092b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	 		           DebugLog.d("Activity Transition", "Invocation Target Exception");
6102b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	 		       } catch (IllegalAccessException ie) {
6112b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	 		    	   DebugLog.d("Activity Transition", "Illegal Access Exception");
6122b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	 		       }
6132b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	            }
614cfd74d65d832137e20e193c960802afba73b5d38sm                   finish();
6152b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
616cfd74d65d832137e20e193c960802afba73b5d38sm               }
617cfd74d65d832137e20e193c960802afba73b5d38sm               break;
618cfd74d65d832137e20e193c960802afba73b5d38sm           case GameFlowEvent.EVENT_SHOW_DIARY:
619cfd74d65d832137e20e193c960802afba73b5d38sm               Intent i = new Intent(this, DiaryActivity.class);
620cfd74d65d832137e20e193c960802afba73b5d38sm               LevelTree.Level level = LevelTree.get(mLevelRow, mLevelIndex);
621cfd74d65d832137e20e193c960802afba73b5d38sm               level.diaryCollected = true;
622cfd74d65d832137e20e193c960802afba73b5d38sm               i.putExtra("text", level.dialogResources.diaryEntry);
623cfd74d65d832137e20e193c960802afba73b5d38sm               startActivity(i);
6242b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm               if (UIConstants.mOverridePendingTransition != null) {
6252b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 	 		       try {
6262b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 	 		    	  UIConstants.mOverridePendingTransition.invoke(AndouKun.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
6272b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 	 		       } catch (InvocationTargetException ite) {
6282b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 	 		           DebugLog.d("Activity Transition", "Invocation Target Exception");
6292b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 	 		       } catch (IllegalAccessException ie) {
6302b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 	 		    	   DebugLog.d("Activity Transition", "Illegal Access Exception");
6312b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 	 		       }
6322b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 	            }
633cfd74d65d832137e20e193c960802afba73b5d38sm               break;
634cfd74d65d832137e20e193c960802afba73b5d38sm
635cfd74d65d832137e20e193c960802afba73b5d38sm           case GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER1:
636cfd74d65d832137e20e193c960802afba73b5d38sm        	   i = new Intent(this, ConversationDialogActivity.class);
637cfd74d65d832137e20e193c960802afba73b5d38sm               i.putExtra("levelRow", mLevelRow);
638cfd74d65d832137e20e193c960802afba73b5d38sm               i.putExtra("levelIndex", mLevelIndex);
639cfd74d65d832137e20e193c960802afba73b5d38sm               i.putExtra("index", index);
640cfd74d65d832137e20e193c960802afba73b5d38sm               i.putExtra("character", 1);
641cfd74d65d832137e20e193c960802afba73b5d38sm               startActivity(i);
642cfd74d65d832137e20e193c960802afba73b5d38sm               break;
643cfd74d65d832137e20e193c960802afba73b5d38sm
644cfd74d65d832137e20e193c960802afba73b5d38sm           case GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2:
645cfd74d65d832137e20e193c960802afba73b5d38sm        	   i = new Intent(this, ConversationDialogActivity.class);
646cfd74d65d832137e20e193c960802afba73b5d38sm               i.putExtra("levelRow", mLevelRow);
647cfd74d65d832137e20e193c960802afba73b5d38sm               i.putExtra("levelIndex", mLevelIndex);
648cfd74d65d832137e20e193c960802afba73b5d38sm               i.putExtra("index", index);
649cfd74d65d832137e20e193c960802afba73b5d38sm               i.putExtra("character", 2);
650cfd74d65d832137e20e193c960802afba73b5d38sm               startActivity(i);
651cfd74d65d832137e20e193c960802afba73b5d38sm               break;
652cfd74d65d832137e20e193c960802afba73b5d38sm           case GameFlowEvent.EVENT_SHOW_ANIMATION:
653cfd74d65d832137e20e193c960802afba73b5d38sm        	   i = new Intent(this, AnimationPlayerActivity.class);
654cfd74d65d832137e20e193c960802afba73b5d38sm               i.putExtra("animation", index);
655cfd74d65d832137e20e193c960802afba73b5d38sm               startActivityForResult(i, ACTIVITY_ANIMATION_PLAYER);
6562b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm               if (UIConstants.mOverridePendingTransition != null) {
6572b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	 		       try {
6582b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	 		    	  UIConstants.mOverridePendingTransition.invoke(AndouKun.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
6592b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	 		       } catch (InvocationTargetException ite) {
6602b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	 		           DebugLog.d("Activity Transition", "Invocation Target Exception");
6612b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	 		       } catch (IllegalAccessException ie) {
6622b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	 		    	   DebugLog.d("Activity Transition", "Illegal Access Exception");
6632b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	 		       }
6642b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	            }
665cfd74d65d832137e20e193c960802afba73b5d38sm               break;
666cfd74d65d832137e20e193c960802afba73b5d38sm
667cfd74d65d832137e20e193c960802afba73b5d38sm       }
668cfd74d65d832137e20e193c960802afba73b5d38sm    }
669cfd74d65d832137e20e193c960802afba73b5d38sm
670cfd74d65d832137e20e193c960802afba73b5d38sm    protected void saveGame() {
671cfd74d65d832137e20e193c960802afba73b5d38sm    	if (mPrefsEditor != null) {
672cfd74d65d832137e20e193c960802afba73b5d38sm    		final int completed = LevelTree.packCompletedLevels(mLevelRow);
6732b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_LEVEL_ROW, mLevelRow);
6742b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_LEVEL_INDEX, mLevelIndex);
6752b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_LEVEL_COMPLETED, completed);
6762b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putLong(PreferenceConstants.PREFERENCE_SESSION_ID, mSessionId);
6772b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putFloat(PreferenceConstants.PREFERENCE_TOTAL_GAME_TIME, mTotalGameTime);
6782b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_LAST_ENDING, mLastEnding);
6792b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_ROBOTS_DESTROYED, mRobotsDestroyed);
6802b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_PEARLS_COLLECTED, mPearlsCollected);
6812b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_PEARLS_TOTAL, mPearlsTotal);
6822b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_LINEAR_MODE, mLinearMode);
6832b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putBoolean(PreferenceConstants.PREFERENCE_EXTRAS_UNLOCKED, mExtrasUnlocked);
6842b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mPrefsEditor.putInt(PreferenceConstants.PREFERENCE_DIFFICULTY, mDifficulty);
685cfd74d65d832137e20e193c960802afba73b5d38sm    		mPrefsEditor.commit();
686cfd74d65d832137e20e193c960802afba73b5d38sm    	}
687cfd74d65d832137e20e193c960802afba73b5d38sm    }
688cfd74d65d832137e20e193c960802afba73b5d38sm
689cfd74d65d832137e20e193c960802afba73b5d38sm    protected void showPauseMessage() {
690cfd74d65d832137e20e193c960802afba73b5d38sm    	if (mPauseMessage != null) {
691cfd74d65d832137e20e193c960802afba73b5d38sm    		mPauseMessage.setVisibility(View.VISIBLE);
692cfd74d65d832137e20e193c960802afba73b5d38sm    	}
6932b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	if (mLevelNameBox != null && mLevelName != null) {
6942b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mLevelName.setText(LevelTree.get(mLevelRow, mLevelIndex).name);
6952b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mLevelNameBox.setVisibility(View.VISIBLE);
6962b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	}
697cfd74d65d832137e20e193c960802afba73b5d38sm    }
698cfd74d65d832137e20e193c960802afba73b5d38sm
699cfd74d65d832137e20e193c960802afba73b5d38sm    protected void hidePauseMessage() {
700cfd74d65d832137e20e193c960802afba73b5d38sm    	if (mPauseMessage != null) {
701cfd74d65d832137e20e193c960802afba73b5d38sm    		mPauseMessage.setVisibility(View.GONE);
702cfd74d65d832137e20e193c960802afba73b5d38sm    	}
7032b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	if (mLevelNameBox != null) {
7042b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		mLevelNameBox.setVisibility(View.GONE);
7052b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	}
706cfd74d65d832137e20e193c960802afba73b5d38sm    }
707cfd74d65d832137e20e193c960802afba73b5d38sm
708cfd74d65d832137e20e193c960802afba73b5d38sm    protected void showWaitMessage() {
709cfd74d65d832137e20e193c960802afba73b5d38sm    	if (mWaitMessage != null) {
710cfd74d65d832137e20e193c960802afba73b5d38sm    		mWaitMessage.setVisibility(View.VISIBLE);
711cfd74d65d832137e20e193c960802afba73b5d38sm    		mWaitMessage.startAnimation(mWaitFadeAnimation);
712cfd74d65d832137e20e193c960802afba73b5d38sm    	}
713cfd74d65d832137e20e193c960802afba73b5d38sm    }
714cfd74d65d832137e20e193c960802afba73b5d38sm
715cfd74d65d832137e20e193c960802afba73b5d38sm    protected void hideWaitMessage() {
716cfd74d65d832137e20e193c960802afba73b5d38sm    	if (mWaitMessage != null) {
717cfd74d65d832137e20e193c960802afba73b5d38sm    		mWaitMessage.setVisibility(View.GONE);
718cfd74d65d832137e20e193c960802afba73b5d38sm    		mWaitMessage.clearAnimation();
719cfd74d65d832137e20e193c960802afba73b5d38sm    	}
720cfd74d65d832137e20e193c960802afba73b5d38sm    }
721cfd74d65d832137e20e193c960802afba73b5d38sm
722cfd74d65d832137e20e193c960802afba73b5d38sm
723cfd74d65d832137e20e193c960802afba73b5d38sm    public void onAccuracyChanged(Sensor sensor, int accuracy) {
724cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO Auto-generated method stub
725cfd74d65d832137e20e193c960802afba73b5d38sm
726cfd74d65d832137e20e193c960802afba73b5d38sm    }
727cfd74d65d832137e20e193c960802afba73b5d38sm
728cfd74d65d832137e20e193c960802afba73b5d38sm
729cfd74d65d832137e20e193c960802afba73b5d38sm    public void onSensorChanged(SensorEvent event) {
730cfd74d65d832137e20e193c960802afba73b5d38sm       synchronized (this) {
731cfd74d65d832137e20e193c960802afba73b5d38sm           if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
7322b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm               final float x = event.values[1];
7332b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm               final float y = event.values[2];
7342b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm               final float z = event.values[0];
735cfd74d65d832137e20e193c960802afba73b5d38sm               mGame.onOrientationEvent(x, y, z);
736cfd74d65d832137e20e193c960802afba73b5d38sm           }
737cfd74d65d832137e20e193c960802afba73b5d38sm       }
738cfd74d65d832137e20e193c960802afba73b5d38sm    }
739cfd74d65d832137e20e193c960802afba73b5d38sm
740cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
741cfd74d65d832137e20e193c960802afba73b5d38sm    protected Dialog onCreateDialog(int id) {
742cfd74d65d832137e20e193c960802afba73b5d38sm        Dialog dialog = null;
743cfd74d65d832137e20e193c960802afba73b5d38sm        if (id == QUIT_GAME_DIALOG) {
744cfd74d65d832137e20e193c960802afba73b5d38sm
745cfd74d65d832137e20e193c960802afba73b5d38sm            dialog = new AlertDialog.Builder(this)
746cfd74d65d832137e20e193c960802afba73b5d38sm                .setTitle(R.string.quit_game_dialog_title)
747cfd74d65d832137e20e193c960802afba73b5d38sm                .setPositiveButton(R.string.quit_game_dialog_ok, new DialogInterface.OnClickListener() {
748cfd74d65d832137e20e193c960802afba73b5d38sm                    public void onClick(DialogInterface dialog, int whichButton) {
749cfd74d65d832137e20e193c960802afba73b5d38sm                    	finish();
7502b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    	if (UIConstants.mOverridePendingTransition != null) {
7512b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm         	 		       try {
7522b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm         	 		    	  UIConstants.mOverridePendingTransition.invoke(AndouKun.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
7532b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm         	 		       } catch (InvocationTargetException ite) {
7542b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm         	 		           DebugLog.d("Activity Transition", "Invocation Target Exception");
7552b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm         	 		       } catch (IllegalAccessException ie) {
7562b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm         	 		    	   DebugLog.d("Activity Transition", "Illegal Access Exception");
7572b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm         	 		       }
7582b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm         	            }
759cfd74d65d832137e20e193c960802afba73b5d38sm                    }
760cfd74d65d832137e20e193c960802afba73b5d38sm                })
761cfd74d65d832137e20e193c960802afba73b5d38sm                .setNegativeButton(R.string.quit_game_dialog_cancel, null)
762cfd74d65d832137e20e193c960802afba73b5d38sm                .setMessage(R.string.quit_game_dialog_message)
763cfd74d65d832137e20e193c960802afba73b5d38sm                .create();
764cfd74d65d832137e20e193c960802afba73b5d38sm        }
765cfd74d65d832137e20e193c960802afba73b5d38sm        return dialog;
766cfd74d65d832137e20e193c960802afba73b5d38sm    }
767cfd74d65d832137e20e193c960802afba73b5d38sm}
768