/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.replica.replicaisland; import java.lang.reflect.InvocationTargetException; import android.app.Activity; import android.content.Intent; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.TranslateAnimation; import android.widget.ImageView; public class AnimationPlayerActivity extends Activity { public static final int KYLE_DEATH = 0; public static final int WANDA_ENDING = 1; public static final int KABOCHA_ENDING = 2; public static final int ROKUDOU_ENDING = 3; private AnimationDrawable mAnimation; private int mAnimationType; private long mAnimationEndTime; private KillActivityHandler mKillActivityHandler = new KillActivityHandler(); class KillActivityHandler extends Handler { @Override public void handleMessage(Message msg) { AnimationPlayerActivity.this.finish(); if (UIConstants.mOverridePendingTransition != null) { try { UIConstants.mOverridePendingTransition.invoke(AnimationPlayerActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out); } catch (InvocationTargetException ite) { DebugLog.d("Activity Transition", "Invocation Target Exception"); } catch (IllegalAccessException ie) { DebugLog.d("Activity Transition", "Illegal Access Exception"); } } } public void sleep(long delayMillis) { this.removeMessages(0); sendMessageDelayed(obtainMessage(0), delayMillis); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Intent callingIntent = getIntent(); mAnimationType = callingIntent.getIntExtra("animation", KYLE_DEATH); if (mAnimationType == KYLE_DEATH) { setContentView(R.layout.animation_player); ImageView canvasImage = (ImageView) findViewById(R.id.animation_canvas); canvasImage.setImageResource(R.anim.kyle_fall); mAnimation = (AnimationDrawable) canvasImage.getDrawable(); } else { if (mAnimationType == WANDA_ENDING || mAnimationType == KABOCHA_ENDING) { float startX = 0.0f; DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); if (mAnimationType == WANDA_ENDING) { setContentView(R.layout.good_ending_animation); startX = 200 * metrics.density; } else { setContentView(R.layout.kabocha_ending_animation); startX = -200 * metrics.density; } // HACK // the TranslateAnimation system doesn't support device independent pixels. // So for the Wanda ending and Kabocha endings, in which the game over text // scrolls in horizontally, compute the size based on the actual density of // the display and just generate the anim in code. The Rokudou animation // can be safely loaded from a file. Animation gameOverAnim = new TranslateAnimation(startX, 0, 0, 0); gameOverAnim.setDuration(6000); gameOverAnim.setFillAfter(true); gameOverAnim.setFillEnabled(true); gameOverAnim.setStartOffset(8000); View background = findViewById(R.id.animation_background); View foreground = findViewById(R.id.animation_foreground); View gameOver = findViewById(R.id.game_over); Animation foregroundAnim = AnimationUtils.loadAnimation(this, R.anim.horizontal_layer2_slide); Animation backgroundAnim = AnimationUtils.loadAnimation(this, R.anim.horizontal_layer1_slide); background.startAnimation(backgroundAnim); foreground.startAnimation(foregroundAnim); gameOver.startAnimation(gameOverAnim); mAnimationEndTime = gameOverAnim.getDuration() + System.currentTimeMillis(); } else if (mAnimationType == ROKUDOU_ENDING) { setContentView(R.layout.rokudou_ending_animation); View background = findViewById(R.id.animation_background); View sphere = findViewById(R.id.animation_sphere); View cliffs = findViewById(R.id.animation_cliffs); View rokudou = findViewById(R.id.animation_rokudou); View gameOver = findViewById(R.id.game_over); Animation backgroundAnim = AnimationUtils.loadAnimation(this, R.anim.rokudou_slide_bg); Animation sphereAnim = AnimationUtils.loadAnimation(this, R.anim.rokudou_slide_sphere); Animation cliffsAnim = AnimationUtils.loadAnimation(this, R.anim.rokudou_slide_cliffs); Animation rokudouAnim = AnimationUtils.loadAnimation(this, R.anim.rokudou_slide_rokudou); Animation gameOverAnim = AnimationUtils.loadAnimation(this, R.anim.rokudou_game_over); background.startAnimation(backgroundAnim); sphere.startAnimation(sphereAnim); cliffs.startAnimation(cliffsAnim); rokudou.startAnimation(rokudouAnim); gameOver.startAnimation(gameOverAnim); mAnimationEndTime = gameOverAnim.getDuration() + System.currentTimeMillis(); } else { assert false; } } // Pass the calling intent back so that we can figure out which animation just played. setResult(RESULT_OK, callingIntent); } @Override public boolean onTouchEvent(MotionEvent event) { long time = System.currentTimeMillis(); if (time > mAnimationEndTime) { finish(); } else { try { Thread.sleep(32); } catch (InterruptedException e) { // Safe to ignore. } } return true; } @Override public void onWindowFocusChanged(boolean hasFocus) { if (hasFocus && mAnimation != null) { mAnimation.start(); mKillActivityHandler.sleep(mAnimation.getDuration(0) * mAnimation.getNumberOfFrames()); } } }