blob: 73293b068ca28ec8948f7518dcb2921e2f55b88c [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;
Dianne Hackborn98129732012-11-01 16:28:16 -070016import android.os.Debug;
Craig Mautner764983d2012-03-22 11:37:36 -070017import android.os.SystemClock;
18import android.util.Log;
19import android.util.Slog;
Craig Mautnera91f9e22012-09-14 16:22:08 -070020import android.util.SparseArray;
Craig Mautner76a71652012-09-03 23:23:58 -070021import android.util.SparseIntArray;
Dianne Hackborn529e7442012-11-01 14:22:28 -070022import android.util.TimeUtils;
Craig Mautner6881a102012-07-27 13:04:51 -070023import android.view.Display;
Craig Mautner764983d2012-03-22 11:37:36 -070024import android.view.Surface;
Craig Mautner764983d2012-03-22 11:37:36 -070025import android.view.WindowManagerPolicy;
26import android.view.animation.Animation;
Craig Mautner764983d2012-03-22 11:37:36 -070027
Craig Mautner322e4032012-07-13 13:35:20 -070028import com.android.server.wm.WindowManagerService.AppWindowAnimParams;
Dianne Hackborn529e7442012-11-01 14:22:28 -070029import com.android.server.wm.WindowManagerService.LayoutFields;
Craig Mautner711f90a2012-07-03 18:43:52 -070030import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;
Craig Mautner764983d2012-03-22 11:37:36 -070031
Craig Mautnere7ae2502012-03-26 17:11:19 -070032import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070033import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070034
Craig Mautner764983d2012-03-22 11:37:36 -070035/**
Craig Mautner764983d2012-03-22 11:37:36 -070036 * Singleton class that carries out the animations and Surface operations in a separate task
37 * on behalf of WindowManagerService.
38 */
39public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070040 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070041
42 final WindowManagerService mService;
43 final Context mContext;
44 final WindowManagerPolicy mPolicy;
45
46 boolean mAnimating;
Craig Mautner01cd0e72012-06-18 10:19:11 -070047
Craig Mautner1caa3992012-06-22 09:46:48 -070048 final Runnable mAnimationRunnable;
49
Craig Mautner764983d2012-03-22 11:37:36 -070050 int mAdjResult;
51
Craig Mautner76a71652012-09-03 23:23:58 -070052 // Layout changes for individual Displays. Indexed by displayId.
53 SparseIntArray mPendingLayoutChanges = new SparseIntArray();
Craig Mautner764983d2012-03-22 11:37:36 -070054
Craig Mautner764983d2012-03-22 11:37:36 -070055 /** Time of current animation step. Reset on each iteration */
56 long mCurrentTime;
57
58 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
59 * 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 -070060 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070061
Craig Mautnere7ae2502012-03-26 17:11:19 -070062 // Window currently running an animation that has requested it be detached
63 // from the wallpaper. This means we need to ensure the wallpaper is
64 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070065 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070066 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070067
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070068 WindowStateAnimator mUniverseBackground = null;
69 int mAboveUniverseLayer = 0;
70
Craig Mautnera608b882012-03-30 13:03:49 -070071 int mBulkUpdateParams = 0;
72
Craig Mautnera91f9e22012-09-14 16:22:08 -070073 SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators =
74 new SparseArray<WindowAnimator.DisplayContentsAnimator>();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070075
Craig Mautner4d7349b2012-04-20 14:52:47 -070076 static final int WALLPAPER_ACTION_PENDING = 1;
77 int mPendingActions;
78
Craig Mautner1caa3992012-06-22 09:46:48 -070079 WindowState mWallpaperTarget = null;
Craig Mautner918b53b2012-07-09 14:15:54 -070080 AppWindowAnimator mWpAppAnimator = null;
81 WindowState mLowerWallpaperTarget = null;
82 WindowState mUpperWallpaperTarget = null;
Craig Mautner1caa3992012-06-22 09:46:48 -070083
Craig Mautner322e4032012-07-13 13:35:20 -070084 ArrayList<AppWindowAnimator> mAppAnimators = new ArrayList<AppWindowAnimator>();
85
Craig Mautner918b53b2012-07-09 14:15:54 -070086 ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
87
88 /** Parameters being passed from this into mService. */
89 static class AnimatorToLayoutParams {
90 boolean mUpdateQueued;
91 int mBulkUpdateParams;
Craig Mautner76a71652012-09-03 23:23:58 -070092 SparseIntArray mPendingLayoutChanges;
Craig Mautner918b53b2012-07-09 14:15:54 -070093 WindowState mWindowDetachedWallpaper;
94 }
95 /** Do not modify unless holding mService.mWindowMap or this and mAnimToLayout in that order */
Craig Mautner711f90a2012-07-03 18:43:52 -070096 final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();
97
Craig Mautnerb47bbc32012-08-22 17:41:48 -070098 boolean mInitialized = false;
99
Craig Mautner178af592012-09-17 10:37:29 -0700100 // forceHiding states.
101 static final int KEYGUARD_NOT_SHOWN = 0;
102 static final int KEYGUARD_ANIMATING_IN = 1;
103 static final int KEYGUARD_SHOWN = 2;
104 static final int KEYGUARD_ANIMATING_OUT = 3;
105 int mForceHiding = KEYGUARD_NOT_SHOWN;
106
107 private String forceHidingToString() {
108 switch (mForceHiding) {
109 case KEYGUARD_NOT_SHOWN: return "KEYGUARD_NOT_SHOWN";
110 case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN";
111 case KEYGUARD_SHOWN: return "KEYGUARD_SHOWN";
112 case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT";
113 default: return "KEYGUARD STATE UNKNOWN " + mForceHiding;
114 }
115 }
116
Craig Mautner918b53b2012-07-09 14:15:54 -0700117 WindowAnimator(final WindowManagerService service) {
Craig Mautner764983d2012-03-22 11:37:36 -0700118 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -0700119 mContext = service.mContext;
120 mPolicy = service.mPolicy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700121
122 mAnimationRunnable = new Runnable() {
123 @Override
124 public void run() {
125 // TODO(cmautner): When full isolation is achieved for animation, the first lock
126 // goes away and only the WindowAnimator.this remains.
127 synchronized(mService.mWindowMap) {
128 synchronized(WindowAnimator.this) {
129 copyLayoutToAnimParamsLocked();
130 animateLocked();
131 }
132 }
133 }
134 };
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700135 }
Craig Mautner9e809442012-06-22 17:13:04 -0700136
Craig Mautnera91f9e22012-09-14 16:22:08 -0700137 void addDisplayLocked(final int displayId) {
Craig Mautnerac439e52012-09-21 08:58:34 -0700138 // Create the DisplayContentsAnimator object by retrieving it.
139 getDisplayContentsAnimatorLocked(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700140 if (displayId == Display.DEFAULT_DISPLAY) {
141 mInitialized = true;
142 }
143 }
144
145 void removeDisplayLocked(final int displayId) {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700146 final DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
147 if (displayAnimator != null) {
148 if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
149 displayAnimator.mWindowAnimationBackgroundSurface.kill();
150 displayAnimator.mWindowAnimationBackgroundSurface = null;
151 }
152 if (displayAnimator.mScreenRotationAnimation != null) {
153 displayAnimator.mScreenRotationAnimation.kill();
154 displayAnimator.mScreenRotationAnimation = null;
155 }
156 if (displayAnimator.mDimAnimator != null) {
157 displayAnimator.mDimAnimator.kill();
158 displayAnimator.mDimAnimator = null;
159 }
160 }
161
Craig Mautnera91f9e22012-09-14 16:22:08 -0700162 mDisplayContentsAnimators.delete(displayId);
Craig Mautner1caa3992012-06-22 09:46:48 -0700163 }
164
Craig Mautner711f90a2012-07-03 18:43:52 -0700165 /** Locked on mAnimToLayout */
166 void updateAnimToLayoutLocked() {
167 final AnimatorToLayoutParams animToLayout = mAnimToLayout;
168 synchronized (animToLayout) {
169 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
Craig Mautner76a71652012-09-03 23:23:58 -0700170 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges.clone();
Craig Mautner711f90a2012-07-03 18:43:52 -0700171 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
172
173 if (!animToLayout.mUpdateQueued) {
174 animToLayout.mUpdateQueued = true;
175 mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
176 }
177 }
178 }
179
Craig Mautner1caa3992012-06-22 09:46:48 -0700180 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
181 private void copyLayoutToAnimParamsLocked() {
Craig Mautner711f90a2012-07-03 18:43:52 -0700182 final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
Craig Mautner1caa3992012-06-22 09:46:48 -0700183 synchronized(layoutToAnim) {
184 layoutToAnim.mAnimationScheduled = false;
185
Craig Mautner322e4032012-07-13 13:35:20 -0700186 if (!layoutToAnim.mParamsModified) {
187 return;
188 }
189 layoutToAnim.mParamsModified = false;
190
Craig Mautner918b53b2012-07-09 14:15:54 -0700191 if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) {
192 layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED;
193 mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
194 }
195
Dianne Hackborn529e7442012-11-01 14:22:28 -0700196 if (WindowManagerService.DEBUG_WALLPAPER_LIGHT) {
197 if (mWallpaperTarget != layoutToAnim.mWallpaperTarget
198 || mLowerWallpaperTarget != layoutToAnim.mLowerWallpaperTarget
199 || mUpperWallpaperTarget != layoutToAnim.mUpperWallpaperTarget) {
Dianne Hackborn98129732012-11-01 16:28:16 -0700200 Slog.d(TAG, "Pulling anim wallpaper: target=" + layoutToAnim.mWallpaperTarget
201 + " lower=" + layoutToAnim.mLowerWallpaperTarget + " upper="
202 + layoutToAnim.mUpperWallpaperTarget);
Dianne Hackborn529e7442012-11-01 14:22:28 -0700203 }
204 }
Craig Mautner1caa3992012-06-22 09:46:48 -0700205 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
Craig Mautner918b53b2012-07-09 14:15:54 -0700206 mWpAppAnimator = mWallpaperTarget == null
207 ? null : mWallpaperTarget.mAppToken == null
208 ? null : mWallpaperTarget.mAppToken.mAppAnimator;
209 mLowerWallpaperTarget = layoutToAnim.mLowerWallpaperTarget;
210 mUpperWallpaperTarget = layoutToAnim.mUpperWallpaperTarget;
Craig Mautnera76fdb72012-07-03 19:03:02 -0700211
212 // Set the new DimAnimator params.
Craig Mautnera91f9e22012-09-14 16:22:08 -0700213 final int numDisplays = mDisplayContentsAnimators.size();
214 for (int i = 0; i < numDisplays; i++) {
215 final int displayId = mDisplayContentsAnimators.keyAt(i);
216 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
Craig Mautnera76fdb72012-07-03 19:03:02 -0700217
Craig Mautnera91f9e22012-09-14 16:22:08 -0700218 displayAnimator.mWinAnimators.clear();
219 final WinAnimatorList winAnimators = layoutToAnim.mWinAnimatorLists.get(displayId);
220 if (winAnimators != null) {
221 displayAnimator.mWinAnimators.addAll(winAnimators);
222 }
223
224 DimAnimator.Parameters dimParams = layoutToAnim.mDimParams.get(displayId);
225 if (dimParams == null) {
226 displayAnimator.mDimParams = null;
227 } else {
228 final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
229
230 // Only set dim params on the highest dimmed layer.
231 final WindowStateAnimator existingDimWinAnimator =
232 displayAnimator.mDimParams == null ?
233 null : displayAnimator.mDimParams.mDimWinAnimator;
234 // Don't turn on for an unshown surface, or for any layer but the highest
235 // dimmed layer.
236 if (newWinAnimator.mSurfaceShown && (existingDimWinAnimator == null
237 || !existingDimWinAnimator.mSurfaceShown
238 || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
239 displayAnimator.mDimParams = new DimAnimator.Parameters(dimParams);
240 }
Craig Mautnera76fdb72012-07-03 19:03:02 -0700241 }
242 }
Craig Mautner322e4032012-07-13 13:35:20 -0700243
244 mAppAnimators.clear();
245 final int N = layoutToAnim.mAppWindowAnimParams.size();
246 for (int i = 0; i < N; i++) {
247 final AppWindowAnimParams params = layoutToAnim.mAppWindowAnimParams.get(i);
248 AppWindowAnimator appAnimator = params.mAppAnimator;
Craig Mautnerbea12bd2012-08-20 10:18:34 -0700249 appAnimator.mAllAppWinAnimators.clear();
250 appAnimator.mAllAppWinAnimators.addAll(params.mWinAnimators);
Craig Mautner322e4032012-07-13 13:35:20 -0700251 mAppAnimators.add(appAnimator);
252 }
Craig Mautner1caa3992012-06-22 09:46:48 -0700253 }
254 }
255
Dianne Hackborn98129732012-11-01 16:28:16 -0700256 void hideWallpapersLocked(final WindowState w, boolean fromAnimator) {
257 // There is an issue where this function can be called either from
258 // the animation or the layout side of the window manager. The problem
259 // is that if it is called from the layout side, we may not yet have
260 // propagated the current layout wallpaper state over into the animation
261 // state. If that is the case, we can do bad things like hide the
262 // wallpaper when we had just made it shown because the animation side
263 // doesn't yet see that there is now a wallpaper target. As a temporary
264 // work-around, we tell the function here which side of the window manager
265 // is calling so it can use the right state.
266 if (fromAnimator) {
267 hideWallpapersLocked(w, mWallpaperTarget, mLowerWallpaperTarget, mWallpaperTokens);
268 } else {
269 hideWallpapersLocked(w, mService.mWallpaperTarget,
270 mService.mLowerWallpaperTarget, mService.mWallpaperTokens);
271 }
272 }
273
274 void hideWallpapersLocked(final WindowState w, final WindowState wallpaperTarget,
275 final WindowState lowerWallpaperTarget, final ArrayList<WindowToken> wallpaperTokens) {
276 if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) {
277 final int numTokens = wallpaperTokens.size();
Craig Mautner918b53b2012-07-09 14:15:54 -0700278 for (int i = numTokens - 1; i >= 0; i--) {
Dianne Hackborn98129732012-11-01 16:28:16 -0700279 final WindowToken token = wallpaperTokens.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700280 final int numWindows = token.windows.size();
281 for (int j = numWindows - 1; j >= 0; j--) {
282 final WindowState wallpaper = token.windows.get(j);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700283 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
284 if (!winAnimator.mLastHidden) {
285 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700286 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautner76a71652012-09-03 23:23:58 -0700287 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
288 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700289 }
290 }
Dianne Hackbornef03a7f2012-10-29 18:46:52 -0700291 if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG,
Dianne Hackborn2ea9bae2012-11-02 18:43:48 -0700292 "Hiding wallpaper " + token + " from " + w
293 + " target=" + wallpaperTarget + " lower=" + lowerWallpaperTarget
294 + "\n" + Debug.getCallers(5, " "));
Craig Mautnerb9836b92012-06-11 11:40:09 -0700295 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700296 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700297 }
298 }
299
Craig Mautnera91f9e22012-09-14 16:22:08 -0700300 private void updateAppWindowsLocked() {
Craig Mautner764983d2012-03-22 11:37:36 -0700301 int i;
Craig Mautner322e4032012-07-13 13:35:20 -0700302 final int NAT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700303 for (i=0; i<NAT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700304 final AppWindowAnimator appAnimator = mAppAnimators.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700305 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700306 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner9339c402012-11-30 11:23:56 -0800307 if (appAnimator.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700308 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700309 } else if (wasAnimating) {
310 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700311 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
312 "appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700313 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
314 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700315 }
316 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700317
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700318 final int NEAT = mService.mExitingAppTokens.size();
319 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700320 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700321 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700322 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner9339c402012-11-30 11:23:56 -0800323 if (appAnimator.stepAnimationLocked(mCurrentTime)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700324 mAnimating = true;
325 } else if (wasAnimating) {
326 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700327 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
328 "exiting appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700329 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
330 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700331 }
332 }
Craig Mautner764983d2012-03-22 11:37:36 -0700333 }
334
Craig Mautnera91f9e22012-09-14 16:22:08 -0700335 private void updateWindowsLocked(final int displayId) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700336 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700337
Craig Mautnera91f9e22012-09-14 16:22:08 -0700338 final WinAnimatorList winAnimatorList =
339 getDisplayContentsAnimatorLocked(displayId).mWinAnimators;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700340 ArrayList<WindowStateAnimator> unForceHiding = null;
341 boolean wallpaperInUnForceHiding = false;
Craig Mautner178af592012-09-17 10:37:29 -0700342 mForceHiding = KEYGUARD_NOT_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700343
Craig Mautner59c00972012-07-30 12:10:24 -0700344 for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
345 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700346 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700347 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700348
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700349 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700350 final boolean wasAnimating = winAnimator.mWasAnimating;
351 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700352
353 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700354 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700355 ", nowAnimating=" + nowAnimating);
356 }
357
Craig Mautner918b53b2012-07-09 14:15:54 -0700358 if (wasAnimating && !winAnimator.mAnimating && mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700359 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700360 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
361 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700362 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700363 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
Craig Mautner76a71652012-09-03 23:23:58 -0700364 mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700365 }
Craig Mautner764983d2012-03-22 11:37:36 -0700366 }
367
Craig Mautnerbec53f72012-04-05 11:49:05 -0700368 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700369 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700370 if (WindowManagerService.DEBUG_ANIM ||
371 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
372 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700373 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner76a71652012-09-03 23:23:58 -0700374 setPendingLayoutChanges(displayId,
375 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700376 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700377 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
Craig Mautner76a71652012-09-03 23:23:58 -0700378 mPendingLayoutChanges.get(displayId));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700379 }
Craig Mautner764983d2012-03-22 11:37:36 -0700380 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700381 }
Craig Mautner4bf18a72012-07-10 14:08:16 -0700382 if (win.isReadyForDisplay()) {
383 if (nowAnimating) {
384 if (winAnimator.mAnimationIsEntrance) {
Craig Mautner178af592012-09-17 10:37:29 -0700385 mForceHiding = KEYGUARD_ANIMATING_IN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700386 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700387 mForceHiding = KEYGUARD_ANIMATING_OUT;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700388 }
389 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700390 mForceHiding = KEYGUARD_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700391 }
Craig Mautner764983d2012-03-22 11:37:36 -0700392 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700393 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner178af592012-09-17 10:37:29 -0700394 "Force hide " + mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700395 + " hasSurface=" + win.mHasSurface
396 + " policyVis=" + win.mPolicyVisibility
397 + " destroying=" + win.mDestroying
398 + " attHidden=" + win.mAttachedHidden
399 + " vis=" + win.mViewVisibility
400 + " hidden=" + win.mRootToken.hidden
401 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700402 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautner4bf18a72012-07-10 14:08:16 -0700403 final boolean hideWhenLocked =
404 (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700405 final boolean changed;
Craig Mautner178af592012-09-17 10:37:29 -0700406 if (((mForceHiding == KEYGUARD_ANIMATING_IN)
Craig Mautner4bf18a72012-07-10 14:08:16 -0700407 && (!winAnimator.isAnimating() || hideWhenLocked))
Craig Mautner178af592012-09-17 10:37:29 -0700408 || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700409 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700410 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700411 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700412 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700413 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700414 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700415 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700416 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700417 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700418 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700419 if (unForceHiding == null) {
420 unForceHiding = new ArrayList<WindowStateAnimator>();
421 }
422 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700423 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700424 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700425 }
426 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700427 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700428 // We are showing on to of the current
429 // focus, so re-evaluate focus to make
430 // sure it is correct.
431 mService.mFocusMayChange = true;
432 }
433 }
434 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700435 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700436 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700437 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
438 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700439 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700440 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
Craig Mautner76a71652012-09-03 23:23:58 -0700441 mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700442 }
Craig Mautner764983d2012-03-22 11:37:36 -0700443 }
444 }
445 }
446
Craig Mautnerbec53f72012-04-05 11:49:05 -0700447 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700448 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
449 if (atoken == null || atoken.allDrawn) {
450 if (winAnimator.performShowLocked()) {
Craig Mautner76a71652012-09-03 23:23:58 -0700451 mPendingLayoutChanges.put(displayId,
452 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
Craig Mautner6fbda632012-07-03 09:26:39 -0700453 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
454 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
Craig Mautner76a71652012-09-03 23:23:58 -0700455 mPendingLayoutChanges.get(displayId));
Craig Mautner764983d2012-03-22 11:37:36 -0700456 }
457 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700458 }
Craig Mautner764983d2012-03-22 11:37:36 -0700459 }
Craig Mautner322e4032012-07-13 13:35:20 -0700460 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700461 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700462 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
463 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700464 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700465 }
Craig Mautner59431632012-04-04 11:56:44 -0700466 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
467 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700468 }
469 }
Craig Mautner764983d2012-03-22 11:37:36 -0700470 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700471
Craig Mautner078ea0a2012-06-25 11:04:29 -0700472 // If we have windows that are being show due to them no longer
473 // being force-hidden, apply the appropriate animation to them.
474 if (unForceHiding != null) {
475 for (int i=unForceHiding.size()-1; i>=0; i--) {
476 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
477 if (a != null) {
478 final WindowStateAnimator winAnimator = unForceHiding.get(i);
479 winAnimator.setAnimation(a);
480 winAnimator.mAnimationIsEntrance = true;
481 }
482 }
483 }
484 }
485
Craig Mautnera91f9e22012-09-14 16:22:08 -0700486 private void updateWallpaperLocked(int displayId) {
487 final DisplayContentsAnimator displayAnimator =
488 getDisplayContentsAnimatorLocked(displayId);
489 final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700490 WindowStateAnimator windowAnimationBackground = null;
491 int windowAnimationBackgroundColor = 0;
492 WindowState detachedWallpaper = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700493 final DimSurface windowAnimationBackgroundSurface =
494 displayAnimator.mWindowAnimationBackgroundSurface;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700495
Craig Mautner59c00972012-07-30 12:10:24 -0700496 for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
497 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner078ea0a2012-06-25 11:04:29 -0700498 if (winAnimator.mSurface == null) {
499 continue;
500 }
501
502 final int flags = winAnimator.mAttrFlags;
503 final WindowState win = winAnimator.mWin;
504
505 // If this window is animating, make a note that we have
506 // an animating window and take care of a request to run
507 // a detached wallpaper animation.
508 if (winAnimator.mAnimating) {
509 if (winAnimator.mAnimation != null) {
510 if ((flags & FLAG_SHOW_WALLPAPER) != 0
511 && winAnimator.mAnimation.getDetachWallpaper()) {
512 detachedWallpaper = win;
513 }
514 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
515 if (backgroundColor != 0) {
516 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
517 windowAnimationBackground.mAnimLayer)) {
518 windowAnimationBackground = winAnimator;
519 windowAnimationBackgroundColor = backgroundColor;
520 }
521 }
522 }
523 mAnimating = true;
524 }
525
526 // If this window's app token is running a detached wallpaper
527 // animation, make a note so we can ensure the wallpaper is
528 // displayed behind it.
Craig Mautner322e4032012-07-13 13:35:20 -0700529 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700530 if (appAnimator != null && appAnimator.animation != null
531 && appAnimator.animating) {
532 if ((flags & FLAG_SHOW_WALLPAPER) != 0
533 && appAnimator.animation.getDetachWallpaper()) {
534 detachedWallpaper = win;
535 }
536
537 final int backgroundColor = appAnimator.animation.getBackgroundColor();
538 if (backgroundColor != 0) {
539 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
540 windowAnimationBackground.mAnimLayer)) {
541 windowAnimationBackground = winAnimator;
542 windowAnimationBackgroundColor = backgroundColor;
543 }
544 }
545 }
546 } // end forall windows
547
Craig Mautner9e809442012-06-22 17:13:04 -0700548 if (mWindowDetachedWallpaper != detachedWallpaper) {
549 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
550 "Detached wallpaper changed from " + mWindowDetachedWallpaper
551 + " to " + detachedWallpaper);
552 mWindowDetachedWallpaper = detachedWallpaper;
553 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
554 }
555
556 if (windowAnimationBackgroundColor != 0) {
557 // If the window that wants black is the current wallpaper
558 // target, then the black goes *below* the wallpaper so we
559 // don't cause the wallpaper to suddenly disappear.
560 int animLayer = windowAnimationBackground.mAnimLayer;
561 WindowState win = windowAnimationBackground.mWin;
Craig Mautner59c00972012-07-30 12:10:24 -0700562 if (mWallpaperTarget == win
Craig Mautner918b53b2012-07-09 14:15:54 -0700563 || mLowerWallpaperTarget == win || mUpperWallpaperTarget == win) {
Craig Mautner59c00972012-07-30 12:10:24 -0700564 final int N = winAnimatorList.size();
Craig Mautner9e809442012-06-22 17:13:04 -0700565 for (int i = 0; i < N; i++) {
Craig Mautner59c00972012-07-30 12:10:24 -0700566 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700567 if (winAnimator.mIsWallpaper) {
Craig Mautner9e809442012-06-22 17:13:04 -0700568 animLayer = winAnimator.mAnimLayer;
569 break;
570 }
571 }
572 }
573
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700574 if (windowAnimationBackgroundSurface != null) {
Craig Mautner9339c402012-11-30 11:23:56 -0800575 windowAnimationBackgroundSurface.show(
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700576 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
577 windowAnimationBackgroundColor);
578 }
Craig Mautner9e809442012-06-22 17:13:04 -0700579 } else {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700580 if (windowAnimationBackgroundSurface != null) {
581 windowAnimationBackgroundSurface.hide();
582 }
Craig Mautner9e809442012-06-22 17:13:04 -0700583 }
Craig Mautner764983d2012-03-22 11:37:36 -0700584 }
585
Craig Mautner9339c402012-11-30 11:23:56 -0800586 /** See if any windows have been drawn, so they (and others associated with them) can now be
587 * shown. */
Craig Mautner764983d2012-03-22 11:37:36 -0700588 private void testTokenMayBeDrawnLocked() {
Craig Mautner322e4032012-07-13 13:35:20 -0700589 final int NT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700590 for (int i=0; i<NT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700591 AppWindowAnimator appAnimator = mAppAnimators.get(i);
592 AppWindowToken wtoken = appAnimator.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700593 final boolean allDrawn = wtoken.allDrawn;
Craig Mautner322e4032012-07-13 13:35:20 -0700594 if (allDrawn != appAnimator.allDrawn) {
595 appAnimator.allDrawn = allDrawn;
Craig Mautner6fbda632012-07-03 09:26:39 -0700596 if (allDrawn) {
597 // The token has now changed state to having all
598 // windows shown... what to do, what to do?
Craig Mautner322e4032012-07-13 13:35:20 -0700599 if (appAnimator.freezingScreen) {
600 appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700601 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
602 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
603 "Setting mOrientationChangeComplete=true because wtoken "
604 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
605 + " numDrawn=" + wtoken.numDrawnWindows);
606 // This will set mOrientationChangeComplete and cause a pass through layout.
Craig Mautner76a71652012-09-03 23:23:58 -0700607 setAppLayoutChanges(appAnimator,
608 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
609 "testTokenMayBeDrawnLocked: freezingScreen");
Craig Mautner6fbda632012-07-03 09:26:39 -0700610 } else {
Craig Mautner76a71652012-09-03 23:23:58 -0700611 setAppLayoutChanges(appAnimator,
612 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
613 "testTokenMayBeDrawnLocked");
614
Craig Mautner6fbda632012-07-03 09:26:39 -0700615 // We can now show all of the drawn windows!
616 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautner322e4032012-07-13 13:35:20 -0700617 mAnimating |= appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700618 }
Craig Mautner764983d2012-03-22 11:37:36 -0700619 }
620 }
621 }
622 }
623 }
624
Craig Mautnera91f9e22012-09-14 16:22:08 -0700625 private void performAnimationsLocked(final int displayId) {
626 updateWindowsLocked(displayId);
627 updateWallpaperLocked(displayId);
Craig Mautner764983d2012-03-22 11:37:36 -0700628 }
629
Craig Mautner1caa3992012-06-22 09:46:48 -0700630 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
631 /** Locked on mService.mWindowMap and this. */
632 private void animateLocked() {
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700633 if (!mInitialized) {
634 return;
635 }
Craig Mautner59c00972012-07-30 12:10:24 -0700636
Craig Mautner76a71652012-09-03 23:23:58 -0700637 mPendingLayoutChanges.clear();
Craig Mautner764983d2012-03-22 11:37:36 -0700638 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700639 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700640 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700641 mAnimating = false;
642 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
643 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
644 }
Craig Mautner764983d2012-03-22 11:37:36 -0700645
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700646 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
647 TAG, ">>> OPEN TRANSACTION animateLocked");
Craig Mautner764983d2012-03-22 11:37:36 -0700648 Surface.openTransaction();
Jamie Gennisb6ce6e42012-10-15 19:14:58 -0700649 Surface.setAnimationTransaction();
Craig Mautner764983d2012-03-22 11:37:36 -0700650 try {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700651 updateAppWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700652
Craig Mautnera91f9e22012-09-14 16:22:08 -0700653 final int numDisplays = mDisplayContentsAnimators.size();
654 for (int i = 0; i < numDisplays; i++) {
655 final int displayId = mDisplayContentsAnimators.keyAt(i);
656 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
657
658 final ScreenRotationAnimation screenRotationAnimation =
659 displayAnimator.mScreenRotationAnimation;
660 if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
661 if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
662 mAnimating = true;
663 } else {
664 mBulkUpdateParams |= SET_UPDATE_ROTATION;
665 screenRotationAnimation.kill();
666 displayAnimator.mScreenRotationAnimation = null;
667 }
668 }
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700669
670 // Update animations of all applications, including those
671 // associated with exiting/removed apps
Craig Mautnera91f9e22012-09-14 16:22:08 -0700672 performAnimationsLocked(displayId);
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700673
Craig Mautnera91f9e22012-09-14 16:22:08 -0700674 final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators;
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700675 final int N = winAnimatorList.size();
676 for (int j = 0; j < N; j++) {
677 winAnimatorList.get(j).prepareSurfaceLocked(true);
678 }
679 }
680
681 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700682
Craig Mautnera91f9e22012-09-14 16:22:08 -0700683 for (int i = 0; i < numDisplays; i++) {
684 final int displayId = mDisplayContentsAnimators.keyAt(i);
685 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
Craig Mautner764983d2012-03-22 11:37:36 -0700686
Craig Mautnera91f9e22012-09-14 16:22:08 -0700687 final ScreenRotationAnimation screenRotationAnimation =
688 displayAnimator.mScreenRotationAnimation;
689 if (screenRotationAnimation != null) {
690 screenRotationAnimation.updateSurfacesInTransaction();
691 }
692
693 final DimAnimator.Parameters dimParams = displayAnimator.mDimParams;
694 final DimAnimator dimAnimator = displayAnimator.mDimAnimator;
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700695 if (dimAnimator != null && dimParams != null) {
696 dimAnimator.updateParameters(mContext.getResources(), dimParams, mCurrentTime);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700697 }
698 if (dimAnimator != null && dimAnimator.mDimShown) {
699 mAnimating |= dimAnimator.updateSurface(isDimmingLocked(displayId),
700 mCurrentTime, !mService.okToDisplay());
701 }
Craig Mautner764983d2012-03-22 11:37:36 -0700702 }
703
Craig Mautner7358fbf2012-04-12 21:06:33 -0700704 if (mService.mWatermark != null) {
705 mService.mWatermark.drawIfNeeded();
706 }
Craig Mautner764983d2012-03-22 11:37:36 -0700707 } catch (RuntimeException e) {
708 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
709 } finally {
710 Surface.closeTransaction();
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700711 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
712 TAG, "<<< CLOSE TRANSACTION animateLocked");
713 }
714
715 for (int i = mPendingLayoutChanges.size() - 1; i >= 0; i--) {
716 if ((mPendingLayoutChanges.valueAt(i)
717 & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
718 mPendingActions |= WALLPAPER_ACTION_PENDING;
719 }
Craig Mautner764983d2012-03-22 11:37:36 -0700720 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700721
Craig Mautner76a71652012-09-03 23:23:58 -0700722 if (mBulkUpdateParams != 0 || mPendingLayoutChanges.size() > 0) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700723 updateAnimToLayoutLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700724 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700725
726 if (mAnimating) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700727 synchronized (mService.mLayoutToAnim) {
728 mService.scheduleAnimationLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -0700729 }
Chet Haase198e5642012-05-10 09:55:15 -0700730 } else if (wasAnimating) {
731 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700732 }
733 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
734 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
735 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
Craig Mautner76a71652012-09-03 23:23:58 -0700736 + " mPendingLayoutChanges(DEFAULT_DISPLAY)="
737 + Integer.toHexString(mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY)));
Craig Mautner7d8df392012-04-06 15:26:23 -0700738 }
Craig Mautner764983d2012-03-22 11:37:36 -0700739 }
740
741 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700742 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700743 mCurrentFocus = currentFocus;
744 }
745
Craig Mautnera91f9e22012-09-14 16:22:08 -0700746 boolean isDimmingLocked(int displayId) {
747 return getDisplayContentsAnimatorLocked(displayId).mDimParams != null;
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700748 }
749
Craig Mautnera91f9e22012-09-14 16:22:08 -0700750 boolean isDimmingLocked(final WindowStateAnimator winAnimator) {
751 DimAnimator.Parameters dimParams =
752 getDisplayContentsAnimatorLocked(winAnimator.mWin.getDisplayId()).mDimParams;
753 return dimParams != null && dimParams.mDimWinAnimator == winAnimator;
Craig Mautneracafd192012-05-10 10:41:02 -0700754 }
755
Dianne Hackborn529e7442012-11-01 14:22:28 -0700756 static String bulkUpdateParamsToString(int bulkUpdateParams) {
757 StringBuilder builder = new StringBuilder(128);
758 if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
759 builder.append(" UPDATE_ROTATION");
760 }
761 if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
762 builder.append(" WALLPAPER_MAY_CHANGE");
763 }
764 if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
765 builder.append(" FORCE_HIDING_CHANGED");
766 }
767 if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) != 0) {
768 builder.append(" ORIENTATION_CHANGE_COMPLETE");
769 }
770 if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
771 builder.append(" TURN_ON_SCREEN");
772 }
773 return builder.toString();
774 }
775
Craig Mautnera91f9e22012-09-14 16:22:08 -0700776 public void dumpLocked(PrintWriter pw, String prefix, boolean dumpAll) {
Dianne Hackborn529e7442012-11-01 14:22:28 -0700777 final String subPrefix = " " + prefix;
778 final String subSubPrefix = " " + subPrefix;
779
780 boolean needSep = false;
781 if (mAppAnimators.size() > 0) {
782 needSep = true;
783 pw.println(" App Animators:");
784 for (int i=mAppAnimators.size()-1; i>=0; i--) {
785 AppWindowAnimator anim = mAppAnimators.get(i);
786 pw.print(prefix); pw.print("App Animator #"); pw.print(i);
787 pw.print(' '); pw.print(anim);
788 if (dumpAll) {
789 pw.println(':');
790 anim.dump(pw, subPrefix, dumpAll);
791 } else {
792 pw.println();
793 }
Craig Mautner6fbda632012-07-03 09:26:39 -0700794 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700795 }
796 if (mWallpaperTokens.size() > 0) {
797 if (needSep) {
798 pw.println();
799 }
800 needSep = true;
801 pw.print(prefix); pw.println("Wallpaper tokens:");
802 for (int i=mWallpaperTokens.size()-1; i>=0; i--) {
803 WindowToken token = mWallpaperTokens.get(i);
804 pw.print(prefix); pw.print("Wallpaper #"); pw.print(i);
805 pw.print(' '); pw.print(token);
806 if (dumpAll) {
807 pw.println(':');
808 token.dump(pw, subPrefix);
809 } else {
810 pw.println();
811 }
812 }
813 }
814
815 if (needSep) {
816 pw.println();
817 }
818 for (int i = 0; i < mDisplayContentsAnimators.size(); i++) {
819 pw.print(prefix); pw.print("DisplayContentsAnimator #");
820 pw.print(mDisplayContentsAnimators.keyAt(i));
821 pw.println(":");
822 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
823 for (int j=0; j<displayAnimator.mWinAnimators.size(); j++) {
824 WindowStateAnimator wanim = displayAnimator.mWinAnimators.get(j);
825 pw.print(subPrefix); pw.print("Window #"); pw.print(j);
826 pw.print(": "); pw.println(wanim);
827 }
828 if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
829 if (dumpAll || displayAnimator.mWindowAnimationBackgroundSurface.mDimShown) {
830 pw.print(subPrefix); pw.println("mWindowAnimationBackgroundSurface:");
Craig Mautnera91f9e22012-09-14 16:22:08 -0700831 displayAnimator.mWindowAnimationBackgroundSurface.printTo(subSubPrefix, pw);
832 }
Craig Mautner6fbda632012-07-03 09:26:39 -0700833 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700834 if (displayAnimator.mDimAnimator != null) {
835 if (dumpAll || displayAnimator.mDimAnimator.mDimShown) {
836 pw.print(subPrefix); pw.println("mDimAnimator:");
837 displayAnimator.mDimAnimator.printTo(subSubPrefix, pw);
838 }
839 } else if (dumpAll) {
840 pw.print(subPrefix); pw.println("no DimAnimator ");
841 }
842 if (displayAnimator.mDimParams != null) {
843 pw.print(subPrefix); pw.println("mDimParams:");
844 displayAnimator.mDimParams.printTo(subSubPrefix, pw);
845 } else if (dumpAll) {
846 pw.print(subPrefix); pw.println("no DimParams ");
847 }
848 if (displayAnimator.mScreenRotationAnimation != null) {
849 pw.print(subPrefix); pw.println("mScreenRotationAnimation:");
850 displayAnimator.mScreenRotationAnimation.printTo(subSubPrefix, pw);
851 } else if (dumpAll) {
852 pw.print(subPrefix); pw.println("no ScreenRotationAnimation ");
853 }
854 }
855
856 pw.println();
857
858 if (dumpAll) {
859 pw.print(prefix); pw.print("mAnimTransactionSequence=");
860 pw.print(mAnimTransactionSequence);
861 pw.print(" mForceHiding="); pw.println(forceHidingToString());
862 pw.print(prefix); pw.print("mCurrentTime=");
863 pw.println(TimeUtils.formatUptime(mCurrentTime));
Dianne Hackborn529e7442012-11-01 14:22:28 -0700864 }
865 if (mBulkUpdateParams != 0) {
866 pw.print(prefix); pw.print("mBulkUpdateParams=0x");
867 pw.print(Integer.toHexString(mBulkUpdateParams));
868 pw.println(bulkUpdateParamsToString(mBulkUpdateParams));
869 }
870 if (mPendingActions != 0) {
871 pw.print(prefix); pw.print("mPendingActions=0x");
872 pw.println(Integer.toHexString(mPendingActions));
873 }
874 if (mWindowDetachedWallpaper != null) {
875 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
876 pw.println(mWindowDetachedWallpaper);
877 }
878 pw.print(prefix); pw.print("mWallpaperTarget="); pw.println(mWallpaperTarget);
879 pw.print(prefix); pw.print("mWpAppAnimator="); pw.println(mWpAppAnimator);
880 if (mLowerWallpaperTarget != null || mUpperWallpaperTarget != null) {
881 pw.print(prefix); pw.print("mLowerWallpaperTarget=");
882 pw.println(mLowerWallpaperTarget);
883 pw.print(prefix); pw.print("mUpperWallpaperTarget=");
884 pw.println(mUpperWallpaperTarget);
885 }
886 if (mUniverseBackground != null) {
887 pw.print(prefix); pw.print("mUniverseBackground="); pw.print(mUniverseBackground);
888 pw.print(" mAboveUniverseLayer="); pw.println(mAboveUniverseLayer);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700889 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700890 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700891
Craig Mautner76a71652012-09-03 23:23:58 -0700892 void clearPendingActions() {
893 synchronized (this) {
894 mPendingActions = 0;
895 }
896 }
897
898 void setPendingLayoutChanges(final int displayId, final int changes) {
899 mPendingLayoutChanges.put(displayId, mPendingLayoutChanges.get(displayId) | changes);
900 }
901
902 void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) {
903 // Used to track which displays layout changes have been done.
904 SparseIntArray displays = new SparseIntArray();
905 for (int i = appAnimator.mAllAppWinAnimators.size() - 1; i >= 0; i--) {
906 WindowStateAnimator winAnimator = appAnimator.mAllAppWinAnimators.get(i);
907 final int displayId = winAnimator.mWin.mDisplayContent.getDisplayId();
908 if (displays.indexOfKey(displayId) < 0) {
909 setPendingLayoutChanges(displayId, changes);
910 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
911 mService.debugLayoutRepeats(s, mPendingLayoutChanges.get(displayId));
912 }
913 // Keep from processing this display again.
914 displays.put(displayId, changes);
915 }
916 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700917 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700918
919 private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
920 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
921 if (displayAnimator == null) {
Craig Mautnerac439e52012-09-21 08:58:34 -0700922 displayAnimator = new DisplayContentsAnimator(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700923 mDisplayContentsAnimators.put(displayId, displayAnimator);
924 }
925 return displayAnimator;
926 }
927
928 void setScreenRotationAnimationLocked(int displayId, ScreenRotationAnimation animation) {
929 getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation = animation;
930 }
931
932 ScreenRotationAnimation getScreenRotationAnimationLocked(int displayId) {
933 return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation;
934 }
935
Craig Mautnerac439e52012-09-21 08:58:34 -0700936 private class DisplayContentsAnimator {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700937 WinAnimatorList mWinAnimators = new WinAnimatorList();
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700938 DimAnimator mDimAnimator = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700939 DimAnimator.Parameters mDimParams = null;
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700940 DimSurface mWindowAnimationBackgroundSurface = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700941 ScreenRotationAnimation mScreenRotationAnimation = null;
Craig Mautnerac439e52012-09-21 08:58:34 -0700942
943 public DisplayContentsAnimator(int displayId) {
944 mDimAnimator = new DimAnimator(mService.mFxSession, displayId);
Craig Mautner9339c402012-11-30 11:23:56 -0800945 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession,
946 mService.getDisplayContentLocked(displayId));
Craig Mautnerac439e52012-09-21 08:58:34 -0700947 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700948 }
Craig Mautner764983d2012-03-22 11:37:36 -0700949}