Home | History | Annotate | Download | only in replicaisland
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 
     18 package com.replica.replicaisland;
     19 
     20 import java.lang.reflect.InvocationTargetException;
     21 
     22 import android.app.Activity;
     23 import android.content.Intent;
     24 import android.graphics.drawable.AnimationDrawable;
     25 import android.os.Bundle;
     26 import android.os.Handler;
     27 import android.os.Message;
     28 import android.util.DisplayMetrics;
     29 import android.view.MotionEvent;
     30 import android.view.View;
     31 import android.view.animation.Animation;
     32 import android.view.animation.AnimationUtils;
     33 import android.view.animation.TranslateAnimation;
     34 import android.widget.ImageView;
     35 
     36 
     37 public class AnimationPlayerActivity extends Activity {
     38 	public static final int KYLE_DEATH = 0;
     39 	public static final int WANDA_ENDING = 1;
     40 	public static final int KABOCHA_ENDING = 2;
     41 	public static final int ROKUDOU_ENDING = 3;
     42 
     43 	private AnimationDrawable mAnimation;
     44 	private int mAnimationType;
     45 	private long mAnimationEndTime;
     46 
     47 	private KillActivityHandler mKillActivityHandler = new KillActivityHandler();
     48 
     49     class KillActivityHandler extends Handler {
     50 
     51         @Override
     52         public void handleMessage(Message msg) {
     53         	AnimationPlayerActivity.this.finish();
     54         	if (UIConstants.mOverridePendingTransition != null) {
     55   		       try {
     56   		    	  UIConstants.mOverridePendingTransition.invoke(AnimationPlayerActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
     57   		       } catch (InvocationTargetException ite) {
     58   		           DebugLog.d("Activity Transition", "Invocation Target Exception");
     59   		       } catch (IllegalAccessException ie) {
     60   		    	   DebugLog.d("Activity Transition", "Illegal Access Exception");
     61   		       }
     62         	}
     63         }
     64 
     65         public void sleep(long delayMillis) {
     66         	this.removeMessages(0);
     67             sendMessageDelayed(obtainMessage(0), delayMillis);
     68         }
     69     };
     70 
     71 	@Override
     72 	public void onCreate(Bundle savedInstanceState) {
     73 	  super.onCreate(savedInstanceState);
     74 
     75 	  final Intent callingIntent = getIntent();
     76 	  mAnimationType = callingIntent.getIntExtra("animation", KYLE_DEATH);
     77 
     78 	  if (mAnimationType == KYLE_DEATH) {
     79 		  setContentView(R.layout.animation_player);
     80 
     81 		  ImageView canvasImage = (ImageView) findViewById(R.id.animation_canvas);
     82 		  canvasImage.setImageResource(R.anim.kyle_fall);
     83 		  mAnimation = (AnimationDrawable) canvasImage.getDrawable();
     84 	  } else {
     85 
     86 
     87 		  if (mAnimationType == WANDA_ENDING || mAnimationType == KABOCHA_ENDING) {
     88 			  float startX = 0.0f;
     89 			  DisplayMetrics metrics = new DisplayMetrics();
     90 			  getWindowManager().getDefaultDisplay().getMetrics(metrics);
     91 			  if (mAnimationType == WANDA_ENDING) {
     92 				  setContentView(R.layout.good_ending_animation);
     93 				  startX = 200 * metrics.density;
     94 
     95 			  } else {
     96 				  setContentView(R.layout.kabocha_ending_animation);
     97 				  startX = -200 * metrics.density;
     98 			  }
     99 
    100 			  // HACK
    101 			  // the TranslateAnimation system doesn't support device independent pixels.
    102 			  // So for the Wanda ending and Kabocha endings, in which the game over text
    103 			  // scrolls in horizontally, compute the size based on the actual density of
    104 			  // the display and just generate the anim in code.  The Rokudou animation
    105 			  // can be safely loaded from a file.
    106 			  Animation gameOverAnim = new TranslateAnimation(startX, 0, 0, 0);
    107 			  gameOverAnim.setDuration(6000);
    108 			  gameOverAnim.setFillAfter(true);
    109 			  gameOverAnim.setFillEnabled(true);
    110 			  gameOverAnim.setStartOffset(8000);
    111 
    112 			  View background = findViewById(R.id.animation_background);
    113 			  View foreground = findViewById(R.id.animation_foreground);
    114 			  View gameOver = findViewById(R.id.game_over);
    115 
    116 			  Animation foregroundAnim = AnimationUtils.loadAnimation(this, R.anim.horizontal_layer2_slide);
    117 			  Animation backgroundAnim = AnimationUtils.loadAnimation(this, R.anim.horizontal_layer1_slide);
    118 
    119 			  background.startAnimation(backgroundAnim);
    120 			  foreground.startAnimation(foregroundAnim);
    121 			  gameOver.startAnimation(gameOverAnim);
    122 
    123 			  mAnimationEndTime = gameOverAnim.getDuration() + System.currentTimeMillis();
    124 		  } else if (mAnimationType == ROKUDOU_ENDING) {
    125 			  setContentView(R.layout.rokudou_ending_animation);
    126 			  View background = findViewById(R.id.animation_background);
    127 			  View sphere = findViewById(R.id.animation_sphere);
    128 			  View cliffs = findViewById(R.id.animation_cliffs);
    129 			  View rokudou = findViewById(R.id.animation_rokudou);
    130 			  View gameOver = findViewById(R.id.game_over);
    131 
    132 
    133 			  Animation backgroundAnim = AnimationUtils.loadAnimation(this, R.anim.rokudou_slide_bg);
    134 			  Animation sphereAnim = AnimationUtils.loadAnimation(this, R.anim.rokudou_slide_sphere);
    135 			  Animation cliffsAnim = AnimationUtils.loadAnimation(this, R.anim.rokudou_slide_cliffs);
    136 			  Animation rokudouAnim = AnimationUtils.loadAnimation(this, R.anim.rokudou_slide_rokudou);
    137 			  Animation gameOverAnim = AnimationUtils.loadAnimation(this, R.anim.rokudou_game_over);
    138 
    139 			  background.startAnimation(backgroundAnim);
    140 			  sphere.startAnimation(sphereAnim);
    141 			  cliffs.startAnimation(cliffsAnim);
    142 			  rokudou.startAnimation(rokudouAnim);
    143 			  gameOver.startAnimation(gameOverAnim);
    144 			  mAnimationEndTime = gameOverAnim.getDuration() + System.currentTimeMillis();
    145 		  } else {
    146 			  assert false;
    147 		  }
    148 
    149 	  }
    150 
    151 	  // Pass the calling intent back so that we can figure out which animation just played.
    152 	  setResult(RESULT_OK, callingIntent);
    153 
    154 	}
    155 
    156 	@Override
    157 	public boolean onTouchEvent(MotionEvent event) {
    158 		long time = System.currentTimeMillis();
    159 		if (time > mAnimationEndTime) {
    160 			finish();
    161 		} else {
    162 			try {
    163 				Thread.sleep(32);
    164 			} catch (InterruptedException e) {
    165 				// Safe to ignore.
    166 			}
    167 		}
    168 		return true;
    169 	}
    170 
    171 	@Override
    172 	public void onWindowFocusChanged(boolean hasFocus) {
    173 	  if (hasFocus && mAnimation != null) {
    174 		  mAnimation.start();
    175 		  mKillActivityHandler.sleep(mAnimation.getDuration(0) * mAnimation.getNumberOfFrames());
    176 	  }
    177 	}
    178 
    179 }
    180