blob: 2688cffb9d22989bbb9a622b0e644bbeb4c1a449 [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 Mautner96868332012-12-04 14:29:11 -080012import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_ACTION_PENDING;
Craig Mautnera608b882012-03-30 13:03:49 -070013
Craig Mautner764983d2012-03-22 11:37:36 -070014import android.content.Context;
Dianne Hackborn98129732012-11-01 16:28:16 -070015import android.os.Debug;
Craig Mautner764983d2012-03-22 11:37:36 -070016import android.os.SystemClock;
17import android.util.Log;
18import android.util.Slog;
Craig Mautnera91f9e22012-09-14 16:22:08 -070019import android.util.SparseArray;
Craig Mautner76a71652012-09-03 23:23:58 -070020import android.util.SparseIntArray;
Dianne Hackborn529e7442012-11-01 14:22:28 -070021import android.util.TimeUtils;
Craig Mautner6881a102012-07-27 13:04:51 -070022import android.view.Display;
Mathias Agopian3866f0d2013-02-11 22:08:48 -080023import android.view.SurfaceControl;
Craig Mautner764983d2012-03-22 11:37:36 -070024import android.view.WindowManagerPolicy;
25import android.view.animation.Animation;
Craig Mautner764983d2012-03-22 11:37:36 -070026
Dianne Hackborn529e7442012-11-01 14:22:28 -070027import com.android.server.wm.WindowManagerService.LayoutFields;
Craig Mautner764983d2012-03-22 11:37:36 -070028
Craig Mautnere7ae2502012-03-26 17:11:19 -070029import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070030import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070031
Craig Mautner764983d2012-03-22 11:37:36 -070032/**
Craig Mautner764983d2012-03-22 11:37:36 -070033 * Singleton class that carries out the animations and Surface operations in a separate task
34 * on behalf of WindowManagerService.
35 */
36public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070037 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070038
39 final WindowManagerService mService;
40 final Context mContext;
41 final WindowManagerPolicy mPolicy;
42
43 boolean mAnimating;
Craig Mautner01cd0e72012-06-18 10:19:11 -070044
Craig Mautner1caa3992012-06-22 09:46:48 -070045 final Runnable mAnimationRunnable;
46
Craig Mautner764983d2012-03-22 11:37:36 -070047 /** Time of current animation step. Reset on each iteration */
48 long mCurrentTime;
49
50 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
51 * 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 -070052 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070053
Craig Mautnerae446592012-12-06 19:05:05 -080054 /** Window currently running an animation that has requested it be detached
55 * from the wallpaper. This means we need to ensure the wallpaper is
56 * visible behind it in case it animates in a way that would allow it to be
57 * seen. If multiple windows satisfy this, use the lowest window. */
Craig Mautnere7ae2502012-03-26 17:11:19 -070058 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070059
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070060 WindowStateAnimator mUniverseBackground = null;
61 int mAboveUniverseLayer = 0;
62
Craig Mautnera608b882012-03-30 13:03:49 -070063 int mBulkUpdateParams = 0;
Dianne Hackborna57c6952013-03-29 14:46:40 -070064 Object mLastWindowFreezeSource;
Craig Mautnera608b882012-03-30 13:03:49 -070065
Craig Mautnera91f9e22012-09-14 16:22:08 -070066 SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators =
Dianne Hackbornf4bf0ae2013-05-20 18:42:16 -070067 new SparseArray<WindowAnimator.DisplayContentsAnimator>(2);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070068
Craig Mautnerb47bbc32012-08-22 17:41:48 -070069 boolean mInitialized = false;
70
Craig Mautner178af592012-09-17 10:37:29 -070071 // forceHiding states.
72 static final int KEYGUARD_NOT_SHOWN = 0;
73 static final int KEYGUARD_ANIMATING_IN = 1;
74 static final int KEYGUARD_SHOWN = 2;
75 static final int KEYGUARD_ANIMATING_OUT = 3;
76 int mForceHiding = KEYGUARD_NOT_SHOWN;
77
78 private String forceHidingToString() {
79 switch (mForceHiding) {
80 case KEYGUARD_NOT_SHOWN: return "KEYGUARD_NOT_SHOWN";
81 case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN";
82 case KEYGUARD_SHOWN: return "KEYGUARD_SHOWN";
83 case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT";
84 default: return "KEYGUARD STATE UNKNOWN " + mForceHiding;
85 }
86 }
87
Craig Mautner918b53b2012-07-09 14:15:54 -070088 WindowAnimator(final WindowManagerService service) {
Craig Mautner764983d2012-03-22 11:37:36 -070089 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -070090 mContext = service.mContext;
91 mPolicy = service.mPolicy;
Craig Mautner1caa3992012-06-22 09:46:48 -070092
93 mAnimationRunnable = new Runnable() {
94 @Override
95 public void run() {
Craig Mautner96868332012-12-04 14:29:11 -080096 synchronized (mService.mWindowMap) {
97 mService.mAnimationScheduled = false;
98 animateLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -070099 }
100 }
101 };
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700102 }
Craig Mautner9e809442012-06-22 17:13:04 -0700103
Craig Mautnera91f9e22012-09-14 16:22:08 -0700104 void addDisplayLocked(final int displayId) {
Craig Mautnerac439e52012-09-21 08:58:34 -0700105 // Create the DisplayContentsAnimator object by retrieving it.
106 getDisplayContentsAnimatorLocked(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700107 if (displayId == Display.DEFAULT_DISPLAY) {
108 mInitialized = true;
109 }
110 }
111
112 void removeDisplayLocked(final int displayId) {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700113 final DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
114 if (displayAnimator != null) {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700115 if (displayAnimator.mScreenRotationAnimation != null) {
116 displayAnimator.mScreenRotationAnimation.kill();
117 displayAnimator.mScreenRotationAnimation = null;
118 }
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700119 }
120
Craig Mautnera91f9e22012-09-14 16:22:08 -0700121 mDisplayContentsAnimators.delete(displayId);
Craig Mautner1caa3992012-06-22 09:46:48 -0700122 }
123
Craig Mautner96868332012-12-04 14:29:11 -0800124 AppWindowAnimator getWallpaperAppAnimator() {
125 return mService.mWallpaperTarget == null
126 ? null : mService.mWallpaperTarget.mAppToken == null
127 ? null : mService.mWallpaperTarget.mAppToken.mAppAnimator;
Craig Mautner711f90a2012-07-03 18:43:52 -0700128 }
129
Craig Mautner96868332012-12-04 14:29:11 -0800130 void hideWallpapersLocked(final WindowState w) {
131 final WindowState wallpaperTarget = mService.mWallpaperTarget;
132 final WindowState lowerWallpaperTarget = mService.mLowerWallpaperTarget;
133 final ArrayList<WindowToken> wallpaperTokens = mService.mWallpaperTokens;
Craig Mautner66f78d72012-12-04 16:46:50 -0800134
Dianne Hackborn98129732012-11-01 16:28:16 -0700135 if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) {
136 final int numTokens = wallpaperTokens.size();
Craig Mautner918b53b2012-07-09 14:15:54 -0700137 for (int i = numTokens - 1; i >= 0; i--) {
Dianne Hackborn98129732012-11-01 16:28:16 -0700138 final WindowToken token = wallpaperTokens.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700139 final int numWindows = token.windows.size();
140 for (int j = numWindows - 1; j >= 0; j--) {
141 final WindowState wallpaper = token.windows.get(j);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700142 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
143 if (!winAnimator.mLastHidden) {
144 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700145 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautner76a71652012-09-03 23:23:58 -0700146 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
147 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700148 }
149 }
Dianne Hackbornef03a7f2012-10-29 18:46:52 -0700150 if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG,
Dianne Hackborn2ea9bae2012-11-02 18:43:48 -0700151 "Hiding wallpaper " + token + " from " + w
152 + " target=" + wallpaperTarget + " lower=" + lowerWallpaperTarget
153 + "\n" + Debug.getCallers(5, " "));
Craig Mautnerb9836b92012-06-11 11:40:09 -0700154 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700155 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700156 }
157 }
158
Craig Mautnerb1fd65c02013-02-05 13:34:57 -0800159 private void updateAppWindowsLocked(int displayId) {
Craig Mautnerb1fd65c02013-02-05 13:34:57 -0800160 final DisplayContent displayContent = mService.getDisplayContentLocked(displayId);
Craig Mautnerd9a22882013-03-16 15:00:36 -0700161 final ArrayList<Task> tasks = displayContent.getTasks();
Craig Mautnerf81b90872013-02-26 13:02:43 -0800162 final int numTasks = tasks.size();
163 for (int taskNdx = 0; taskNdx < numTasks; ++taskNdx) {
164 final AppTokenList tokens = tasks.get(taskNdx).mAppTokens;
165 final int numTokens = tokens.size();
166 for (int tokenNdx = 0; tokenNdx < numTokens; ++tokenNdx) {
167 final AppWindowAnimator appAnimator = tokens.get(tokenNdx).mAppAnimator;
168 final boolean wasAnimating = appAnimator.animation != null
169 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
170 if (appAnimator.stepAnimationLocked(mCurrentTime)) {
171 mAnimating = true;
172 } else if (wasAnimating) {
173 // stopped animating, do one more pass through the layout
174 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
175 "appToken " + appAnimator.mAppToken + " done");
176 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
177 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
178 }
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700179 }
180 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700181
Craig Mautnerb1fd65c02013-02-05 13:34:57 -0800182 final AppTokenList exitingAppTokens = displayContent.mExitingAppTokens;
183 final int NEAT = exitingAppTokens.size();
Craig Mautner05d29032013-05-03 13:40:13 -0700184 for (int i = 0; i < NEAT; i++) {
Craig Mautnerb1fd65c02013-02-05 13:34:57 -0800185 final AppWindowAnimator appAnimator = exitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700186 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700187 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner9339c402012-11-30 11:23:56 -0800188 if (appAnimator.stepAnimationLocked(mCurrentTime)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700189 mAnimating = true;
190 } else if (wasAnimating) {
191 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700192 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
193 "exiting appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700194 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
195 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700196 }
197 }
Craig Mautner764983d2012-03-22 11:37:36 -0700198 }
199
Craig Mautnera91f9e22012-09-14 16:22:08 -0700200 private void updateWindowsLocked(final int displayId) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700201 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700202
Craig Mautner96868332012-12-04 14:29:11 -0800203 final WindowList windows = mService.getWindowListLocked(displayId);
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700204 ArrayList<WindowStateAnimator> unForceHiding = null;
205 boolean wallpaperInUnForceHiding = false;
Craig Mautner178af592012-09-17 10:37:29 -0700206 mForceHiding = KEYGUARD_NOT_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700207
Craig Mautner96868332012-12-04 14:29:11 -0800208 for (int i = windows.size() - 1; i >= 0; i--) {
209 WindowState win = windows.get(i);
210 WindowStateAnimator winAnimator = win.mWinAnimator;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700211 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700212
Mathias Agopian29479eb2013-02-14 14:36:04 -0800213 if (winAnimator.mSurfaceControl != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700214 final boolean wasAnimating = winAnimator.mWasAnimating;
215 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700216
217 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700218 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700219 ", nowAnimating=" + nowAnimating);
220 }
221
Craig Mautner96868332012-12-04 14:29:11 -0800222 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700223 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700224 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
225 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700226 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700227 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
Craig Mautner66f78d72012-12-04 16:46:50 -0800228 getPendingLayoutChanges(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700229 }
Craig Mautner764983d2012-03-22 11:37:36 -0700230 }
231
Craig Mautnerbec53f72012-04-05 11:49:05 -0700232 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700233 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700234 if (WindowManagerService.DEBUG_ANIM ||
235 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
236 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700237 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner76a71652012-09-03 23:23:58 -0700238 setPendingLayoutChanges(displayId,
239 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700240 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700241 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
Craig Mautner66f78d72012-12-04 16:46:50 -0800242 getPendingLayoutChanges(displayId));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700243 }
Craig Mautner764983d2012-03-22 11:37:36 -0700244 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700245 }
Craig Mautner4bf18a72012-07-10 14:08:16 -0700246 if (win.isReadyForDisplay()) {
247 if (nowAnimating) {
248 if (winAnimator.mAnimationIsEntrance) {
Craig Mautner178af592012-09-17 10:37:29 -0700249 mForceHiding = KEYGUARD_ANIMATING_IN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700250 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700251 mForceHiding = KEYGUARD_ANIMATING_OUT;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700252 }
253 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700254 mForceHiding = KEYGUARD_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700255 }
Craig Mautner764983d2012-03-22 11:37:36 -0700256 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700257 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner178af592012-09-17 10:37:29 -0700258 "Force hide " + mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700259 + " hasSurface=" + win.mHasSurface
260 + " policyVis=" + win.mPolicyVisibility
261 + " destroying=" + win.mDestroying
262 + " attHidden=" + win.mAttachedHidden
263 + " vis=" + win.mViewVisibility
264 + " hidden=" + win.mRootToken.hidden
265 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700266 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautner4bf18a72012-07-10 14:08:16 -0700267 final boolean hideWhenLocked =
268 (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700269 final boolean changed;
Craig Mautner178af592012-09-17 10:37:29 -0700270 if (((mForceHiding == KEYGUARD_ANIMATING_IN)
Craig Mautner4bf18a72012-07-10 14:08:16 -0700271 && (!winAnimator.isAnimating() || hideWhenLocked))
Craig Mautner178af592012-09-17 10:37:29 -0700272 || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700273 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700274 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700275 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700276 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700277 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700278 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700279 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700280 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700281 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700282 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700283 if (unForceHiding == null) {
284 unForceHiding = new ArrayList<WindowStateAnimator>();
285 }
286 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700287 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700288 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700289 }
290 }
Craig Mautner29219d92013-04-16 20:19:12 -0700291 final WindowState currentFocus = mService.mCurrentFocus;
292 if (currentFocus == null || currentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700293 // We are showing on to of the current
294 // focus, so re-evaluate focus to make
295 // sure it is correct.
296 mService.mFocusMayChange = true;
297 }
298 }
299 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700300 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700301 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700302 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
303 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700304 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700305 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
Craig Mautner66f78d72012-12-04 16:46:50 -0800306 getPendingLayoutChanges(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700307 }
Craig Mautner764983d2012-03-22 11:37:36 -0700308 }
309 }
310 }
311
Craig Mautnerbec53f72012-04-05 11:49:05 -0700312 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700313 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
314 if (atoken == null || atoken.allDrawn) {
315 if (winAnimator.performShowLocked()) {
Craig Mautner66f78d72012-12-04 16:46:50 -0800316 setPendingLayoutChanges(displayId,
Craig Mautner76a71652012-09-03 23:23:58 -0700317 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
Craig Mautner6fbda632012-07-03 09:26:39 -0700318 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
319 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
Craig Mautner66f78d72012-12-04 16:46:50 -0800320 getPendingLayoutChanges(displayId));
Craig Mautner764983d2012-03-22 11:37:36 -0700321 }
322 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700323 }
Craig Mautner764983d2012-03-22 11:37:36 -0700324 }
Craig Mautner322e4032012-07-13 13:35:20 -0700325 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700326 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700327 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
328 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700329 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700330 }
Craig Mautner59431632012-04-04 11:56:44 -0700331 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
332 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700333 }
334 }
Craig Mautner764983d2012-03-22 11:37:36 -0700335 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700336
Craig Mautner078ea0a2012-06-25 11:04:29 -0700337 // If we have windows that are being show due to them no longer
338 // being force-hidden, apply the appropriate animation to them.
339 if (unForceHiding != null) {
340 for (int i=unForceHiding.size()-1; i>=0; i--) {
341 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
342 if (a != null) {
343 final WindowStateAnimator winAnimator = unForceHiding.get(i);
344 winAnimator.setAnimation(a);
345 winAnimator.mAnimationIsEntrance = true;
346 }
347 }
348 }
349 }
350
Craig Mautnera91f9e22012-09-14 16:22:08 -0700351 private void updateWallpaperLocked(int displayId) {
Craig Mautner05d29032013-05-03 13:40:13 -0700352 mService.getDisplayContentLocked(displayId).resetAnimationBackgroundAnimator();
353
Craig Mautner96868332012-12-04 14:29:11 -0800354 final WindowList windows = mService.getWindowListLocked(displayId);
Craig Mautner078ea0a2012-06-25 11:04:29 -0700355 WindowState detachedWallpaper = null;
356
Craig Mautner96868332012-12-04 14:29:11 -0800357 for (int i = windows.size() - 1; i >= 0; i--) {
358 final WindowState win = windows.get(i);
359 WindowStateAnimator winAnimator = win.mWinAnimator;
Mathias Agopian29479eb2013-02-14 14:36:04 -0800360 if (winAnimator.mSurfaceControl == null) {
Craig Mautner078ea0a2012-06-25 11:04:29 -0700361 continue;
362 }
363
364 final int flags = winAnimator.mAttrFlags;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700365
366 // If this window is animating, make a note that we have
367 // an animating window and take care of a request to run
368 // a detached wallpaper animation.
369 if (winAnimator.mAnimating) {
370 if (winAnimator.mAnimation != null) {
371 if ((flags & FLAG_SHOW_WALLPAPER) != 0
372 && winAnimator.mAnimation.getDetachWallpaper()) {
373 detachedWallpaper = win;
374 }
Craig Mautner05d29032013-05-03 13:40:13 -0700375 final int color = winAnimator.mAnimation.getBackgroundColor();
376 if (color != 0) {
377 win.getStack().setAnimationBackground(winAnimator, color);
Craig Mautner078ea0a2012-06-25 11:04:29 -0700378 }
379 }
380 mAnimating = true;
381 }
382
383 // If this window's app token is running a detached wallpaper
384 // animation, make a note so we can ensure the wallpaper is
385 // displayed behind it.
Craig Mautner322e4032012-07-13 13:35:20 -0700386 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700387 if (appAnimator != null && appAnimator.animation != null
388 && appAnimator.animating) {
389 if ((flags & FLAG_SHOW_WALLPAPER) != 0
390 && appAnimator.animation.getDetachWallpaper()) {
391 detachedWallpaper = win;
392 }
393
Craig Mautner05d29032013-05-03 13:40:13 -0700394 final int color = appAnimator.animation.getBackgroundColor();
395 if (color != 0) {
396 win.getStack().setAnimationBackground(winAnimator, color);
Craig Mautner078ea0a2012-06-25 11:04:29 -0700397 }
398 }
399 } // end forall windows
400
Craig Mautner9e809442012-06-22 17:13:04 -0700401 if (mWindowDetachedWallpaper != detachedWallpaper) {
402 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
403 "Detached wallpaper changed from " + mWindowDetachedWallpaper
404 + " to " + detachedWallpaper);
405 mWindowDetachedWallpaper = detachedWallpaper;
406 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
407 }
Craig Mautner764983d2012-03-22 11:37:36 -0700408 }
409
Craig Mautner9339c402012-11-30 11:23:56 -0800410 /** See if any windows have been drawn, so they (and others associated with them) can now be
411 * shown. */
Craig Mautnerb1fd65c02013-02-05 13:34:57 -0800412 private void testTokenMayBeDrawnLocked(int displayId) {
Craig Mautner96868332012-12-04 14:29:11 -0800413 // See if any windows have been drawn, so they (and others
414 // associated with them) can now be shown.
Craig Mautnerd9a22882013-03-16 15:00:36 -0700415 final ArrayList<Task> tasks = mService.getDisplayContentLocked(displayId).getTasks();
Craig Mautnerf81b90872013-02-26 13:02:43 -0800416 final int numTasks = tasks.size();
417 for (int taskNdx = 0; taskNdx < numTasks; ++taskNdx) {
418 final AppTokenList tokens = tasks.get(taskNdx).mAppTokens;
419 final int numTokens = tokens.size();
420 for (int tokenNdx = 0; tokenNdx < numTokens; ++tokenNdx) {
421 final AppWindowToken wtoken = tokens.get(tokenNdx);
422 AppWindowAnimator appAnimator = wtoken.mAppAnimator;
423 final boolean allDrawn = wtoken.allDrawn;
424 if (allDrawn != appAnimator.allDrawn) {
425 appAnimator.allDrawn = allDrawn;
426 if (allDrawn) {
427 // The token has now changed state to having all
428 // windows shown... what to do, what to do?
429 if (appAnimator.freezingScreen) {
430 appAnimator.showAllWindowsLocked();
431 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
432 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
433 "Setting mOrientationChangeComplete=true because wtoken "
434 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
435 + " numDrawn=" + wtoken.numDrawnWindows);
436 // This will set mOrientationChangeComplete and cause a pass through layout.
437 setAppLayoutChanges(appAnimator,
438 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
439 "testTokenMayBeDrawnLocked: freezingScreen");
440 } else {
441 setAppLayoutChanges(appAnimator,
442 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
443 "testTokenMayBeDrawnLocked");
Craig Mautnerf8924152013-07-16 09:10:55 -0700444
Craig Mautnerf81b90872013-02-26 13:02:43 -0800445 // We can now show all of the drawn windows!
446 if (!mService.mOpeningApps.contains(wtoken)) {
447 mAnimating |= appAnimator.showAllWindowsLocked();
448 }
Craig Mautner6fbda632012-07-03 09:26:39 -0700449 }
Craig Mautner764983d2012-03-22 11:37:36 -0700450 }
451 }
452 }
453 }
454 }
455
Craig Mautnera91f9e22012-09-14 16:22:08 -0700456 private void performAnimationsLocked(final int displayId) {
457 updateWindowsLocked(displayId);
458 updateWallpaperLocked(displayId);
Craig Mautner764983d2012-03-22 11:37:36 -0700459 }
460
Craig Mautner1420b932012-12-28 17:14:38 -0800461
462 /** Locked on mService.mWindowMap. */
Craig Mautner1caa3992012-06-22 09:46:48 -0700463 private void animateLocked() {
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700464 if (!mInitialized) {
465 return;
466 }
Craig Mautner59c00972012-07-30 12:10:24 -0700467
Craig Mautner764983d2012-03-22 11:37:36 -0700468 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700469 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700470 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700471 mAnimating = false;
472 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
473 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
474 }
Craig Mautner764983d2012-03-22 11:37:36 -0700475
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700476 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
477 TAG, ">>> OPEN TRANSACTION animateLocked");
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800478 SurfaceControl.openTransaction();
479 SurfaceControl.setAnimationTransaction();
Craig Mautner764983d2012-03-22 11:37:36 -0700480 try {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700481 final int numDisplays = mDisplayContentsAnimators.size();
482 for (int i = 0; i < numDisplays; i++) {
483 final int displayId = mDisplayContentsAnimators.keyAt(i);
Craig Mautnerb1fd65c02013-02-05 13:34:57 -0800484 updateAppWindowsLocked(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700485 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
486
487 final ScreenRotationAnimation screenRotationAnimation =
488 displayAnimator.mScreenRotationAnimation;
489 if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
490 if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
491 mAnimating = true;
492 } else {
493 mBulkUpdateParams |= SET_UPDATE_ROTATION;
494 screenRotationAnimation.kill();
495 displayAnimator.mScreenRotationAnimation = null;
496 }
497 }
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700498
499 // Update animations of all applications, including those
500 // associated with exiting/removed apps
Craig Mautnera91f9e22012-09-14 16:22:08 -0700501 performAnimationsLocked(displayId);
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700502
Craig Mautner96868332012-12-04 14:29:11 -0800503 final WindowList windows = mService.getWindowListLocked(displayId);
504 final int N = windows.size();
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700505 for (int j = 0; j < N; j++) {
Craig Mautner96868332012-12-04 14:29:11 -0800506 windows.get(j).mWinAnimator.prepareSurfaceLocked(true);
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700507 }
508 }
509
Craig Mautnera91f9e22012-09-14 16:22:08 -0700510 for (int i = 0; i < numDisplays; i++) {
511 final int displayId = mDisplayContentsAnimators.keyAt(i);
Craig Mautnerb1fd65c02013-02-05 13:34:57 -0800512
513 testTokenMayBeDrawnLocked(displayId);
514
Craig Mautner11462cc2013-05-13 15:56:18 -0700515 final ScreenRotationAnimation screenRotationAnimation =
516 mDisplayContentsAnimators.valueAt(i).mScreenRotationAnimation;
517 if (screenRotationAnimation != null) {
518 screenRotationAnimation.updateSurfacesInTransaction();
519 }
520
Craig Mautner05d29032013-05-03 13:40:13 -0700521 mAnimating |= mService.getDisplayContentLocked(displayId).animateDimLayers();
Craig Mautner1420b932012-12-28 17:14:38 -0800522
Svetoslav Ganov545252f2012-12-10 18:29:24 -0800523 //TODO (multidisplay): Magnification is supported only for the default display.
524 if (mService.mDisplayMagnifier != null && displayId == Display.DEFAULT_DISPLAY) {
525 mService.mDisplayMagnifier.drawMagnifiedRegionBorderIfNeededLocked();
526 }
Craig Mautner764983d2012-03-22 11:37:36 -0700527 }
528
Craig Mautnerf7666462013-04-28 08:58:21 -0700529 mService.setFocusedStackLayer();
530
Craig Mautner7358fbf2012-04-12 21:06:33 -0700531 if (mService.mWatermark != null) {
532 mService.mWatermark.drawIfNeeded();
533 }
Craig Mautner764983d2012-03-22 11:37:36 -0700534 } catch (RuntimeException e) {
535 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
536 } finally {
Mathias Agopian3866f0d2013-02-11 22:08:48 -0800537 SurfaceControl.closeTransaction();
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700538 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
539 TAG, "<<< CLOSE TRANSACTION animateLocked");
540 }
541
Craig Mautner66f78d72012-12-04 16:46:50 -0800542 boolean hasPendingLayoutChanges = false;
Craig Mautnerf8924152013-07-16 09:10:55 -0700543 final int numDisplays = mService.mDisplayContents.size();
544 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Craig Mautner0f4ab972013-07-19 11:01:05 -0700545 final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx);
Craig Mautner66f78d72012-12-04 16:46:50 -0800546 final int pendingChanges = getPendingLayoutChanges(displayContent.getDisplayId());
547 if ((pendingChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
Craig Mautner96868332012-12-04 14:29:11 -0800548 mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING;
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700549 }
Craig Mautner66f78d72012-12-04 16:46:50 -0800550 if (pendingChanges != 0) {
551 hasPendingLayoutChanges = true;
552 }
Craig Mautner764983d2012-03-22 11:37:36 -0700553 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700554
Craig Mautner66f78d72012-12-04 16:46:50 -0800555 boolean doRequest = false;
556 if (mBulkUpdateParams != 0) {
557 doRequest = mService.copyAnimToLayoutParamsLocked();
558 }
559
560 if (hasPendingLayoutChanges || doRequest) {
561 mService.requestTraversalLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700562 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700563
564 if (mAnimating) {
Craig Mautner96868332012-12-04 14:29:11 -0800565 mService.scheduleAnimationLocked();
Chet Haase198e5642012-05-10 09:55:15 -0700566 } else if (wasAnimating) {
567 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700568 }
569 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
570 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
571 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
Craig Mautner76a71652012-09-03 23:23:58 -0700572 + " mPendingLayoutChanges(DEFAULT_DISPLAY)="
Craig Mautner66f78d72012-12-04 16:46:50 -0800573 + Integer.toHexString(getPendingLayoutChanges(Display.DEFAULT_DISPLAY)));
Craig Mautner7d8df392012-04-06 15:26:23 -0700574 }
Craig Mautner764983d2012-03-22 11:37:36 -0700575 }
576
Dianne Hackborn529e7442012-11-01 14:22:28 -0700577 static String bulkUpdateParamsToString(int bulkUpdateParams) {
578 StringBuilder builder = new StringBuilder(128);
579 if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
580 builder.append(" UPDATE_ROTATION");
581 }
582 if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
583 builder.append(" WALLPAPER_MAY_CHANGE");
584 }
585 if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
586 builder.append(" FORCE_HIDING_CHANGED");
587 }
588 if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) != 0) {
589 builder.append(" ORIENTATION_CHANGE_COMPLETE");
590 }
591 if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
592 builder.append(" TURN_ON_SCREEN");
593 }
594 return builder.toString();
595 }
596
Craig Mautnera91f9e22012-09-14 16:22:08 -0700597 public void dumpLocked(PrintWriter pw, String prefix, boolean dumpAll) {
Dianne Hackborn529e7442012-11-01 14:22:28 -0700598 final String subPrefix = " " + prefix;
599 final String subSubPrefix = " " + subPrefix;
600
Dianne Hackborn529e7442012-11-01 14:22:28 -0700601 for (int i = 0; i < mDisplayContentsAnimators.size(); i++) {
602 pw.print(prefix); pw.print("DisplayContentsAnimator #");
603 pw.print(mDisplayContentsAnimators.keyAt(i));
604 pw.println(":");
605 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
Craig Mautner96868332012-12-04 14:29:11 -0800606 final WindowList windows =
607 mService.getWindowListLocked(mDisplayContentsAnimators.keyAt(i));
608 final int N = windows.size();
609 for (int j = 0; j < N; j++) {
610 WindowStateAnimator wanim = windows.get(j).mWinAnimator;
Dianne Hackborn529e7442012-11-01 14:22:28 -0700611 pw.print(subPrefix); pw.print("Window #"); pw.print(j);
612 pw.print(": "); pw.println(wanim);
613 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700614 if (displayAnimator.mScreenRotationAnimation != null) {
615 pw.print(subPrefix); pw.println("mScreenRotationAnimation:");
616 displayAnimator.mScreenRotationAnimation.printTo(subSubPrefix, pw);
617 } else if (dumpAll) {
618 pw.print(subPrefix); pw.println("no ScreenRotationAnimation ");
619 }
620 }
621
622 pw.println();
623
624 if (dumpAll) {
625 pw.print(prefix); pw.print("mAnimTransactionSequence=");
626 pw.print(mAnimTransactionSequence);
627 pw.print(" mForceHiding="); pw.println(forceHidingToString());
628 pw.print(prefix); pw.print("mCurrentTime=");
629 pw.println(TimeUtils.formatUptime(mCurrentTime));
Dianne Hackborn529e7442012-11-01 14:22:28 -0700630 }
631 if (mBulkUpdateParams != 0) {
632 pw.print(prefix); pw.print("mBulkUpdateParams=0x");
633 pw.print(Integer.toHexString(mBulkUpdateParams));
634 pw.println(bulkUpdateParamsToString(mBulkUpdateParams));
635 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700636 if (mWindowDetachedWallpaper != null) {
637 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
638 pw.println(mWindowDetachedWallpaper);
639 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700640 if (mUniverseBackground != null) {
641 pw.print(prefix); pw.print("mUniverseBackground="); pw.print(mUniverseBackground);
642 pw.print(" mAboveUniverseLayer="); pw.println(mAboveUniverseLayer);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700643 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700644 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700645
Craig Mautner66f78d72012-12-04 16:46:50 -0800646 int getPendingLayoutChanges(final int displayId) {
647 return mService.getDisplayContentLocked(displayId).pendingLayoutChanges;
648 }
649
Craig Mautner76a71652012-09-03 23:23:58 -0700650 void setPendingLayoutChanges(final int displayId, final int changes) {
Craig Mautner66f78d72012-12-04 16:46:50 -0800651 mService.getDisplayContentLocked(displayId).pendingLayoutChanges |= changes;
Craig Mautner76a71652012-09-03 23:23:58 -0700652 }
653
654 void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) {
655 // Used to track which displays layout changes have been done.
Dianne Hackbornf4bf0ae2013-05-20 18:42:16 -0700656 SparseIntArray displays = new SparseIntArray(2);
Craig Mautner96868332012-12-04 14:29:11 -0800657 WindowList windows = appAnimator.mAppToken.allAppWindows;
658 for (int i = windows.size() - 1; i >= 0; i--) {
659 final int displayId = windows.get(i).getDisplayId();
Craig Mautner76a71652012-09-03 23:23:58 -0700660 if (displays.indexOfKey(displayId) < 0) {
661 setPendingLayoutChanges(displayId, changes);
662 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner66f78d72012-12-04 16:46:50 -0800663 mService.debugLayoutRepeats(s, getPendingLayoutChanges(displayId));
Craig Mautner76a71652012-09-03 23:23:58 -0700664 }
665 // Keep from processing this display again.
666 displays.put(displayId, changes);
667 }
668 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700669 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700670
671 private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
672 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
673 if (displayAnimator == null) {
Craig Mautner05d29032013-05-03 13:40:13 -0700674 displayAnimator = new DisplayContentsAnimator();
Craig Mautnera91f9e22012-09-14 16:22:08 -0700675 mDisplayContentsAnimators.put(displayId, displayAnimator);
676 }
677 return displayAnimator;
678 }
679
680 void setScreenRotationAnimationLocked(int displayId, ScreenRotationAnimation animation) {
681 getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation = animation;
682 }
683
684 ScreenRotationAnimation getScreenRotationAnimationLocked(int displayId) {
685 return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation;
686 }
687
Craig Mautnerac439e52012-09-21 08:58:34 -0700688 private class DisplayContentsAnimator {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700689 ScreenRotationAnimation mScreenRotationAnimation = null;
690 }
Craig Mautner764983d2012-03-22 11:37:36 -0700691}