blob: a05e04dd6c7cc80032ec31885589db0441a98117 [file] [log] [blame]
Craig Mautnerc2c0a612014-02-20 20:25:41 -08001/*
2 * Copyright (C) 2014 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 */
Craig Mautnera2c77052012-03-26 12:14:43 -070016
17package com.android.server.wm;
18
Filip Gruszczynski69cbc352015-11-11 13:46:04 -080019import static android.view.Display.DEFAULT_DISPLAY;
Wale Ogunwalee7bf46b2015-09-30 09:19:28 -070020import static android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
Filip Gruszczynski69cbc352015-11-11 13:46:04 -080021import static android.view.WindowManager.LayoutParams.FLAG_SCALED;
Robert Carr132c9f52017-07-31 17:02:30 -070022import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY;
Craig Mautnerc2f9be02012-03-27 17:32:29 -070023import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
Jorim Jaggieb88d832016-04-13 20:17:43 -070024import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
Robert Carrfbbde852016-10-18 11:02:28 -070025import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
Jorim Jaggi0a1523d2018-04-19 17:48:38 +020026import static android.view.WindowManager.TRANSIT_NONE;
Jorim Jaggia5e10572017-11-15 14:36:26 +010027import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
28import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Jorim Jaggi0b46f3c2016-03-14 12:21:37 +010029import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_FREEFORM;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080030import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080031import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
32import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION;
33import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW;
Jorim Jaggie4b0f282017-05-17 15:10:29 +020034import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW_VERBOSE;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080035import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
Filip Gruszczynskif34a04c2015-12-07 15:05:49 -080036import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_CROP;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080037import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
38import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC;
39import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
40import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
41import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
Chong Zhang97782b42015-10-07 16:01:23 -070042import static com.android.server.wm.WindowManagerService.TYPE_LAYER_MULTIPLIER;
Filip Gruszczynski198dcbf2016-01-18 10:02:00 -080043import static com.android.server.wm.WindowManagerService.logWithStack;
Yi Jin6c6e9ca2018-03-20 16:53:35 -070044import static com.android.server.wm.WindowStateAnimatorProto.DRAW_STATE;
45import static com.android.server.wm.WindowStateAnimatorProto.LAST_CLIP_RECT;
46import static com.android.server.wm.WindowStateAnimatorProto.SURFACE;
47import static com.android.server.wm.WindowStateAnimatorProto.SYSTEM_DECOR_RECT;
Jorim Jaggiaf0d6d22018-06-08 15:25:35 +020048import static com.android.server.wm.WindowSurfacePlacer.SET_ORIENTATION_CHANGE_COMPLETE;
Adrian Roos41f7e9d2018-06-07 15:29:34 +020049import static com.android.server.wm.utils.CoordinateTransforms.transformToRotation;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070050
Craig Mautnerc2f9be02012-03-27 17:32:29 -070051import android.content.Context;
52import android.graphics.Matrix;
53import android.graphics.PixelFormat;
Craig Mautner7358fbf2012-04-12 21:06:33 -070054import android.graphics.Point;
Craig Mautnerc2f9be02012-03-27 17:32:29 -070055import android.graphics.Rect;
Craig Mautner48ba1e72012-04-02 13:18:16 -070056import android.graphics.Region;
Craig Mautnera51a9562012-04-17 17:05:26 -070057import android.os.Debug;
Chong Zhang8784be62016-06-28 15:25:07 -070058import android.os.Trace;
Craig Mautnera2c77052012-03-26 12:14:43 -070059import android.util.Slog;
Steven Timotiusaf03df62017-07-18 16:56:43 -070060import android.util.proto.ProtoOutputStream;
Craig Mautner59c00972012-07-30 12:10:24 -070061import android.view.DisplayInfo;
Igor Murashkina86ab6402013-08-30 12:58:36 -070062import android.view.Surface.OutOfResourcesException;
Mathias Agopian3866f0d2013-02-11 22:08:48 -080063import android.view.SurfaceControl;
Craig Mautnera2c77052012-03-26 12:14:43 -070064import android.view.WindowManager;
Craig Mautnerc2f9be02012-03-27 17:32:29 -070065import android.view.WindowManager.LayoutParams;
Craig Mautnera2c77052012-03-26 12:14:43 -070066import android.view.animation.Animation;
Craig Mautnerc2f9be02012-03-27 17:32:29 -070067import android.view.animation.AnimationUtils;
Craig Mautnera2c77052012-03-26 12:14:43 -070068
Adrian Roose99bc052017-11-20 17:55:31 +010069import com.android.server.policy.WindowManagerPolicy;
70
Jorim Jaggia5e10572017-11-15 14:36:26 +010071import java.io.PrintWriter;
Craig Mautnera2c77052012-03-26 12:14:43 -070072
73/**
Craig Mautnerc2f9be02012-03-27 17:32:29 -070074 * Keep track of animations and surface operations for a single WindowState.
75 **/
Craig Mautnera2c77052012-03-26 12:14:43 -070076class WindowStateAnimator {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -080077 static final String TAG = TAG_WITH_CLASS_NAME ? "WindowStateAnimator" : TAG_WM;
Chong Zhang97782b42015-10-07 16:01:23 -070078 static final int WINDOW_FREEZE_LAYER = TYPE_LAYER_MULTIPLIER * 200;
Craig Mautnera2c77052012-03-26 12:14:43 -070079
Jorim Jaggi6a7c90a2016-03-11 15:04:59 +010080 /**
81 * Mode how the window gets clipped by the stack bounds during an animation: The clipping should
82 * be applied after applying the animation transformation, i.e. the stack bounds don't move
83 * during the animation.
84 */
85 static final int STACK_CLIP_AFTER_ANIM = 0;
86
87 /**
88 * Mode how the window gets clipped by the stack bounds: The clipping should be applied before
89 * applying the animation transformation, i.e. the stack bounds move with the window.
90 */
91 static final int STACK_CLIP_BEFORE_ANIM = 1;
92
93 /**
94 * Mode how window gets clipped by the stack bounds during an animation: Don't clip the window
95 * by the stack bounds.
96 */
97 static final int STACK_CLIP_NONE = 2;
98
Craig Mautner918b53b2012-07-09 14:15:54 -070099 // Unchanging local convenience fields.
Craig Mautnera2c77052012-03-26 12:14:43 -0700100 final WindowManagerService mService;
101 final WindowState mWin;
Craig Mautnere7ae2502012-03-26 17:11:19 -0700102 final WindowAnimator mAnimator;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700103 final Session mSession;
104 final WindowManagerPolicy mPolicy;
105 final Context mContext;
Craig Mautner918b53b2012-07-09 14:15:54 -0700106 final boolean mIsWallpaper;
Wale Ogunwalee4da0c12016-07-29 12:47:02 -0700107 private final WallpaperController mWallpaperControllerLocked;
Craig Mautnera2c77052012-03-26 12:14:43 -0700108
Craig Mautnera2c77052012-03-26 12:14:43 -0700109 boolean mAnimationIsEntrance;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700110 int mAnimLayer;
111 int mLastLayer;
112
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700113 /**
114 * Set when we have changed the size of the surface, to know that
115 * we must tell them application to resize (and thus redraw itself).
116 */
117 boolean mSurfaceResized;
Chong Zhang5b2f1992015-11-13 15:40:36 -0800118 /**
119 * Whether we should inform the client on next relayoutWindow that
120 * the surface has been resized since last time.
121 */
122 boolean mReportSurfaceResized;
Robert Carre6a83512015-11-03 16:09:21 -0800123 WindowSurfaceController mSurfaceController;
Filip Gruszczynski10a80e02015-11-06 09:21:17 -0800124 private WindowSurfaceController mPendingDestroySurface;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700125
126 /**
127 * Set if the client has asked that the destroy of its surface be delayed
128 * until it explicitly says it is okay.
129 */
130 boolean mSurfaceDestroyDeferred;
131
Filip Gruszczynski10a80e02015-11-06 09:21:17 -0800132 private boolean mDestroyPreservedSurfaceUponRedraw;
Craig Mautner7d8df392012-04-06 15:26:23 -0700133 float mShownAlpha = 0;
134 float mAlpha = 0;
135 float mLastAlpha = 0;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700136
Winson Chung399f6202014-03-19 10:47:20 -0700137 Rect mTmpClipRect = new Rect();
Jorim Jaggi6a7c90a2016-03-11 15:04:59 +0100138 Rect mTmpFinalClipRect = new Rect();
Winson Chung399f6202014-03-19 10:47:20 -0700139 Rect mLastClipRect = new Rect();
Jorim Jaggi6a7c90a2016-03-11 15:04:59 +0100140 Rect mLastFinalClipRect = new Rect();
Filip Gruszczynski4b8eea72015-09-14 18:16:19 -0700141 Rect mTmpStackBounds = new Rect();
Winson Chung08f81892017-03-02 15:40:51 -0800142 private Rect mTmpAnimatingBounds = new Rect();
143 private Rect mTmpSourceBounds = new Rect();
Winson Chung399f6202014-03-19 10:47:20 -0700144
Filip Gruszczynskif34a04c2015-12-07 15:05:49 -0800145 /**
146 * This is rectangle of the window's surface that is not covered by
147 * system decorations.
148 */
149 private final Rect mSystemDecorRect = new Rect();
Filip Gruszczynskif34a04c2015-12-07 15:05:49 -0800150
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700151 float mDsDx=1, mDtDx=0, mDsDy=0, mDtDy=1;
Robert Carr0edf18f2017-02-21 20:01:47 -0800152 private float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700153
154 boolean mHaveMatrix;
155
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700156 // Set to true if, when the window gets displayed, it should perform
157 // an enter animation.
158 boolean mEnterAnimationPending;
Craig Mautnera2c77052012-03-26 12:14:43 -0700159
Craig Mautner9c795042014-10-28 19:59:59 -0700160 /** Used to indicate that this window is undergoing an enter animation. Used for system
161 * windows to make the callback to View.dispatchOnWindowShownCallback(). Set when the
162 * window is first added or shown, cleared when the callback has been made. */
163 boolean mEnteringAnimation;
164
Jorim Jaggiff71d202016-04-14 13:12:36 -0700165 private boolean mAnimationStartDelayed;
166
Chavi Weingartenb736e322018-02-23 00:27:54 +0000167 private final SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction();
168
John Reck80181b92015-05-19 11:09:32 -0700169 /** The pixel format of the underlying SurfaceControl */
170 int mSurfaceFormat;
171
Craig Mautner749a7bb2012-04-02 13:49:53 -0700172 /** This is set when there is no Surface */
173 static final int NO_SURFACE = 0;
174 /** This is set after the Surface has been created but before the window has been drawn. During
175 * this time the surface is hidden. */
176 static final int DRAW_PENDING = 1;
177 /** This is set after the window has finished drawing for the first time but before its surface
178 * is shown. The surface will be displayed when the next layout is run. */
179 static final int COMMIT_DRAW_PENDING = 2;
180 /** This is set during the time after the window's drawing has been committed, and before its
181 * surface is actually shown. It is used to delay showing the surface until all windows in a
182 * token are ready to be shown. */
183 static final int READY_TO_SHOW = 3;
184 /** Set when the window has been shown in the screen the first time. */
185 static final int HAS_DRAWN = 4;
Adrian Roos3eeb4e62014-05-19 12:43:26 +0200186
Craig Mautner276a6eb2014-11-04 15:32:57 -0800187 String drawStateToString() {
188 switch (mDrawState) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700189 case NO_SURFACE: return "NO_SURFACE";
190 case DRAW_PENDING: return "DRAW_PENDING";
191 case COMMIT_DRAW_PENDING: return "COMMIT_DRAW_PENDING";
192 case READY_TO_SHOW: return "READY_TO_SHOW";
193 case HAS_DRAWN: return "HAS_DRAWN";
Craig Mautner276a6eb2014-11-04 15:32:57 -0800194 default: return Integer.toString(mDrawState);
Craig Mautner6fbda632012-07-03 09:26:39 -0700195 }
196 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700197 int mDrawState;
Craig Mautnera608b882012-03-30 13:03:49 -0700198
Craig Mautner749a7bb2012-04-02 13:49:53 -0700199 /** Was this window last hidden? */
200 boolean mLastHidden;
Craig Mautnera608b882012-03-30 13:03:49 -0700201
Craig Mautnerbec53f72012-04-05 11:49:05 -0700202 int mAttrType;
203
Robert Carrc7294602016-05-13 11:32:05 -0700204 boolean mForceScaleUntilResize;
205
Robert Carr04092112016-06-02 12:56:12 -0700206 // WindowState.mHScale and WindowState.mVScale contain the
207 // scale according to client specified layout parameters (e.g.
208 // one layout size, with another surface size, creates such scaling).
209 // Here we track an additional scaling factor used to follow stack
210 // scaling (as in the case of the Pinned stack animation).
211 float mExtraHScale = (float) 1.0;
212 float mExtraVScale = (float) 1.0;
213
Robert Carr217e7cc2018-01-31 18:08:39 -0800214 // An offset in pixel of the surface contents from the window position. Used for Wallpaper
215 // to provide the effect of scrolling within a large surface. We just use these values as
216 // a cache.
217 int mXOffset = 0;
218 int mYOffset = 0;
219
chaviwbe43ac82018-04-04 15:14:49 -0700220 /**
221 * A flag to determine if the WSA needs to offset its position to compensate for the stack's
222 * position update before the WSA surface has resized.
223 */
224 private boolean mOffsetPositionForStackResize;
225
Filip Gruszczynski69cbc352015-11-11 13:46:04 -0800226 private final Rect mTmpSize = new Rect();
227
Robert Carrca4c5a62018-02-05 16:07:55 -0800228 private final SurfaceControl.Transaction mReparentTransaction = new SurfaceControl.Transaction();
229
Robert Carr7b3d11d2018-03-15 14:34:45 -0700230 // Used to track whether we have called detach children on the way to invisibility, in which
231 // case we need to give the client a new Surface if it lays back out to a visible state.
232 boolean mChildrenDetached = false;
233
Robert Carr2025bf842018-03-19 13:25:05 -0700234 // Set to true after the first frame of the Pinned stack animation
235 // and reset after the last to ensure we only reset mForceScaleUntilResize
236 // once per animation.
237 boolean mPipAnimationStarted = false;
238
chaviwbe43ac82018-04-04 15:14:49 -0700239 private final Point mTmpPos = new Point();
240
Craig Mautnerc431e892015-02-11 13:14:26 -0800241 WindowStateAnimator(final WindowState win) {
Craig Mautner918b53b2012-07-09 14:15:54 -0700242 final WindowManagerService service = win.mService;
243
Craig Mautnera2c77052012-03-26 12:14:43 -0700244 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -0700245 mAnimator = service.mAnimator;
246 mPolicy = service.mPolicy;
247 mContext = service.mContext;
Craig Mautner918b53b2012-07-09 14:15:54 -0700248
249 mWin = win;
Craig Mautner918b53b2012-07-09 14:15:54 -0700250 mSession = win.mSession;
Craig Mautner918b53b2012-07-09 14:15:54 -0700251 mAttrType = win.mAttrs.type;
252 mIsWallpaper = win.mIsWallpaper;
Wale Ogunwale0303c572016-10-20 10:16:29 -0700253 mWallpaperControllerLocked = mService.mRoot.mWallpaperController;
Craig Mautnera2c77052012-03-26 12:14:43 -0700254 }
255
Jorim Jaggi5c80c412016-04-19 20:03:47 -0700256 /**
257 * Is the window or its container currently set to animate or currently animating?
258 */
259 boolean isAnimationSet() {
Jorim Jaggia5e10572017-11-15 14:36:26 +0100260 return mWin.isAnimating();
Jorim Jaggi5c80c412016-04-19 20:03:47 -0700261 }
262
Craig Mautnera2c77052012-03-26 12:14:43 -0700263 void cancelExitAnimationForNextAnimationLocked() {
Chong Zhangbfc2f8f2016-01-29 15:50:34 -0800264 if (DEBUG_ANIM) Slog.d(TAG,
265 "cancelExitAnimationForNextAnimationLocked: " + mWin);
266
Jorim Jaggia5e10572017-11-15 14:36:26 +0100267 mWin.cancelAnimation();
268 mWin.destroySurfaceUnchecked();
Craig Mautnera2c77052012-03-26 12:14:43 -0700269 }
270
Jorim Jaggia5e10572017-11-15 14:36:26 +0100271 void onAnimationFinished() {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700272 // Done animating, clean up.
273 if (DEBUG_ANIM) Slog.v(
Jorim Jaggia5e10572017-11-15 14:36:26 +0100274 TAG, "Animation done in " + this + ": exiting=" + mWin.mAnimatingExit
275 + ", reportedVisible="
276 + (mWin.mAppToken != null ? mWin.mAppToken.reportedVisible : false));
Craig Mautnera2c77052012-03-26 12:14:43 -0700277
Craig Mautnere7ae2502012-03-26 17:11:19 -0700278 if (mAnimator.mWindowDetachedWallpaper == mWin) {
279 mAnimator.mWindowDetachedWallpaper = null;
Craig Mautnera2c77052012-03-26 12:14:43 -0700280 }
Jorim Jaggia5e10572017-11-15 14:36:26 +0100281
Filip Gruszczynski14b4e572015-11-03 15:53:55 -0800282 mWin.checkPolicyVisibilityChange();
Jorim Jaggia5e10572017-11-15 14:36:26 +0100283 final DisplayContent displayContent = mWin.getDisplayContent();
Jorim Jaggiba41f4b2016-12-14 17:43:07 -0800284 if (mAttrType == LayoutParams.TYPE_STATUS_BAR && mWin.mPolicyVisibility) {
Craig Mautner81defc72013-10-29 11:10:42 -0700285 // Upon completion of a not-visible to visible status bar animation a relayout is
286 // required.
Craig Mautnerdf88d732014-01-27 09:21:32 -0800287 if (displayContent != null) {
Wale Ogunwale2b06bfc2016-09-28 14:17:05 -0700288 displayContent.setLayoutNeeded();
Craig Mautnerdf88d732014-01-27 09:21:32 -0800289 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700290 }
291
Wale Ogunwaleadde52e2016-07-16 13:11:55 -0700292 mWin.onExitAnimationDone();
Craig Mautnerdf88d732014-01-27 09:21:32 -0800293 final int displayId = mWin.getDisplayId();
Jorim Jaggia5e10572017-11-15 14:36:26 +0100294 int pendingLayoutChanges = FINISH_LAYOUT_REDO_ANIM;
295 if (displayContent.mWallpaperController.isWallpaperTarget(mWin)) {
296 pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
297 }
298 mAnimator.setPendingLayoutChanges(displayId, pendingLayoutChanges);
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800299 if (DEBUG_LAYOUT_REPEATS)
Filip Gruszczynski4501d232015-09-02 13:00:02 -0700300 mService.mWindowPlacerLocked.debugLayoutRepeats(
301 "WindowStateAnimator", mAnimator.getPendingLayoutChanges(displayId));
Craig Mautnera2c77052012-03-26 12:14:43 -0700302
303 if (mWin.mAppToken != null) {
304 mWin.mAppToken.updateReportedVisibilityLocked();
305 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700306 }
307
Chavi Weingartenb736e322018-02-23 00:27:54 +0000308 void hide(SurfaceControl.Transaction transaction, String reason) {
Craig Mautner0afddcb2012-05-08 15:38:00 -0700309 if (!mLastHidden) {
310 //dump();
311 mLastHidden = true;
Jorim Jaggi50575902018-04-10 17:49:30 +0200312
313 // We may have a preserved surface which we no longer need. If there was a quick
314 // VISIBLE, GONE, VISIBLE, GONE sequence, the surface may never draw, so we don't mark
315 // it to be destroyed in prepareSurfaceLocked.
316 markPreservedSurfaceForDestroy();
317
Wale Ogunwalef9e09782015-11-09 12:42:37 -0800318 if (mSurfaceController != null) {
Chavi Weingartenb736e322018-02-23 00:27:54 +0000319 mSurfaceController.hide(transaction, reason);
Wale Ogunwalef9e09782015-11-09 12:42:37 -0800320 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700321 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700322 }
323
Chavi Weingartenb736e322018-02-23 00:27:54 +0000324 void hide(String reason) {
325 hide(mTmpTransaction, reason);
326 SurfaceControl.mergeToGlobalTransaction(mTmpTransaction);
327 }
328
Craig Mautnera608b882012-03-30 13:03:49 -0700329 boolean finishDrawingLocked() {
Craig Mautner42d04db2014-11-06 12:13:23 -0800330 final boolean startingWindow =
331 mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
332 if (DEBUG_STARTING_WINDOW && startingWindow) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700333 Slog.v(TAG, "Finishing drawing window " + mWin + ": mDrawState="
Craig Mautner276a6eb2014-11-04 15:32:57 -0800334 + drawStateToString());
Craig Mautner6fbda632012-07-03 09:26:39 -0700335 }
Robert Carr1ca6a332016-04-11 18:00:43 -0700336
Jorim Jaggie7d2b852017-08-28 17:55:15 +0200337 boolean layoutNeeded = false;
Chong Zhang92147042016-05-09 12:47:11 -0700338
Craig Mautner749a7bb2012-04-02 13:49:53 -0700339 if (mDrawState == DRAW_PENDING) {
Robert Carre13b58e2017-08-31 14:50:44 -0700340 if (DEBUG_ANIM || SHOW_TRANSACTIONS || DEBUG_ORIENTATION)
Chong Zhang5b2f1992015-11-13 15:40:36 -0800341 Slog.v(TAG, "finishDrawingLocked: mDrawState=COMMIT_DRAW_PENDING " + mWin + " in "
Robert Carre6a83512015-11-03 16:09:21 -0800342 + mSurfaceController);
Craig Mautner42d04db2014-11-06 12:13:23 -0800343 if (DEBUG_STARTING_WINDOW && startingWindow) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700344 Slog.v(TAG, "Draw state now committed in " + mWin);
345 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700346 mDrawState = COMMIT_DRAW_PENDING;
Chong Zhangcbbcc0f2016-05-17 20:46:58 -0700347 layoutNeeded = true;
Craig Mautnera608b882012-03-30 13:03:49 -0700348 }
Chong Zhangdb20b5f2015-10-23 14:01:43 -0700349
Chong Zhangcbbcc0f2016-05-17 20:46:58 -0700350 return layoutNeeded;
Craig Mautnera608b882012-03-30 13:03:49 -0700351 }
352
353 // This must be called while inside a transaction.
Craig Mautnerc431e892015-02-11 13:14:26 -0800354 boolean commitFinishDrawingLocked() {
Jorim Jaggie4b0f282017-05-17 15:10:29 +0200355 if (DEBUG_STARTING_WINDOW_VERBOSE &&
Craig Mautner6fbda632012-07-03 09:26:39 -0700356 mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
357 Slog.i(TAG, "commitFinishDrawingLocked: " + mWin + " cur mDrawState="
Craig Mautner276a6eb2014-11-04 15:32:57 -0800358 + drawStateToString());
Craig Mautner6fbda632012-07-03 09:26:39 -0700359 }
Craig Mautner276a6eb2014-11-04 15:32:57 -0800360 if (mDrawState != COMMIT_DRAW_PENDING && mDrawState != READY_TO_SHOW) {
Craig Mautnera608b882012-03-30 13:03:49 -0700361 return false;
362 }
Robert Carre13b58e2017-08-31 14:50:44 -0700363 if (DEBUG_ANIM) {
Robert Carre6a83512015-11-03 16:09:21 -0800364 Slog.i(TAG, "commitFinishDrawingLocked: mDrawState=READY_TO_SHOW " + mSurfaceController);
Craig Mautner6fbda632012-07-03 09:26:39 -0700365 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700366 mDrawState = READY_TO_SHOW;
Chong Zhang0275e392015-09-17 10:41:44 -0700367 boolean result = false;
Craig Mautnera608b882012-03-30 13:03:49 -0700368 final AppWindowToken atoken = mWin.mAppToken;
Jorim Jaggiaf0d6d22018-06-08 15:25:35 +0200369 if (atoken == null || atoken.canShowWindows()
370 || mWin.mAttrs.type == TYPE_APPLICATION_STARTING) {
Wale Ogunwale9d147902016-07-16 11:58:55 -0700371 result = mWin.performShowLocked();
Chong Zhang0275e392015-09-17 10:41:44 -0700372 }
Chong Zhang97782b42015-10-07 16:01:23 -0700373 return result;
Craig Mautnera608b882012-03-30 13:03:49 -0700374 }
375
Chong Zhang97782b42015-10-07 16:01:23 -0700376 void preserveSurfaceLocked() {
377 if (mDestroyPreservedSurfaceUponRedraw) {
Chong Zhangb9b0fec2016-02-11 18:51:51 -0800378 // This could happen when switching the surface mode very fast. For example,
379 // we preserved a surface when dragResizing changed to true. Then before the
380 // preserved surface is removed, dragResizing changed to false again.
381 // In this case, we need to leave the preserved surface alone, and destroy
382 // the actual surface, so that the createSurface call could create a surface
383 // of the proper size. The preserved surface will still be removed when client
384 // finishes drawing to the new surface.
385 mSurfaceDestroyDeferred = false;
386 destroySurfaceLocked();
387 mSurfaceDestroyDeferred = true;
Chong Zhang97782b42015-10-07 16:01:23 -0700388 return;
389 }
Filip Gruszczynski198dcbf2016-01-18 10:02:00 -0800390 if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, "SET FREEZE LAYER", false);
Wale Ogunwalef9e09782015-11-09 12:42:37 -0800391 if (mSurfaceController != null) {
Robert Carrb1579c82017-09-05 14:54:47 -0700392 // Our SurfaceControl is always at layer 0 within the parent Surface managed by
393 // window-state. We want this old Surface to stay on top of the new one
394 // until we do the swap, so we place it at layer 1.
395 mSurfaceController.mSurfaceControl.setLayer(1);
Wale Ogunwalef9e09782015-11-09 12:42:37 -0800396 }
Chong Zhang97782b42015-10-07 16:01:23 -0700397 mDestroyPreservedSurfaceUponRedraw = true;
398 mSurfaceDestroyDeferred = true;
399 destroySurfaceLocked();
400 }
401
402 void destroyPreservedSurfaceLocked() {
403 if (!mDestroyPreservedSurfaceUponRedraw) {
404 return;
405 }
Robert Carrd5c7dd62017-03-08 10:39:30 -0800406 if (mSurfaceController != null) {
407 if (mPendingDestroySurface != null) {
408 // If we are preserving a surface but we aren't relaunching that means
409 // we are just doing an in-place switch. In that case any SurfaceFlinger side
410 // child layers need to be reparented to the new surface to make this
411 // transparent to the app.
412 if (mWin.mAppToken == null || mWin.mAppToken.isRelaunching() == false) {
Robert Carrca4c5a62018-02-05 16:07:55 -0800413 mReparentTransaction.reparentChildren(mPendingDestroySurface.mSurfaceControl,
414 mSurfaceController.mSurfaceControl.getHandle())
415 .apply();
Robert Carrd5c7dd62017-03-08 10:39:30 -0800416 }
417 }
418 }
419
Chong Zhang97782b42015-10-07 16:01:23 -0700420 destroyDeferredSurfaceLocked();
421 mDestroyPreservedSurfaceUponRedraw = false;
422 }
423
Chong Zhangeb665572016-05-09 18:28:27 -0700424 void markPreservedSurfaceForDestroy() {
425 if (mDestroyPreservedSurfaceUponRedraw
426 && !mService.mDestroyPreservedSurface.contains(mWin)) {
427 mService.mDestroyPreservedSurface.add(mWin);
428 }
429 }
430
Robert Carrda61ba92017-03-29 15:52:23 -0700431 private int getLayerStack() {
432 return mWin.getDisplayContent().getDisplay().getLayerStack();
433 }
434
Robert Carrecc06b32017-04-18 14:25:10 -0700435 void resetDrawState() {
436 mDrawState = DRAW_PENDING;
437
438 if (mWin.mAppToken == null) {
439 return;
440 }
441
Jorim Jaggif5f9e122017-10-24 18:21:09 +0200442 if (!mWin.mAppToken.isSelfAnimating()) {
Robert Carrecc06b32017-04-18 14:25:10 -0700443 mWin.mAppToken.clearAllDrawn();
444 } else {
445 // Currently animating, persist current state of allDrawn until animation
446 // is complete.
447 mWin.mAppToken.deferClearAllDrawn = true;
448 }
449 }
450
Albert Chaulk3bf2e572016-11-22 13:59:19 -0500451 WindowSurfaceController createSurfaceLocked(int windowType, int ownerUid) {
Alan Viveretteccb11e12014-07-08 16:04:02 -0700452 final WindowState w = mWin;
Chong Zhanga8975bd2016-01-28 17:13:47 -0800453
Wale Ogunwale722ff892016-02-18 13:37:55 -0800454 if (mSurfaceController != null) {
455 return mSurfaceController;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700456 }
Robert Carr7b3d11d2018-03-15 14:34:45 -0700457 mChildrenDetached = false;
Wale Ogunwale722ff892016-02-18 13:37:55 -0800458
Robert Carr132c9f52017-07-31 17:02:30 -0700459 if ((mWin.mAttrs.privateFlags & PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY) != 0) {
460 windowType = SurfaceControl.WINDOW_TYPE_DONT_SCREENSHOT;
461 }
462
Wale Ogunwale722ff892016-02-18 13:37:55 -0800463 w.setHasSurface(false);
464
465 if (DEBUG_ANIM || DEBUG_ORIENTATION) Slog.i(TAG,
466 "createSurface " + this + ": mDrawState=DRAW_PENDING");
467
Robert Carrecc06b32017-04-18 14:25:10 -0700468 resetDrawState();
Wale Ogunwale722ff892016-02-18 13:37:55 -0800469
470 mService.makeWindowFreezingScreenIfNeededLocked(w);
471
472 int flags = SurfaceControl.HIDDEN;
473 final WindowManager.LayoutParams attrs = w.mAttrs;
474
475 if (mService.isSecureLocked(w)) {
476 flags |= SurfaceControl.SECURE;
477 }
478
Robert Carr217e7cc2018-01-31 18:08:39 -0800479 mTmpSize.set(0, 0, 0, 0);
Wale Ogunwale722ff892016-02-18 13:37:55 -0800480 calculateSurfaceBounds(w, attrs);
481 final int width = mTmpSize.width();
482 final int height = mTmpSize.height();
483
484 if (DEBUG_VISIBILITY) {
485 Slog.v(TAG, "Creating surface in session "
486 + mSession.mSurfaceSession + " window " + this
487 + " w=" + width + " h=" + height
488 + " x=" + mTmpSize.left + " y=" + mTmpSize.top
489 + " format=" + attrs.format + " flags=" + flags);
490 }
491
492 // We may abort, so initialize to defaults.
Wale Ogunwale722ff892016-02-18 13:37:55 -0800493 mLastClipRect.set(0, 0, 0, 0);
494
495 // Set up surface control with initial size.
496 try {
497
498 final boolean isHwAccelerated = (attrs.flags & FLAG_HARDWARE_ACCELERATED) != 0;
499 final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : attrs.format;
500 if (!PixelFormat.formatHasAlpha(attrs.format)
501 // Don't make surface with surfaceInsets opaque as they display a
502 // translucent shadow.
503 && attrs.surfaceInsets.left == 0
504 && attrs.surfaceInsets.top == 0
505 && attrs.surfaceInsets.right == 0
506 && attrs.surfaceInsets.bottom == 0
507 // Don't make surface opaque when resizing to reduce the amount of
508 // artifacts shown in areas the app isn't drawing content to.
509 && !w.isDragResizing()) {
510 flags |= SurfaceControl.OPAQUE;
511 }
512
513 mSurfaceController = new WindowSurfaceController(mSession.mSurfaceSession,
Jorim Jaggia5e10572017-11-15 14:36:26 +0100514 attrs.getTitle().toString(), width, height, format, flags, this,
515 windowType, ownerUid);
chaviwbe43ac82018-04-04 15:14:49 -0700516
517 setOffsetPositionForStackResize(false);
Robert Carr486bbb72017-05-30 11:25:22 -0700518 mSurfaceFormat = format;
Wale Ogunwale722ff892016-02-18 13:37:55 -0800519
520 w.setHasSurface(true);
521
522 if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) {
523 Slog.i(TAG, " CREATE SURFACE "
524 + mSurfaceController + " IN SESSION "
525 + mSession.mSurfaceSession
526 + ": pid=" + mSession.mPid + " format="
527 + attrs.format + " flags=0x"
528 + Integer.toHexString(flags)
529 + " / " + this);
530 }
531 } catch (OutOfResourcesException e) {
532 Slog.w(TAG, "OutOfResourcesException creating surface");
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700533 mService.mRoot.reclaimSomeSurfaceMemory(this, "create", true);
Wale Ogunwale722ff892016-02-18 13:37:55 -0800534 mDrawState = NO_SURFACE;
535 return null;
536 } catch (Exception e) {
Robert Carrb0f39362018-03-14 13:52:25 -0700537 Slog.e(TAG, "Exception creating surface (parent dead?)", e);
Wale Ogunwale722ff892016-02-18 13:37:55 -0800538 mDrawState = NO_SURFACE;
539 return null;
540 }
541
542 if (WindowManagerService.localLOGV) Slog.v(TAG, "Got surface: " + mSurfaceController
543 + ", set left=" + w.mFrame.left + " top=" + w.mFrame.top
544 + ", animLayer=" + mAnimLayer);
545
546 if (SHOW_LIGHT_TRANSACTIONS) {
547 Slog.i(TAG, ">>> OPEN TRANSACTION createSurfaceLocked");
548 WindowManagerService.logSurface(w, "CREATE pos=("
549 + w.mFrame.left + "," + w.mFrame.top + ") ("
550 + width + "x" + height + "), layer=" + mAnimLayer + " HIDE", false);
551 }
552
Wale Ogunwale722ff892016-02-18 13:37:55 -0800553 mLastHidden = true;
554
555 if (WindowManagerService.localLOGV) Slog.v(TAG, "Created surface " + this);
Robert Carre6a83512015-11-03 16:09:21 -0800556 return mSurfaceController;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700557 }
558
Filip Gruszczynski69cbc352015-11-11 13:46:04 -0800559 private void calculateSurfaceBounds(WindowState w, LayoutParams attrs) {
560 if ((attrs.flags & FLAG_SCALED) != 0) {
561 // For a scaled surface, we always want the requested size.
562 mTmpSize.right = mTmpSize.left + w.mRequestedWidth;
563 mTmpSize.bottom = mTmpSize.top + w.mRequestedHeight;
564 } else {
565 // When we're doing a drag-resizing, request a surface that's fullscreen size,
566 // so that we don't need to reallocate during the process. This also prevents
567 // buffer drops due to size mismatch.
568 if (w.isDragResizing()) {
569 if (w.getResizeMode() == DRAG_RESIZE_MODE_FREEFORM) {
570 mTmpSize.left = 0;
571 mTmpSize.top = 0;
572 }
573 final DisplayInfo displayInfo = w.getDisplayInfo();
574 mTmpSize.right = mTmpSize.left + displayInfo.logicalWidth;
575 mTmpSize.bottom = mTmpSize.top + displayInfo.logicalHeight;
576 } else {
577 mTmpSize.right = mTmpSize.left + w.mCompatFrame.width();
578 mTmpSize.bottom = mTmpSize.top + w.mCompatFrame.height();
579 }
580 }
581
582 // Something is wrong and SurfaceFlinger will not like this, try to revert to sane values.
Filip Gruszczynskie6ed1952015-12-21 09:34:16 -0800583 // This doesn't necessarily mean that there is an error in the system. The sizes might be
584 // incorrect, because it is before the first layout or draw.
Filip Gruszczynski69cbc352015-11-11 13:46:04 -0800585 if (mTmpSize.width() < 1) {
Filip Gruszczynski69cbc352015-11-11 13:46:04 -0800586 mTmpSize.right = mTmpSize.left + 1;
587 }
588 if (mTmpSize.height() < 1) {
Filip Gruszczynski69cbc352015-11-11 13:46:04 -0800589 mTmpSize.bottom = mTmpSize.top + 1;
590 }
591
Filip Gruszczynski69cbc352015-11-11 13:46:04 -0800592 // Adjust for surface insets.
Phil Weavera4b32b92016-06-02 13:55:39 -0700593 mTmpSize.left -= attrs.surfaceInsets.left;
594 mTmpSize.top -= attrs.surfaceInsets.top;
595 mTmpSize.right += attrs.surfaceInsets.right;
596 mTmpSize.bottom += attrs.surfaceInsets.bottom;
Filip Gruszczynski69cbc352015-11-11 13:46:04 -0800597 }
598
Chong Zhangeb22e8e2016-01-20 19:52:22 -0800599 boolean hasSurface() {
Jorim Jaggie7d2b852017-08-28 17:55:15 +0200600 return mSurfaceController != null && mSurfaceController.hasSurface();
Chong Zhangeb22e8e2016-01-20 19:52:22 -0800601 }
602
Craig Mautner96868332012-12-04 14:29:11 -0800603 void destroySurfaceLocked() {
Chong Zhangdb20b5f2015-10-23 14:01:43 -0700604 final AppWindowToken wtoken = mWin.mAppToken;
605 if (wtoken != null) {
Chong Zhangdb20b5f2015-10-23 14:01:43 -0700606 if (mWin == wtoken.startingWindow) {
607 wtoken.startingDisplayed = false;
608 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700609 }
610
Wale Ogunwale722ff892016-02-18 13:37:55 -0800611 if (mSurfaceController == null) {
612 return;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700613 }
Wale Ogunwale722ff892016-02-18 13:37:55 -0800614
Wale Ogunwale722ff892016-02-18 13:37:55 -0800615 // When destroying a surface we want to make sure child windows are hidden. If we are
616 // preserving the surface until redraw though we intend to swap it out with another surface
617 // for resizing. In this case the window always remains visible to the user and the child
618 // windows should likewise remain visible.
Wale Ogunwale9d147902016-07-16 11:58:55 -0700619 if (!mDestroyPreservedSurfaceUponRedraw) {
620 mWin.mHidden = true;
Wale Ogunwale722ff892016-02-18 13:37:55 -0800621 }
622
623 try {
624 if (DEBUG_VISIBILITY) logWithStack(TAG, "Window " + this + " destroying surface "
625 + mSurfaceController + ", session " + mSession);
626 if (mSurfaceDestroyDeferred) {
627 if (mSurfaceController != null && mPendingDestroySurface != mSurfaceController) {
628 if (mPendingDestroySurface != null) {
629 if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) {
630 WindowManagerService.logSurface(mWin, "DESTROY PENDING", true);
631 }
Robert Carra8828862018-02-05 16:17:36 -0800632 mPendingDestroySurface.destroyNotInTransaction();
Wale Ogunwale722ff892016-02-18 13:37:55 -0800633 }
634 mPendingDestroySurface = mSurfaceController;
635 }
636 } else {
637 if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) {
638 WindowManagerService.logSurface(mWin, "DESTROY", true);
639 }
640 destroySurface();
641 }
642 // Don't hide wallpaper if we're deferring the surface destroy
643 // because of a surface change.
644 if (!mDestroyPreservedSurfaceUponRedraw) {
645 mWallpaperControllerLocked.hideWallpapers(mWin);
646 }
647 } catch (RuntimeException e) {
648 Slog.w(TAG, "Exception thrown when destroying Window " + this
649 + " surface " + mSurfaceController + " session " + mSession + ": " + e.toString());
650 }
651
652 // Whether the surface was preserved (and copied to mPendingDestroySurface) or not, it
653 // needs to be cleared to match the WindowState.mHasSurface state. It is also necessary
654 // so it can be recreated successfully in mPendingDestroySurface case.
655 mWin.setHasSurface(false);
656 if (mSurfaceController != null) {
657 mSurfaceController.setShown(false);
658 }
659 mSurfaceController = null;
660 mDrawState = NO_SURFACE;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700661 }
662
Craig Mautner96868332012-12-04 14:29:11 -0800663 void destroyDeferredSurfaceLocked() {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700664 try {
665 if (mPendingDestroySurface != null) {
666 if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) {
Filip Gruszczynski198dcbf2016-01-18 10:02:00 -0800667 WindowManagerService.logSurface(mWin, "DESTROY PENDING", true);
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700668 }
Robert Carra8828862018-02-05 16:17:36 -0800669 mPendingDestroySurface.destroyNotInTransaction();
Chong Zhang6e21cf42015-11-09 14:41:42 -0800670 // Don't hide wallpaper if we're destroying a deferred surface
671 // after a surface mode change.
672 if (!mDestroyPreservedSurfaceUponRedraw) {
673 mWallpaperControllerLocked.hideWallpapers(mWin);
674 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700675 }
676 } catch (RuntimeException e) {
Craig Mautnerd87946b2012-03-29 18:00:19 -0700677 Slog.w(TAG, "Exception thrown when destroying Window "
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700678 + this + " surface " + mPendingDestroySurface
679 + " session " + mSession + ": " + e.toString());
680 }
681 mSurfaceDestroyDeferred = false;
682 mPendingDestroySurface = null;
683 }
684
685 void computeShownFrameLocked() {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700686 final int displayId = mWin.getDisplayId();
687 final ScreenRotationAnimation screenRotationAnimation =
688 mAnimator.getScreenRotationAnimationLocked(displayId);
Adrian Roos28c25e22018-05-31 18:07:28 +0200689 final boolean windowParticipatesInScreenRotationAnimation =
690 !mWin.mForceSeamlesslyRotate;
691 final boolean screenAnimation = screenRotationAnimation != null
692 && screenRotationAnimation.isAnimating()
693 && windowParticipatesInScreenRotationAnimation;
Robert Carr2f0fe622015-09-25 14:56:38 -0700694
Robert Carr44643c12017-09-27 14:57:38 -0700695 if (screenAnimation) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700696 // cache often used attributes locally
697 final Rect frame = mWin.mFrame;
698 final float tmpFloats[] = mService.mTmpFloats;
699 final Matrix tmpMatrix = mWin.mTmpMatrix;
700
701 // Compute the desired transformation.
Robert Carr44643c12017-09-27 14:57:38 -0700702 if (screenRotationAnimation.isRotating()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700703 // If we are doing a screen animation, the global rotation
704 // applied to windows can result in windows that are carefully
705 // aligned with each other to slightly separate, allowing you
706 // to see what is behind them. An unsightly mess. This...
707 // thing... magically makes it call good: scale each window
708 // slightly (two pixels larger in each dimension, from the
709 // window's center).
710 final float w = frame.width();
711 final float h = frame.height();
712 if (w>=1 && h>=1) {
713 tmpMatrix.setScale(1 + 2/w, 1 + 2/h, w/2, h/2);
714 } else {
715 tmpMatrix.reset();
716 }
717 } else {
718 tmpMatrix.reset();
719 }
Robert Carr44643c12017-09-27 14:57:38 -0700720
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700721 tmpMatrix.postScale(mWin.mGlobalScale, mWin.mGlobalScale);
Robert Carr29d196f2017-11-28 12:39:46 -0800722
Jorim Jaggi9af095b2017-12-12 17:18:57 +0100723 // WindowState.prepareSurfaces expands for surface insets (in order they don't get
724 // clipped by the WindowState surface), so we need to go into the other direction here.
Robert Carr217e7cc2018-01-31 18:08:39 -0800725 tmpMatrix.postTranslate(mWin.mAttrs.surfaceInsets.left,
726 mWin.mAttrs.surfaceInsets.top);
Jorim Jaggi9af095b2017-12-12 17:18:57 +0100727
Matthew Ng34a06d12017-02-03 11:56:08 -0800728
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700729 // "convert" it into SurfaceFlinger's format
730 // (a 2x2 matrix + an offset)
731 // Here we must not transform the position of the surface
732 // since it is already included in the transformation.
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800733 //Slog.i(TAG_WM, "Transform: " + matrix);
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700734
735 mHaveMatrix = true;
736 tmpMatrix.getValues(tmpFloats);
737 mDsDx = tmpFloats[Matrix.MSCALE_X];
738 mDtDx = tmpFloats[Matrix.MSKEW_Y];
Robert Carr0edf18f2017-02-21 20:01:47 -0800739 mDtDy = tmpFloats[Matrix.MSKEW_X];
740 mDsDy = tmpFloats[Matrix.MSCALE_Y];
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700741
742 // Now set the alpha... but because our current hardware
743 // can't do alpha transformation on a non-opaque surface,
744 // turn it off if we are running an animation that is also
745 // transforming since it is more important to have that
746 // animation be smooth.
747 mShownAlpha = mAlpha;
748 if (!mService.mLimitedAlphaCompositing
749 || (!PixelFormat.formatHasAlpha(mWin.mAttrs.format)
Robert Carr217e7cc2018-01-31 18:08:39 -0800750 || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDtDy, mDsDy)))) {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800751 //Slog.i(TAG_WM, "Applying alpha transform");
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700752 if (screenAnimation) {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700753 mShownAlpha *= screenRotationAnimation.getEnterTransformation().getAlpha();
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700754 }
755 } else {
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -0800756 //Slog.i(TAG_WM, "Not applying alpha transform");
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700757 }
758
Robert Carre13b58e2017-08-31 14:50:44 -0700759 if ((DEBUG_ANIM || WindowManagerService.localLOGV)
Craig Mautnera91f9e22012-09-14 16:22:08 -0700760 && (mShownAlpha == 1.0 || mShownAlpha == 0.0)) Slog.v(
761 TAG, "computeShownFrameLocked: Animating " + this + " mAlpha=" + mAlpha
Craig Mautnera91f9e22012-09-14 16:22:08 -0700762 + " screen=" + (screenAnimation ?
763 screenRotationAnimation.getEnterTransformation().getAlpha() : "null"));
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700764 return;
Wale Ogunwalee05f5012016-09-16 16:27:29 -0700765 } else if (mIsWallpaper && mService.mRoot.mWallpaperActionPending) {
Craig Mautner4d7349b2012-04-20 14:52:47 -0700766 return;
Chong Zhang3005e752015-09-18 18:46:28 -0700767 } else if (mWin.isDragResizeChanged()) {
768 // This window is awaiting a relayout because user just started (or ended)
769 // drag-resizing. The shown frame (which affects surface size and pos)
770 // should not be updated until we get next finished draw with the new surface.
771 // Otherwise one or two frames rendered with old settings would be displayed
772 // with new geometry.
773 return;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700774 }
775
Filip Gruszczynski19723a42015-11-25 15:01:48 -0800776 if (WindowManagerService.localLOGV) Slog.v(
Craig Mautner4d7349b2012-04-20 14:52:47 -0700777 TAG, "computeShownFrameLocked: " + this +
778 " not attached, mAlpha=" + mAlpha);
Svetoslav Ganov1cf70bb2012-08-06 10:53:34 -0700779
Robert Carrb1579c82017-09-05 14:54:47 -0700780 mShownAlpha = mAlpha;
781 mHaveMatrix = false;
782 mDsDx = mWin.mGlobalScale;
783 mDtDx = 0;
784 mDtDy = 0;
785 mDsDy = mWin.mGlobalScale;
Robert Carref090ac2017-05-15 16:45:50 -0700786 }
787
Robert Carrfbbde852016-10-18 11:02:28 -0700788 /**
Robert Carrfbbde852016-10-18 11:02:28 -0700789 * Calculate the window-space crop rect and fill clipRect.
Wale Ogunwaleca9e0612016-12-02 07:45:59 -0800790 * @return true if clipRect has been filled otherwise, no window space crop should be applied.
Robert Carrfbbde852016-10-18 11:02:28 -0700791 */
Wale Ogunwaleca9e0612016-12-02 07:45:59 -0800792 private boolean calculateCrop(Rect clipRect) {
Robert Carrfbbde852016-10-18 11:02:28 -0700793 final WindowState w = mWin;
794 final DisplayContent displayContent = w.getDisplayContent();
795 clipRect.setEmpty();
796
797 if (displayContent == null) {
798 return false;
799 }
800
Wale Ogunwale44f036f2017-09-29 05:09:09 -0700801 if (w.inPinnedWindowingMode()) {
Robert Carrfbbde852016-10-18 11:02:28 -0700802 return false;
803 }
804
Adrian Roos28c25e22018-05-31 18:07:28 +0200805 // During forced seamless rotation, the surface bounds get updated with the crop in the
806 // new rotation, which is not compatible with showing the surface in the old rotation.
807 // To work around that we disable cropping for such windows, as it is not necessary anyways.
808 if (w.mForceSeamlesslyRotate) {
809 return false;
810 }
811
Robert Carrfbbde852016-10-18 11:02:28 -0700812 // If we're animating, the wallpaper should only
813 // be updated at the end of the animation.
814 if (w.mAttrs.type == TYPE_WALLPAPER) {
815 return false;
816 }
817
Wale Ogunwale6bab4cf2016-04-07 12:23:08 -0700818 if (DEBUG_WINDOW_CROP) Slog.d(TAG,
819 "Updating crop win=" + w + " mLastCrop=" + mLastClipRect);
Dianne Hackborn3e52fc22012-05-15 17:58:02 -0700820
Robert Carrfbbde852016-10-18 11:02:28 -0700821 w.calculatePolicyCrop(mSystemDecorRect);
822
823 if (DEBUG_WINDOW_CROP) Slog.d(TAG, "Applying decor to crop win=" + w + " mDecorFrame="
824 + w.mDecorFrame + " mSystemDecorRect=" + mSystemDecorRect);
Dianne Hackborn3e52fc22012-05-15 17:58:02 -0700825
Andrii Kulian283acd22017-08-03 04:03:51 -0700826 final Task task = w.getTask();
827 final boolean fullscreen = w.fillsDisplay() || (task != null && task.isFullscreen());
Jorim Jaggi253a20f2015-11-03 12:38:42 +0100828 final boolean isFreeformResizing =
Jorim Jaggidcf467c2015-11-05 13:59:32 +0100829 w.isDragResizing() && w.getResizeMode() == DRAG_RESIZE_MODE_FREEFORM;
Robert Carr51a1b872015-12-08 14:03:13 -0800830
831 // We use the clip rect as provided by the tranformation for non-fullscreen windows to
832 // avoid premature clipping with the system decor rect.
Robert Carrf0586622018-01-29 13:03:43 -0800833 clipRect.set(mSystemDecorRect);
Wale Ogunwale6bab4cf2016-04-07 12:23:08 -0700834 if (DEBUG_WINDOW_CROP) Slog.d(TAG, "win=" + w + " Initial clip rect: " + clipRect
Robert Carrf0586622018-01-29 13:03:43 -0800835 + " fullscreen=" + fullscreen);
Robert Carr51a1b872015-12-08 14:03:13 -0800836
Robert Carrfbbde852016-10-18 11:02:28 -0700837 w.expandForSurfaceInsets(clipRect);
Alan Viverette49a22e82014-07-12 20:01:27 -0700838
Alan Viverette49a22e82014-07-12 20:01:27 -0700839 // The clip rect was generated assuming (0,0) as the window origin,
840 // so we need to translate to match the actual surface coordinates.
Robert Carrfbbde852016-10-18 11:02:28 -0700841 clipRect.offset(w.mAttrs.surfaceInsets.left, w.mAttrs.surfaceInsets.top);
Robert Carr58f29132015-10-29 14:19:05 -0700842
Wale Ogunwale6bab4cf2016-04-07 12:23:08 -0700843 if (DEBUG_WINDOW_CROP) Slog.d(TAG,
844 "win=" + w + " Clip rect after stack adjustment=" + clipRect);
Robert Carr58f29132015-10-29 14:19:05 -0700845
Chia-I Wue6bcaf12016-05-27 10:58:48 +0800846 w.transformClipRectFromScreenToSurfaceSpace(clipRect);
Robert Carr58f29132015-10-29 14:19:05 -0700847
Robert Carrfbbde852016-10-18 11:02:28 -0700848 return true;
Robert Carr0d00c2e2016-02-29 17:45:02 -0800849 }
850
chaviw23012112017-12-20 15:29:04 -0800851 private void applyCrop(Rect clipRect, boolean recoveringMemory) {
Robert Carrfbbde852016-10-18 11:02:28 -0700852 if (DEBUG_WINDOW_CROP) Slog.d(TAG, "applyCrop: win=" + mWin
chaviw23012112017-12-20 15:29:04 -0800853 + " clipRect=" + clipRect);
Robert Carr4320d332016-06-10 15:13:32 -0700854 if (clipRect != null) {
855 if (!clipRect.equals(mLastClipRect)) {
856 mLastClipRect.set(clipRect);
857 mSurfaceController.setCropInTransaction(clipRect, recoveringMemory);
858 }
859 } else {
860 mSurfaceController.clearCropInTransaction(recoveringMemory);
Dianne Hackborn3e52fc22012-05-15 17:58:02 -0700861 }
Filip Gruszczynski4b8eea72015-09-14 18:16:19 -0700862 }
863
Wale Ogunwale4c8b7952015-04-07 10:49:40 -0700864 void setSurfaceBoundariesLocked(final boolean recoveringMemory) {
Wale Ogunwale027f4752017-05-12 10:37:16 -0700865 if (mSurfaceController == null) {
866 return;
867 }
868
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700869 final WindowState w = mWin;
Winson Chung08f81892017-03-02 15:40:51 -0800870 final LayoutParams attrs = mWin.getAttrs();
Robert Carr0d00c2e2016-02-29 17:45:02 -0800871 final Task task = w.getTask();
Alan Viveretteccb11e12014-07-08 16:04:02 -0700872
Robert Carr217e7cc2018-01-31 18:08:39 -0800873 mTmpSize.set(0, 0, 0, 0);
Winson Chung08f81892017-03-02 15:40:51 -0800874 calculateSurfaceBounds(w, attrs);
Chong Zhang0275e392015-09-17 10:41:44 -0700875
Robert Carr04092112016-06-02 12:56:12 -0700876 mExtraHScale = (float) 1.0;
877 mExtraVScale = (float) 1.0;
Robert Carre1034cc32016-02-01 13:08:15 -0800878
Robert Carr6da3cc02016-06-16 15:17:07 -0700879 boolean wasForceScaled = mForceScaleUntilResize;
880 boolean wasSeamlesslyRotated = w.mSeamlesslyRotated;
881
Robert Carrfed10072016-05-26 11:48:49 -0700882 // Once relayout has been called at least once, we need to make sure
883 // we only resize the client surface during calls to relayout. For
884 // clients which use indeterminate measure specs (MATCH_PARENT),
885 // we may try and change their window size without a call to relayout.
886 // However, this would be unsafe, as the client may be in the middle
887 // of producing a frame at the old size, having just completed layout
888 // to find the surface size changed underneath it.
chaviwbe43ac82018-04-04 15:14:49 -0700889 final boolean relayout = !w.mRelayoutCalled || w.mInRelayout;
890 if (relayout) {
Robert Carrfed10072016-05-26 11:48:49 -0700891 mSurfaceResized = mSurfaceController.setSizeInTransaction(
892 mTmpSize.width(), mTmpSize.height(), recoveringMemory);
893 } else {
894 mSurfaceResized = false;
895 }
Robert Carrc7294602016-05-13 11:32:05 -0700896 mForceScaleUntilResize = mForceScaleUntilResize && !mSurfaceResized;
Robert Carr6da3cc02016-06-16 15:17:07 -0700897 // If we are undergoing seamless rotation, the surface has already
898 // been set up to persist at it's old location. We need to freeze
899 // updates until a resize occurs.
Robert Carrb14d4abc2016-10-03 18:13:33 -0700900 mService.markForSeamlessRotation(w, w.mSeamlesslyRotated && !mSurfaceResized);
Robert Carrc7294602016-05-13 11:32:05 -0700901
chaviw23012112017-12-20 15:29:04 -0800902 Rect clipRect = null;
Robert Carrfbbde852016-10-18 11:02:28 -0700903 if (calculateCrop(mTmpClipRect)) {
904 clipRect = mTmpClipRect;
905 }
Robert Carra9408d42016-06-03 13:28:48 -0700906
907 float surfaceWidth = mSurfaceController.getWidth();
908 float surfaceHeight = mSurfaceController.getHeight();
909
Robert Carr74a66a22018-02-23 12:17:51 -0800910 final Rect insets = attrs.surfaceInsets;
911
Robert Carr8f0a3ad2017-02-15 19:30:28 -0800912 if (isForceScaled()) {
Robert Carr74a66a22018-02-23 12:17:51 -0800913 int hInsets = insets.left + insets.right;
914 int vInsets = insets.top + insets.bottom;
Winson Chung08f81892017-03-02 15:40:51 -0800915 float surfaceContentWidth = surfaceWidth - hInsets;
916 float surfaceContentHeight = surfaceHeight - vInsets;
Robert Carra9408d42016-06-03 13:28:48 -0700917 if (!mForceScaleUntilResize) {
918 mSurfaceController.forceScaleableInTransaction(true);
919 }
Robert Carrfd4c9892017-02-01 10:28:28 -0800920
Robert Carr74a66a22018-02-23 12:17:51 -0800921 int posX = 0;
922 int posY = 0;
Robert Carrfd4c9892017-02-01 10:28:28 -0800923 task.mStack.getDimBounds(mTmpStackBounds);
Robert Carr18f622f2017-05-08 11:20:43 -0700924
925 boolean allowStretching = false;
Winson Chung8bca9e42017-04-16 15:59:43 -0700926 task.mStack.getFinalAnimationSourceHintBounds(mTmpSourceBounds);
Robert Carr18f622f2017-05-08 11:20:43 -0700927 // If we don't have source bounds, we can attempt to use the content insets
928 // in the following scenario:
929 // 1. We have content insets.
930 // 2. We are not transitioning to full screen
931 // We have to be careful to check "lastAnimatingBoundsWasToFullscreen" rather than
932 // the mBoundsAnimating state, as we may have already left it and only be here
933 // because of the force-scale until resize state.
934 if (mTmpSourceBounds.isEmpty() && (mWin.mLastRelayoutContentInsets.width() > 0
935 || mWin.mLastRelayoutContentInsets.height() > 0)
936 && !task.mStack.lastAnimatingBoundsWasToFullscreen()) {
937 mTmpSourceBounds.set(task.mStack.mPreAnimationBounds);
938 mTmpSourceBounds.inset(mWin.mLastRelayoutContentInsets);
939 allowStretching = true;
940 }
Adrian Roos604ef952018-05-15 20:13:13 +0200941
942 // Make sure that what we're animating to and from is actually the right size in case
943 // the window cannot take up the full screen.
944 mTmpStackBounds.intersectUnchecked(w.mParentFrame);
945 mTmpSourceBounds.intersectUnchecked(w.mParentFrame);
946 mTmpAnimatingBounds.intersectUnchecked(w.mParentFrame);
947
Winson Chung08f81892017-03-02 15:40:51 -0800948 if (!mTmpSourceBounds.isEmpty()) {
949 // Get the final target stack bounds, if we are not animating, this is just the
950 // current stack bounds
Winson Chung40a5f932017-04-13 16:39:36 -0700951 task.mStack.getFinalAnimationBounds(mTmpAnimatingBounds);
Winson Chung08f81892017-03-02 15:40:51 -0800952
953 // Calculate the current progress and interpolate the difference between the target
954 // and source bounds
955 float finalWidth = mTmpAnimatingBounds.width();
956 float initialWidth = mTmpSourceBounds.width();
Robert Carr18f622f2017-05-08 11:20:43 -0700957 float tw = (surfaceContentWidth - mTmpStackBounds.width())
Winson Chung08f81892017-03-02 15:40:51 -0800958 / (surfaceContentWidth - mTmpAnimatingBounds.width());
Robert Carr18f622f2017-05-08 11:20:43 -0700959 float th = tw;
960 mExtraHScale = (initialWidth + tw * (finalWidth - initialWidth)) / initialWidth;
961 if (allowStretching) {
962 float finalHeight = mTmpAnimatingBounds.height();
963 float initialHeight = mTmpSourceBounds.height();
964 th = (surfaceContentHeight - mTmpStackBounds.height())
965 / (surfaceContentHeight - mTmpAnimatingBounds.height());
966 mExtraVScale = (initialHeight + tw * (finalHeight - initialHeight))
967 / initialHeight;
968 } else {
969 mExtraVScale = mExtraHScale;
970 }
Winson Chung08f81892017-03-02 15:40:51 -0800971
972 // Adjust the position to account for the inset bounds
Robert Carr18f622f2017-05-08 11:20:43 -0700973 posX -= (int) (tw * mExtraHScale * mTmpSourceBounds.left);
974 posY -= (int) (th * mExtraVScale * mTmpSourceBounds.top);
Winson Chung08f81892017-03-02 15:40:51 -0800975
Robert Carr74a66a22018-02-23 12:17:51 -0800976 // In pinned mode the clip rectangle applied to us by our stack has been
977 // expanded outwards to allow for shadows. However in case of source bounds set
978 // we need to crop to within the surface. The code above has scaled and positioned
979 // the surface to fit the unexpanded stack bounds, but now we need to reapply
980 // the cropping that the stack would have applied if it weren't expanded. This
981 // can be different in each direction based on the source bounds.
982 clipRect = mTmpClipRect;
983 clipRect.set((int)((insets.left + mTmpSourceBounds.left) * tw),
984 (int)((insets.top + mTmpSourceBounds.top) * th),
985 insets.left + (int)(surfaceWidth
986 - (tw* (surfaceWidth - mTmpSourceBounds.right))),
987 insets.top + (int)(surfaceHeight
988 - (th * (surfaceHeight - mTmpSourceBounds.bottom))));
Winson Chung08f81892017-03-02 15:40:51 -0800989 } else {
990 // We want to calculate the scaling based on the content area, not based on
991 // the entire surface, so that we scale in sync with windows that don't have insets.
992 mExtraHScale = mTmpStackBounds.width() / surfaceContentWidth;
993 mExtraVScale = mTmpStackBounds.height() / surfaceContentHeight;
994
995 // Since we are scaled to fit in our previously desired crop, we can now
996 // expose the whole window in buffer space, and not risk extending
997 // past where the system would have cropped us
998 clipRect = null;
Winson Chung08f81892017-03-02 15:40:51 -0800999 }
Robert Carr0d00c2e2016-02-29 17:45:02 -08001000
Robert Carrfd4c9892017-02-01 10:28:28 -08001001 // In the case of ForceScaleToStack we scale entire tasks together,
Robert Carr0d00c2e2016-02-29 17:45:02 -08001002 // and so we need to scale our offsets relative to the task bounds
1003 // or parent and child windows would fall out of alignment.
Winson Chung08f81892017-03-02 15:40:51 -08001004 posX -= (int) (attrs.x * (1 - mExtraHScale));
1005 posY -= (int) (attrs.y * (1 - mExtraVScale));
1006
Robert Carrbc133762016-05-12 14:04:38 -07001007 // Imagine we are scaling down. As we scale the buffer down, we decrease the
1008 // distance between the surface top left, and the start of the surface contents
1009 // (previously it was surfaceInsets.left pixels in screen space but now it
Robert Carr04092112016-06-02 12:56:12 -07001010 // will be surfaceInsets.left*mExtraHScale). This means in order to keep the
Robert Carrbc133762016-05-12 14:04:38 -07001011 // non inset content at the same position, we have to shift the whole window
1012 // forward. Likewise for scaling up, we've increased this distance, and we need
1013 // to shift by a negative number to compensate.
Robert Carr74a66a22018-02-23 12:17:51 -08001014 posX += insets.left * (1 - mExtraHScale);
1015 posY += insets.top * (1 - mExtraVScale);
Robert Carrbc133762016-05-12 14:04:38 -07001016
Winson Chung08f81892017-03-02 15:40:51 -08001017 mSurfaceController.setPositionInTransaction((float) Math.floor(posX),
1018 (float) Math.floor(posY), recoveringMemory);
Robert Carrc7294602016-05-13 11:32:05 -07001019
1020 // Various surfaces in the scaled stack may resize at different times.
1021 // We need to ensure for each surface, that we disable transformation matrix
1022 // scaling in the same transaction which we resize the surface in.
1023 // As we are in SCALING_MODE_SCALE_TO_WINDOW, SurfaceFlinger will
Robert Carra9408d42016-06-03 13:28:48 -07001024 // then take over the scaling until the new buffer arrives, and things
Robert Carrc7294602016-05-13 11:32:05 -07001025 // will be seamless.
Robert Carr2025bf842018-03-19 13:25:05 -07001026 if (mPipAnimationStarted == false) {
1027 mForceScaleUntilResize = true;
1028 mPipAnimationStarted = true;
1029 }
Rob Carr06be6bb2018-02-06 16:26:06 +00001030 } else {
Robert Carr2025bf842018-03-19 13:25:05 -07001031 mPipAnimationStarted = false;
1032
Rob Carr06be6bb2018-02-06 16:26:06 +00001033 if (!w.mSeamlesslyRotated) {
chaviwbe43ac82018-04-04 15:14:49 -07001034 // Used to offset the WSA when stack position changes before a resize.
1035 int xOffset = mXOffset;
1036 int yOffset = mYOffset;
1037 if (mOffsetPositionForStackResize) {
1038 if (relayout) {
1039 // Once a relayout is called, reset the offset back to 0 and defer
1040 // setting it until a new frame with the updated size. This ensures that
1041 // the WS position is reset (so the stack position is shown) at the same
1042 // time that the buffer size changes.
1043 setOffsetPositionForStackResize(false);
1044 mSurfaceController.deferTransactionUntil(mSurfaceController.getHandle(),
1045 mWin.getFrameNumber());
1046 } else {
1047 final TaskStack stack = mWin.getStack();
1048 mTmpPos.x = 0;
1049 mTmpPos.y = 0;
1050 if (stack != null) {
1051 stack.getRelativePosition(mTmpPos);
1052 }
1053
1054 xOffset = -mTmpPos.x;
1055 yOffset = -mTmpPos.y;
1056
1057 // Crop also needs to be extended so the bottom isn't cut off when the WSA
1058 // position is moved.
1059 if (clipRect != null) {
1060 clipRect.right += mTmpPos.x;
1061 clipRect.bottom += mTmpPos.y;
1062 }
1063 }
1064 }
1065 mSurfaceController.setPositionInTransaction(xOffset, yOffset, recoveringMemory);
Rob Carr06be6bb2018-02-06 16:26:06 +00001066 }
Robert Carr0d00c2e2016-02-29 17:45:02 -08001067 }
1068
Robert Carra9408d42016-06-03 13:28:48 -07001069 // If we are ending the scaling mode. We switch to SCALING_MODE_FREEZE
Robert Carr6da3cc02016-06-16 15:17:07 -07001070 // to prevent further updates until buffer latch.
1071 // When ending both force scaling, and seamless rotation, we need to freeze
1072 // the Surface geometry until a buffer comes in at the new size (normally position and crop
1073 // are unfrozen). setGeometryAppliesWithResizeInTransaction accomplishes this for us.
1074 if ((wasForceScaled && !mForceScaleUntilResize) ||
1075 (wasSeamlesslyRotated && !w.mSeamlesslyRotated)) {
1076 mSurfaceController.setGeometryAppliesWithResizeInTransaction(true);
Robert Carra9408d42016-06-03 13:28:48 -07001077 mSurfaceController.forceScaleableInTransaction(false);
1078 }
Robert Carr4320d332016-06-10 15:13:32 -07001079
Robert Carr6da3cc02016-06-16 15:17:07 -07001080 if (!w.mSeamlesslyRotated) {
chaviw23012112017-12-20 15:29:04 -08001081 applyCrop(clipRect, recoveringMemory);
Robert Carr6da3cc02016-06-16 15:17:07 -07001082 mSurfaceController.setMatrixInTransaction(mDsDx * w.mHScale * mExtraHScale,
1083 mDtDx * w.mVScale * mExtraVScale,
Robert Carr0edf18f2017-02-21 20:01:47 -08001084 mDtDy * w.mHScale * mExtraHScale,
1085 mDsDy * w.mVScale * mExtraVScale, recoveringMemory);
Robert Carr6da3cc02016-06-16 15:17:07 -07001086 }
Filip Gruszczynski63a35e22015-11-05 15:38:59 -08001087
Robert Carre6a83512015-11-03 16:09:21 -08001088 if (mSurfaceResized) {
Chong Zhang5b2f1992015-11-13 15:40:36 -08001089 mReportSurfaceResized = true;
Robert Carre6a83512015-11-03 16:09:21 -08001090 mAnimator.setPendingLayoutChanges(w.getDisplayId(),
Jorim Jaggia5e10572017-11-15 14:36:26 +01001091 FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001092 }
Craig Mautneracaf9cc2012-04-17 11:45:25 -07001093 }
1094
Andrii Kulian283acd22017-08-03 04:03:51 -07001095 /**
1096 * Get rect of the task this window is currently in. If there is no task, rect will be set to
1097 * empty.
1098 */
1099 void getContainerRect(Rect rect) {
1100 final Task task = mWin.getTask();
1101 if (task != null) {
1102 task.getDimBounds(rect);
1103 } else {
1104 rect.left = rect.top = rect.right = rect.bottom = 0;
1105 }
1106 }
1107
Filip Gruszczynski24966d42015-09-05 15:00:00 -07001108 void prepareSurfaceLocked(final boolean recoveringMemory) {
Craig Mautneracaf9cc2012-04-17 11:45:25 -07001109 final WindowState w = mWin;
Chong Zhangeb22e8e2016-01-20 19:52:22 -08001110 if (!hasSurface()) {
Jorim Jaggi38d44ec2017-06-14 16:04:59 -07001111
1112 // There is no need to wait for an animation change if our window is gone for layout
1113 // already as we'll never be visible.
Bryce Lee8c3cf382017-07-06 19:47:10 -07001114 if (w.getOrientationChanging() && w.isGoneForLayoutLw()) {
Craig Mautneracaf9cc2012-04-17 11:45:25 -07001115 if (DEBUG_ORIENTATION) {
1116 Slog.v(TAG, "Orientation change skips hidden " + w);
1117 }
Bryce Lee8c3cf382017-07-06 19:47:10 -07001118 w.setOrientationChanging(false);
Craig Mautneracaf9cc2012-04-17 11:45:25 -07001119 }
1120 return;
1121 }
1122
1123 boolean displayed = false;
1124
1125 computeShownFrameLocked();
1126
Craig Mautnera91f9e22012-09-14 16:22:08 -07001127 setSurfaceBoundariesLocked(recoveringMemory);
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001128
Craig Mautner918b53b2012-07-09 14:15:54 -07001129 if (mIsWallpaper && !mWin.mWallpaperVisible) {
Craig Mautner0fa77c12012-06-11 15:57:19 -07001130 // Wallpaper is no longer visible and there is no wp target => hide it.
Filip Gruszczynski63a35e22015-11-05 15:38:59 -08001131 hide("prepareSurfaceLocked");
Wale Ogunwale9d147902016-07-16 11:58:55 -07001132 } else if (w.isParentWindowHidden() || !w.isOnScreen()) {
Filip Gruszczynski63a35e22015-11-05 15:38:59 -08001133 hide("prepareSurfaceLocked");
Wale Ogunwalee8069dc2015-08-18 09:52:01 -07001134 mWallpaperControllerLocked.hideWallpapers(w);
Craig Mautnerb9836b92012-06-11 11:40:09 -07001135
Jorim Jaggi38d44ec2017-06-14 16:04:59 -07001136 // If we are waiting for this window to handle an orientation change. If this window is
1137 // really hidden (gone for layout), there is no point in still waiting for it.
1138 // Note that this does introduce a potential glitch if the window becomes unhidden
1139 // before it has drawn for the new orientation.
Bryce Lee8c3cf382017-07-06 19:47:10 -07001140 if (w.getOrientationChanging() && w.isGoneForLayoutLw()) {
1141 w.setOrientationChanging(false);
Craig Mautnerc8bc97e2012-04-02 12:54:54 -07001142 if (DEBUG_ORIENTATION) Slog.v(TAG,
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001143 "Orientation change skips hidden " + w);
1144 }
1145 } else if (mLastLayer != mAnimLayer
1146 || mLastAlpha != mShownAlpha
1147 || mLastDsDx != mDsDx
1148 || mLastDtDx != mDtDx
1149 || mLastDsDy != mDsDy
1150 || mLastDtDy != mDtDy
1151 || w.mLastHScale != w.mHScale
1152 || w.mLastVScale != w.mVScale
Craig Mautner749a7bb2012-04-02 13:49:53 -07001153 || mLastHidden) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001154 displayed = true;
1155 mLastAlpha = mShownAlpha;
1156 mLastLayer = mAnimLayer;
1157 mLastDsDx = mDsDx;
1158 mLastDtDx = mDtDx;
1159 mLastDsDy = mDsDy;
1160 mLastDtDy = mDtDy;
1161 w.mLastHScale = w.mHScale;
1162 w.mLastVScale = w.mVScale;
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -08001163 if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(w,
Robert Carre6a83512015-11-03 16:09:21 -08001164 "controller=" + mSurfaceController +
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001165 "alpha=" + mShownAlpha + " layer=" + mAnimLayer
Craig Mautner78505d82014-09-02 14:36:31 -07001166 + " matrix=[" + mDsDx + "*" + w.mHScale
1167 + "," + mDtDx + "*" + w.mVScale
Robert Carr0edf18f2017-02-21 20:01:47 -08001168 + "][" + mDtDy + "*" + w.mHScale
1169 + "," + mDsDy + "*" + w.mVScale + "]", false);
Craig Mautner749a7bb2012-04-02 13:49:53 -07001170
Robert Carre6a83512015-11-03 16:09:21 -08001171 boolean prepared =
Robert Carraf422a82017-04-10 18:34:33 -07001172 mSurfaceController.prepareToShowInTransaction(mShownAlpha,
Robert Carr04092112016-06-02 12:56:12 -07001173 mDsDx * w.mHScale * mExtraHScale,
1174 mDtDx * w.mVScale * mExtraVScale,
Robert Carr0edf18f2017-02-21 20:01:47 -08001175 mDtDy * w.mHScale * mExtraHScale,
1176 mDsDy * w.mVScale * mExtraVScale,
Robert Carre6a83512015-11-03 16:09:21 -08001177 recoveringMemory);
1178
Robert Carr03206af2017-07-10 18:24:21 -07001179 if (prepared && mDrawState == HAS_DRAWN) {
1180 if (mLastHidden) {
1181 if (showSurfaceRobustlyLocked()) {
1182 markPreservedSurfaceForDestroy();
1183 mAnimator.requestRemovalOfReplacedWindows(w);
1184 mLastHidden = false;
1185 if (mIsWallpaper) {
1186 w.dispatchWallpaperVisibility(true);
1187 }
1188 // This draw means the difference between unique content and mirroring.
1189 // Run another pass through performLayout to set mHasContent in the
1190 // LogicalDisplay.
1191 mAnimator.setPendingLayoutChanges(w.getDisplayId(),
Jorim Jaggia5e10572017-11-15 14:36:26 +01001192 FINISH_LAYOUT_REDO_ANIM);
Robert Carr03206af2017-07-10 18:24:21 -07001193 } else {
1194 w.setOrientationChanging(false);
Craig Mautner749a7bb2012-04-02 13:49:53 -07001195 }
Robert Carr03206af2017-07-10 18:24:21 -07001196 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001197 }
Chong Zhangeb22e8e2016-01-20 19:52:22 -08001198 if (hasSurface()) {
Robert Carre6a83512015-11-03 16:09:21 -08001199 w.mToken.hasVisible = true;
1200 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001201 } else {
Jorim Jaggi5c80c412016-04-19 20:03:47 -07001202 if (DEBUG_ANIM && isAnimationSet()) {
Chong Zhange05db742016-02-16 16:58:37 -08001203 Slog.v(TAG, "prepareSurface: No changes in animation for " + this);
Craig Mautner83339b42012-05-01 22:13:23 -07001204 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001205 displayed = true;
1206 }
1207
Bryce Lee8c3cf382017-07-06 19:47:10 -07001208 if (w.getOrientationChanging()) {
Jorim Jaggi38d44ec2017-06-14 16:04:59 -07001209 if (!w.isDrawnLw()) {
1210 mAnimator.mBulkUpdateParams &= ~SET_ORIENTATION_CHANGE_COMPLETE;
1211 mAnimator.mLastWindowFreezeSource = w;
1212 if (DEBUG_ORIENTATION) Slog.v(TAG,
1213 "Orientation continue waiting for draw in " + w);
1214 } else {
Bryce Lee8c3cf382017-07-06 19:47:10 -07001215 w.setOrientationChanging(false);
Jorim Jaggi38d44ec2017-06-14 16:04:59 -07001216 if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation change complete in " + w);
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001217 }
Jorim Jaggi38d44ec2017-06-14 16:04:59 -07001218 }
1219
1220 if (displayed) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001221 w.mToken.hasVisible = true;
1222 }
1223 }
1224
Craig Mautneref655012013-01-03 11:20:24 -08001225 void setTransparentRegionHintLocked(final Region region) {
Wale Ogunwalef9e09782015-11-09 12:42:37 -08001226 if (mSurfaceController == null) {
1227 Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true");
1228 return;
1229 }
Robert Carre6a83512015-11-03 16:09:21 -08001230 mSurfaceController.setTransparentRegionHint(region);
Craig Mautner48ba1e72012-04-02 13:18:16 -07001231 }
1232
Robert Carr217e7cc2018-01-31 18:08:39 -08001233 boolean setWallpaperOffset(int dx, int dy) {
1234 if (mXOffset == dx && mYOffset == dy) {
1235 return false;
1236 }
1237 mXOffset = dx;
1238 mYOffset = dy;
Robert Carre6a83512015-11-03 16:09:21 -08001239
1240 try {
Craig Mautner71dd1b62014-02-18 15:48:52 -08001241 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setWallpaperOffset");
Robert Carr68e5c9e2016-09-14 10:50:09 -07001242 mService.openSurfaceTransaction();
Robert Carr217e7cc2018-01-31 18:08:39 -08001243 mSurfaceController.setPositionInTransaction(dx, dy, false);
chaviw23012112017-12-20 15:29:04 -08001244 applyCrop(null, false);
Robert Carre6a83512015-11-03 16:09:21 -08001245 } catch (RuntimeException e) {
1246 Slog.w(TAG, "Error positioning surface of " + mWin
Robert Carr217e7cc2018-01-31 18:08:39 -08001247 + " pos=(" + dx + "," + dy + ")", e);
Robert Carre6a83512015-11-03 16:09:21 -08001248 } finally {
Adrian Roos111aff92017-09-27 18:11:46 +02001249 mService.closeSurfaceTransaction("setWallpaperOffset");
Robert Carre6a83512015-11-03 16:09:21 -08001250 if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
1251 "<<< CLOSE TRANSACTION setWallpaperOffset");
Robert Carr217e7cc2018-01-31 18:08:39 -08001252 return true;
Craig Mautner48ba1e72012-04-02 13:18:16 -07001253 }
Craig Mautner48ba1e72012-04-02 13:18:16 -07001254 }
1255
John Reck80181b92015-05-19 11:09:32 -07001256 /**
1257 * Try to change the pixel format without recreating the surface. This
1258 * will be common in the case of changing from PixelFormat.OPAQUE to
1259 * PixelFormat.TRANSLUCENT in the hardware-accelerated case as both
1260 * requested formats resolve to the same underlying SurfaceControl format
1261 * @return True if format was succesfully changed, false otherwise
1262 */
1263 boolean tryChangeFormatInPlaceLocked() {
Robert Carre6a83512015-11-03 16:09:21 -08001264 if (mSurfaceController == null) {
John Reck80181b92015-05-19 11:09:32 -07001265 return false;
1266 }
1267 final LayoutParams attrs = mWin.getAttrs();
Wale Ogunwalee7bf46b2015-09-30 09:19:28 -07001268 final boolean isHwAccelerated = (attrs.flags & FLAG_HARDWARE_ACCELERATED) != 0;
John Reck80181b92015-05-19 11:09:32 -07001269 final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : attrs.format;
1270 if (format == mSurfaceFormat) {
1271 setOpaqueLocked(!PixelFormat.formatHasAlpha(attrs.format));
1272 return true;
1273 }
1274 return false;
1275 }
1276
Craig Mautner6f612042014-09-07 13:13:23 -07001277 void setOpaqueLocked(boolean isOpaque) {
Wale Ogunwalef9e09782015-11-09 12:42:37 -08001278 if (mSurfaceController == null) {
1279 return;
1280 }
Robert Carre6a83512015-11-03 16:09:21 -08001281 mSurfaceController.setOpaque(isOpaque);
Craig Mautner71dd1b62014-02-18 15:48:52 -08001282 }
1283
Wale Ogunwalef5ad42f2015-06-12 13:59:03 -07001284 void setSecureLocked(boolean isSecure) {
Wale Ogunwalef9e09782015-11-09 12:42:37 -08001285 if (mSurfaceController == null) {
1286 return;
1287 }
Robert Carre6a83512015-11-03 16:09:21 -08001288 mSurfaceController.setSecure(isSecure);
Wale Ogunwalef5ad42f2015-06-12 13:59:03 -07001289 }
1290
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001291 /**
1292 * Have the surface flinger show a surface, robustly dealing with
1293 * error conditions. In particular, if there is not enough memory
1294 * to show the surface, then we will try to get rid of other surfaces
1295 * in order to succeed.
1296 *
1297 * @return Returns true if the surface was successfully shown.
1298 */
Filip Gruszczynski24966d42015-09-05 15:00:00 -07001299 private boolean showSurfaceRobustlyLocked() {
Wale Ogunwale3382ab12017-07-27 08:55:03 -07001300 if (mWin.getWindowConfiguration().windowsAreScaleable()) {
Robert Carr1b5ea722016-04-20 13:23:28 -07001301 mSurfaceController.forceScaleableInTransaction(true);
1302 }
1303
Robert Carre6a83512015-11-03 16:09:21 -08001304 boolean shown = mSurfaceController.showRobustlyInTransaction();
1305 if (!shown)
1306 return false;
1307
Robert Carr849d2932018-05-01 12:14:48 -07001308 // If we had a preserved surface it's no longer needed, and it may be harmful
1309 // if we are transparent.
1310 if (mPendingDestroySurface != null && mDestroyPreservedSurfaceUponRedraw) {
1311 mPendingDestroySurface.mSurfaceControl.hide();
Robert Carrba993782018-05-15 15:16:40 -07001312 mPendingDestroySurface.reparentChildrenInTransaction(mSurfaceController);
Robert Carr849d2932018-05-01 12:14:48 -07001313 }
1314
Robert Carre6a83512015-11-03 16:09:21 -08001315 return true;
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001316 }
1317
1318 void applyEnterAnimationLocked() {
Robert Carrb439a632016-04-07 22:52:10 -07001319 // If we are the new part of a window replacement transition and we have requested
1320 // not to animate, we instead want to make it seamless, so we don't want to apply
1321 // an enter transition.
1322 if (mWin.mSkipEnterAnimationForSeamlessReplacement) {
1323 return;
1324 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001325 final int transit;
1326 if (mEnterAnimationPending) {
1327 mEnterAnimationPending = false;
1328 transit = WindowManagerPolicy.TRANSIT_ENTER;
1329 } else {
1330 transit = WindowManagerPolicy.TRANSIT_SHOW;
1331 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001332 applyAnimationLocked(transit, true);
Svetoslav Ganov545252f2012-12-10 18:29:24 -08001333 //TODO (multidisplay): Magnification is supported only for the default display.
Svetoslav8e3feb12014-02-24 13:46:47 -08001334 if (mService.mAccessibilityController != null
Filip Gruszczynski69cbc352015-11-11 13:46:04 -08001335 && mWin.getDisplayId() == DEFAULT_DISPLAY) {
Svetoslav8e3feb12014-02-24 13:46:47 -08001336 mService.mAccessibilityController.onWindowTransitionLocked(mWin, transit);
Svetoslav Ganov152e9bb2012-10-12 20:15:29 -07001337 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001338 }
1339
1340 /**
1341 * Choose the correct animation and set it to the passed WindowState.
Craig Mautner4b71aa12012-12-27 17:20:01 -08001342 * @param transit If AppTransition.TRANSIT_PREVIEW_DONE and the app window has been drawn
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001343 * then the animation will be app_starting_exit. Any other value loads the animation from
1344 * the switch statement below.
1345 * @param isEntrance The animation type the last time this was called. Used to keep from
1346 * loading the same animation twice.
1347 * @return true if an animation has been loaded.
1348 */
1349 boolean applyAnimationLocked(int transit, boolean isEntrance) {
Jorim Jaggia5e10572017-11-15 14:36:26 +01001350 if (mWin.isSelfAnimating() && mAnimationIsEntrance == isEntrance) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001351 // If we are trying to apply an animation, but already running
Jorim Jaggif8d77da2014-11-11 16:59:12 +01001352 // an animation of the same type, then just leave that one alone.
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001353 return true;
1354 }
1355
Jorim Jaggia5e10572017-11-15 14:36:26 +01001356 if (isEntrance && mWin.mAttrs.type == TYPE_INPUT_METHOD) {
1357 mWin.getDisplayContent().adjustForImeIfNeeded();
1358 mWin.setDisplayLayoutNeeded();
1359 mService.mWindowPlacerLocked.requestTraversal();
1360 }
1361
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001362 // Only apply an animation if the display isn't frozen. If it is
1363 // frozen, there is no reason to animate and it can cause strange
1364 // artifacts when we unfreeze the display if some different animation
1365 // is running.
Chong Zhang8784be62016-06-28 15:25:07 -07001366 Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "WSA#applyAnimationLocked");
David Stevens9440dc82017-03-16 19:00:20 -07001367 if (mWin.mToken.okToAnimate()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001368 int anim = mPolicy.selectAnimationLw(mWin, transit);
1369 int attr = -1;
1370 Animation a = null;
1371 if (anim != 0) {
Dianne Hackborn4c1e3182012-10-05 18:37:54 -07001372 a = anim != -1 ? AnimationUtils.loadAnimation(mContext, anim) : null;
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001373 } else {
1374 switch (transit) {
1375 case WindowManagerPolicy.TRANSIT_ENTER:
1376 attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation;
1377 break;
1378 case WindowManagerPolicy.TRANSIT_EXIT:
1379 attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation;
1380 break;
1381 case WindowManagerPolicy.TRANSIT_SHOW:
1382 attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation;
1383 break;
1384 case WindowManagerPolicy.TRANSIT_HIDE:
1385 attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation;
1386 break;
1387 }
1388 if (attr >= 0) {
Jorim Jaggi0a1523d2018-04-19 17:48:38 +02001389 a = mService.mAppTransition.loadAnimationAttr(mWin.mAttrs, attr, TRANSIT_NONE);
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001390 }
1391 }
Filip Gruszczynski0bd180d2015-12-07 15:43:52 -08001392 if (DEBUG_ANIM) Slog.v(TAG,
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001393 "applyAnimation: win=" + this
1394 + " anim=" + anim + " attr=0x" + Integer.toHexString(attr)
Craig Mautner4d7349b2012-04-20 14:52:47 -07001395 + " a=" + a
Craig Mautner8863cca2012-09-18 15:04:34 -07001396 + " transit=" + transit
Craig Mautner83339b42012-05-01 22:13:23 -07001397 + " isEntrance=" + isEntrance + " Callers " + Debug.getCallers(3));
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001398 if (a != null) {
Filip Gruszczynski198dcbf2016-01-18 10:02:00 -08001399 if (DEBUG_ANIM) logWithStack(TAG, "Loaded animation " + a + " for " + this);
Jorim Jaggia5e10572017-11-15 14:36:26 +01001400 mWin.startAnimation(a);
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001401 mAnimationIsEntrance = isEntrance;
1402 }
1403 } else {
Jorim Jaggia5e10572017-11-15 14:36:26 +01001404 mWin.cancelAnimation();
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001405 }
Chong Zhang8784be62016-06-28 15:25:07 -07001406
Jorim Jaggia5e10572017-11-15 14:36:26 +01001407 if (!isEntrance && mWin.mAttrs.type == TYPE_INPUT_METHOD) {
Wale Ogunwale360a8bc2016-10-10 13:25:26 -07001408 mWin.getDisplayContent().adjustForImeIfNeeded();
Jorim Jaggieb88d832016-04-13 20:17:43 -07001409 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001410
Jorim Jaggia5e10572017-11-15 14:36:26 +01001411 Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
1412 return isAnimationSet();
Jorim Jaggif8d77da2014-11-11 16:59:12 +01001413 }
1414
Steven Timotiusaf03df62017-07-18 16:56:43 -07001415 void writeToProto(ProtoOutputStream proto, long fieldId) {
1416 final long token = proto.start(fieldId);
1417 mLastClipRect.writeToProto(proto, LAST_CLIP_RECT);
1418 if (mSurfaceController != null) {
1419 mSurfaceController.writeToProto(proto, SURFACE);
1420 }
Vishnu Nair1d0fa072018-01-04 07:53:00 -08001421 proto.write(DRAW_STATE, mDrawState);
1422 mSystemDecorRect.writeToProto(proto, SYSTEM_DECOR_RECT);
Steven Timotiusaf03df62017-07-18 16:56:43 -07001423 proto.end(token);
1424 }
1425
Craig Mautnera2c77052012-03-26 12:14:43 -07001426 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
Jorim Jaggia5e10572017-11-15 14:36:26 +01001427 if (mAnimationIsEntrance) {
1428 pw.print(prefix); pw.print(" mAnimationIsEntrance="); pw.print(mAnimationIsEntrance);
Craig Mautnera2c77052012-03-26 12:14:43 -07001429 }
Robert Carre6a83512015-11-03 16:09:21 -08001430 if (mSurfaceController != null) {
1431 mSurfaceController.dump(pw, prefix, dumpAll);
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001432 }
Robert Carre6a83512015-11-03 16:09:21 -08001433 if (dumpAll) {
1434 pw.print(prefix); pw.print("mDrawState="); pw.print(drawStateToString());
1435 pw.print(prefix); pw.print(" mLastHidden="); pw.println(mLastHidden);
Filip Gruszczynskif34a04c2015-12-07 15:05:49 -08001436 pw.print(prefix); pw.print("mSystemDecorRect="); mSystemDecorRect.printShortString(pw);
Wale Ogunwale6bab4cf2016-04-07 12:23:08 -07001437 pw.print(" mLastClipRect="); mLastClipRect.printShortString(pw);
1438
Jorim Jaggi6a7c90a2016-03-11 15:04:59 +01001439 if (!mLastFinalClipRect.isEmpty()) {
1440 pw.print(" mLastFinalClipRect="); mLastFinalClipRect.printShortString(pw);
1441 }
Filip Gruszczynskif34a04c2015-12-07 15:05:49 -08001442 pw.println();
Robert Carre6a83512015-11-03 16:09:21 -08001443 }
1444
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001445 if (mPendingDestroySurface != null) {
1446 pw.print(prefix); pw.print("mPendingDestroySurface=");
1447 pw.println(mPendingDestroySurface);
1448 }
1449 if (mSurfaceResized || mSurfaceDestroyDeferred) {
1450 pw.print(prefix); pw.print("mSurfaceResized="); pw.print(mSurfaceResized);
1451 pw.print(" mSurfaceDestroyDeferred="); pw.println(mSurfaceDestroyDeferred);
1452 }
1453 if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) {
1454 pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha);
1455 pw.print(" mAlpha="); pw.print(mAlpha);
1456 pw.print(" mLastAlpha="); pw.println(mLastAlpha);
1457 }
1458 if (mHaveMatrix || mWin.mGlobalScale != 1) {
1459 pw.print(prefix); pw.print("mGlobalScale="); pw.print(mWin.mGlobalScale);
1460 pw.print(" mDsDx="); pw.print(mDsDx);
1461 pw.print(" mDtDx="); pw.print(mDtDx);
Robert Carr0edf18f2017-02-21 20:01:47 -08001462 pw.print(" mDtDy="); pw.print(mDtDy);
1463 pw.print(" mDsDy="); pw.println(mDsDy);
Craig Mautnerc2f9be02012-03-27 17:32:29 -07001464 }
Jorim Jaggiff71d202016-04-14 13:12:36 -07001465 if (mAnimationStartDelayed) {
1466 pw.print(prefix); pw.print("mAnimationStartDelayed="); pw.print(mAnimationStartDelayed);
1467 }
Craig Mautnera2c77052012-03-26 12:14:43 -07001468 }
1469
Craig Mautnerc8bc97e2012-04-02 12:54:54 -07001470 @Override
1471 public String toString() {
Dianne Hackborn529e7442012-11-01 14:22:28 -07001472 StringBuffer sb = new StringBuffer("WindowStateAnimator{");
1473 sb.append(Integer.toHexString(System.identityHashCode(this)));
1474 sb.append(' ');
1475 sb.append(mWin.mAttrs.getTitle());
1476 sb.append('}');
Craig Mautnerc8bc97e2012-04-02 12:54:54 -07001477 return sb.toString();
1478 }
Robert Carre6a83512015-11-03 16:09:21 -08001479
1480 void reclaimSomeSurfaceMemory(String operation, boolean secure) {
Wale Ogunwalee05f5012016-09-16 16:27:29 -07001481 mService.mRoot.reclaimSomeSurfaceMemory(this, operation, secure);
Robert Carre6a83512015-11-03 16:09:21 -08001482 }
1483
1484 boolean getShown() {
1485 if (mSurfaceController != null) {
1486 return mSurfaceController.getShown();
1487 }
1488 return false;
1489 }
1490
1491 void destroySurface() {
Wale Ogunwale722ff892016-02-18 13:37:55 -08001492 try {
1493 if (mSurfaceController != null) {
Robert Carra8828862018-02-05 16:17:36 -08001494 mSurfaceController.destroyNotInTransaction();
Wale Ogunwale722ff892016-02-18 13:37:55 -08001495 }
1496 } catch (RuntimeException e) {
1497 Slog.w(TAG, "Exception thrown when destroying surface " + this
1498 + " surface " + mSurfaceController + " session " + mSession + ": " + e);
1499 } finally {
1500 mWin.setHasSurface(false);
1501 mSurfaceController = null;
1502 mDrawState = NO_SURFACE;
1503 }
Robert Carre6a83512015-11-03 16:09:21 -08001504 }
Filip Gruszczynskif52dd202015-11-15 20:36:38 -08001505
Adrian Roos41f7e9d2018-06-07 15:29:34 +02001506 void seamlesslyRotate(SurfaceControl.Transaction t, int oldRotation, int newRotation) {
Robert Carr6da3cc02016-06-16 15:17:07 -07001507 final WindowState w = mWin;
Robert Carr6da3cc02016-06-16 15:17:07 -07001508
Adrian Roos41f7e9d2018-06-07 15:29:34 +02001509 // We rotated the screen, but have not received a new buffer with the correct size yet. In
1510 // the mean time, we rotate the buffer we have to the new orientation.
Robert Carr6da3cc02016-06-16 15:17:07 -07001511 final Matrix transform = mService.mTmpTransform;
Adrian Roos41f7e9d2018-06-07 15:29:34 +02001512 transformToRotation(oldRotation, newRotation, w.mFrame.width(), w.mFrame.height(),
Andrii Kulian4dfb9c42016-10-11 20:06:27 -07001513 transform);
Robert Carr897215d2017-03-29 12:25:50 -07001514 transform.getValues(mService.mTmpFloats);
Robert Carr6da3cc02016-06-16 15:17:07 -07001515
Robert Carr897215d2017-03-29 12:25:50 -07001516 float DsDx = mService.mTmpFloats[Matrix.MSCALE_X];
1517 float DtDx = mService.mTmpFloats[Matrix.MSKEW_Y];
1518 float DtDy = mService.mTmpFloats[Matrix.MSKEW_X];
1519 float DsDy = mService.mTmpFloats[Matrix.MSCALE_Y];
1520 float nx = mService.mTmpFloats[Matrix.MTRANS_X];
1521 float ny = mService.mTmpFloats[Matrix.MTRANS_Y];
Robert Carr19cdd092018-03-14 11:50:52 -07001522 mSurfaceController.setPosition(t, nx, ny, false);
1523 mSurfaceController.setMatrix(t, DsDx * w.mHScale, DtDx * w.mVScale, DtDy
1524 * w.mHScale, DsDy * w.mVScale, false);
Robert Carr6da3cc02016-06-16 15:17:07 -07001525 }
Robert Carr3b716242016-08-16 16:02:21 -07001526
Robert Carr8f0a3ad2017-02-15 19:30:28 -08001527 /** The force-scaled state for a given window can persist past
1528 * the state for it's stack as the windows complete resizing
1529 * independently of one another.
1530 */
1531 boolean isForceScaled() {
1532 final Task task = mWin.getTask();
1533 if (task != null && task.mStack.isForceScaled()) {
1534 return true;
1535 }
1536 return mForceScaleUntilResize;
1537 }
Robert Carrd5c7dd62017-03-08 10:39:30 -08001538
1539 void detachChildren() {
1540 if (mSurfaceController != null) {
1541 mSurfaceController.detachChildren();
1542 }
Robert Carr7b3d11d2018-03-15 14:34:45 -07001543 mChildrenDetached = true;
Robert Carrd5c7dd62017-03-08 10:39:30 -08001544 }
Jorim Jaggia5e10572017-11-15 14:36:26 +01001545
1546 int getLayer() {
1547 return mLastLayer;
1548 }
chaviwbe43ac82018-04-04 15:14:49 -07001549
1550 void setOffsetPositionForStackResize(boolean offsetPositionForStackResize) {
1551 mOffsetPositionForStackResize = offsetPositionForStackResize;
1552 }
Craig Mautnera2c77052012-03-26 12:14:43 -07001553}