blob: 9eab92c4a979fcaf1b29f51a13d6198bd48fc1ce [file] [log] [blame]
Craig Mautner764983d2012-03-22 11:37:36 -07001// Copyright 2012 Google Inc. All Rights Reserved.
2
3package com.android.server.wm;
4
5import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
Craig Mautnerf12100e2012-06-25 11:13:24 -07006import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
Craig Mautner764983d2012-03-22 11:37:36 -07007
Craig Mautnera608b882012-03-30 13:03:49 -07008import static com.android.server.wm.WindowManagerService.LayoutFields.SET_UPDATE_ROTATION;
9import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_MAY_CHANGE;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070010import static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED;
Craig Mautner2639da52012-07-09 09:39:06 -070011import static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070012
Craig Mautner711f90a2012-07-03 18:43:52 -070013import static com.android.server.wm.WindowManagerService.H.UPDATE_ANIM_PARAMETERS;
Craig Mautnera608b882012-03-30 13:03:49 -070014
Craig Mautner764983d2012-03-22 11:37:36 -070015import android.content.Context;
16import android.os.SystemClock;
17import android.util.Log;
18import android.util.Slog;
Craig Mautner76a71652012-09-03 23:23:58 -070019import android.util.SparseIntArray;
Craig Mautner6881a102012-07-27 13:04:51 -070020import android.view.Display;
Craig Mautner764983d2012-03-22 11:37:36 -070021import android.view.Surface;
Craig Mautner764983d2012-03-22 11:37:36 -070022import android.view.WindowManagerPolicy;
23import android.view.animation.Animation;
Craig Mautner764983d2012-03-22 11:37:36 -070024
Craig Mautner322e4032012-07-13 13:35:20 -070025import com.android.server.wm.WindowManagerService.AppWindowAnimParams;
Craig Mautner711f90a2012-07-03 18:43:52 -070026import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;
Craig Mautner764983d2012-03-22 11:37:36 -070027
Craig Mautnere7ae2502012-03-26 17:11:19 -070028import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070029import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070030
Craig Mautner764983d2012-03-22 11:37:36 -070031/**
Craig Mautner764983d2012-03-22 11:37:36 -070032 * Singleton class that carries out the animations and Surface operations in a separate task
33 * on behalf of WindowManagerService.
34 */
35public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070036 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070037
38 final WindowManagerService mService;
39 final Context mContext;
40 final WindowManagerPolicy mPolicy;
41
Craig Mautner59c00972012-07-30 12:10:24 -070042 ArrayList<WinAnimatorList> mWinAnimatorLists = new ArrayList<WinAnimatorList>();
Craig Mautnerbec53f72012-04-05 11:49:05 -070043
Craig Mautner764983d2012-03-22 11:37:36 -070044 boolean mAnimating;
Craig Mautner01cd0e72012-06-18 10:19:11 -070045
Craig Mautner1caa3992012-06-22 09:46:48 -070046 final Runnable mAnimationRunnable;
47
Craig Mautner764983d2012-03-22 11:37:36 -070048 int mAdjResult;
49
Craig Mautner76a71652012-09-03 23:23:58 -070050 // Layout changes for individual Displays. Indexed by displayId.
51 SparseIntArray mPendingLayoutChanges = new SparseIntArray();
Craig Mautner764983d2012-03-22 11:37:36 -070052
53 /** Overall window dimensions */
54 int mDw, mDh;
55
56 /** Interior window dimensions */
57 int mInnerDw, mInnerDh;
58
59 /** Time of current animation step. Reset on each iteration */
60 long mCurrentTime;
61
62 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
63 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
Craig Mautner6fbda632012-07-03 09:26:39 -070064 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070065
66 /** The one and only screen rotation if one is happening */
67 ScreenRotationAnimation mScreenRotationAnimation = null;
68
Craig Mautnere7ae2502012-03-26 17:11:19 -070069 // Window currently running an animation that has requested it be detached
70 // from the wallpaper. This means we need to ensure the wallpaper is
71 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070072 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070073 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070074
Craig Mautnere7ae2502012-03-26 17:11:19 -070075 DimSurface mWindowAnimationBackgroundSurface = null;
76
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070077 WindowStateAnimator mUniverseBackground = null;
78 int mAboveUniverseLayer = 0;
79
Craig Mautnera608b882012-03-30 13:03:49 -070080 int mBulkUpdateParams = 0;
81
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070082 DimAnimator mDimAnimator = null;
83 DimAnimator.Parameters mDimParams = null;
84
Craig Mautner4d7349b2012-04-20 14:52:47 -070085 static final int WALLPAPER_ACTION_PENDING = 1;
86 int mPendingActions;
87
Craig Mautner1caa3992012-06-22 09:46:48 -070088 WindowState mWallpaperTarget = null;
Craig Mautner918b53b2012-07-09 14:15:54 -070089 AppWindowAnimator mWpAppAnimator = null;
90 WindowState mLowerWallpaperTarget = null;
91 WindowState mUpperWallpaperTarget = null;
Craig Mautner1caa3992012-06-22 09:46:48 -070092
Craig Mautner322e4032012-07-13 13:35:20 -070093 ArrayList<AppWindowAnimator> mAppAnimators = new ArrayList<AppWindowAnimator>();
94
Craig Mautner918b53b2012-07-09 14:15:54 -070095 ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
96
97 /** Parameters being passed from this into mService. */
98 static class AnimatorToLayoutParams {
99 boolean mUpdateQueued;
100 int mBulkUpdateParams;
Craig Mautner76a71652012-09-03 23:23:58 -0700101 SparseIntArray mPendingLayoutChanges;
Craig Mautner918b53b2012-07-09 14:15:54 -0700102 WindowState mWindowDetachedWallpaper;
103 }
104 /** Do not modify unless holding mService.mWindowMap or this and mAnimToLayout in that order */
Craig Mautner711f90a2012-07-03 18:43:52 -0700105 final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();
106
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700107 boolean mInitialized = false;
108
Craig Mautner918b53b2012-07-09 14:15:54 -0700109 WindowAnimator(final WindowManagerService service) {
Craig Mautner764983d2012-03-22 11:37:36 -0700110 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -0700111 mContext = service.mContext;
112 mPolicy = service.mPolicy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700113
114 mAnimationRunnable = new Runnable() {
115 @Override
116 public void run() {
117 // TODO(cmautner): When full isolation is achieved for animation, the first lock
118 // goes away and only the WindowAnimator.this remains.
119 synchronized(mService.mWindowMap) {
120 synchronized(WindowAnimator.this) {
121 copyLayoutToAnimParamsLocked();
122 animateLocked();
123 }
124 }
125 }
126 };
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700127 }
Craig Mautner9e809442012-06-22 17:13:04 -0700128
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700129 void initializeLocked(final int layerStack) {
Craig Mautner6881a102012-07-27 13:04:51 -0700130 mWindowAnimationBackgroundSurface =
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700131 new DimSurface(mService.mFxSession, layerStack);
132 mDimAnimator = new DimAnimator(mService.mFxSession, layerStack);
133 mInitialized = true;
Craig Mautner1caa3992012-06-22 09:46:48 -0700134 }
135
Craig Mautner711f90a2012-07-03 18:43:52 -0700136 /** Locked on mAnimToLayout */
137 void updateAnimToLayoutLocked() {
138 final AnimatorToLayoutParams animToLayout = mAnimToLayout;
139 synchronized (animToLayout) {
140 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
Craig Mautner76a71652012-09-03 23:23:58 -0700141 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges.clone();
Craig Mautner711f90a2012-07-03 18:43:52 -0700142 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
143
144 if (!animToLayout.mUpdateQueued) {
145 animToLayout.mUpdateQueued = true;
146 mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
147 }
148 }
149 }
150
Craig Mautner1caa3992012-06-22 09:46:48 -0700151 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
152 private void copyLayoutToAnimParamsLocked() {
Craig Mautner711f90a2012-07-03 18:43:52 -0700153 final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
Craig Mautner1caa3992012-06-22 09:46:48 -0700154 synchronized(layoutToAnim) {
155 layoutToAnim.mAnimationScheduled = false;
156
Craig Mautner322e4032012-07-13 13:35:20 -0700157 if (!layoutToAnim.mParamsModified) {
158 return;
159 }
160 layoutToAnim.mParamsModified = false;
161
Craig Mautner918b53b2012-07-09 14:15:54 -0700162 if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) {
163 layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED;
164 mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
165 }
166
Craig Mautner59c00972012-07-30 12:10:24 -0700167 mWinAnimatorLists =
168 new ArrayList<WinAnimatorList>(layoutToAnim.mWinAnimatorLists);
Craig Mautner1caa3992012-06-22 09:46:48 -0700169 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
Craig Mautner918b53b2012-07-09 14:15:54 -0700170 mWpAppAnimator = mWallpaperTarget == null
171 ? null : mWallpaperTarget.mAppToken == null
172 ? null : mWallpaperTarget.mAppToken.mAppAnimator;
173 mLowerWallpaperTarget = layoutToAnim.mLowerWallpaperTarget;
174 mUpperWallpaperTarget = layoutToAnim.mUpperWallpaperTarget;
Craig Mautnera76fdb72012-07-03 19:03:02 -0700175
176 // Set the new DimAnimator params.
177 DimAnimator.Parameters dimParams = layoutToAnim.mDimParams;
178 if (dimParams == null) {
179 mDimParams = dimParams;
180 } else {
181 final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
182
183 // Only set dim params on the highest dimmed layer.
184 final WindowStateAnimator existingDimWinAnimator = mDimParams == null
185 ? null : mDimParams.mDimWinAnimator;
186 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
187 if (newWinAnimator.mSurfaceShown &&
188 (existingDimWinAnimator == null || !existingDimWinAnimator.mSurfaceShown
189 || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
190 mDimParams = dimParams;
191 }
192 }
Craig Mautner322e4032012-07-13 13:35:20 -0700193
194 mAppAnimators.clear();
195 final int N = layoutToAnim.mAppWindowAnimParams.size();
196 for (int i = 0; i < N; i++) {
197 final AppWindowAnimParams params = layoutToAnim.mAppWindowAnimParams.get(i);
198 AppWindowAnimator appAnimator = params.mAppAnimator;
Craig Mautnerbea12bd2012-08-20 10:18:34 -0700199 appAnimator.mAllAppWinAnimators.clear();
200 appAnimator.mAllAppWinAnimators.addAll(params.mWinAnimators);
Craig Mautner322e4032012-07-13 13:35:20 -0700201 mAppAnimators.add(appAnimator);
202 }
Craig Mautner1caa3992012-06-22 09:46:48 -0700203 }
204 }
205
Craig Mautnerb9836b92012-06-11 11:40:09 -0700206 void hideWallpapersLocked(final WindowState w) {
Craig Mautner918b53b2012-07-09 14:15:54 -0700207 if ((mWallpaperTarget == w && mLowerWallpaperTarget == null) || mWallpaperTarget == null) {
208 final int numTokens = mWallpaperTokens.size();
209 for (int i = numTokens - 1; i >= 0; i--) {
210 final WindowToken token = mWallpaperTokens.get(i);
211 final int numWindows = token.windows.size();
212 for (int j = numWindows - 1; j >= 0; j--) {
213 final WindowState wallpaper = token.windows.get(j);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700214 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
215 if (!winAnimator.mLastHidden) {
216 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700217 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautner76a71652012-09-03 23:23:58 -0700218 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
219 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700220 }
221 }
222 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700223 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700224 }
225 }
226
Craig Mautner764983d2012-03-22 11:37:36 -0700227 private void updateWindowsAppsAndRotationAnimationsLocked() {
228 int i;
Craig Mautner322e4032012-07-13 13:35:20 -0700229 final int NAT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700230 for (i=0; i<NAT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700231 final AppWindowAnimator appAnimator = mAppAnimators.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700232 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700233 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700234 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700235 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700236 } else if (wasAnimating) {
237 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700238 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
239 "appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700240 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
241 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700242 }
243 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700244
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700245 final int NEAT = mService.mExitingAppTokens.size();
246 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700247 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700248 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700249 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700250 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700251 mAnimating = true;
252 } else if (wasAnimating) {
253 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700254 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
255 "exiting appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700256 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
257 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700258 }
259 }
260
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700261 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700262 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700263 mAnimating = true;
264 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700265 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700266 mScreenRotationAnimation.kill();
267 mScreenRotationAnimation = null;
268 }
269 }
270 }
271
Craig Mautner59c00972012-07-30 12:10:24 -0700272 private void updateWindowsLocked(final WinAnimatorList winAnimatorList) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700273 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700274
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700275 ArrayList<WindowStateAnimator> unForceHiding = null;
276 boolean wallpaperInUnForceHiding = false;
277
Craig Mautner4bf18a72012-07-10 14:08:16 -0700278 // forceHiding states.
279 final int KEYGUARD_NOT_SHOWN = 0;
280 final int KEYGUARD_ANIMATING_IN = 1;
281 final int KEYGUARD_SHOWN = 2;
282 final int KEYGUARD_ANIMATING_OUT = 3;
283 int forceHiding = KEYGUARD_NOT_SHOWN;
284
Craig Mautner59c00972012-07-30 12:10:24 -0700285 for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
286 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700287 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700288 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700289
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700290 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700291 final boolean wasAnimating = winAnimator.mWasAnimating;
292 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700293
294 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700295 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700296 ", nowAnimating=" + nowAnimating);
297 }
298
Craig Mautner918b53b2012-07-09 14:15:54 -0700299 if (wasAnimating && !winAnimator.mAnimating && mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700300 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700301 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
302 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700303 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700304 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
Craig Mautner76a71652012-09-03 23:23:58 -0700305 mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700306 }
Craig Mautner764983d2012-03-22 11:37:36 -0700307 }
308
Craig Mautnerbec53f72012-04-05 11:49:05 -0700309 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700310 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700311 if (WindowManagerService.DEBUG_ANIM ||
312 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
313 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700314 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner76a71652012-09-03 23:23:58 -0700315 final int displayId = win.mDisplayContent.getDisplayId();
316 setPendingLayoutChanges(displayId,
317 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700318 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700319 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
Craig Mautner76a71652012-09-03 23:23:58 -0700320 mPendingLayoutChanges.get(displayId));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700321 }
Craig Mautner764983d2012-03-22 11:37:36 -0700322 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700323 }
Craig Mautner4bf18a72012-07-10 14:08:16 -0700324 if (win.isReadyForDisplay()) {
325 if (nowAnimating) {
326 if (winAnimator.mAnimationIsEntrance) {
327 forceHiding = KEYGUARD_ANIMATING_IN;
328 } else {
329 forceHiding = KEYGUARD_ANIMATING_OUT;
330 }
331 } else {
332 forceHiding = KEYGUARD_SHOWN;
333 }
Craig Mautner764983d2012-03-22 11:37:36 -0700334 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700335 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner078ea0a2012-06-25 11:04:29 -0700336 "Force hide " + forceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700337 + " hasSurface=" + win.mHasSurface
338 + " policyVis=" + win.mPolicyVisibility
339 + " destroying=" + win.mDestroying
340 + " attHidden=" + win.mAttachedHidden
341 + " vis=" + win.mViewVisibility
342 + " hidden=" + win.mRootToken.hidden
343 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700344 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautner4bf18a72012-07-10 14:08:16 -0700345 final boolean hideWhenLocked =
346 (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700347 final boolean changed;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700348 if (((forceHiding == KEYGUARD_ANIMATING_IN)
349 && (!winAnimator.isAnimating() || hideWhenLocked))
350 || ((forceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700351 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700352 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700353 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700354 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700355 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700356 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700357 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700358 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700359 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700360 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700361 if (unForceHiding == null) {
362 unForceHiding = new ArrayList<WindowStateAnimator>();
363 }
364 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700365 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700366 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700367 }
368 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700369 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700370 // We are showing on to of the current
371 // focus, so re-evaluate focus to make
372 // sure it is correct.
373 mService.mFocusMayChange = true;
374 }
375 }
376 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700377 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700378 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700379 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
380 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700381 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700382 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
Craig Mautner76a71652012-09-03 23:23:58 -0700383 mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700384 }
Craig Mautner764983d2012-03-22 11:37:36 -0700385 }
386 }
387 }
388
Craig Mautnerbec53f72012-04-05 11:49:05 -0700389 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700390 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
391 if (atoken == null || atoken.allDrawn) {
392 if (winAnimator.performShowLocked()) {
Craig Mautner76a71652012-09-03 23:23:58 -0700393 final int displayId = win.mDisplayContent.getDisplayId();
394 mPendingLayoutChanges.put(displayId,
395 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
Craig Mautner6fbda632012-07-03 09:26:39 -0700396 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
397 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
Craig Mautner76a71652012-09-03 23:23:58 -0700398 mPendingLayoutChanges.get(displayId));
Craig Mautner764983d2012-03-22 11:37:36 -0700399 }
400 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700401 }
Craig Mautner764983d2012-03-22 11:37:36 -0700402 }
Craig Mautner322e4032012-07-13 13:35:20 -0700403 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700404 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700405 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
406 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700407 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700408 }
Craig Mautner59431632012-04-04 11:56:44 -0700409 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
410 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700411 }
412 }
Craig Mautner764983d2012-03-22 11:37:36 -0700413 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700414
Craig Mautner078ea0a2012-06-25 11:04:29 -0700415 // If we have windows that are being show due to them no longer
416 // being force-hidden, apply the appropriate animation to them.
417 if (unForceHiding != null) {
418 for (int i=unForceHiding.size()-1; i>=0; i--) {
419 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
420 if (a != null) {
421 final WindowStateAnimator winAnimator = unForceHiding.get(i);
422 winAnimator.setAnimation(a);
423 winAnimator.mAnimationIsEntrance = true;
424 }
425 }
426 }
427 }
428
Craig Mautner59c00972012-07-30 12:10:24 -0700429 private void updateWallpaperLocked(final WinAnimatorList winAnimatorList) {
Craig Mautner078ea0a2012-06-25 11:04:29 -0700430 WindowStateAnimator windowAnimationBackground = null;
431 int windowAnimationBackgroundColor = 0;
432 WindowState detachedWallpaper = null;
433
Craig Mautner59c00972012-07-30 12:10:24 -0700434 for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
435 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner078ea0a2012-06-25 11:04:29 -0700436 if (winAnimator.mSurface == null) {
437 continue;
438 }
439
440 final int flags = winAnimator.mAttrFlags;
441 final WindowState win = winAnimator.mWin;
442
443 // If this window is animating, make a note that we have
444 // an animating window and take care of a request to run
445 // a detached wallpaper animation.
446 if (winAnimator.mAnimating) {
447 if (winAnimator.mAnimation != null) {
448 if ((flags & FLAG_SHOW_WALLPAPER) != 0
449 && winAnimator.mAnimation.getDetachWallpaper()) {
450 detachedWallpaper = win;
451 }
452 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
453 if (backgroundColor != 0) {
454 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
455 windowAnimationBackground.mAnimLayer)) {
456 windowAnimationBackground = winAnimator;
457 windowAnimationBackgroundColor = backgroundColor;
458 }
459 }
460 }
461 mAnimating = true;
462 }
463
464 // If this window's app token is running a detached wallpaper
465 // animation, make a note so we can ensure the wallpaper is
466 // displayed behind it.
Craig Mautner322e4032012-07-13 13:35:20 -0700467 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700468 if (appAnimator != null && appAnimator.animation != null
469 && appAnimator.animating) {
470 if ((flags & FLAG_SHOW_WALLPAPER) != 0
471 && appAnimator.animation.getDetachWallpaper()) {
472 detachedWallpaper = win;
473 }
474
475 final int backgroundColor = appAnimator.animation.getBackgroundColor();
476 if (backgroundColor != 0) {
477 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
478 windowAnimationBackground.mAnimLayer)) {
479 windowAnimationBackground = winAnimator;
480 windowAnimationBackgroundColor = backgroundColor;
481 }
482 }
483 }
484 } // end forall windows
485
Craig Mautner9e809442012-06-22 17:13:04 -0700486 if (mWindowDetachedWallpaper != detachedWallpaper) {
487 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
488 "Detached wallpaper changed from " + mWindowDetachedWallpaper
489 + " to " + detachedWallpaper);
490 mWindowDetachedWallpaper = detachedWallpaper;
491 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
492 }
493
494 if (windowAnimationBackgroundColor != 0) {
495 // If the window that wants black is the current wallpaper
496 // target, then the black goes *below* the wallpaper so we
497 // don't cause the wallpaper to suddenly disappear.
498 int animLayer = windowAnimationBackground.mAnimLayer;
499 WindowState win = windowAnimationBackground.mWin;
Craig Mautner59c00972012-07-30 12:10:24 -0700500 if (mWallpaperTarget == win
Craig Mautner918b53b2012-07-09 14:15:54 -0700501 || mLowerWallpaperTarget == win || mUpperWallpaperTarget == win) {
Craig Mautner59c00972012-07-30 12:10:24 -0700502 final int N = winAnimatorList.size();
Craig Mautner9e809442012-06-22 17:13:04 -0700503 for (int i = 0; i < N; i++) {
Craig Mautner59c00972012-07-30 12:10:24 -0700504 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700505 if (winAnimator.mIsWallpaper) {
Craig Mautner9e809442012-06-22 17:13:04 -0700506 animLayer = winAnimator.mAnimLayer;
507 break;
508 }
509 }
510 }
511
Craig Mautner078ea0a2012-06-25 11:04:29 -0700512 mWindowAnimationBackgroundSurface.show(mDw, mDh,
Craig Mautner9e809442012-06-22 17:13:04 -0700513 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
514 windowAnimationBackgroundColor);
515 } else {
516 mWindowAnimationBackgroundSurface.hide();
517 }
Craig Mautner764983d2012-03-22 11:37:36 -0700518 }
519
520 private void testTokenMayBeDrawnLocked() {
521 // See if any windows have been drawn, so they (and others
522 // associated with them) can now be shown.
Craig Mautner322e4032012-07-13 13:35:20 -0700523 final int NT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700524 for (int i=0; i<NT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700525 AppWindowAnimator appAnimator = mAppAnimators.get(i);
526 AppWindowToken wtoken = appAnimator.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700527 final boolean allDrawn = wtoken.allDrawn;
Craig Mautner322e4032012-07-13 13:35:20 -0700528 if (allDrawn != appAnimator.allDrawn) {
529 appAnimator.allDrawn = allDrawn;
Craig Mautner6fbda632012-07-03 09:26:39 -0700530 if (allDrawn) {
531 // The token has now changed state to having all
532 // windows shown... what to do, what to do?
Craig Mautner322e4032012-07-13 13:35:20 -0700533 if (appAnimator.freezingScreen) {
534 appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700535 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
536 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
537 "Setting mOrientationChangeComplete=true because wtoken "
538 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
539 + " numDrawn=" + wtoken.numDrawnWindows);
540 // This will set mOrientationChangeComplete and cause a pass through layout.
Craig Mautner76a71652012-09-03 23:23:58 -0700541 setAppLayoutChanges(appAnimator,
542 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
543 "testTokenMayBeDrawnLocked: freezingScreen");
Craig Mautner6fbda632012-07-03 09:26:39 -0700544 } else {
Craig Mautner76a71652012-09-03 23:23:58 -0700545 setAppLayoutChanges(appAnimator,
546 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
547 "testTokenMayBeDrawnLocked");
548
Craig Mautner6fbda632012-07-03 09:26:39 -0700549 // We can now show all of the drawn windows!
550 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautner322e4032012-07-13 13:35:20 -0700551 mAnimating |= appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700552 }
Craig Mautner764983d2012-03-22 11:37:36 -0700553 }
554 }
555 }
556 }
557 }
558
Craig Mautner59c00972012-07-30 12:10:24 -0700559 private void performAnimationsLocked(final WinAnimatorList winAnimatorList) {
560 updateWindowsLocked(winAnimatorList);
561 updateWallpaperLocked(winAnimatorList);
Craig Mautner764983d2012-03-22 11:37:36 -0700562
Craig Mautner76a71652012-09-03 23:23:58 -0700563 for (int i = mPendingLayoutChanges.size() - 1; i >= 0; i--) {
564 if ((mPendingLayoutChanges.valueAt(i)
565 & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
566 mPendingActions |= WALLPAPER_ACTION_PENDING;
567 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700568 }
Craig Mautner764983d2012-03-22 11:37:36 -0700569
Craig Mautner6fbda632012-07-03 09:26:39 -0700570 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700571 }
572
Craig Mautner1caa3992012-06-22 09:46:48 -0700573 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
574 /** Locked on mService.mWindowMap and this. */
575 private void animateLocked() {
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700576 if (!mInitialized) {
577 return;
578 }
Craig Mautner59c00972012-07-30 12:10:24 -0700579 for (int i = mWinAnimatorLists.size() - 1; i >= 0; i--) {
580 animateLocked(mWinAnimatorLists.get(i));
581 }
582 }
583
584 private void animateLocked(final WinAnimatorList winAnimatorList) {
Craig Mautner76a71652012-09-03 23:23:58 -0700585 mPendingLayoutChanges.clear();
Craig Mautner764983d2012-03-22 11:37:36 -0700586 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700587 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700588 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700589 mAnimating = false;
590 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
591 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
592 }
Craig Mautner764983d2012-03-22 11:37:36 -0700593
594 // Update animations of all applications, including those
595 // associated with exiting/removed apps
596 Surface.openTransaction();
597
598 try {
599 updateWindowsAppsAndRotationAnimationsLocked();
Craig Mautner59c00972012-07-30 12:10:24 -0700600 performAnimationsLocked(winAnimatorList);
Craig Mautner764983d2012-03-22 11:37:36 -0700601
602 // THIRD LOOP: Update the surfaces of all windows.
603
604 if (mScreenRotationAnimation != null) {
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700605 mScreenRotationAnimation.updateSurfacesInTransaction();
Craig Mautner764983d2012-03-22 11:37:36 -0700606 }
607
Craig Mautner59c00972012-07-30 12:10:24 -0700608 final int N = winAnimatorList.size();
Craig Mautner7358fbf2012-04-12 21:06:33 -0700609 for (int i = 0; i < N; i++) {
Craig Mautner59c00972012-07-30 12:10:24 -0700610 winAnimatorList.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700611 }
612
Craig Mautner6af9b922012-04-05 19:25:51 -0700613 if (mDimParams != null) {
614 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
615 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700616 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700617 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700618 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700619 }
620
621 if (mService.mBlackFrame != null) {
622 if (mScreenRotationAnimation != null) {
623 mService.mBlackFrame.setMatrix(
624 mScreenRotationAnimation.getEnterTransformation().getMatrix());
625 } else {
626 mService.mBlackFrame.clearMatrix();
627 }
628 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700629
630 if (mService.mWatermark != null) {
631 mService.mWatermark.drawIfNeeded();
632 }
Craig Mautner764983d2012-03-22 11:37:36 -0700633 } catch (RuntimeException e) {
634 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
635 } finally {
636 Surface.closeTransaction();
637 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700638
Craig Mautner76a71652012-09-03 23:23:58 -0700639 if (mBulkUpdateParams != 0 || mPendingLayoutChanges.size() > 0) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700640 updateAnimToLayoutLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700641 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700642
643 if (mAnimating) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700644 synchronized (mService.mLayoutToAnim) {
645 mService.scheduleAnimationLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -0700646 }
Chet Haase198e5642012-05-10 09:55:15 -0700647 } else if (wasAnimating) {
648 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700649 }
650 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
651 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
652 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
Craig Mautner76a71652012-09-03 23:23:58 -0700653 + " mPendingLayoutChanges(DEFAULT_DISPLAY)="
654 + Integer.toHexString(mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY)));
Craig Mautner7d8df392012-04-06 15:26:23 -0700655 }
Craig Mautner764983d2012-03-22 11:37:36 -0700656 }
657
658 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700659 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700660 mCurrentFocus = currentFocus;
661 }
662
663 void setDisplayDimensions(final int curWidth, final int curHeight,
664 final int appWidth, final int appHeight) {
665 mDw = curWidth;
666 mDh = curHeight;
667 mInnerDw = appWidth;
668 mInnerDh = appHeight;
669 }
670
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700671 boolean isDimming() {
672 return mDimParams != null;
673 }
674
Craig Mautneracafd192012-05-10 10:41:02 -0700675 boolean isDimming(final WindowStateAnimator winAnimator) {
676 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
677 }
678
Craig Mautnere7ae2502012-03-26 17:11:19 -0700679 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700680 if (dumpAll) {
681 if (mWindowDetachedWallpaper != null) {
682 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
683 pw.println(mWindowDetachedWallpaper);
684 }
685 pw.print(prefix); pw.print("mAnimTransactionSequence=");
686 pw.println(mAnimTransactionSequence);
687 if (mWindowAnimationBackgroundSurface != null) {
688 pw.print(prefix); pw.print("mWindowAnimationBackgroundSurface:");
689 mWindowAnimationBackgroundSurface.printTo(prefix + " ", pw);
690 }
691 if (mDimAnimator != null) {
692 pw.print(prefix); pw.print("mDimAnimator:");
693 mDimAnimator.printTo(prefix + " ", pw);
694 } else {
695 pw.print(prefix); pw.print("no DimAnimator ");
696 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700697 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700698 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700699
700 static class SetAnimationParams {
701 final WindowStateAnimator mWinAnimator;
702 final Animation mAnimation;
703 final int mAnimDw;
704 final int mAnimDh;
705 public SetAnimationParams(final WindowStateAnimator winAnimator,
706 final Animation animation, final int animDw, final int animDh) {
707 mWinAnimator = winAnimator;
708 mAnimation = animation;
709 mAnimDw = animDw;
710 mAnimDh = animDh;
711 }
712 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700713
Craig Mautner76a71652012-09-03 23:23:58 -0700714 void clearPendingActions() {
715 synchronized (this) {
716 mPendingActions = 0;
717 }
718 }
719
720 void setPendingLayoutChanges(final int displayId, final int changes) {
721 mPendingLayoutChanges.put(displayId, mPendingLayoutChanges.get(displayId) | changes);
722 }
723
724 void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) {
725 // Used to track which displays layout changes have been done.
726 SparseIntArray displays = new SparseIntArray();
727 for (int i = appAnimator.mAllAppWinAnimators.size() - 1; i >= 0; i--) {
728 WindowStateAnimator winAnimator = appAnimator.mAllAppWinAnimators.get(i);
729 final int displayId = winAnimator.mWin.mDisplayContent.getDisplayId();
730 if (displays.indexOfKey(displayId) < 0) {
731 setPendingLayoutChanges(displayId, changes);
732 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
733 mService.debugLayoutRepeats(s, mPendingLayoutChanges.get(displayId));
734 }
735 // Keep from processing this display again.
736 displays.put(displayId, changes);
737 }
738 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700739 }
Craig Mautner764983d2012-03-22 11:37:36 -0700740}