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
19cfd74d65d832137e20e193c960802afba73b5d38smimport android.app.ListActivity;
20cfd74d65d832137e20e193c960802afba73b5d38smimport android.content.Context;
21cfd74d65d832137e20e193c960802afba73b5d38smimport android.content.Intent;
22cfd74d65d832137e20e193c960802afba73b5d38smimport android.media.AudioManager;
23cfd74d65d832137e20e193c960802afba73b5d38smimport android.os.Bundle;
24cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.KeyEvent;
25cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.LayoutInflater;
26cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.Menu;
27cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.MenuItem;
28cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.View;
29cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.ViewGroup;
30cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.animation.Animation;
31cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.animation.AnimationUtils;
32cfd74d65d832137e20e193c960802afba73b5d38smimport android.widget.ArrayAdapter;
33cfd74d65d832137e20e193c960802afba73b5d38smimport android.widget.ListView;
34cfd74d65d832137e20e193c960802afba73b5d38smimport android.widget.TextView;
35cfd74d65d832137e20e193c960802afba73b5d38sm
362b1168acefb6a4104bb7f008df6ac51fcd1de7ecsmimport java.lang.reflect.InvocationTargetException;
37cfd74d65d832137e20e193c960802afba73b5d38smimport java.util.ArrayList;
38cfd74d65d832137e20e193c960802afba73b5d38smimport java.util.Comparator;
39cfd74d65d832137e20e193c960802afba73b5d38smimport java.util.List;
40cfd74d65d832137e20e193c960802afba73b5d38sm
41cfd74d65d832137e20e193c960802afba73b5d38smpublic class LevelSelectActivity extends ListActivity {
42cfd74d65d832137e20e193c960802afba73b5d38sm    private final static int UNLOCK_ALL_LEVELS_ID = 0;
43cfd74d65d832137e20e193c960802afba73b5d38sm    private final static int UNLOCK_NEXT_LEVEL_ID = 1;
44cfd74d65d832137e20e193c960802afba73b5d38sm    private final static LevelDataComparator sLevelComparator = new LevelDataComparator();
45cfd74d65d832137e20e193c960802afba73b5d38sm    private ArrayList<LevelMetaData> mLevelData;
46cfd74d65d832137e20e193c960802afba73b5d38sm    private Animation mButtonFlickerAnimation;
47cfd74d65d832137e20e193c960802afba73b5d38sm    private boolean mLevelSelected;
48cfd74d65d832137e20e193c960802afba73b5d38sm
49cfd74d65d832137e20e193c960802afba73b5d38sm    private class LevelMetaData {
50cfd74d65d832137e20e193c960802afba73b5d38sm        public LevelTree.Level level;
51cfd74d65d832137e20e193c960802afba73b5d38sm        public int x;
52cfd74d65d832137e20e193c960802afba73b5d38sm        public int y;
53cfd74d65d832137e20e193c960802afba73b5d38sm        boolean enabled;
54cfd74d65d832137e20e193c960802afba73b5d38sm
55cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
56cfd74d65d832137e20e193c960802afba73b5d38sm        public String toString() {
57cfd74d65d832137e20e193c960802afba73b5d38sm            return level.name;
58cfd74d65d832137e20e193c960802afba73b5d38sm        }
59cfd74d65d832137e20e193c960802afba73b5d38sm    }
60cfd74d65d832137e20e193c960802afba73b5d38sm
61cfd74d65d832137e20e193c960802afba73b5d38sm    private class DisableItemArrayAdapter<T> extends ArrayAdapter<T> {
62cfd74d65d832137e20e193c960802afba73b5d38sm    	private static final int TYPE_ENABLED = 0;
63cfd74d65d832137e20e193c960802afba73b5d38sm    	private static final int TYPE_DISABLED = 1;
64cfd74d65d832137e20e193c960802afba73b5d38sm    	private static final int TYPE_COMPLETED = 2;
65cfd74d65d832137e20e193c960802afba73b5d38sm    	private static final int TYPE_COUNT = 3;
66cfd74d65d832137e20e193c960802afba73b5d38sm
67cfd74d65d832137e20e193c960802afba73b5d38sm        private int mRowResource;
68cfd74d65d832137e20e193c960802afba73b5d38sm        private int mDisabledRowResource;
69cfd74d65d832137e20e193c960802afba73b5d38sm        private int mCompletedRowResource;
70cfd74d65d832137e20e193c960802afba73b5d38sm        private Context mContext;
71cfd74d65d832137e20e193c960802afba73b5d38sm        private int mTextViewResource;
72cfd74d65d832137e20e193c960802afba73b5d38sm        private int mTextViewResource2;
73cfd74d65d832137e20e193c960802afba73b5d38sm
74cfd74d65d832137e20e193c960802afba73b5d38sm        public DisableItemArrayAdapter(Context context, int resource, int disabledResource, int completedResource,
75cfd74d65d832137e20e193c960802afba73b5d38sm                int textViewResourceId, int textViewResourceId2, List<T> objects) {
76cfd74d65d832137e20e193c960802afba73b5d38sm            super(context, resource, textViewResourceId, objects);
77cfd74d65d832137e20e193c960802afba73b5d38sm            mRowResource = resource;
78cfd74d65d832137e20e193c960802afba73b5d38sm            mDisabledRowResource = disabledResource;
79cfd74d65d832137e20e193c960802afba73b5d38sm            mCompletedRowResource = completedResource;
80cfd74d65d832137e20e193c960802afba73b5d38sm            mContext = context;
81cfd74d65d832137e20e193c960802afba73b5d38sm            mTextViewResource = textViewResourceId;
82cfd74d65d832137e20e193c960802afba73b5d38sm            mTextViewResource2 = textViewResourceId2;
83cfd74d65d832137e20e193c960802afba73b5d38sm        }
84cfd74d65d832137e20e193c960802afba73b5d38sm
85cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
86cfd74d65d832137e20e193c960802afba73b5d38sm        public boolean isEnabled(int position) {
87cfd74d65d832137e20e193c960802afba73b5d38sm            // TODO: do we have separators in this list?
88cfd74d65d832137e20e193c960802afba73b5d38sm            return mLevelData.get(position).enabled;
89cfd74d65d832137e20e193c960802afba73b5d38sm        }
90cfd74d65d832137e20e193c960802afba73b5d38sm
91cfd74d65d832137e20e193c960802afba73b5d38sm
92cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
93cfd74d65d832137e20e193c960802afba73b5d38sm		public boolean areAllItemsEnabled() {
94cfd74d65d832137e20e193c960802afba73b5d38sm			return false;
95cfd74d65d832137e20e193c960802afba73b5d38sm		}
96cfd74d65d832137e20e193c960802afba73b5d38sm
97cfd74d65d832137e20e193c960802afba73b5d38sm		@Override
98cfd74d65d832137e20e193c960802afba73b5d38sm		public int getItemViewType(int position) {
99cfd74d65d832137e20e193c960802afba73b5d38sm			int type = TYPE_ENABLED;
100cfd74d65d832137e20e193c960802afba73b5d38sm			LevelMetaData level = mLevelData.get(position);
101cfd74d65d832137e20e193c960802afba73b5d38sm			if (level != null) {
102cfd74d65d832137e20e193c960802afba73b5d38sm				if (!level.enabled) {
103cfd74d65d832137e20e193c960802afba73b5d38sm					if (level.level.completed) {
104cfd74d65d832137e20e193c960802afba73b5d38sm						type = TYPE_COMPLETED;
105cfd74d65d832137e20e193c960802afba73b5d38sm					} else {
106cfd74d65d832137e20e193c960802afba73b5d38sm						type = TYPE_DISABLED;
107cfd74d65d832137e20e193c960802afba73b5d38sm					}
108cfd74d65d832137e20e193c960802afba73b5d38sm				}
109cfd74d65d832137e20e193c960802afba73b5d38sm			}
110cfd74d65d832137e20e193c960802afba73b5d38sm			return type;
111cfd74d65d832137e20e193c960802afba73b5d38sm		}
112cfd74d65d832137e20e193c960802afba73b5d38sm
113cfd74d65d832137e20e193c960802afba73b5d38sm		@Override
114cfd74d65d832137e20e193c960802afba73b5d38sm		public int getViewTypeCount() {
115cfd74d65d832137e20e193c960802afba73b5d38sm			return TYPE_COUNT;
116cfd74d65d832137e20e193c960802afba73b5d38sm		}
117cfd74d65d832137e20e193c960802afba73b5d38sm
118cfd74d65d832137e20e193c960802afba73b5d38sm		@Override
119cfd74d65d832137e20e193c960802afba73b5d38sm		public boolean hasStableIds() {
120cfd74d65d832137e20e193c960802afba73b5d38sm			return true;
121cfd74d65d832137e20e193c960802afba73b5d38sm		}
122cfd74d65d832137e20e193c960802afba73b5d38sm
123cfd74d65d832137e20e193c960802afba73b5d38sm		@Override
124cfd74d65d832137e20e193c960802afba73b5d38sm		public boolean isEmpty() {
125cfd74d65d832137e20e193c960802afba73b5d38sm			return mLevelData.size() > 0;
126cfd74d65d832137e20e193c960802afba73b5d38sm		}
127cfd74d65d832137e20e193c960802afba73b5d38sm
128cfd74d65d832137e20e193c960802afba73b5d38sm		@Override
129cfd74d65d832137e20e193c960802afba73b5d38sm        public View getView (int position, View convertView, ViewGroup parent) {
130cfd74d65d832137e20e193c960802afba73b5d38sm            View sourceView = null;
131cfd74d65d832137e20e193c960802afba73b5d38sm            if (mLevelData.get(position).enabled) {
132cfd74d65d832137e20e193c960802afba73b5d38sm            	if (convertView != null && convertView.getId() == mRowResource) {
133cfd74d65d832137e20e193c960802afba73b5d38sm            		sourceView = convertView;
134cfd74d65d832137e20e193c960802afba73b5d38sm            	} else {
135cfd74d65d832137e20e193c960802afba73b5d38sm            		sourceView = LayoutInflater.from(mContext).inflate(
136cfd74d65d832137e20e193c960802afba73b5d38sm            				mRowResource, parent, false);
137cfd74d65d832137e20e193c960802afba73b5d38sm            	}
138cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (mLevelData.get(position).level.completed) {
139cfd74d65d832137e20e193c960802afba73b5d38sm            	if (convertView != null && convertView.getId() == mCompletedRowResource) {
140cfd74d65d832137e20e193c960802afba73b5d38sm            		sourceView = convertView;
141cfd74d65d832137e20e193c960802afba73b5d38sm            	} else {
142cfd74d65d832137e20e193c960802afba73b5d38sm            		sourceView = LayoutInflater.from(mContext).inflate(
143cfd74d65d832137e20e193c960802afba73b5d38sm            				mCompletedRowResource, parent, false);
144cfd74d65d832137e20e193c960802afba73b5d38sm            	}
145cfd74d65d832137e20e193c960802afba73b5d38sm            } else {
146cfd74d65d832137e20e193c960802afba73b5d38sm            	if (convertView != null && convertView.getId() == mDisabledRowResource) {
147cfd74d65d832137e20e193c960802afba73b5d38sm            		sourceView = convertView;
148cfd74d65d832137e20e193c960802afba73b5d38sm            	} else {
149cfd74d65d832137e20e193c960802afba73b5d38sm            		sourceView = LayoutInflater.from(mContext).inflate(
150cfd74d65d832137e20e193c960802afba73b5d38sm                        mDisabledRowResource, parent, false);
151cfd74d65d832137e20e193c960802afba73b5d38sm            	}
152cfd74d65d832137e20e193c960802afba73b5d38sm            }
153cfd74d65d832137e20e193c960802afba73b5d38sm            TextView view = (TextView)sourceView.findViewById(mTextViewResource);
154cfd74d65d832137e20e193c960802afba73b5d38sm            if (view != null) {
155cfd74d65d832137e20e193c960802afba73b5d38sm                view.setText(mLevelData.get(position).level.name);
156cfd74d65d832137e20e193c960802afba73b5d38sm            }
157cfd74d65d832137e20e193c960802afba73b5d38sm
158cfd74d65d832137e20e193c960802afba73b5d38sm            TextView view2 = (TextView)sourceView.findViewById(mTextViewResource2);
159cfd74d65d832137e20e193c960802afba73b5d38sm            if (view2 != null) {
160cfd74d65d832137e20e193c960802afba73b5d38sm                view2.setText(mLevelData.get(position).level.timeStamp);
161cfd74d65d832137e20e193c960802afba73b5d38sm            }
162cfd74d65d832137e20e193c960802afba73b5d38sm            return sourceView;
163cfd74d65d832137e20e193c960802afba73b5d38sm        }
164cfd74d65d832137e20e193c960802afba73b5d38sm
165cfd74d65d832137e20e193c960802afba73b5d38sm    }
166cfd74d65d832137e20e193c960802afba73b5d38sm
167cfd74d65d832137e20e193c960802afba73b5d38sm    /** Called when the activity is first created. */
168cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
169cfd74d65d832137e20e193c960802afba73b5d38sm    public void onCreate(Bundle savedInstanceState) {
170cfd74d65d832137e20e193c960802afba73b5d38sm        super.onCreate(savedInstanceState);
171cfd74d65d832137e20e193c960802afba73b5d38sm        setContentView(R.layout.level_select);
172cfd74d65d832137e20e193c960802afba73b5d38sm        mLevelData = new ArrayList<LevelMetaData>();
173cfd74d65d832137e20e193c960802afba73b5d38sm
1742b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        if (getIntent().getBooleanExtra("unlockAll", false)) {
1752b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	generateLevelList(false);
1762b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	for (LevelMetaData level : mLevelData) {
1772b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                level.enabled = true;
1782b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            }
1792b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        } else {
1802b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	generateLevelList(true);
1812b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        }
1822b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
183cfd74d65d832137e20e193c960802afba73b5d38sm
184cfd74d65d832137e20e193c960802afba73b5d38sm        DisableItemArrayAdapter<LevelMetaData> adapter = new DisableItemArrayAdapter<LevelMetaData>(
185cfd74d65d832137e20e193c960802afba73b5d38sm                this, R.layout.level_select_row, R.layout.level_select_disabled_row, R.layout.level_select_completed_row,
186cfd74d65d832137e20e193c960802afba73b5d38sm                R.id.title, R.id.time, mLevelData);
187cfd74d65d832137e20e193c960802afba73b5d38sm
188cfd74d65d832137e20e193c960802afba73b5d38sm        adapter.sort(sLevelComparator);
189cfd74d65d832137e20e193c960802afba73b5d38sm
190cfd74d65d832137e20e193c960802afba73b5d38sm        setListAdapter(adapter);
191cfd74d65d832137e20e193c960802afba73b5d38sm
192cfd74d65d832137e20e193c960802afba73b5d38sm        mButtonFlickerAnimation = AnimationUtils.loadAnimation(this, R.anim.button_flicker);
193cfd74d65d832137e20e193c960802afba73b5d38sm
194cfd74d65d832137e20e193c960802afba73b5d38sm        mLevelSelected = false;
195cfd74d65d832137e20e193c960802afba73b5d38sm
196cfd74d65d832137e20e193c960802afba73b5d38sm        // Keep the volume control type consistent across all activities.
197cfd74d65d832137e20e193c960802afba73b5d38sm        setVolumeControlStream(AudioManager.STREAM_MUSIC);
198cfd74d65d832137e20e193c960802afba73b5d38sm    }
199cfd74d65d832137e20e193c960802afba73b5d38sm
200cfd74d65d832137e20e193c960802afba73b5d38sm    protected void generateLevelList(boolean onlyAllowThePast) {
201cfd74d65d832137e20e193c960802afba73b5d38sm    	final int count = LevelTree.levels.size();
202cfd74d65d832137e20e193c960802afba73b5d38sm        boolean oneBranchUnlocked = false;
203cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < count; x++) {
204cfd74d65d832137e20e193c960802afba73b5d38sm            boolean anyUnlocksThisBranch = false;
205cfd74d65d832137e20e193c960802afba73b5d38sm            final LevelTree.LevelGroup group = LevelTree.levels.get(x);
206cfd74d65d832137e20e193c960802afba73b5d38sm            for (int y = 0; y < group.levels.size(); y++) {
207cfd74d65d832137e20e193c960802afba73b5d38sm                LevelTree.Level level = group.levels.get(y);
208cfd74d65d832137e20e193c960802afba73b5d38sm                boolean enabled = false;
209cfd74d65d832137e20e193c960802afba73b5d38sm                if (!level.completed && !oneBranchUnlocked) {
210cfd74d65d832137e20e193c960802afba73b5d38sm                    enabled = true;
211cfd74d65d832137e20e193c960802afba73b5d38sm                    anyUnlocksThisBranch = true;
212cfd74d65d832137e20e193c960802afba73b5d38sm                }
213cfd74d65d832137e20e193c960802afba73b5d38sm                if (enabled || level.completed || !onlyAllowThePast || (onlyAllowThePast && level.inThePast)) {
214cfd74d65d832137e20e193c960802afba73b5d38sm                	addItem(level, x, y, enabled);
215cfd74d65d832137e20e193c960802afba73b5d38sm                }
216cfd74d65d832137e20e193c960802afba73b5d38sm            }
217cfd74d65d832137e20e193c960802afba73b5d38sm            if (anyUnlocksThisBranch) {
218cfd74d65d832137e20e193c960802afba73b5d38sm                oneBranchUnlocked = true;
219cfd74d65d832137e20e193c960802afba73b5d38sm            }
220cfd74d65d832137e20e193c960802afba73b5d38sm        }
221cfd74d65d832137e20e193c960802afba73b5d38sm    }
222cfd74d65d832137e20e193c960802afba73b5d38sm
223cfd74d65d832137e20e193c960802afba73b5d38sm    protected void unlockNext() {
224cfd74d65d832137e20e193c960802afba73b5d38sm    	final int count = LevelTree.levels.size();
225cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < count; x++) {
226cfd74d65d832137e20e193c960802afba73b5d38sm            final LevelTree.LevelGroup group = LevelTree.levels.get(x);
227cfd74d65d832137e20e193c960802afba73b5d38sm            for (int y = 0; y < group.levels.size(); y++) {
228cfd74d65d832137e20e193c960802afba73b5d38sm                LevelTree.Level level = group.levels.get(y);
229cfd74d65d832137e20e193c960802afba73b5d38sm                if (!level.completed) {
230cfd74d65d832137e20e193c960802afba73b5d38sm                	level.completed = true;
231cfd74d65d832137e20e193c960802afba73b5d38sm                    return;
232cfd74d65d832137e20e193c960802afba73b5d38sm                }
233cfd74d65d832137e20e193c960802afba73b5d38sm            }
234cfd74d65d832137e20e193c960802afba73b5d38sm
235cfd74d65d832137e20e193c960802afba73b5d38sm        }
236cfd74d65d832137e20e193c960802afba73b5d38sm    }
237cfd74d65d832137e20e193c960802afba73b5d38sm
238cfd74d65d832137e20e193c960802afba73b5d38sm
239cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
240cfd74d65d832137e20e193c960802afba73b5d38sm    protected void onListItemClick(ListView l, View v, int position, long id) {
241cfd74d65d832137e20e193c960802afba73b5d38sm        if (!mLevelSelected) {
242cfd74d65d832137e20e193c960802afba73b5d38sm	        super.onListItemClick(l, v, position, id);
243cfd74d65d832137e20e193c960802afba73b5d38sm	        LevelMetaData selectedLevel = mLevelData.get(position);
244cfd74d65d832137e20e193c960802afba73b5d38sm	        if (selectedLevel.enabled) {
245cfd74d65d832137e20e193c960802afba73b5d38sm	        	mLevelSelected = true;
246cfd74d65d832137e20e193c960802afba73b5d38sm	            Intent intent = new Intent();
247cfd74d65d832137e20e193c960802afba73b5d38sm
248cfd74d65d832137e20e193c960802afba73b5d38sm	            intent.putExtra("resource", selectedLevel.level.resource);
249cfd74d65d832137e20e193c960802afba73b5d38sm	            intent.putExtra("row", selectedLevel.x);
250cfd74d65d832137e20e193c960802afba73b5d38sm	            intent.putExtra("index", selectedLevel.y);
251cfd74d65d832137e20e193c960802afba73b5d38sm	            TextView text = (TextView)v.findViewById(R.id.title);
252cfd74d65d832137e20e193c960802afba73b5d38sm	            if (text != null) {
253cfd74d65d832137e20e193c960802afba73b5d38sm	            	text.startAnimation(mButtonFlickerAnimation);
254cfd74d65d832137e20e193c960802afba73b5d38sm	            	mButtonFlickerAnimation.setAnimationListener(new EndActivityAfterAnimation(intent));
255cfd74d65d832137e20e193c960802afba73b5d38sm	            } else {
256cfd74d65d832137e20e193c960802afba73b5d38sm	                setResult(RESULT_OK, intent);
257cfd74d65d832137e20e193c960802afba73b5d38sm	            	finish();
2582b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	            	if (UIConstants.mOverridePendingTransition != null) {
2592b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		 		       try {
2602b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		 		    	  UIConstants.mOverridePendingTransition.invoke(LevelSelectActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
2612b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		 		       } catch (InvocationTargetException ite) {
2622b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		 		           DebugLog.d("Activity Transition", "Invocation Target Exception");
2632b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		 		       } catch (IllegalAccessException ie) {
2642b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		 		    	   DebugLog.d("Activity Transition", "Illegal Access Exception");
2652b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		 		       }
2662b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		            }
267cfd74d65d832137e20e193c960802afba73b5d38sm	            }
268cfd74d65d832137e20e193c960802afba73b5d38sm	        }
269cfd74d65d832137e20e193c960802afba73b5d38sm        }
270cfd74d65d832137e20e193c960802afba73b5d38sm    }
271cfd74d65d832137e20e193c960802afba73b5d38sm
272cfd74d65d832137e20e193c960802afba73b5d38sm    private void addItem(LevelTree.Level level, int x, int y, boolean enabled) {
273cfd74d65d832137e20e193c960802afba73b5d38sm        LevelMetaData data = new LevelMetaData();
274cfd74d65d832137e20e193c960802afba73b5d38sm        data.level = level;
275cfd74d65d832137e20e193c960802afba73b5d38sm        data.x = x;
276cfd74d65d832137e20e193c960802afba73b5d38sm        data.y = y;
277cfd74d65d832137e20e193c960802afba73b5d38sm        data.enabled = enabled;
278cfd74d65d832137e20e193c960802afba73b5d38sm        mLevelData.add(data);
279cfd74d65d832137e20e193c960802afba73b5d38sm    }
280cfd74d65d832137e20e193c960802afba73b5d38sm
281cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
282cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onCreateOptionsMenu(Menu menu) {
283cfd74d65d832137e20e193c960802afba73b5d38sm        super.onCreateOptionsMenu(menu);
284cfd74d65d832137e20e193c960802afba73b5d38sm        boolean handled = false;
285cfd74d65d832137e20e193c960802afba73b5d38sm        if (AndouKun.VERSION < 0) {
286cfd74d65d832137e20e193c960802afba73b5d38sm        	menu.add(0, UNLOCK_NEXT_LEVEL_ID, 0, R.string.unlock_next_level);
287cfd74d65d832137e20e193c960802afba73b5d38sm        	menu.add(0, UNLOCK_ALL_LEVELS_ID, 0, R.string.unlock_levels);
288cfd74d65d832137e20e193c960802afba73b5d38sm
289cfd74d65d832137e20e193c960802afba73b5d38sm        	handled = true;
290cfd74d65d832137e20e193c960802afba73b5d38sm        }
291cfd74d65d832137e20e193c960802afba73b5d38sm        return handled;
292cfd74d65d832137e20e193c960802afba73b5d38sm    }
293cfd74d65d832137e20e193c960802afba73b5d38sm
294cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
295cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onMenuItemSelected(int featureId, MenuItem item) {
296cfd74d65d832137e20e193c960802afba73b5d38sm        switch(item.getItemId()) {
297cfd74d65d832137e20e193c960802afba73b5d38sm        case UNLOCK_NEXT_LEVEL_ID:
298cfd74d65d832137e20e193c960802afba73b5d38sm        	unlockNext();
299cfd74d65d832137e20e193c960802afba73b5d38sm        	mLevelData.clear();
300cfd74d65d832137e20e193c960802afba73b5d38sm        	generateLevelList(false);
301cfd74d65d832137e20e193c960802afba73b5d38sm            ((ArrayAdapter)getListAdapter()).sort(sLevelComparator);
302cfd74d65d832137e20e193c960802afba73b5d38sm            ((ArrayAdapter)getListAdapter()).notifyDataSetChanged();
303cfd74d65d832137e20e193c960802afba73b5d38sm
304cfd74d65d832137e20e193c960802afba73b5d38sm        	return true;
305cfd74d65d832137e20e193c960802afba73b5d38sm
306cfd74d65d832137e20e193c960802afba73b5d38sm        case UNLOCK_ALL_LEVELS_ID:
307cfd74d65d832137e20e193c960802afba73b5d38sm        	// Regenerate the level list to remove the past-only filter.
308cfd74d65d832137e20e193c960802afba73b5d38sm        	mLevelData.clear();
309cfd74d65d832137e20e193c960802afba73b5d38sm        	generateLevelList(false);
310cfd74d65d832137e20e193c960802afba73b5d38sm            for (LevelMetaData level : mLevelData) {
311cfd74d65d832137e20e193c960802afba73b5d38sm                level.enabled = true;
312cfd74d65d832137e20e193c960802afba73b5d38sm            }
313cfd74d65d832137e20e193c960802afba73b5d38sm
314cfd74d65d832137e20e193c960802afba73b5d38sm            ((ArrayAdapter)getListAdapter()).sort(sLevelComparator);
315cfd74d65d832137e20e193c960802afba73b5d38sm            ((ArrayAdapter)getListAdapter()).notifyDataSetChanged();
316cfd74d65d832137e20e193c960802afba73b5d38sm            return true;
317cfd74d65d832137e20e193c960802afba73b5d38sm        }
318cfd74d65d832137e20e193c960802afba73b5d38sm
319cfd74d65d832137e20e193c960802afba73b5d38sm        return super.onMenuItemSelected(featureId, item);
320cfd74d65d832137e20e193c960802afba73b5d38sm    }
321cfd74d65d832137e20e193c960802afba73b5d38sm
322cfd74d65d832137e20e193c960802afba73b5d38sm
323cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
324cfd74d65d832137e20e193c960802afba73b5d38sm	public boolean onKeyDown(int keyCode, KeyEvent event) {
325cfd74d65d832137e20e193c960802afba73b5d38sm    	boolean result = false;
326cfd74d65d832137e20e193c960802afba73b5d38sm		if (keyCode == KeyEvent.KEYCODE_BACK) {
327cfd74d65d832137e20e193c960802afba73b5d38sm			result = true;
328cfd74d65d832137e20e193c960802afba73b5d38sm		}
329cfd74d65d832137e20e193c960802afba73b5d38sm		return result;
330cfd74d65d832137e20e193c960802afba73b5d38sm	}
331cfd74d65d832137e20e193c960802afba73b5d38sm
332cfd74d65d832137e20e193c960802afba73b5d38sm	@Override
333cfd74d65d832137e20e193c960802afba73b5d38sm	public boolean onKeyUp(int keyCode, KeyEvent event) {
334cfd74d65d832137e20e193c960802afba73b5d38sm		boolean result = false;
335cfd74d65d832137e20e193c960802afba73b5d38sm		if (keyCode == KeyEvent.KEYCODE_BACK) {
336cfd74d65d832137e20e193c960802afba73b5d38sm			result = true;
337cfd74d65d832137e20e193c960802afba73b5d38sm		}
338cfd74d65d832137e20e193c960802afba73b5d38sm		return result;
339cfd74d65d832137e20e193c960802afba73b5d38sm	}
340cfd74d65d832137e20e193c960802afba73b5d38sm
341cfd74d65d832137e20e193c960802afba73b5d38sm
342cfd74d65d832137e20e193c960802afba73b5d38sm	/** Comparator for level meta data. */
343cfd74d65d832137e20e193c960802afba73b5d38sm    private final static class LevelDataComparator implements Comparator<LevelMetaData> {
344cfd74d65d832137e20e193c960802afba73b5d38sm        public int compare(final LevelMetaData object1, final LevelMetaData object2) {
345cfd74d65d832137e20e193c960802afba73b5d38sm            int result = 0;
346cfd74d65d832137e20e193c960802afba73b5d38sm            if (object1 == null && object2 != null) {
347cfd74d65d832137e20e193c960802afba73b5d38sm                result = 1;
348cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (object1 != null && object2 == null) {
349cfd74d65d832137e20e193c960802afba73b5d38sm                result = -1;
350cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (object1 != null && object2 != null) {
351cfd74d65d832137e20e193c960802afba73b5d38sm                result = object1.level.timeStamp.compareTo(object2.level.timeStamp);
352cfd74d65d832137e20e193c960802afba73b5d38sm            }
353cfd74d65d832137e20e193c960802afba73b5d38sm            return result;
354cfd74d65d832137e20e193c960802afba73b5d38sm        }
355cfd74d65d832137e20e193c960802afba73b5d38sm    }
356cfd74d65d832137e20e193c960802afba73b5d38sm
357cfd74d65d832137e20e193c960802afba73b5d38sm    protected class EndActivityAfterAnimation implements Animation.AnimationListener {
358cfd74d65d832137e20e193c960802afba73b5d38sm        private Intent mIntent;
359cfd74d65d832137e20e193c960802afba73b5d38sm
360cfd74d65d832137e20e193c960802afba73b5d38sm        EndActivityAfterAnimation(Intent intent) {
361cfd74d65d832137e20e193c960802afba73b5d38sm            mIntent = intent;
362cfd74d65d832137e20e193c960802afba73b5d38sm        }
363cfd74d65d832137e20e193c960802afba73b5d38sm
364cfd74d65d832137e20e193c960802afba73b5d38sm
365cfd74d65d832137e20e193c960802afba73b5d38sm        public void onAnimationEnd(Animation animation) {
366cfd74d65d832137e20e193c960802afba73b5d38sm            setResult(RESULT_OK, mIntent);
367cfd74d65d832137e20e193c960802afba73b5d38sm            finish();
368cfd74d65d832137e20e193c960802afba73b5d38sm        }
369cfd74d65d832137e20e193c960802afba73b5d38sm
370cfd74d65d832137e20e193c960802afba73b5d38sm        public void onAnimationRepeat(Animation animation) {
371cfd74d65d832137e20e193c960802afba73b5d38sm            // TODO Auto-generated method stub
372cfd74d65d832137e20e193c960802afba73b5d38sm
373cfd74d65d832137e20e193c960802afba73b5d38sm        }
374cfd74d65d832137e20e193c960802afba73b5d38sm
375cfd74d65d832137e20e193c960802afba73b5d38sm        public void onAnimationStart(Animation animation) {
376cfd74d65d832137e20e193c960802afba73b5d38sm            // TODO Auto-generated method stub
377cfd74d65d832137e20e193c960802afba73b5d38sm
378cfd74d65d832137e20e193c960802afba73b5d38sm        }
379cfd74d65d832137e20e193c960802afba73b5d38sm
380cfd74d65d832137e20e193c960802afba73b5d38sm    }
381cfd74d65d832137e20e193c960802afba73b5d38sm}
382cfd74d65d832137e20e193c960802afba73b5d38sm
383