blob: 13013a8d776ef921ca1d5a5260c450b2acc991b0 [file] [log] [blame]
Dianne Hackborna1111872010-11-23 20:55:11 -08001/*
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
Dianne Hackborn6e1eb762011-02-17 16:07:28 -080017package com.android.server.wm;
Dianne Hackborna1111872010-11-23 20:55:11 -080018
Dianne Hackborn4dcece82012-02-10 14:50:32 -080019import java.io.PrintWriter;
20
Craig Mautner7d8df392012-04-06 15:26:23 -070021import static com.android.server.wm.WindowStateAnimator.SurfaceTrace;
22
Dianne Hackbornf9d0be92010-11-24 12:35:25 -080023import android.content.Context;
Dianne Hackborna1111872010-11-23 20:55:11 -080024import android.graphics.Matrix;
Dianne Hackborna1111872010-11-23 20:55:11 -080025import android.graphics.PixelFormat;
26import android.graphics.Rect;
Dianne Hackborna1111872010-11-23 20:55:11 -080027import android.util.Slog;
Dianne Hackborna1111872010-11-23 20:55:11 -080028import android.view.Surface;
29import android.view.SurfaceSession;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -080030import android.view.animation.Animation;
31import android.view.animation.AnimationUtils;
32import android.view.animation.Transformation;
Dianne Hackborna1111872010-11-23 20:55:11 -080033
Craig Mautnere32c3072012-03-12 15:25:35 -070034class ScreenRotationAnimation {
Dianne Hackbornf9d0be92010-11-24 12:35:25 -080035 static final String TAG = "ScreenRotationAnimation";
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -080036 static final boolean DEBUG_STATE = false;
37 static final boolean DEBUG_TRANSFORMS = false;
Dianne Hackborn187ae2102012-04-11 18:12:06 -070038 static final boolean TWO_PHASE_ANIMATION = false;
Dianne Hackbornd6b32b62012-03-16 11:54:51 -070039 static final boolean USE_CUSTOM_BLACK_FRAME = false;
Dianne Hackborna1111872010-11-23 20:55:11 -080040
Dianne Hackborn50660e22011-02-02 17:12:25 -080041 static final int FREEZE_LAYER = WindowManagerService.TYPE_LAYER_MULTIPLIER * 200;
42
Dianne Hackbornf9d0be92010-11-24 12:35:25 -080043 final Context mContext;
Dianne Hackborna1111872010-11-23 20:55:11 -080044 Surface mSurface;
Dianne Hackbornd6b32b62012-03-16 11:54:51 -070045 BlackFrame mCustomBlackFrame;
46 BlackFrame mExitingBlackFrame;
47 BlackFrame mEnteringBlackFrame;
Dianne Hackborna1111872010-11-23 20:55:11 -080048 int mWidth, mHeight;
49
Dianne Hackbornf9d0be92010-11-24 12:35:25 -080050 int mOriginalRotation;
51 int mOriginalWidth, mOriginalHeight;
Dianne Hackborna1111872010-11-23 20:55:11 -080052 int mCurRotation;
Dianne Hackborna1111872010-11-23 20:55:11 -080053
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -080054 // For all animations, "exit" is for the UI elements that are going
55 // away (that is the snapshot of the old screen), and "enter" is for
56 // the new UI elements that are appearing (that is the active windows
57 // in their final orientation).
58
59 // The starting animation for the exiting and entering elements. This
60 // animation applies a transformation while the rotation is in progress.
61 // It is started immediately, before the new entering UI is ready.
62 Animation mStartExitAnimation;
63 final Transformation mStartExitTransformation = new Transformation();
64 Animation mStartEnterAnimation;
65 final Transformation mStartEnterTransformation = new Transformation();
Dianne Hackborn9fd74802012-03-01 19:26:31 -080066 Animation mStartFrameAnimation;
67 final Transformation mStartFrameTransformation = new Transformation();
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -080068
69 // The finishing animation for the exiting and entering elements. This
70 // animation needs to undo the transformation of the starting animation.
71 // It starts running once the new rotation UI elements are ready to be
72 // displayed.
73 Animation mFinishExitAnimation;
74 final Transformation mFinishExitTransformation = new Transformation();
75 Animation mFinishEnterAnimation;
76 final Transformation mFinishEnterTransformation = new Transformation();
Dianne Hackborn9fd74802012-03-01 19:26:31 -080077 Animation mFinishFrameAnimation;
78 final Transformation mFinishFrameTransformation = new Transformation();
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -080079
80 // The current active animation to move from the old to the new rotated
81 // state. Which animation is run here will depend on the old and new
82 // rotations.
83 Animation mRotateExitAnimation;
84 final Transformation mRotateExitTransformation = new Transformation();
85 Animation mRotateEnterAnimation;
86 final Transformation mRotateEnterTransformation = new Transformation();
Dianne Hackborn9fd74802012-03-01 19:26:31 -080087 Animation mRotateFrameAnimation;
88 final Transformation mRotateFrameTransformation = new Transformation();
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -080089
90 // A previously running rotate animation. This will be used if we need
91 // to switch to a new rotation before finishing the previous one.
92 Animation mLastRotateExitAnimation;
93 final Transformation mLastRotateExitTransformation = new Transformation();
94 Animation mLastRotateEnterAnimation;
95 final Transformation mLastRotateEnterTransformation = new Transformation();
Dianne Hackborn9fd74802012-03-01 19:26:31 -080096 Animation mLastRotateFrameAnimation;
97 final Transformation mLastRotateFrameTransformation = new Transformation();
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -080098
99 // Complete transformations being applied.
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800100 final Transformation mExitTransformation = new Transformation();
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800101 final Transformation mEnterTransformation = new Transformation();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800102 final Transformation mFrameTransformation = new Transformation();
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800103
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800104 boolean mStarted;
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800105 boolean mAnimRunning;
106 boolean mFinishAnimReady;
107 long mFinishAnimStartTime;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800108
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800109 final Matrix mFrameInitialMatrix = new Matrix();
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800110 final Matrix mSnapshotInitialMatrix = new Matrix();
111 final Matrix mSnapshotFinalMatrix = new Matrix();
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700112 final Matrix mExitFrameFinalMatrix = new Matrix();
Dianne Hackborn50660e22011-02-02 17:12:25 -0800113 final Matrix mTmpMatrix = new Matrix();
Dianne Hackborna1111872010-11-23 20:55:11 -0800114 final float[] mTmpFloats = new float[9];
Craig Mautnerdbb79912012-03-01 18:59:14 -0800115 private boolean mMoreRotateEnter;
116 private boolean mMoreRotateExit;
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800117 private boolean mMoreRotateFrame;
Craig Mautnerdbb79912012-03-01 18:59:14 -0800118 private boolean mMoreFinishEnter;
119 private boolean mMoreFinishExit;
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800120 private boolean mMoreFinishFrame;
Craig Mautnerdbb79912012-03-01 18:59:14 -0800121 private boolean mMoreStartEnter;
122 private boolean mMoreStartExit;
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800123 private boolean mMoreStartFrame;
Craig Mautner3255a282012-04-16 15:42:47 -0700124 long mHalfwayPoint;
Dianne Hackborna1111872010-11-23 20:55:11 -0800125
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800126 public void printTo(String prefix, PrintWriter pw) {
127 pw.print(prefix); pw.print("mSurface="); pw.print(mSurface);
128 pw.print(" mWidth="); pw.print(mWidth);
129 pw.print(" mHeight="); pw.println(mHeight);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700130 if (USE_CUSTOM_BLACK_FRAME) {
131 pw.print(prefix); pw.print("mCustomBlackFrame="); pw.println(mCustomBlackFrame);
132 if (mCustomBlackFrame != null) {
133 mCustomBlackFrame.printTo(prefix + " ", pw);
134 }
135 }
136 pw.print(prefix); pw.print("mExitingBlackFrame="); pw.println(mExitingBlackFrame);
137 if (mExitingBlackFrame != null) {
138 mExitingBlackFrame.printTo(prefix + " ", pw);
139 }
140 pw.print(prefix); pw.print("mEnteringBlackFrame="); pw.println(mEnteringBlackFrame);
141 if (mEnteringBlackFrame != null) {
142 mEnteringBlackFrame.printTo(prefix + " ", pw);
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800143 }
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700144 pw.print(prefix); pw.print("mCurRotation="); pw.print(mCurRotation);
145 pw.print(" mOriginalRotation="); pw.println(mOriginalRotation);
146 pw.print(prefix); pw.print("mOriginalWidth="); pw.print(mOriginalWidth);
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800147 pw.print(" mOriginalHeight="); pw.println(mOriginalHeight);
148 pw.print(prefix); pw.print("mStarted="); pw.print(mStarted);
149 pw.print(" mAnimRunning="); pw.print(mAnimRunning);
150 pw.print(" mFinishAnimReady="); pw.print(mFinishAnimReady);
151 pw.print(" mFinishAnimStartTime="); pw.println(mFinishAnimStartTime);
152 pw.print(prefix); pw.print("mStartExitAnimation="); pw.print(mStartExitAnimation);
153 pw.print(" "); mStartExitTransformation.printShortString(pw); pw.println();
154 pw.print(prefix); pw.print("mStartEnterAnimation="); pw.print(mStartEnterAnimation);
155 pw.print(" "); mStartEnterTransformation.printShortString(pw); pw.println();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800156 pw.print(prefix); pw.print("mStartFrameAnimation="); pw.print(mStartFrameAnimation);
157 pw.print(" "); mStartFrameTransformation.printShortString(pw); pw.println();
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800158 pw.print(prefix); pw.print("mFinishExitAnimation="); pw.print(mFinishExitAnimation);
159 pw.print(" "); mFinishExitTransformation.printShortString(pw); pw.println();
160 pw.print(prefix); pw.print("mFinishEnterAnimation="); pw.print(mFinishEnterAnimation);
161 pw.print(" "); mFinishEnterTransformation.printShortString(pw); pw.println();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800162 pw.print(prefix); pw.print("mFinishFrameAnimation="); pw.print(mFinishFrameAnimation);
163 pw.print(" "); mFinishFrameTransformation.printShortString(pw); pw.println();
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800164 pw.print(prefix); pw.print("mRotateExitAnimation="); pw.print(mRotateExitAnimation);
165 pw.print(" "); mRotateExitTransformation.printShortString(pw); pw.println();
166 pw.print(prefix); pw.print("mRotateEnterAnimation="); pw.print(mRotateEnterAnimation);
167 pw.print(" "); mRotateEnterTransformation.printShortString(pw); pw.println();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800168 pw.print(prefix); pw.print("mRotateFrameAnimation="); pw.print(mRotateFrameAnimation);
169 pw.print(" "); mRotateFrameTransformation.printShortString(pw); pw.println();
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800170 pw.print(prefix); pw.print("mExitTransformation=");
171 mExitTransformation.printShortString(pw); pw.println();
172 pw.print(prefix); pw.print("mEnterTransformation=");
173 mEnterTransformation.printShortString(pw); pw.println();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800174 pw.print(prefix); pw.print("mFrameTransformation=");
175 mEnterTransformation.printShortString(pw); pw.println();
176 pw.print(prefix); pw.print("mFrameInitialMatrix=");
177 mFrameInitialMatrix.printShortString(pw);
178 pw.println();
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800179 pw.print(prefix); pw.print("mSnapshotInitialMatrix=");
180 mSnapshotInitialMatrix.printShortString(pw);
181 pw.print(" mSnapshotFinalMatrix="); mSnapshotFinalMatrix.printShortString(pw);
182 pw.println();
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700183 pw.print(prefix); pw.print("mExitFrameFinalMatrix=");
184 mExitFrameFinalMatrix.printShortString(pw);
185 pw.println();
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800186 }
187
Jeff Brownbc68a592011-07-25 12:58:12 -0700188 public ScreenRotationAnimation(Context context, SurfaceSession session,
189 boolean inTransaction, int originalWidth, int originalHeight, int originalRotation) {
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800190 mContext = context;
Dianne Hackborna1111872010-11-23 20:55:11 -0800191
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800192 // Screenshot does NOT include rotation!
Mathias Agopian0ab84ef2011-10-13 16:02:48 -0700193 if (originalRotation == Surface.ROTATION_90
194 || originalRotation == Surface.ROTATION_270) {
195 mWidth = originalHeight;
196 mHeight = originalWidth;
197 } else {
198 mWidth = originalWidth;
199 mHeight = originalHeight;
200 }
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800201
Jeff Brownbc68a592011-07-25 12:58:12 -0700202 mOriginalRotation = originalRotation;
203 mOriginalWidth = originalWidth;
204 mOriginalHeight = originalHeight;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800205
Dianne Hackborn94cb2eb2011-01-13 21:09:44 -0800206 if (!inTransaction) {
Dianne Hackborn36991742011-10-11 21:35:26 -0700207 if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i(WindowManagerService.TAG,
Dianne Hackborn94cb2eb2011-01-13 21:09:44 -0800208 ">>> OPEN TRANSACTION ScreenRotationAnimation");
209 Surface.openTransaction();
210 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700211
Dianne Hackborna1111872010-11-23 20:55:11 -0800212 try {
Dianne Hackborn352cc982011-01-04 11:34:18 -0800213 try {
Craig Mautner7d8df392012-04-06 15:26:23 -0700214 if (WindowManagerService.DEBUG_SURFACE_TRACE) {
215 mSurface = new SurfaceTrace(session, 0, "FreezeSurface", -1, mWidth, mHeight,
216 PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN);
217 } else {
218 mSurface = new Surface(session, 0, "FreezeSurface", -1, mWidth, mHeight,
219 PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN);
220 }
Craig Mautnerbf90eaa2012-03-15 11:28:53 -0700221 if (!mSurface.isValid()) {
Mathias Agopian0ab84ef2011-10-13 16:02:48 -0700222 // Screenshot failed, punt.
223 mSurface = null;
224 return;
225 }
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700226 mSurface.setLayer(FREEZE_LAYER + 1);
Craig Mautner7d8df392012-04-06 15:26:23 -0700227 mSurface.setAlpha(0);
Mathias Agopiane65beaa2011-11-01 14:39:06 -0700228 mSurface.show();
Dianne Hackborn352cc982011-01-04 11:34:18 -0800229 } catch (Surface.OutOfResourcesException e) {
Dianne Hackborn94cb2eb2011-01-13 21:09:44 -0800230 Slog.w(TAG, "Unable to allocate freeze surface", e);
Dianne Hackborn352cc982011-01-04 11:34:18 -0800231 }
Dianne Hackborna1111872010-11-23 20:55:11 -0800232
Dianne Hackborn5fd21692011-06-07 14:09:47 -0700233 if (WindowManagerService.SHOW_TRANSACTIONS ||
234 WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(WindowManagerService.TAG,
235 " FREEZE " + mSurface + ": CREATE");
236
Jeff Brownbc68a592011-07-25 12:58:12 -0700237 setRotation(originalRotation);
Dianne Hackborn94cb2eb2011-01-13 21:09:44 -0800238 } finally {
239 if (!inTransaction) {
240 Surface.closeTransaction();
Dianne Hackborn36991742011-10-11 21:35:26 -0700241 if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i(WindowManagerService.TAG,
Dianne Hackborn94cb2eb2011-01-13 21:09:44 -0800242 "<<< CLOSE TRANSACTION ScreenRotationAnimation");
Dianne Hackborn352cc982011-01-04 11:34:18 -0800243 }
Dianne Hackborn0f761d62010-11-30 22:06:10 -0800244 }
Dianne Hackborna1111872010-11-23 20:55:11 -0800245 }
246
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800247 boolean hasScreenshot() {
248 return mSurface != null;
249 }
250
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800251 static int deltaRotation(int oldRotation, int newRotation) {
252 int delta = newRotation - oldRotation;
Dianne Hackborna1111872010-11-23 20:55:11 -0800253 if (delta < 0) delta += 4;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800254 return delta;
255 }
Dianne Hackborna1111872010-11-23 20:55:11 -0800256
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800257 void setSnapshotTransform(Matrix matrix, float alpha) {
Dianne Hackborn352cc982011-01-04 11:34:18 -0800258 if (mSurface != null) {
259 matrix.getValues(mTmpFloats);
Dianne Hackbornd040edb2011-08-31 12:47:58 -0700260 mSurface.setPosition(mTmpFloats[Matrix.MTRANS_X],
261 mTmpFloats[Matrix.MTRANS_Y]);
Dianne Hackborn352cc982011-01-04 11:34:18 -0800262 mSurface.setMatrix(
263 mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
264 mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]);
265 mSurface.setAlpha(alpha);
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800266 if (DEBUG_TRANSFORMS) {
Dianne Hackborn352cc982011-01-04 11:34:18 -0800267 float[] srcPnts = new float[] { 0, 0, mWidth, mHeight };
268 float[] dstPnts = new float[4];
269 matrix.mapPoints(dstPnts, srcPnts);
270 Slog.i(TAG, "Original : (" + srcPnts[0] + "," + srcPnts[1]
271 + ")-(" + srcPnts[2] + "," + srcPnts[3] + ")");
272 Slog.i(TAG, "Transformed: (" + dstPnts[0] + "," + dstPnts[1]
273 + ")-(" + dstPnts[2] + "," + dstPnts[3] + ")");
274 }
Dianne Hackborna1111872010-11-23 20:55:11 -0800275 }
276 }
277
Dianne Hackborn0aae2d42010-12-07 23:51:29 -0800278 public static void createRotationMatrix(int rotation, int width, int height,
279 Matrix outMatrix) {
280 switch (rotation) {
281 case Surface.ROTATION_0:
282 outMatrix.reset();
283 break;
284 case Surface.ROTATION_90:
285 outMatrix.setRotate(90, 0, 0);
286 outMatrix.postTranslate(height, 0);
287 break;
288 case Surface.ROTATION_180:
289 outMatrix.setRotate(180, 0, 0);
290 outMatrix.postTranslate(width, height);
291 break;
292 case Surface.ROTATION_270:
293 outMatrix.setRotate(270, 0, 0);
294 outMatrix.postTranslate(0, width);
295 break;
296 }
297 }
298
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800299 // Must be called while in a transaction.
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800300 private void setRotation(int rotation) {
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800301 mCurRotation = rotation;
302
303 // Compute the transformation matrix that must be applied
304 // to the snapshot to make it stay in the same original position
305 // with the current screen rotation.
Craig Mautnerbf90eaa2012-03-15 11:28:53 -0700306 int delta = deltaRotation(rotation, Surface.ROTATION_0);
Dianne Hackborn0aae2d42010-12-07 23:51:29 -0800307 createRotationMatrix(delta, mWidth, mHeight, mSnapshotInitialMatrix);
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800308
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800309 if (DEBUG_STATE) Slog.v(TAG, "**** ROTATION: " + delta);
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800310 setSnapshotTransform(mSnapshotInitialMatrix, 1.0f);
311 }
312
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800313 // Must be called while in a transaction.
314 public boolean setRotation(int rotation, SurfaceSession session,
315 long maxAnimationDuration, float animationScale, int finalWidth, int finalHeight) {
316 setRotation(rotation);
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700317 if (TWO_PHASE_ANIMATION) {
318 return startAnimation(session, maxAnimationDuration, animationScale,
319 finalWidth, finalHeight, false);
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700320 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700321
322 // Don't start animation yet.
323 return false;
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800324 }
325
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800326 /**
327 * Returns true if animating.
328 */
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800329 private boolean startAnimation(SurfaceSession session, long maxAnimationDuration,
330 float animationScale, int finalWidth, int finalHeight, boolean dismissing) {
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800331 if (mSurface == null) {
332 // Can't do animation.
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800333 return false;
334 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800335 if (mStarted) {
336 return true;
337 }
338
339 mStarted = true;
340
341 boolean firstStart = false;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800342
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800343 // Figure out how the screen has moved from the original rotation.
344 int delta = deltaRotation(mCurRotation, mOriginalRotation);
345
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700346 if (TWO_PHASE_ANIMATION && mFinishExitAnimation == null
347 && (!dismissing || delta != Surface.ROTATION_0)) {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800348 if (DEBUG_STATE) Slog.v(TAG, "Creating start and finish animations");
349 firstStart = true;
350 mStartExitAnimation = AnimationUtils.loadAnimation(mContext,
351 com.android.internal.R.anim.screen_rotate_start_exit);
352 mStartEnterAnimation = AnimationUtils.loadAnimation(mContext,
353 com.android.internal.R.anim.screen_rotate_start_enter);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700354 if (USE_CUSTOM_BLACK_FRAME) {
355 mStartFrameAnimation = AnimationUtils.loadAnimation(mContext,
356 com.android.internal.R.anim.screen_rotate_start_frame);
357 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800358 mFinishExitAnimation = AnimationUtils.loadAnimation(mContext,
359 com.android.internal.R.anim.screen_rotate_finish_exit);
360 mFinishEnterAnimation = AnimationUtils.loadAnimation(mContext,
361 com.android.internal.R.anim.screen_rotate_finish_enter);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700362 if (USE_CUSTOM_BLACK_FRAME) {
363 mFinishFrameAnimation = AnimationUtils.loadAnimation(mContext,
364 com.android.internal.R.anim.screen_rotate_finish_frame);
365 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800366 }
367
368 if (DEBUG_STATE) Slog.v(TAG, "Rotation delta: " + delta + " finalWidth="
369 + finalWidth + " finalHeight=" + finalHeight
370 + " origWidth=" + mOriginalWidth + " origHeight=" + mOriginalHeight);
371
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800372 switch (delta) {
373 case Surface.ROTATION_0:
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800374 mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800375 com.android.internal.R.anim.screen_rotate_0_exit);
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800376 mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800377 com.android.internal.R.anim.screen_rotate_0_enter);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700378 if (USE_CUSTOM_BLACK_FRAME) {
379 mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
380 com.android.internal.R.anim.screen_rotate_0_frame);
381 }
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800382 break;
383 case Surface.ROTATION_90:
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800384 mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800385 com.android.internal.R.anim.screen_rotate_plus_90_exit);
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800386 mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800387 com.android.internal.R.anim.screen_rotate_plus_90_enter);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700388 if (USE_CUSTOM_BLACK_FRAME) {
389 mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
390 com.android.internal.R.anim.screen_rotate_plus_90_frame);
391 }
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800392 break;
393 case Surface.ROTATION_180:
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800394 mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800395 com.android.internal.R.anim.screen_rotate_180_exit);
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800396 mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800397 com.android.internal.R.anim.screen_rotate_180_enter);
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800398 mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
399 com.android.internal.R.anim.screen_rotate_180_frame);
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800400 break;
401 case Surface.ROTATION_270:
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800402 mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800403 com.android.internal.R.anim.screen_rotate_minus_90_exit);
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800404 mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800405 com.android.internal.R.anim.screen_rotate_minus_90_enter);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700406 if (USE_CUSTOM_BLACK_FRAME) {
407 mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
408 com.android.internal.R.anim.screen_rotate_minus_90_frame);
409 }
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800410 break;
411 }
412
Dianne Hackborn191874e32012-03-09 11:03:36 -0800413 // Compute partial steps between original and final sizes. These
414 // are used for the dimensions of the exiting and entering elements,
415 // so they are never stretched too significantly.
416 final int halfWidth = (finalWidth + mOriginalWidth) / 2;
417 final int halfHeight = (finalHeight + mOriginalHeight) / 2;
418
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800419 // Initialize the animations. This is a hack, redefining what "parent"
420 // means to allow supplying the last and next size. In this definition
421 // "%p" is the original (let's call it "previous") size, and "%" is the
422 // screen's current/new size.
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700423 if (TWO_PHASE_ANIMATION && firstStart) {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800424 if (DEBUG_STATE) Slog.v(TAG, "Initializing start and finish animations");
425 mStartEnterAnimation.initialize(finalWidth, finalHeight,
Dianne Hackborn191874e32012-03-09 11:03:36 -0800426 halfWidth, halfHeight);
427 mStartExitAnimation.initialize(halfWidth, halfHeight,
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800428 mOriginalWidth, mOriginalHeight);
429 mFinishEnterAnimation.initialize(finalWidth, finalHeight,
Dianne Hackborn191874e32012-03-09 11:03:36 -0800430 halfWidth, halfHeight);
431 mFinishExitAnimation.initialize(halfWidth, halfHeight,
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800432 mOriginalWidth, mOriginalHeight);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700433 if (USE_CUSTOM_BLACK_FRAME) {
434 mStartFrameAnimation.initialize(finalWidth, finalHeight,
435 mOriginalWidth, mOriginalHeight);
436 mFinishFrameAnimation.initialize(finalWidth, finalHeight,
437 mOriginalWidth, mOriginalHeight);
438 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800439 }
440 mRotateEnterAnimation.initialize(finalWidth, finalHeight, mOriginalWidth, mOriginalHeight);
441 mRotateExitAnimation.initialize(finalWidth, finalHeight, mOriginalWidth, mOriginalHeight);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700442 if (USE_CUSTOM_BLACK_FRAME) {
443 mRotateFrameAnimation.initialize(finalWidth, finalHeight, mOriginalWidth,
444 mOriginalHeight);
445 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800446 mAnimRunning = false;
447 mFinishAnimReady = false;
448 mFinishAnimStartTime = -1;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800449
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700450 if (TWO_PHASE_ANIMATION && firstStart) {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800451 mStartExitAnimation.restrictDuration(maxAnimationDuration);
452 mStartExitAnimation.scaleCurrentDuration(animationScale);
453 mStartEnterAnimation.restrictDuration(maxAnimationDuration);
454 mStartEnterAnimation.scaleCurrentDuration(animationScale);
455 mFinishExitAnimation.restrictDuration(maxAnimationDuration);
456 mFinishExitAnimation.scaleCurrentDuration(animationScale);
457 mFinishEnterAnimation.restrictDuration(maxAnimationDuration);
458 mFinishEnterAnimation.scaleCurrentDuration(animationScale);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700459 if (USE_CUSTOM_BLACK_FRAME) {
460 mStartFrameAnimation.restrictDuration(maxAnimationDuration);
461 mStartFrameAnimation.scaleCurrentDuration(animationScale);
462 mFinishFrameAnimation.restrictDuration(maxAnimationDuration);
463 mFinishFrameAnimation.scaleCurrentDuration(animationScale);
464 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800465 }
466 mRotateExitAnimation.restrictDuration(maxAnimationDuration);
467 mRotateExitAnimation.scaleCurrentDuration(animationScale);
468 mRotateEnterAnimation.restrictDuration(maxAnimationDuration);
469 mRotateEnterAnimation.scaleCurrentDuration(animationScale);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700470 if (USE_CUSTOM_BLACK_FRAME) {
471 mRotateFrameAnimation.restrictDuration(maxAnimationDuration);
472 mRotateFrameAnimation.scaleCurrentDuration(animationScale);
473 }
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800474
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700475 if (USE_CUSTOM_BLACK_FRAME && mCustomBlackFrame == null) {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800476 if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
477 WindowManagerService.TAG,
478 ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation");
479 Surface.openTransaction();
Dianne Hackborn50660e22011-02-02 17:12:25 -0800480
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800481 // Compute the transformation matrix that must be applied
482 // the the black frame to make it stay in the initial position
483 // before the new screen rotation. This is different than the
484 // snapshot transformation because the snapshot is always based
485 // of the native orientation of the screen, not the orientation
486 // we were last in.
487 createRotationMatrix(delta, mOriginalWidth, mOriginalHeight, mFrameInitialMatrix);
488
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800489 try {
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800490 Rect outer = new Rect(-mOriginalWidth*1, -mOriginalHeight*1,
491 mOriginalWidth*2, mOriginalHeight*2);
492 Rect inner = new Rect(0, 0, mOriginalWidth, mOriginalHeight);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700493 mCustomBlackFrame = new BlackFrame(session, outer, inner, FREEZE_LAYER + 3);
494 mCustomBlackFrame.setMatrix(mFrameInitialMatrix);
495 } catch (Surface.OutOfResourcesException e) {
496 Slog.w(TAG, "Unable to allocate black surface", e);
497 } finally {
498 Surface.closeTransaction();
499 if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
500 WindowManagerService.TAG,
501 "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation");
502 }
503 }
504
505 if (mExitingBlackFrame == null) {
506 if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
507 WindowManagerService.TAG,
508 ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation");
509 Surface.openTransaction();
510
511 // Compute the transformation matrix that must be applied
512 // the the black frame to make it stay in the initial position
513 // before the new screen rotation. This is different than the
514 // snapshot transformation because the snapshot is always based
515 // of the native orientation of the screen, not the orientation
516 // we were last in.
517 createRotationMatrix(delta, mOriginalWidth, mOriginalHeight, mFrameInitialMatrix);
518
519 try {
520 Rect outer = new Rect(-mOriginalWidth*1, -mOriginalHeight*1,
521 mOriginalWidth*2, mOriginalHeight*2);
522 Rect inner = new Rect(0, 0, mOriginalWidth, mOriginalHeight);
523 mExitingBlackFrame = new BlackFrame(session, outer, inner, FREEZE_LAYER + 2);
524 mExitingBlackFrame.setMatrix(mFrameInitialMatrix);
525 } catch (Surface.OutOfResourcesException e) {
526 Slog.w(TAG, "Unable to allocate black surface", e);
527 } finally {
528 Surface.closeTransaction();
529 if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
530 WindowManagerService.TAG,
531 "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation");
532 }
533 }
534
535 if (false && mEnteringBlackFrame == null) {
536 if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
537 WindowManagerService.TAG,
538 ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation");
539 Surface.openTransaction();
540
541 try {
542 Rect outer = new Rect(-finalWidth*1, -finalHeight*1,
543 finalWidth*2, finalHeight*2);
544 Rect inner = new Rect(0, 0, finalWidth, finalHeight);
545 mEnteringBlackFrame = new BlackFrame(session, outer, inner, FREEZE_LAYER);
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800546 } catch (Surface.OutOfResourcesException e) {
547 Slog.w(TAG, "Unable to allocate black surface", e);
548 } finally {
549 Surface.closeTransaction();
550 if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
551 WindowManagerService.TAG,
552 "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation");
553 }
Dianne Hackborn50660e22011-02-02 17:12:25 -0800554 }
555
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800556 return true;
557 }
558
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800559 /**
560 * Returns true if animating.
561 */
562 public boolean dismiss(SurfaceSession session, long maxAnimationDuration,
563 float animationScale, int finalWidth, int finalHeight) {
564 if (DEBUG_STATE) Slog.v(TAG, "Dismiss!");
565 if (mSurface == null) {
566 // Can't do animation.
567 return false;
568 }
569 if (!mStarted) {
570 startAnimation(session, maxAnimationDuration, animationScale, finalWidth, finalHeight,
571 true);
572 }
573 if (!mStarted) {
574 return false;
575 }
576 if (DEBUG_STATE) Slog.v(TAG, "Setting mFinishAnimReady = true");
577 mFinishAnimReady = true;
578 return true;
579 }
580
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800581 public void kill() {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800582 if (DEBUG_STATE) Slog.v(TAG, "Kill!");
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800583 if (mSurface != null) {
Dianne Hackborn5fd21692011-06-07 14:09:47 -0700584 if (WindowManagerService.SHOW_TRANSACTIONS ||
585 WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(WindowManagerService.TAG,
586 " FREEZE " + mSurface + ": DESTROY");
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800587 mSurface.destroy();
588 mSurface = null;
589 }
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700590 if (mCustomBlackFrame != null) {
591 mCustomBlackFrame.kill();
592 mCustomBlackFrame = null;
593 }
594 if (mExitingBlackFrame != null) {
595 mExitingBlackFrame.kill();
596 mExitingBlackFrame = null;
597 }
598 if (mEnteringBlackFrame != null) {
599 mEnteringBlackFrame.kill();
600 mEnteringBlackFrame = null;
Dianne Hackborn352cc982011-01-04 11:34:18 -0800601 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700602 if (TWO_PHASE_ANIMATION) {
603 if (mStartExitAnimation != null) {
604 mStartExitAnimation.cancel();
605 mStartExitAnimation = null;
606 }
607 if (mStartEnterAnimation != null) {
608 mStartEnterAnimation.cancel();
609 mStartEnterAnimation = null;
610 }
611 if (mFinishExitAnimation != null) {
612 mFinishExitAnimation.cancel();
613 mFinishExitAnimation = null;
614 }
615 if (mFinishEnterAnimation != null) {
616 mFinishEnterAnimation.cancel();
617 mFinishEnterAnimation = null;
618 }
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800619 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700620 if (USE_CUSTOM_BLACK_FRAME) {
621 if (mStartFrameAnimation != null) {
622 mStartFrameAnimation.cancel();
623 mStartFrameAnimation = null;
624 }
625 if (mRotateFrameAnimation != null) {
626 mRotateFrameAnimation.cancel();
627 mRotateFrameAnimation = null;
628 }
629 if (mFinishFrameAnimation != null) {
630 mFinishFrameAnimation.cancel();
631 mFinishFrameAnimation = null;
632 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800633 }
634 if (mRotateExitAnimation != null) {
635 mRotateExitAnimation.cancel();
636 mRotateExitAnimation = null;
637 }
638 if (mRotateEnterAnimation != null) {
639 mRotateEnterAnimation.cancel();
640 mRotateEnterAnimation = null;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800641 }
642 }
643
644 public boolean isAnimating() {
Craig Mautner7d8df392012-04-06 15:26:23 -0700645 return hasAnimations() || (TWO_PHASE_ANIMATION && mFinishAnimReady);
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700646 }
647
648 private boolean hasAnimations() {
Craig Mautner7d8df392012-04-06 15:26:23 -0700649 return (TWO_PHASE_ANIMATION &&
650 (mStartEnterAnimation != null || mStartExitAnimation != null
651 || mFinishEnterAnimation != null || mFinishExitAnimation != null))
652 || (USE_CUSTOM_BLACK_FRAME &&
653 (mStartFrameAnimation != null || mRotateFrameAnimation != null
654 || mFinishFrameAnimation != null))
655 || mRotateEnterAnimation != null || mRotateExitAnimation != null;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800656 }
657
Craig Mautnere32c3072012-03-12 15:25:35 -0700658 private boolean stepAnimation(long now) {
Craig Mautner3255a282012-04-16 15:42:47 -0700659 if (now > mHalfwayPoint) {
660 mHalfwayPoint = Long.MAX_VALUE;
661 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800662 if (mFinishAnimReady && mFinishAnimStartTime < 0) {
663 if (DEBUG_STATE) Slog.v(TAG, "Step: finish anim now ready");
664 mFinishAnimStartTime = now;
665 }
666
Craig Mautner7d8df392012-04-06 15:26:23 -0700667 if (TWO_PHASE_ANIMATION) {
668 mMoreStartExit = false;
669 if (mStartExitAnimation != null) {
670 mMoreStartExit = mStartExitAnimation.getTransformation(now, mStartExitTransformation);
671 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start exit: " + mStartExitTransformation);
672 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800673
Craig Mautner7d8df392012-04-06 15:26:23 -0700674 mMoreStartEnter = false;
675 if (mStartEnterAnimation != null) {
676 mMoreStartEnter = mStartEnterAnimation.getTransformation(now, mStartEnterTransformation);
677 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start enter: " + mStartEnterTransformation);
678 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800679 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700680 if (USE_CUSTOM_BLACK_FRAME) {
681 mMoreStartFrame = false;
682 if (mStartFrameAnimation != null) {
683 mMoreStartFrame = mStartFrameAnimation.getTransformation(now, mStartFrameTransformation);
684 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start frame: " + mStartFrameTransformation);
685 }
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800686 }
687
Craig Mautnerdbb79912012-03-01 18:59:14 -0800688 long finishNow = mFinishAnimReady ? (now - mFinishAnimStartTime) : 0;
689 if (DEBUG_STATE) Slog.v(TAG, "Step: finishNow=" + finishNow);
690
Craig Mautner7d8df392012-04-06 15:26:23 -0700691 if (TWO_PHASE_ANIMATION) {
692 mMoreFinishExit = false;
693 if (mFinishExitAnimation != null) {
694 mMoreFinishExit = mFinishExitAnimation.getTransformation(finishNow, mFinishExitTransformation);
695 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish exit: " + mFinishExitTransformation);
696 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800697
Craig Mautner7d8df392012-04-06 15:26:23 -0700698 mMoreFinishEnter = false;
699 if (mFinishEnterAnimation != null) {
700 mMoreFinishEnter = mFinishEnterAnimation.getTransformation(finishNow, mFinishEnterTransformation);
701 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish enter: " + mFinishEnterTransformation);
702 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800703 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700704 if (USE_CUSTOM_BLACK_FRAME) {
705 mMoreFinishFrame = false;
706 if (mFinishFrameAnimation != null) {
707 mMoreFinishFrame = mFinishFrameAnimation.getTransformation(finishNow, mFinishFrameTransformation);
708 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish frame: " + mFinishFrameTransformation);
709 }
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800710 }
711
Craig Mautnerdbb79912012-03-01 18:59:14 -0800712 mMoreRotateExit = false;
713 if (mRotateExitAnimation != null) {
714 mMoreRotateExit = mRotateExitAnimation.getTransformation(now, mRotateExitTransformation);
715 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate exit: " + mRotateExitTransformation);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700716 }
717
718 mMoreRotateEnter = false;
719 if (mRotateEnterAnimation != null) {
720 mMoreRotateEnter = mRotateEnterAnimation.getTransformation(now, mRotateEnterTransformation);
721 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate enter: " + mRotateEnterTransformation);
722 }
723
Craig Mautner7d8df392012-04-06 15:26:23 -0700724 if (USE_CUSTOM_BLACK_FRAME) {
725 mMoreRotateFrame = false;
726 if (mRotateFrameAnimation != null) {
727 mMoreRotateFrame = mRotateFrameAnimation.getTransformation(now, mRotateFrameTransformation);
728 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate frame: " + mRotateFrameTransformation);
729 }
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700730 }
731
Craig Mautner7d8df392012-04-06 15:26:23 -0700732 if (!mMoreRotateExit && (!TWO_PHASE_ANIMATION || (!mMoreStartExit && !mMoreFinishExit))) {
733 if (TWO_PHASE_ANIMATION) {
734 if (mStartExitAnimation != null) {
735 if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing start exit anim!");
736 mStartExitAnimation.cancel();
737 mStartExitAnimation = null;
738 mStartExitTransformation.clear();
739 }
740 if (mFinishExitAnimation != null) {
741 if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing finish exit anim!");
742 mFinishExitAnimation.cancel();
743 mFinishExitAnimation = null;
744 mFinishExitTransformation.clear();
745 }
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700746 }
747 if (mRotateExitAnimation != null) {
748 if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing rotate exit anim!");
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800749 mRotateExitAnimation.cancel();
750 mRotateExitAnimation = null;
751 mRotateExitTransformation.clear();
752 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800753 }
754
Craig Mautner7d8df392012-04-06 15:26:23 -0700755 if (!mMoreRotateEnter && (!TWO_PHASE_ANIMATION || (!mMoreStartEnter && !mMoreFinishEnter))) {
756 if (TWO_PHASE_ANIMATION) {
757 if (mStartEnterAnimation != null) {
758 if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing start enter anim!");
759 mStartEnterAnimation.cancel();
760 mStartEnterAnimation = null;
761 mStartEnterTransformation.clear();
762 }
763 if (mFinishEnterAnimation != null) {
764 if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing finish enter anim!");
765 mFinishEnterAnimation.cancel();
766 mFinishEnterAnimation = null;
767 mFinishEnterTransformation.clear();
768 }
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700769 }
770 if (mRotateEnterAnimation != null) {
771 if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing rotate enter anim!");
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800772 mRotateEnterAnimation.cancel();
773 mRotateEnterAnimation = null;
774 mRotateEnterTransformation.clear();
775 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800776 }
777
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700778 if (USE_CUSTOM_BLACK_FRAME && !mMoreStartFrame && !mMoreRotateFrame && !mMoreFinishFrame) {
779 if (mStartFrameAnimation != null) {
780 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing start frame anim!");
781 mStartFrameAnimation.cancel();
782 mStartFrameAnimation = null;
783 mStartFrameTransformation.clear();
784 }
785 if (mFinishFrameAnimation != null) {
786 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing finish frame anim!");
787 mFinishFrameAnimation.cancel();
788 mFinishFrameAnimation = null;
789 mFinishFrameTransformation.clear();
790 }
791 if (mRotateFrameAnimation != null) {
792 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing rotate frame anim!");
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800793 mRotateFrameAnimation.cancel();
794 mRotateFrameAnimation = null;
795 mRotateFrameTransformation.clear();
796 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800797 }
798
799 mExitTransformation.set(mRotateExitTransformation);
Craig Mautnerdbb79912012-03-01 18:59:14 -0800800 mEnterTransformation.set(mRotateEnterTransformation);
Craig Mautner7d8df392012-04-06 15:26:23 -0700801 if (TWO_PHASE_ANIMATION) {
802 mExitTransformation.compose(mStartExitTransformation);
803 mExitTransformation.compose(mFinishExitTransformation);
804
805 mEnterTransformation.compose(mStartEnterTransformation);
806 mEnterTransformation.compose(mFinishEnterTransformation);
807 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800808
809 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final exit: " + mExitTransformation);
810 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final enter: " + mEnterTransformation);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700811
812 if (USE_CUSTOM_BLACK_FRAME) {
813 //mFrameTransformation.set(mRotateExitTransformation);
814 //mFrameTransformation.compose(mStartExitTransformation);
815 //mFrameTransformation.compose(mFinishExitTransformation);
816 mFrameTransformation.set(mRotateFrameTransformation);
817 mFrameTransformation.compose(mStartFrameTransformation);
818 mFrameTransformation.compose(mFinishFrameTransformation);
819 mFrameTransformation.getMatrix().preConcat(mFrameInitialMatrix);
820 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final frame: " + mFrameTransformation);
821 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800822
Craig Mautner7d8df392012-04-06 15:26:23 -0700823 final boolean more = (TWO_PHASE_ANIMATION
824 && (mMoreStartEnter || mMoreStartExit || mMoreFinishEnter || mMoreFinishExit))
825 || (USE_CUSTOM_BLACK_FRAME
826 && (mMoreStartFrame || mMoreRotateFrame || mMoreFinishFrame))
827 || mMoreRotateEnter || mMoreRotateExit
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800828 || !mFinishAnimReady;
Craig Mautnerdbb79912012-03-01 18:59:14 -0800829
830 mSnapshotFinalMatrix.setConcat(mExitTransformation.getMatrix(), mSnapshotInitialMatrix);
831
832 if (DEBUG_STATE) Slog.v(TAG, "Step: more=" + more);
833
834 return more;
835 }
836
837 void updateSurfaces() {
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700838 if (!mStarted) {
839 return;
840 }
841
Craig Mautnerbf90eaa2012-03-15 11:28:53 -0700842 if (mSurface != null) {
843 if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) {
Craig Mautnerdbb79912012-03-01 18:59:14 -0800844 if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, hiding screenshot surface");
845 mSurface.hide();
846 }
847 }
848
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700849 if (mCustomBlackFrame != null) {
Craig Mautnerbf90eaa2012-03-15 11:28:53 -0700850 if (!mMoreStartFrame && !mMoreFinishFrame && !mMoreRotateFrame) {
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800851 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding black frame");
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700852 mCustomBlackFrame.hide();
Craig Mautnerbf90eaa2012-03-15 11:28:53 -0700853 } else {
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700854 mCustomBlackFrame.setMatrix(mFrameTransformation.getMatrix());
855 }
856 }
857
858 if (mExitingBlackFrame != null) {
859 if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) {
860 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding exiting frame");
861 mExitingBlackFrame.hide();
862 } else {
863 mExitFrameFinalMatrix.setConcat(mExitTransformation.getMatrix(), mFrameInitialMatrix);
864 mExitingBlackFrame.setMatrix(mExitFrameFinalMatrix);
865 mExitingBlackFrame.setAlpha(mExitTransformation.getAlpha());
866 }
867 }
868
869 if (mEnteringBlackFrame != null) {
870 if (!mMoreStartEnter && !mMoreFinishEnter && !mMoreRotateEnter) {
871 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding entering frame");
872 mEnteringBlackFrame.hide();
873 } else {
874 mEnteringBlackFrame.setMatrix(mEnterTransformation.getMatrix());
Craig Mautnerdbb79912012-03-01 18:59:14 -0800875 }
876 }
877
878 setSnapshotTransform(mSnapshotFinalMatrix, mExitTransformation.getAlpha());
879 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700880
Craig Mautnere32c3072012-03-12 15:25:35 -0700881 public boolean stepAnimationLocked(long now) {
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700882 if (!hasAnimations()) {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800883 if (DEBUG_STATE) Slog.v(TAG, "Step: no animations running");
Craig Mautnera731cd32012-03-02 15:23:55 -0800884 mFinishAnimReady = false;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800885 return false;
886 }
887
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800888 if (!mAnimRunning) {
889 if (DEBUG_STATE) Slog.v(TAG, "Step: starting start, finish, rotate");
Craig Mautner7d8df392012-04-06 15:26:23 -0700890 if (TWO_PHASE_ANIMATION) {
891 if (mStartEnterAnimation != null) {
892 mStartEnterAnimation.setStartTime(now);
893 }
894 if (mStartExitAnimation != null) {
895 mStartExitAnimation.setStartTime(now);
896 }
897 if (mFinishEnterAnimation != null) {
898 mFinishEnterAnimation.setStartTime(0);
899 }
900 if (mFinishExitAnimation != null) {
901 mFinishExitAnimation.setStartTime(0);
902 }
Dianne Hackborn89620282011-09-11 12:47:45 -0700903 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700904 if (USE_CUSTOM_BLACK_FRAME) {
905 if (mStartFrameAnimation != null) {
906 mStartFrameAnimation.setStartTime(now);
907 }
908 if (mFinishFrameAnimation != null) {
909 mFinishFrameAnimation.setStartTime(0);
910 }
911 if (mRotateFrameAnimation != null) {
912 mRotateFrameAnimation.setStartTime(now);
913 }
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800914 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800915 if (mRotateEnterAnimation != null) {
916 mRotateEnterAnimation.setStartTime(now);
917 }
918 if (mRotateExitAnimation != null) {
919 mRotateExitAnimation.setStartTime(now);
920 }
921 mAnimRunning = true;
Craig Mautner3255a282012-04-16 15:42:47 -0700922 mHalfwayPoint = now + mRotateEnterAnimation.getDuration() / 2;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800923 }
Craig Mautnere32c3072012-03-12 15:25:35 -0700924
925 return stepAnimation(now);
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800926 }
927
928 public Transformation getEnterTransformation() {
929 return mEnterTransformation;
Dianne Hackborna1111872010-11-23 20:55:11 -0800930 }
931}