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