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