blob: 83337ca98e359452e5388f70a32f06d37f67bd03 [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
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080019import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE;
20import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
21import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC;
22import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
23import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
24import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
Chong Zhang97782b42015-10-07 16:01:23 -070025import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER;
Chong Zhang97782b42015-10-07 16:01:23 -070026import static com.android.server.wm.WindowStateAnimator.WINDOW_FREEZE_LAYER;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080027import static com.android.server.wm.WindowSurfaceController.SurfaceTrace;
28
Dianne Hackbornf9d0be92010-11-24 12:35:25 -080029import android.content.Context;
Dianne Hackborna1111872010-11-23 20:55:11 -080030import android.graphics.Matrix;
Dianne Hackborna1111872010-11-23 20:55:11 -080031import android.graphics.PixelFormat;
32import android.graphics.Rect;
Dianne Hackborna1111872010-11-23 20:55:11 -080033import android.util.Slog;
Craig Mautner6881a102012-07-27 13:04:51 -070034import android.view.Display;
Craig Mautner46ac6fa2013-08-01 10:06:34 -070035import android.view.DisplayInfo;
Dianne Hackborna1111872010-11-23 20:55:11 -080036import android.view.Surface;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080037import android.view.Surface.OutOfResourcesException;
Mathias Agopian3866f0d2013-02-11 22:08:48 -080038import android.view.SurfaceControl;
Dianne Hackborna1111872010-11-23 20:55:11 -080039import android.view.SurfaceSession;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -080040import android.view.animation.Animation;
41import android.view.animation.AnimationUtils;
42import android.view.animation.Transformation;
Dianne Hackborna1111872010-11-23 20:55:11 -080043
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080044import java.io.PrintWriter;
45
Craig Mautnere32c3072012-03-12 15:25:35 -070046class ScreenRotationAnimation {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080047 static final String TAG = TAG_WITH_CLASS_NAME ? "ScreenRotationAnimation" : TAG_WM;
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -080048 static final boolean DEBUG_STATE = false;
49 static final boolean DEBUG_TRANSFORMS = false;
Dianne Hackborn187ae2102012-04-11 18:12:06 -070050 static final boolean TWO_PHASE_ANIMATION = false;
Dianne Hackbornd6b32b62012-03-16 11:54:51 -070051 static final boolean USE_CUSTOM_BLACK_FRAME = false;
Dianne Hackborna1111872010-11-23 20:55:11 -080052
Chong Zhang97782b42015-10-07 16:01:23 -070053 /*
54 * Layers for screen rotation animation. We put these layers above
55 * WINDOW_FREEZE_LAYER so that screen freeze will cover all windows.
56 */
57 static final int SCREEN_FREEZE_LAYER_BASE = WINDOW_FREEZE_LAYER + TYPE_LAYER_MULTIPLIER;
58 static final int SCREEN_FREEZE_LAYER_ENTER = SCREEN_FREEZE_LAYER_BASE;
59 static final int SCREEN_FREEZE_LAYER_SCREENSHOT = SCREEN_FREEZE_LAYER_BASE + 1;
60 static final int SCREEN_FREEZE_LAYER_EXIT = SCREEN_FREEZE_LAYER_BASE + 2;
61 static final int SCREEN_FREEZE_LAYER_CUSTOM = SCREEN_FREEZE_LAYER_BASE + 3;
Dianne Hackborn50660e22011-02-02 17:12:25 -080062
Dianne Hackbornf9d0be92010-11-24 12:35:25 -080063 final Context mContext;
Craig Mautner46ac6fa2013-08-01 10:06:34 -070064 final DisplayContent mDisplayContent;
Mathias Agopian29479eb2013-02-14 14:36:04 -080065 SurfaceControl mSurfaceControl;
Dianne Hackbornd6b32b62012-03-16 11:54:51 -070066 BlackFrame mCustomBlackFrame;
67 BlackFrame mExitingBlackFrame;
68 BlackFrame mEnteringBlackFrame;
Dianne Hackborna1111872010-11-23 20:55:11 -080069 int mWidth, mHeight;
70
Dianne Hackbornf9d0be92010-11-24 12:35:25 -080071 int mOriginalRotation;
72 int mOriginalWidth, mOriginalHeight;
Dianne Hackborna1111872010-11-23 20:55:11 -080073 int mCurRotation;
Craig Mautner46ac6fa2013-08-01 10:06:34 -070074 Rect mOriginalDisplayRect = new Rect();
75 Rect mCurrentDisplayRect = new Rect();
Dianne Hackborna1111872010-11-23 20:55:11 -080076
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -080077 // For all animations, "exit" is for the UI elements that are going
78 // away (that is the snapshot of the old screen), and "enter" is for
79 // the new UI elements that are appearing (that is the active windows
80 // in their final orientation).
81
82 // The starting animation for the exiting and entering elements. This
83 // animation applies a transformation while the rotation is in progress.
84 // It is started immediately, before the new entering UI is ready.
85 Animation mStartExitAnimation;
86 final Transformation mStartExitTransformation = new Transformation();
87 Animation mStartEnterAnimation;
88 final Transformation mStartEnterTransformation = new Transformation();
Dianne Hackborn9fd74802012-03-01 19:26:31 -080089 Animation mStartFrameAnimation;
90 final Transformation mStartFrameTransformation = new Transformation();
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -080091
92 // The finishing animation for the exiting and entering elements. This
93 // animation needs to undo the transformation of the starting animation.
94 // It starts running once the new rotation UI elements are ready to be
95 // displayed.
96 Animation mFinishExitAnimation;
97 final Transformation mFinishExitTransformation = new Transformation();
98 Animation mFinishEnterAnimation;
99 final Transformation mFinishEnterTransformation = new Transformation();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800100 Animation mFinishFrameAnimation;
101 final Transformation mFinishFrameTransformation = new Transformation();
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800102
103 // The current active animation to move from the old to the new rotated
104 // state. Which animation is run here will depend on the old and new
105 // rotations.
106 Animation mRotateExitAnimation;
107 final Transformation mRotateExitTransformation = new Transformation();
108 Animation mRotateEnterAnimation;
109 final Transformation mRotateEnterTransformation = new Transformation();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800110 Animation mRotateFrameAnimation;
111 final Transformation mRotateFrameTransformation = new Transformation();
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800112
113 // A previously running rotate animation. This will be used if we need
114 // to switch to a new rotation before finishing the previous one.
115 Animation mLastRotateExitAnimation;
116 final Transformation mLastRotateExitTransformation = new Transformation();
117 Animation mLastRotateEnterAnimation;
118 final Transformation mLastRotateEnterTransformation = new Transformation();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800119 Animation mLastRotateFrameAnimation;
120 final Transformation mLastRotateFrameTransformation = new Transformation();
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800121
122 // Complete transformations being applied.
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800123 final Transformation mExitTransformation = new Transformation();
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800124 final Transformation mEnterTransformation = new Transformation();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800125 final Transformation mFrameTransformation = new Transformation();
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800126
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800127 boolean mStarted;
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800128 boolean mAnimRunning;
129 boolean mFinishAnimReady;
130 long mFinishAnimStartTime;
Craig Mautner46ac6fa2013-08-01 10:06:34 -0700131 boolean mForceDefaultOrientation;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800132
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800133 final Matrix mFrameInitialMatrix = new Matrix();
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800134 final Matrix mSnapshotInitialMatrix = new Matrix();
135 final Matrix mSnapshotFinalMatrix = new Matrix();
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700136 final Matrix mExitFrameFinalMatrix = new Matrix();
Dianne Hackborn50660e22011-02-02 17:12:25 -0800137 final Matrix mTmpMatrix = new Matrix();
Dianne Hackborna1111872010-11-23 20:55:11 -0800138 final float[] mTmpFloats = new float[9];
Craig Mautnerdbb79912012-03-01 18:59:14 -0800139 private boolean mMoreRotateEnter;
140 private boolean mMoreRotateExit;
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800141 private boolean mMoreRotateFrame;
Craig Mautnerdbb79912012-03-01 18:59:14 -0800142 private boolean mMoreFinishEnter;
143 private boolean mMoreFinishExit;
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800144 private boolean mMoreFinishFrame;
Craig Mautnerdbb79912012-03-01 18:59:14 -0800145 private boolean mMoreStartEnter;
146 private boolean mMoreStartExit;
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800147 private boolean mMoreStartFrame;
Craig Mautner3255a282012-04-16 15:42:47 -0700148 long mHalfwayPoint;
Dianne Hackborna1111872010-11-23 20:55:11 -0800149
Robert Carr68e5c9e2016-09-14 10:50:09 -0700150 private final WindowManagerService mService;
151
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800152 public void printTo(String prefix, PrintWriter pw) {
Mathias Agopian29479eb2013-02-14 14:36:04 -0800153 pw.print(prefix); pw.print("mSurface="); pw.print(mSurfaceControl);
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800154 pw.print(" mWidth="); pw.print(mWidth);
155 pw.print(" mHeight="); pw.println(mHeight);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700156 if (USE_CUSTOM_BLACK_FRAME) {
157 pw.print(prefix); pw.print("mCustomBlackFrame="); pw.println(mCustomBlackFrame);
158 if (mCustomBlackFrame != null) {
159 mCustomBlackFrame.printTo(prefix + " ", pw);
160 }
161 }
162 pw.print(prefix); pw.print("mExitingBlackFrame="); pw.println(mExitingBlackFrame);
163 if (mExitingBlackFrame != null) {
164 mExitingBlackFrame.printTo(prefix + " ", pw);
165 }
166 pw.print(prefix); pw.print("mEnteringBlackFrame="); pw.println(mEnteringBlackFrame);
167 if (mEnteringBlackFrame != null) {
168 mEnteringBlackFrame.printTo(prefix + " ", pw);
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800169 }
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700170 pw.print(prefix); pw.print("mCurRotation="); pw.print(mCurRotation);
171 pw.print(" mOriginalRotation="); pw.println(mOriginalRotation);
172 pw.print(prefix); pw.print("mOriginalWidth="); pw.print(mOriginalWidth);
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800173 pw.print(" mOriginalHeight="); pw.println(mOriginalHeight);
174 pw.print(prefix); pw.print("mStarted="); pw.print(mStarted);
175 pw.print(" mAnimRunning="); pw.print(mAnimRunning);
176 pw.print(" mFinishAnimReady="); pw.print(mFinishAnimReady);
177 pw.print(" mFinishAnimStartTime="); pw.println(mFinishAnimStartTime);
178 pw.print(prefix); pw.print("mStartExitAnimation="); pw.print(mStartExitAnimation);
179 pw.print(" "); mStartExitTransformation.printShortString(pw); pw.println();
180 pw.print(prefix); pw.print("mStartEnterAnimation="); pw.print(mStartEnterAnimation);
181 pw.print(" "); mStartEnterTransformation.printShortString(pw); pw.println();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800182 pw.print(prefix); pw.print("mStartFrameAnimation="); pw.print(mStartFrameAnimation);
183 pw.print(" "); mStartFrameTransformation.printShortString(pw); pw.println();
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800184 pw.print(prefix); pw.print("mFinishExitAnimation="); pw.print(mFinishExitAnimation);
185 pw.print(" "); mFinishExitTransformation.printShortString(pw); pw.println();
186 pw.print(prefix); pw.print("mFinishEnterAnimation="); pw.print(mFinishEnterAnimation);
187 pw.print(" "); mFinishEnterTransformation.printShortString(pw); pw.println();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800188 pw.print(prefix); pw.print("mFinishFrameAnimation="); pw.print(mFinishFrameAnimation);
189 pw.print(" "); mFinishFrameTransformation.printShortString(pw); pw.println();
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800190 pw.print(prefix); pw.print("mRotateExitAnimation="); pw.print(mRotateExitAnimation);
191 pw.print(" "); mRotateExitTransformation.printShortString(pw); pw.println();
192 pw.print(prefix); pw.print("mRotateEnterAnimation="); pw.print(mRotateEnterAnimation);
193 pw.print(" "); mRotateEnterTransformation.printShortString(pw); pw.println();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800194 pw.print(prefix); pw.print("mRotateFrameAnimation="); pw.print(mRotateFrameAnimation);
195 pw.print(" "); mRotateFrameTransformation.printShortString(pw); pw.println();
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800196 pw.print(prefix); pw.print("mExitTransformation=");
197 mExitTransformation.printShortString(pw); pw.println();
198 pw.print(prefix); pw.print("mEnterTransformation=");
199 mEnterTransformation.printShortString(pw); pw.println();
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800200 pw.print(prefix); pw.print("mFrameTransformation=");
201 mEnterTransformation.printShortString(pw); pw.println();
202 pw.print(prefix); pw.print("mFrameInitialMatrix=");
203 mFrameInitialMatrix.printShortString(pw);
204 pw.println();
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800205 pw.print(prefix); pw.print("mSnapshotInitialMatrix=");
206 mSnapshotInitialMatrix.printShortString(pw);
207 pw.print(" mSnapshotFinalMatrix="); mSnapshotFinalMatrix.printShortString(pw);
208 pw.println();
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700209 pw.print(prefix); pw.print("mExitFrameFinalMatrix=");
210 mExitFrameFinalMatrix.printShortString(pw);
211 pw.println();
Craig Mautner46ac6fa2013-08-01 10:06:34 -0700212 pw.print(prefix); pw.print("mForceDefaultOrientation="); pw.print(mForceDefaultOrientation);
213 if (mForceDefaultOrientation) {
214 pw.print(" mOriginalDisplayRect="); pw.print(mOriginalDisplayRect.toShortString());
215 pw.print(" mCurrentDisplayRect="); pw.println(mCurrentDisplayRect.toShortString());
216 }
Dianne Hackborn4dcece82012-02-10 14:50:32 -0800217 }
218
Craig Mautner46ac6fa2013-08-01 10:06:34 -0700219 public ScreenRotationAnimation(Context context, DisplayContent displayContent,
Minoru Aoi2b74a242014-03-13 12:00:34 +0900220 SurfaceSession session, boolean inTransaction, boolean forceDefaultOrientation,
Robert Carr68e5c9e2016-09-14 10:50:09 -0700221 boolean isSecure, WindowManagerService service) {
222 mService = service;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800223 mContext = context;
Craig Mautner46ac6fa2013-08-01 10:06:34 -0700224 mDisplayContent = displayContent;
225 displayContent.getLogicalDisplayRect(mOriginalDisplayRect);
Dianne Hackborna1111872010-11-23 20:55:11 -0800226
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800227 // Screenshot does NOT include rotation!
Craig Mautner46ac6fa2013-08-01 10:06:34 -0700228 final Display display = displayContent.getDisplay();
229 int originalRotation = display.getRotation();
230 final int originalWidth;
231 final int originalHeight;
232 DisplayInfo displayInfo = displayContent.getDisplayInfo();
233 if (forceDefaultOrientation) {
234 // Emulated orientation.
235 mForceDefaultOrientation = true;
236 originalWidth = displayContent.mBaseDisplayWidth;
237 originalHeight = displayContent.mBaseDisplayHeight;
238 } else {
239 // Normal situation
240 originalWidth = displayInfo.logicalWidth;
241 originalHeight = displayInfo.logicalHeight;
242 }
Mathias Agopian0ab84ef2011-10-13 16:02:48 -0700243 if (originalRotation == Surface.ROTATION_90
244 || originalRotation == Surface.ROTATION_270) {
245 mWidth = originalHeight;
246 mHeight = originalWidth;
247 } else {
248 mWidth = originalWidth;
249 mHeight = originalHeight;
250 }
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800251
Jeff Brownbc68a592011-07-25 12:58:12 -0700252 mOriginalRotation = originalRotation;
253 mOriginalWidth = originalWidth;
254 mOriginalHeight = originalHeight;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800255
Dianne Hackborn94cb2eb2011-01-13 21:09:44 -0800256 if (!inTransaction) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800257 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM,
Dianne Hackborn94cb2eb2011-01-13 21:09:44 -0800258 ">>> OPEN TRANSACTION ScreenRotationAnimation");
Robert Carr68e5c9e2016-09-14 10:50:09 -0700259 mService.openSurfaceTransaction();
Dianne Hackborn94cb2eb2011-01-13 21:09:44 -0800260 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700261
Dianne Hackborna1111872010-11-23 20:55:11 -0800262 try {
Dianne Hackborn352cc982011-01-04 11:34:18 -0800263 try {
Minoru Aoi2b74a242014-03-13 12:00:34 +0900264 int flags = SurfaceControl.HIDDEN;
265 if (isSecure) {
266 flags |= SurfaceControl.SECURE;
267 }
268
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800269 if (DEBUG_SURFACE_TRACE) {
Mathias Agopian11e7d882013-03-05 14:14:55 -0800270 mSurfaceControl = new SurfaceTrace(session, "ScreenshotSurface",
Jeff Brown64a55af2012-08-26 02:47:39 -0700271 mWidth, mHeight,
Minoru Aoi2b74a242014-03-13 12:00:34 +0900272 PixelFormat.OPAQUE, flags);
Craig Mautner46ac6fa2013-08-01 10:06:34 -0700273 Slog.w(TAG, "ScreenRotationAnimation ctor: displayOffset="
274 + mOriginalDisplayRect.toShortString());
Craig Mautner7d8df392012-04-06 15:26:23 -0700275 } else {
Mathias Agopian11e7d882013-03-05 14:14:55 -0800276 mSurfaceControl = new SurfaceControl(session, "ScreenshotSurface",
Jeff Brown64a55af2012-08-26 02:47:39 -0700277 mWidth, mHeight,
Minoru Aoi2b74a242014-03-13 12:00:34 +0900278 PixelFormat.OPAQUE, flags);
Mathias Agopian0ab84ef2011-10-13 16:02:48 -0700279 }
Mathias Agopian11e7d882013-03-05 14:14:55 -0800280 // capture a screenshot into the surface we just created
281 Surface sur = new Surface();
282 sur.copyFrom(mSurfaceControl);
283 // FIXME: we should use the proper display
284 SurfaceControl.screenshot(SurfaceControl.getBuiltInDisplay(
285 SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN), sur);
Craig Mautner46ac6fa2013-08-01 10:06:34 -0700286 mSurfaceControl.setLayerStack(display.getLayerStack());
Chong Zhang97782b42015-10-07 16:01:23 -0700287 mSurfaceControl.setLayer(SCREEN_FREEZE_LAYER_SCREENSHOT);
Mathias Agopian29479eb2013-02-14 14:36:04 -0800288 mSurfaceControl.setAlpha(0);
289 mSurfaceControl.show();
Craig Mautnere50d7fc2013-03-18 10:06:21 -0700290 sur.destroy();
Igor Murashkina86ab6402013-08-30 12:58:36 -0700291 } catch (OutOfResourcesException e) {
Dianne Hackborn94cb2eb2011-01-13 21:09:44 -0800292 Slog.w(TAG, "Unable to allocate freeze surface", e);
Dianne Hackborn352cc982011-01-04 11:34:18 -0800293 }
Dianne Hackborna1111872010-11-23 20:55:11 -0800294
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800295 if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG_WM,
296 " FREEZE " + mSurfaceControl + ": CREATE");
Dianne Hackborn5fd21692011-06-07 14:09:47 -0700297
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700298 setRotationInTransaction(originalRotation);
Dianne Hackborn94cb2eb2011-01-13 21:09:44 -0800299 } finally {
300 if (!inTransaction) {
Robert Carr68e5c9e2016-09-14 10:50:09 -0700301 mService.closeSurfaceTransaction();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800302 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG_WM,
Dianne Hackborn94cb2eb2011-01-13 21:09:44 -0800303 "<<< CLOSE TRANSACTION ScreenRotationAnimation");
Dianne Hackborn352cc982011-01-04 11:34:18 -0800304 }
Dianne Hackborn0f761d62010-11-30 22:06:10 -0800305 }
Dianne Hackborna1111872010-11-23 20:55:11 -0800306 }
307
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800308 boolean hasScreenshot() {
Mathias Agopian29479eb2013-02-14 14:36:04 -0800309 return mSurfaceControl != null;
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800310 }
311
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700312 private void setSnapshotTransformInTransaction(Matrix matrix, float alpha) {
Mathias Agopian29479eb2013-02-14 14:36:04 -0800313 if (mSurfaceControl != null) {
Dianne Hackborn352cc982011-01-04 11:34:18 -0800314 matrix.getValues(mTmpFloats);
Craig Mautner46ac6fa2013-08-01 10:06:34 -0700315 float x = mTmpFloats[Matrix.MTRANS_X];
316 float y = mTmpFloats[Matrix.MTRANS_Y];
317 if (mForceDefaultOrientation) {
318 mDisplayContent.getLogicalDisplayRect(mCurrentDisplayRect);
319 x -= mCurrentDisplayRect.left;
320 y -= mCurrentDisplayRect.top;
321 }
322 mSurfaceControl.setPosition(x, y);
Mathias Agopian29479eb2013-02-14 14:36:04 -0800323 mSurfaceControl.setMatrix(
Dianne Hackborn352cc982011-01-04 11:34:18 -0800324 mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
325 mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]);
Mathias Agopian29479eb2013-02-14 14:36:04 -0800326 mSurfaceControl.setAlpha(alpha);
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800327 if (DEBUG_TRANSFORMS) {
Dianne Hackborn352cc982011-01-04 11:34:18 -0800328 float[] srcPnts = new float[] { 0, 0, mWidth, mHeight };
329 float[] dstPnts = new float[4];
330 matrix.mapPoints(dstPnts, srcPnts);
331 Slog.i(TAG, "Original : (" + srcPnts[0] + "," + srcPnts[1]
332 + ")-(" + srcPnts[2] + "," + srcPnts[3] + ")");
333 Slog.i(TAG, "Transformed: (" + dstPnts[0] + "," + dstPnts[1]
334 + ")-(" + dstPnts[2] + "," + dstPnts[3] + ")");
335 }
Dianne Hackborna1111872010-11-23 20:55:11 -0800336 }
337 }
338
Dianne Hackborn0aae2d42010-12-07 23:51:29 -0800339 public static void createRotationMatrix(int rotation, int width, int height,
340 Matrix outMatrix) {
341 switch (rotation) {
342 case Surface.ROTATION_0:
343 outMatrix.reset();
344 break;
345 case Surface.ROTATION_90:
346 outMatrix.setRotate(90, 0, 0);
347 outMatrix.postTranslate(height, 0);
348 break;
349 case Surface.ROTATION_180:
350 outMatrix.setRotate(180, 0, 0);
351 outMatrix.postTranslate(width, height);
352 break;
353 case Surface.ROTATION_270:
354 outMatrix.setRotate(270, 0, 0);
355 outMatrix.postTranslate(0, width);
356 break;
357 }
358 }
359
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800360 // Must be called while in a transaction.
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700361 private void setRotationInTransaction(int rotation) {
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800362 mCurRotation = rotation;
363
364 // Compute the transformation matrix that must be applied
365 // to the snapshot to make it stay in the same original position
366 // with the current screen rotation.
Wale Ogunwale4a02d812015-02-12 23:01:38 -0800367 int delta = DisplayContent.deltaRotation(rotation, Surface.ROTATION_0);
Dianne Hackborn0aae2d42010-12-07 23:51:29 -0800368 createRotationMatrix(delta, mWidth, mHeight, mSnapshotInitialMatrix);
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800369
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800370 if (DEBUG_STATE) Slog.v(TAG, "**** ROTATION: " + delta);
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700371 setSnapshotTransformInTransaction(mSnapshotInitialMatrix, 1.0f);
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800372 }
373
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800374 // Must be called while in a transaction.
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700375 public boolean setRotationInTransaction(int rotation, SurfaceSession session,
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800376 long maxAnimationDuration, float animationScale, int finalWidth, int finalHeight) {
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700377 setRotationInTransaction(rotation);
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700378 if (TWO_PHASE_ANIMATION) {
379 return startAnimation(session, maxAnimationDuration, animationScale,
Craig Mautner3c174372013-02-21 17:54:37 -0800380 finalWidth, finalHeight, false, 0, 0);
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700381 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700382
383 // Don't start animation yet.
384 return false;
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800385 }
386
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800387 /**
388 * Returns true if animating.
389 */
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800390 private boolean startAnimation(SurfaceSession session, long maxAnimationDuration,
Craig Mautner3c174372013-02-21 17:54:37 -0800391 float animationScale, int finalWidth, int finalHeight, boolean dismissing,
392 int exitAnim, int enterAnim) {
Mathias Agopian29479eb2013-02-14 14:36:04 -0800393 if (mSurfaceControl == null) {
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800394 // Can't do animation.
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800395 return false;
396 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800397 if (mStarted) {
398 return true;
399 }
400
401 mStarted = true;
402
403 boolean firstStart = false;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800404
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800405 // Figure out how the screen has moved from the original rotation.
Wale Ogunwale4a02d812015-02-12 23:01:38 -0800406 int delta = DisplayContent.deltaRotation(mCurRotation, mOriginalRotation);
Dianne Hackbornde75cb42011-03-02 17:11:21 -0800407
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700408 if (TWO_PHASE_ANIMATION && mFinishExitAnimation == null
409 && (!dismissing || delta != Surface.ROTATION_0)) {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800410 if (DEBUG_STATE) Slog.v(TAG, "Creating start and finish animations");
411 firstStart = true;
412 mStartExitAnimation = AnimationUtils.loadAnimation(mContext,
413 com.android.internal.R.anim.screen_rotate_start_exit);
414 mStartEnterAnimation = AnimationUtils.loadAnimation(mContext,
415 com.android.internal.R.anim.screen_rotate_start_enter);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700416 if (USE_CUSTOM_BLACK_FRAME) {
417 mStartFrameAnimation = AnimationUtils.loadAnimation(mContext,
418 com.android.internal.R.anim.screen_rotate_start_frame);
419 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800420 mFinishExitAnimation = AnimationUtils.loadAnimation(mContext,
421 com.android.internal.R.anim.screen_rotate_finish_exit);
422 mFinishEnterAnimation = AnimationUtils.loadAnimation(mContext,
423 com.android.internal.R.anim.screen_rotate_finish_enter);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700424 if (USE_CUSTOM_BLACK_FRAME) {
425 mFinishFrameAnimation = AnimationUtils.loadAnimation(mContext,
426 com.android.internal.R.anim.screen_rotate_finish_frame);
427 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800428 }
429
430 if (DEBUG_STATE) Slog.v(TAG, "Rotation delta: " + delta + " finalWidth="
431 + finalWidth + " finalHeight=" + finalHeight
432 + " origWidth=" + mOriginalWidth + " origHeight=" + mOriginalHeight);
433
Dianne Hackborn9d9ece32012-09-10 15:33:52 -0700434 final boolean customAnim;
Craig Mautner3c174372013-02-21 17:54:37 -0800435 if (exitAnim != 0 && enterAnim != 0) {
Dianne Hackborn9d9ece32012-09-10 15:33:52 -0700436 customAnim = true;
Craig Mautner3c174372013-02-21 17:54:37 -0800437 mRotateExitAnimation = AnimationUtils.loadAnimation(mContext, exitAnim);
438 mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext, enterAnim);
Dianne Hackborn9d9ece32012-09-10 15:33:52 -0700439 } else {
440 customAnim = false;
441 switch (delta) {
442 case Surface.ROTATION_0:
443 mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
444 com.android.internal.R.anim.screen_rotate_0_exit);
445 mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
446 com.android.internal.R.anim.screen_rotate_0_enter);
447 if (USE_CUSTOM_BLACK_FRAME) {
448 mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
449 com.android.internal.R.anim.screen_rotate_0_frame);
450 }
451 break;
452 case Surface.ROTATION_90:
453 mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
454 com.android.internal.R.anim.screen_rotate_plus_90_exit);
455 mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
456 com.android.internal.R.anim.screen_rotate_plus_90_enter);
457 if (USE_CUSTOM_BLACK_FRAME) {
458 mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
459 com.android.internal.R.anim.screen_rotate_plus_90_frame);
460 }
461 break;
462 case Surface.ROTATION_180:
463 mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
464 com.android.internal.R.anim.screen_rotate_180_exit);
465 mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
466 com.android.internal.R.anim.screen_rotate_180_enter);
467 if (USE_CUSTOM_BLACK_FRAME) {
468 mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
469 com.android.internal.R.anim.screen_rotate_180_frame);
470 }
471 break;
472 case Surface.ROTATION_270:
473 mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
474 com.android.internal.R.anim.screen_rotate_minus_90_exit);
475 mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
476 com.android.internal.R.anim.screen_rotate_minus_90_enter);
477 if (USE_CUSTOM_BLACK_FRAME) {
478 mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
479 com.android.internal.R.anim.screen_rotate_minus_90_frame);
480 }
481 break;
482 }
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800483 }
484
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800485 // Initialize the animations. This is a hack, redefining what "parent"
486 // means to allow supplying the last and next size. In this definition
487 // "%p" is the original (let's call it "previous") size, and "%" is the
488 // screen's current/new size.
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700489 if (TWO_PHASE_ANIMATION && firstStart) {
Dianne Hackborn9d9ece32012-09-10 15:33:52 -0700490 // Compute partial steps between original and final sizes. These
491 // are used for the dimensions of the exiting and entering elements,
492 // so they are never stretched too significantly.
493 final int halfWidth = (finalWidth + mOriginalWidth) / 2;
494 final int halfHeight = (finalHeight + mOriginalHeight) / 2;
495
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800496 if (DEBUG_STATE) Slog.v(TAG, "Initializing start and finish animations");
497 mStartEnterAnimation.initialize(finalWidth, finalHeight,
Dianne Hackborn191874e32012-03-09 11:03:36 -0800498 halfWidth, halfHeight);
499 mStartExitAnimation.initialize(halfWidth, halfHeight,
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800500 mOriginalWidth, mOriginalHeight);
501 mFinishEnterAnimation.initialize(finalWidth, finalHeight,
Dianne Hackborn191874e32012-03-09 11:03:36 -0800502 halfWidth, halfHeight);
503 mFinishExitAnimation.initialize(halfWidth, halfHeight,
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800504 mOriginalWidth, mOriginalHeight);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700505 if (USE_CUSTOM_BLACK_FRAME) {
506 mStartFrameAnimation.initialize(finalWidth, finalHeight,
507 mOriginalWidth, mOriginalHeight);
508 mFinishFrameAnimation.initialize(finalWidth, finalHeight,
509 mOriginalWidth, mOriginalHeight);
510 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800511 }
512 mRotateEnterAnimation.initialize(finalWidth, finalHeight, mOriginalWidth, mOriginalHeight);
513 mRotateExitAnimation.initialize(finalWidth, finalHeight, mOriginalWidth, mOriginalHeight);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700514 if (USE_CUSTOM_BLACK_FRAME) {
515 mRotateFrameAnimation.initialize(finalWidth, finalHeight, mOriginalWidth,
516 mOriginalHeight);
517 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800518 mAnimRunning = false;
519 mFinishAnimReady = false;
520 mFinishAnimStartTime = -1;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800521
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700522 if (TWO_PHASE_ANIMATION && firstStart) {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800523 mStartExitAnimation.restrictDuration(maxAnimationDuration);
524 mStartExitAnimation.scaleCurrentDuration(animationScale);
525 mStartEnterAnimation.restrictDuration(maxAnimationDuration);
526 mStartEnterAnimation.scaleCurrentDuration(animationScale);
527 mFinishExitAnimation.restrictDuration(maxAnimationDuration);
528 mFinishExitAnimation.scaleCurrentDuration(animationScale);
529 mFinishEnterAnimation.restrictDuration(maxAnimationDuration);
530 mFinishEnterAnimation.scaleCurrentDuration(animationScale);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700531 if (USE_CUSTOM_BLACK_FRAME) {
532 mStartFrameAnimation.restrictDuration(maxAnimationDuration);
533 mStartFrameAnimation.scaleCurrentDuration(animationScale);
534 mFinishFrameAnimation.restrictDuration(maxAnimationDuration);
535 mFinishFrameAnimation.scaleCurrentDuration(animationScale);
536 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800537 }
538 mRotateExitAnimation.restrictDuration(maxAnimationDuration);
539 mRotateExitAnimation.scaleCurrentDuration(animationScale);
540 mRotateEnterAnimation.restrictDuration(maxAnimationDuration);
541 mRotateEnterAnimation.scaleCurrentDuration(animationScale);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700542 if (USE_CUSTOM_BLACK_FRAME) {
543 mRotateFrameAnimation.restrictDuration(maxAnimationDuration);
544 mRotateFrameAnimation.scaleCurrentDuration(animationScale);
545 }
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800546
Craig Mautner46ac6fa2013-08-01 10:06:34 -0700547 final int layerStack = mDisplayContent.getDisplay().getLayerStack();
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700548 if (USE_CUSTOM_BLACK_FRAME && mCustomBlackFrame == null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800549 if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
550 TAG_WM,
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800551 ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation");
Robert Carr68e5c9e2016-09-14 10:50:09 -0700552 mService.openSurfaceTransaction();
Dianne Hackborn50660e22011-02-02 17:12:25 -0800553
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800554 // Compute the transformation matrix that must be applied
555 // the the black frame to make it stay in the initial position
556 // before the new screen rotation. This is different than the
557 // snapshot transformation because the snapshot is always based
558 // of the native orientation of the screen, not the orientation
559 // we were last in.
560 createRotationMatrix(delta, mOriginalWidth, mOriginalHeight, mFrameInitialMatrix);
561
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800562 try {
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800563 Rect outer = new Rect(-mOriginalWidth*1, -mOriginalHeight*1,
564 mOriginalWidth*2, mOriginalHeight*2);
565 Rect inner = new Rect(0, 0, mOriginalWidth, mOriginalHeight);
Chong Zhang97782b42015-10-07 16:01:23 -0700566 mCustomBlackFrame = new BlackFrame(session, outer, inner,
567 SCREEN_FREEZE_LAYER_CUSTOM, layerStack, false);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700568 mCustomBlackFrame.setMatrix(mFrameInitialMatrix);
Igor Murashkina86ab6402013-08-30 12:58:36 -0700569 } catch (OutOfResourcesException e) {
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700570 Slog.w(TAG, "Unable to allocate black surface", e);
571 } finally {
Robert Carr68e5c9e2016-09-14 10:50:09 -0700572 mService.closeSurfaceTransaction();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800573 if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
574 TAG_WM,
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700575 "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation");
576 }
577 }
578
Dianne Hackborn9d9ece32012-09-10 15:33:52 -0700579 if (!customAnim && mExitingBlackFrame == null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800580 if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
581 TAG_WM,
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700582 ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation");
Robert Carr68e5c9e2016-09-14 10:50:09 -0700583 mService.openSurfaceTransaction();
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700584 try {
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700585 // Compute the transformation matrix that must be applied
586 // the the black frame to make it stay in the initial position
587 // before the new screen rotation. This is different than the
588 // snapshot transformation because the snapshot is always based
589 // of the native orientation of the screen, not the orientation
590 // we were last in.
591 createRotationMatrix(delta, mOriginalWidth, mOriginalHeight, mFrameInitialMatrix);
592
Craig Mautner46ac6fa2013-08-01 10:06:34 -0700593 final Rect outer;
594 final Rect inner;
595 if (mForceDefaultOrientation) {
596 // Going from a smaller Display to a larger Display, add curtains to sides
597 // or top and bottom. Going from a larger to smaller display will result in
598 // no BlackSurfaces being constructed.
599 outer = mCurrentDisplayRect;
600 inner = mOriginalDisplayRect;
601 } else {
602 outer = new Rect(-mOriginalWidth*1, -mOriginalHeight*1,
603 mOriginalWidth*2, mOriginalHeight*2);
604 inner = new Rect(0, 0, mOriginalWidth, mOriginalHeight);
605 }
Chong Zhang97782b42015-10-07 16:01:23 -0700606 mExitingBlackFrame = new BlackFrame(session, outer, inner,
607 SCREEN_FREEZE_LAYER_EXIT, layerStack, mForceDefaultOrientation);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700608 mExitingBlackFrame.setMatrix(mFrameInitialMatrix);
Igor Murashkina86ab6402013-08-30 12:58:36 -0700609 } catch (OutOfResourcesException e) {
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700610 Slog.w(TAG, "Unable to allocate black surface", e);
611 } finally {
Robert Carr68e5c9e2016-09-14 10:50:09 -0700612 mService.closeSurfaceTransaction();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800613 if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
614 TAG_WM,
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700615 "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation");
616 }
617 }
618
Dianne Hackborn9d9ece32012-09-10 15:33:52 -0700619 if (customAnim && mEnteringBlackFrame == null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800620 if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
621 TAG_WM,
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700622 ">>> OPEN TRANSACTION ScreenRotationAnimation.startAnimation");
Robert Carr68e5c9e2016-09-14 10:50:09 -0700623 mService.openSurfaceTransaction();
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700624
625 try {
626 Rect outer = new Rect(-finalWidth*1, -finalHeight*1,
627 finalWidth*2, finalHeight*2);
628 Rect inner = new Rect(0, 0, finalWidth, finalHeight);
Chong Zhang97782b42015-10-07 16:01:23 -0700629 mEnteringBlackFrame = new BlackFrame(session, outer, inner,
630 SCREEN_FREEZE_LAYER_ENTER, layerStack, false);
Igor Murashkina86ab6402013-08-30 12:58:36 -0700631 } catch (OutOfResourcesException e) {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800632 Slog.w(TAG, "Unable to allocate black surface", e);
633 } finally {
Robert Carr68e5c9e2016-09-14 10:50:09 -0700634 mService.closeSurfaceTransaction();
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800635 if (SHOW_LIGHT_TRANSACTIONS || DEBUG_STATE) Slog.i(
636 TAG_WM,
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800637 "<<< CLOSE TRANSACTION ScreenRotationAnimation.startAnimation");
638 }
Dianne Hackborn50660e22011-02-02 17:12:25 -0800639 }
640
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800641 return true;
642 }
643
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800644 /**
645 * Returns true if animating.
646 */
647 public boolean dismiss(SurfaceSession session, long maxAnimationDuration,
Craig Mautner3c174372013-02-21 17:54:37 -0800648 float animationScale, int finalWidth, int finalHeight, int exitAnim, int enterAnim) {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800649 if (DEBUG_STATE) Slog.v(TAG, "Dismiss!");
Mathias Agopian29479eb2013-02-14 14:36:04 -0800650 if (mSurfaceControl == null) {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800651 // Can't do animation.
652 return false;
653 }
654 if (!mStarted) {
655 startAnimation(session, maxAnimationDuration, animationScale, finalWidth, finalHeight,
Craig Mautner3c174372013-02-21 17:54:37 -0800656 true, exitAnim, enterAnim);
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800657 }
658 if (!mStarted) {
659 return false;
660 }
661 if (DEBUG_STATE) Slog.v(TAG, "Setting mFinishAnimReady = true");
662 mFinishAnimReady = true;
663 return true;
664 }
665
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800666 public void kill() {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800667 if (DEBUG_STATE) Slog.v(TAG, "Kill!");
Mathias Agopian29479eb2013-02-14 14:36:04 -0800668 if (mSurfaceControl != null) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800669 if (SHOW_TRANSACTIONS ||
670 SHOW_SURFACE_ALLOC) Slog.i(TAG_WM,
Mathias Agopian29479eb2013-02-14 14:36:04 -0800671 " FREEZE " + mSurfaceControl + ": DESTROY");
672 mSurfaceControl.destroy();
673 mSurfaceControl = null;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800674 }
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700675 if (mCustomBlackFrame != null) {
676 mCustomBlackFrame.kill();
677 mCustomBlackFrame = null;
678 }
679 if (mExitingBlackFrame != null) {
680 mExitingBlackFrame.kill();
681 mExitingBlackFrame = null;
682 }
683 if (mEnteringBlackFrame != null) {
684 mEnteringBlackFrame.kill();
685 mEnteringBlackFrame = null;
Dianne Hackborn352cc982011-01-04 11:34:18 -0800686 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700687 if (TWO_PHASE_ANIMATION) {
688 if (mStartExitAnimation != null) {
689 mStartExitAnimation.cancel();
690 mStartExitAnimation = null;
691 }
692 if (mStartEnterAnimation != null) {
693 mStartEnterAnimation.cancel();
694 mStartEnterAnimation = null;
695 }
696 if (mFinishExitAnimation != null) {
697 mFinishExitAnimation.cancel();
698 mFinishExitAnimation = null;
699 }
700 if (mFinishEnterAnimation != null) {
701 mFinishEnterAnimation.cancel();
702 mFinishEnterAnimation = null;
703 }
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800704 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700705 if (USE_CUSTOM_BLACK_FRAME) {
706 if (mStartFrameAnimation != null) {
707 mStartFrameAnimation.cancel();
708 mStartFrameAnimation = null;
709 }
710 if (mRotateFrameAnimation != null) {
711 mRotateFrameAnimation.cancel();
712 mRotateFrameAnimation = null;
713 }
714 if (mFinishFrameAnimation != null) {
715 mFinishFrameAnimation.cancel();
716 mFinishFrameAnimation = null;
717 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800718 }
719 if (mRotateExitAnimation != null) {
720 mRotateExitAnimation.cancel();
721 mRotateExitAnimation = null;
722 }
723 if (mRotateEnterAnimation != null) {
724 mRotateEnterAnimation.cancel();
725 mRotateEnterAnimation = null;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800726 }
727 }
728
729 public boolean isAnimating() {
Craig Mautner7d8df392012-04-06 15:26:23 -0700730 return hasAnimations() || (TWO_PHASE_ANIMATION && mFinishAnimReady);
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700731 }
732
Dianne Hackborn4b169692012-11-29 17:51:24 -0800733 public boolean isRotating() {
734 return mCurRotation != mOriginalRotation;
735 }
736
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700737 private boolean hasAnimations() {
Craig Mautner7d8df392012-04-06 15:26:23 -0700738 return (TWO_PHASE_ANIMATION &&
739 (mStartEnterAnimation != null || mStartExitAnimation != null
740 || mFinishEnterAnimation != null || mFinishExitAnimation != null))
741 || (USE_CUSTOM_BLACK_FRAME &&
742 (mStartFrameAnimation != null || mRotateFrameAnimation != null
743 || mFinishFrameAnimation != null))
744 || mRotateEnterAnimation != null || mRotateExitAnimation != null;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800745 }
746
Craig Mautnere32c3072012-03-12 15:25:35 -0700747 private boolean stepAnimation(long now) {
Craig Mautner3255a282012-04-16 15:42:47 -0700748 if (now > mHalfwayPoint) {
749 mHalfwayPoint = Long.MAX_VALUE;
750 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800751 if (mFinishAnimReady && mFinishAnimStartTime < 0) {
752 if (DEBUG_STATE) Slog.v(TAG, "Step: finish anim now ready");
753 mFinishAnimStartTime = now;
754 }
755
Craig Mautner7d8df392012-04-06 15:26:23 -0700756 if (TWO_PHASE_ANIMATION) {
757 mMoreStartExit = false;
758 if (mStartExitAnimation != null) {
759 mMoreStartExit = mStartExitAnimation.getTransformation(now, mStartExitTransformation);
760 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start exit: " + mStartExitTransformation);
761 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800762
Craig Mautner7d8df392012-04-06 15:26:23 -0700763 mMoreStartEnter = false;
764 if (mStartEnterAnimation != null) {
765 mMoreStartEnter = mStartEnterAnimation.getTransformation(now, mStartEnterTransformation);
766 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start enter: " + mStartEnterTransformation);
767 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800768 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700769 if (USE_CUSTOM_BLACK_FRAME) {
770 mMoreStartFrame = false;
771 if (mStartFrameAnimation != null) {
772 mMoreStartFrame = mStartFrameAnimation.getTransformation(now, mStartFrameTransformation);
773 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start frame: " + mStartFrameTransformation);
774 }
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800775 }
776
Craig Mautnerdbb79912012-03-01 18:59:14 -0800777 long finishNow = mFinishAnimReady ? (now - mFinishAnimStartTime) : 0;
778 if (DEBUG_STATE) Slog.v(TAG, "Step: finishNow=" + finishNow);
779
Craig Mautner7d8df392012-04-06 15:26:23 -0700780 if (TWO_PHASE_ANIMATION) {
781 mMoreFinishExit = false;
782 if (mFinishExitAnimation != null) {
783 mMoreFinishExit = mFinishExitAnimation.getTransformation(finishNow, mFinishExitTransformation);
784 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish exit: " + mFinishExitTransformation);
785 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800786
Craig Mautner7d8df392012-04-06 15:26:23 -0700787 mMoreFinishEnter = false;
788 if (mFinishEnterAnimation != null) {
789 mMoreFinishEnter = mFinishEnterAnimation.getTransformation(finishNow, mFinishEnterTransformation);
790 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish enter: " + mFinishEnterTransformation);
791 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800792 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700793 if (USE_CUSTOM_BLACK_FRAME) {
794 mMoreFinishFrame = false;
795 if (mFinishFrameAnimation != null) {
796 mMoreFinishFrame = mFinishFrameAnimation.getTransformation(finishNow, mFinishFrameTransformation);
797 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish frame: " + mFinishFrameTransformation);
798 }
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800799 }
800
Craig Mautnerdbb79912012-03-01 18:59:14 -0800801 mMoreRotateExit = false;
802 if (mRotateExitAnimation != null) {
803 mMoreRotateExit = mRotateExitAnimation.getTransformation(now, mRotateExitTransformation);
804 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate exit: " + mRotateExitTransformation);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700805 }
806
807 mMoreRotateEnter = false;
808 if (mRotateEnterAnimation != null) {
809 mMoreRotateEnter = mRotateEnterAnimation.getTransformation(now, mRotateEnterTransformation);
810 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate enter: " + mRotateEnterTransformation);
811 }
812
Craig Mautner7d8df392012-04-06 15:26:23 -0700813 if (USE_CUSTOM_BLACK_FRAME) {
814 mMoreRotateFrame = false;
815 if (mRotateFrameAnimation != null) {
816 mMoreRotateFrame = mRotateFrameAnimation.getTransformation(now, mRotateFrameTransformation);
817 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate frame: " + mRotateFrameTransformation);
818 }
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700819 }
820
Craig Mautner7d8df392012-04-06 15:26:23 -0700821 if (!mMoreRotateExit && (!TWO_PHASE_ANIMATION || (!mMoreStartExit && !mMoreFinishExit))) {
822 if (TWO_PHASE_ANIMATION) {
823 if (mStartExitAnimation != null) {
824 if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing start exit anim!");
825 mStartExitAnimation.cancel();
826 mStartExitAnimation = null;
827 mStartExitTransformation.clear();
828 }
829 if (mFinishExitAnimation != null) {
830 if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing finish exit anim!");
831 mFinishExitAnimation.cancel();
832 mFinishExitAnimation = null;
833 mFinishExitTransformation.clear();
834 }
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700835 }
836 if (mRotateExitAnimation != null) {
837 if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing rotate exit anim!");
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800838 mRotateExitAnimation.cancel();
839 mRotateExitAnimation = null;
840 mRotateExitTransformation.clear();
841 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800842 }
843
Craig Mautner7d8df392012-04-06 15:26:23 -0700844 if (!mMoreRotateEnter && (!TWO_PHASE_ANIMATION || (!mMoreStartEnter && !mMoreFinishEnter))) {
845 if (TWO_PHASE_ANIMATION) {
846 if (mStartEnterAnimation != null) {
847 if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing start enter anim!");
848 mStartEnterAnimation.cancel();
849 mStartEnterAnimation = null;
850 mStartEnterTransformation.clear();
851 }
852 if (mFinishEnterAnimation != null) {
853 if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing finish enter anim!");
854 mFinishEnterAnimation.cancel();
855 mFinishEnterAnimation = null;
856 mFinishEnterTransformation.clear();
857 }
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700858 }
859 if (mRotateEnterAnimation != null) {
860 if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing rotate enter anim!");
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800861 mRotateEnterAnimation.cancel();
862 mRotateEnterAnimation = null;
863 mRotateEnterTransformation.clear();
864 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800865 }
866
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700867 if (USE_CUSTOM_BLACK_FRAME && !mMoreStartFrame && !mMoreRotateFrame && !mMoreFinishFrame) {
868 if (mStartFrameAnimation != null) {
869 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing start frame anim!");
870 mStartFrameAnimation.cancel();
871 mStartFrameAnimation = null;
872 mStartFrameTransformation.clear();
873 }
874 if (mFinishFrameAnimation != null) {
875 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing finish frame anim!");
876 mFinishFrameAnimation.cancel();
877 mFinishFrameAnimation = null;
878 mFinishFrameTransformation.clear();
879 }
880 if (mRotateFrameAnimation != null) {
881 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing rotate frame anim!");
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800882 mRotateFrameAnimation.cancel();
883 mRotateFrameAnimation = null;
884 mRotateFrameTransformation.clear();
885 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800886 }
887
888 mExitTransformation.set(mRotateExitTransformation);
Craig Mautnerdbb79912012-03-01 18:59:14 -0800889 mEnterTransformation.set(mRotateEnterTransformation);
Craig Mautner7d8df392012-04-06 15:26:23 -0700890 if (TWO_PHASE_ANIMATION) {
891 mExitTransformation.compose(mStartExitTransformation);
892 mExitTransformation.compose(mFinishExitTransformation);
893
894 mEnterTransformation.compose(mStartEnterTransformation);
895 mEnterTransformation.compose(mFinishEnterTransformation);
896 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800897
898 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final exit: " + mExitTransformation);
899 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final enter: " + mEnterTransformation);
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700900
901 if (USE_CUSTOM_BLACK_FRAME) {
902 //mFrameTransformation.set(mRotateExitTransformation);
903 //mFrameTransformation.compose(mStartExitTransformation);
904 //mFrameTransformation.compose(mFinishExitTransformation);
905 mFrameTransformation.set(mRotateFrameTransformation);
906 mFrameTransformation.compose(mStartFrameTransformation);
907 mFrameTransformation.compose(mFinishFrameTransformation);
908 mFrameTransformation.getMatrix().preConcat(mFrameInitialMatrix);
909 if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final frame: " + mFrameTransformation);
910 }
Craig Mautnerdbb79912012-03-01 18:59:14 -0800911
Craig Mautner7d8df392012-04-06 15:26:23 -0700912 final boolean more = (TWO_PHASE_ANIMATION
913 && (mMoreStartEnter || mMoreStartExit || mMoreFinishEnter || mMoreFinishExit))
914 || (USE_CUSTOM_BLACK_FRAME
915 && (mMoreStartFrame || mMoreRotateFrame || mMoreFinishFrame))
Igor Murashkina86ab6402013-08-30 12:58:36 -0700916 || mMoreRotateEnter || mMoreRotateExit
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800917 || !mFinishAnimReady;
Craig Mautnerdbb79912012-03-01 18:59:14 -0800918
919 mSnapshotFinalMatrix.setConcat(mExitTransformation.getMatrix(), mSnapshotInitialMatrix);
920
921 if (DEBUG_STATE) Slog.v(TAG, "Step: more=" + more);
922
923 return more;
924 }
925
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700926 void updateSurfacesInTransaction() {
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700927 if (!mStarted) {
928 return;
929 }
930
Mathias Agopian29479eb2013-02-14 14:36:04 -0800931 if (mSurfaceControl != null) {
Craig Mautnerbf90eaa2012-03-15 11:28:53 -0700932 if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) {
Craig Mautnerdbb79912012-03-01 18:59:14 -0800933 if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, hiding screenshot surface");
Mathias Agopian29479eb2013-02-14 14:36:04 -0800934 mSurfaceControl.hide();
Craig Mautnerdbb79912012-03-01 18:59:14 -0800935 }
936 }
937
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700938 if (mCustomBlackFrame != null) {
Craig Mautnerbf90eaa2012-03-15 11:28:53 -0700939 if (!mMoreStartFrame && !mMoreFinishFrame && !mMoreRotateFrame) {
Dianne Hackborn9fd74802012-03-01 19:26:31 -0800940 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding black frame");
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700941 mCustomBlackFrame.hide();
Craig Mautnerbf90eaa2012-03-15 11:28:53 -0700942 } else {
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700943 mCustomBlackFrame.setMatrix(mFrameTransformation.getMatrix());
944 }
945 }
946
947 if (mExitingBlackFrame != null) {
948 if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) {
949 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding exiting frame");
950 mExitingBlackFrame.hide();
951 } else {
952 mExitFrameFinalMatrix.setConcat(mExitTransformation.getMatrix(), mFrameInitialMatrix);
953 mExitingBlackFrame.setMatrix(mExitFrameFinalMatrix);
Craig Mautner46ac6fa2013-08-01 10:06:34 -0700954 if (mForceDefaultOrientation) {
955 mExitingBlackFrame.setAlpha(mExitTransformation.getAlpha());
956 }
Dianne Hackbornd6b32b62012-03-16 11:54:51 -0700957 }
958 }
959
960 if (mEnteringBlackFrame != null) {
961 if (!mMoreStartEnter && !mMoreFinishEnter && !mMoreRotateEnter) {
962 if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding entering frame");
963 mEnteringBlackFrame.hide();
964 } else {
965 mEnteringBlackFrame.setMatrix(mEnterTransformation.getMatrix());
Craig Mautnerdbb79912012-03-01 18:59:14 -0800966 }
967 }
968
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700969 setSnapshotTransformInTransaction(mSnapshotFinalMatrix, mExitTransformation.getAlpha());
Craig Mautnerdbb79912012-03-01 18:59:14 -0800970 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700971
Craig Mautnere32c3072012-03-12 15:25:35 -0700972 public boolean stepAnimationLocked(long now) {
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700973 if (!hasAnimations()) {
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800974 if (DEBUG_STATE) Slog.v(TAG, "Step: no animations running");
Craig Mautnera731cd32012-03-02 15:23:55 -0800975 mFinishAnimReady = false;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -0800976 return false;
977 }
978
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -0800979 if (!mAnimRunning) {
980 if (DEBUG_STATE) Slog.v(TAG, "Step: starting start, finish, rotate");
Craig Mautner7d8df392012-04-06 15:26:23 -0700981 if (TWO_PHASE_ANIMATION) {
982 if (mStartEnterAnimation != null) {
983 mStartEnterAnimation.setStartTime(now);
984 }
985 if (mStartExitAnimation != null) {
986 mStartExitAnimation.setStartTime(now);
987 }
988 if (mFinishEnterAnimation != null) {
989 mFinishEnterAnimation.setStartTime(0);
990 }
991 if (mFinishExitAnimation != null) {
992 mFinishExitAnimation.setStartTime(0);
993 }
Dianne Hackborn89620282011-09-11 12:47:45 -0700994 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700995 if (USE_CUSTOM_BLACK_FRAME) {
996 if (mStartFrameAnimation != null) {
997 mStartFrameAnimation.setStartTime(now);
998 }
999 if (mFinishFrameAnimation != null) {
1000 mFinishFrameAnimation.setStartTime(0);
1001 }
1002 if (mRotateFrameAnimation != null) {
1003 mRotateFrameAnimation.setStartTime(now);
1004 }
Dianne Hackborn9fd74802012-03-01 19:26:31 -08001005 }
Dianne Hackbornfd1c5ed2012-01-13 13:09:16 -08001006 if (mRotateEnterAnimation != null) {
1007 mRotateEnterAnimation.setStartTime(now);
1008 }
1009 if (mRotateExitAnimation != null) {
1010 mRotateExitAnimation.setStartTime(now);
1011 }
1012 mAnimRunning = true;
Craig Mautner3255a282012-04-16 15:42:47 -07001013 mHalfwayPoint = now + mRotateEnterAnimation.getDuration() / 2;
Dianne Hackbornf9d0be92010-11-24 12:35:25 -08001014 }
Craig Mautnere32c3072012-03-12 15:25:35 -07001015
1016 return stepAnimation(now);
Dianne Hackbornf9d0be92010-11-24 12:35:25 -08001017 }
1018
1019 public Transformation getEnterTransformation() {
1020 return mEnterTransformation;
Dianne Hackborna1111872010-11-23 20:55:11 -08001021 }
1022}