blob: 722776c5cee80975a85d1bc83e72d019308bf003 [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;
6
Craig Mautnera608b882012-03-30 13:03:49 -07007import static com.android.server.wm.WindowManagerService.LayoutFields.SET_UPDATE_ROTATION;
8import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_MAY_CHANGE;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -07009import static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED;
10
11import static com.android.server.wm.WindowManagerService.H.SET_DIM_PARAMETERS;
Craig Mautnera608b882012-03-30 13:03:49 -070012
Craig Mautner764983d2012-03-22 11:37:36 -070013import android.content.Context;
14import android.os.SystemClock;
15import android.util.Log;
16import android.util.Slog;
17import android.view.Surface;
18import android.view.WindowManager;
Craig Mautner764983d2012-03-22 11:37:36 -070019import android.view.WindowManagerPolicy;
20import android.view.animation.Animation;
Craig Mautner764983d2012-03-22 11:37:36 -070021
22import com.android.internal.policy.impl.PhoneWindowManager;
23
Craig Mautnere7ae2502012-03-26 17:11:19 -070024import java.io.PrintWriter;
25
Craig Mautner764983d2012-03-22 11:37:36 -070026/**
27 * @author cmautner@google.com (Craig Mautner)
28 * Singleton class that carries out the animations and Surface operations in a separate task
29 * on behalf of WindowManagerService.
30 */
31public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070032 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070033
34 final WindowManagerService mService;
35 final Context mContext;
36 final WindowManagerPolicy mPolicy;
37
38 boolean mAnimating;
Craig Mautner764983d2012-03-22 11:37:36 -070039 boolean mTokenMayBeDrawn;
40 boolean mForceHiding;
41 WindowState mWindowAnimationBackground;
42 int mWindowAnimationBackgroundColor;
43 int mAdjResult;
44
45 int mPendingLayoutChanges;
46
47 /** Overall window dimensions */
48 int mDw, mDh;
49
50 /** Interior window dimensions */
51 int mInnerDw, mInnerDh;
52
53 /** Time of current animation step. Reset on each iteration */
54 long mCurrentTime;
55
56 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
57 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
58 private int mTransactionSequence;
59
60 /** The one and only screen rotation if one is happening */
61 ScreenRotationAnimation mScreenRotationAnimation = null;
62
Craig Mautnere7ae2502012-03-26 17:11:19 -070063 // Window currently running an animation that has requested it be detached
64 // from the wallpaper. This means we need to ensure the wallpaper is
65 // visible behind it in case it animates in a way that would allow it to be
66 // seen.
67 WindowState mWindowDetachedWallpaper = null;
68 WindowState mDetachedWallpaper = null;
Craig Mautnere7ae2502012-03-26 17:11:19 -070069 DimSurface mWindowAnimationBackgroundSurface = null;
70
Craig Mautnera608b882012-03-30 13:03:49 -070071 int mBulkUpdateParams = 0;
72
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070073 DimAnimator mDimAnimator = null;
74 DimAnimator.Parameters mDimParams = null;
75
Craig Mautner764983d2012-03-22 11:37:36 -070076 WindowAnimator(final WindowManagerService service, final Context context,
77 final WindowManagerPolicy policy) {
78 mService = service;
79 mContext = context;
80 mPolicy = policy;
81 }
82
Craig Mautnere7ae2502012-03-26 17:11:19 -070083 private void testWallpaperAndBackgroundLocked() {
84 if (mWindowDetachedWallpaper != mDetachedWallpaper) {
85 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
86 "Detached wallpaper changed from " + mWindowDetachedWallpaper
87 + " to " + mDetachedWallpaper);
88 mWindowDetachedWallpaper = mDetachedWallpaper;
Craig Mautnera608b882012-03-30 13:03:49 -070089 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautnere7ae2502012-03-26 17:11:19 -070090 }
91
92 if (mWindowAnimationBackgroundColor != 0) {
93 // If the window that wants black is the current wallpaper
94 // target, then the black goes *below* the wallpaper so we
95 // don't cause the wallpaper to suddenly disappear.
96 WindowState target = mWindowAnimationBackground;
97 if (mService.mWallpaperTarget == target
98 || mService.mLowerWallpaperTarget == target
99 || mService.mUpperWallpaperTarget == target) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700100 final int N = mService.mWindows.size();
101 for (int i = 0; i < N; i++) {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700102 WindowState w = mService.mWindows.get(i);
103 if (w.mIsWallpaper) {
104 target = w;
105 break;
106 }
107 }
108 }
109 if (mWindowAnimationBackgroundSurface == null) {
110 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
111 }
112 final int dw = mDw;
113 final int dh = mDh;
114 mWindowAnimationBackgroundSurface.show(dw, dh,
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700115 target.mWinAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM,
Craig Mautnere7ae2502012-03-26 17:11:19 -0700116 mWindowAnimationBackgroundColor);
117 } else if (mWindowAnimationBackgroundSurface != null) {
118 mWindowAnimationBackgroundSurface.hide();
119 }
120 }
121
Craig Mautner764983d2012-03-22 11:37:36 -0700122 private void updateWindowsAppsAndRotationAnimationsLocked() {
123 int i;
124 final int NAT = mService.mAppTokens.size();
125 for (i=0; i<NAT; i++) {
126 final AppWindowToken appToken = mService.mAppTokens.get(i);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700127 final boolean wasAnimating = appToken.animation != null
128 && appToken.animation != WindowManagerService.sDummyAnimation;
Craig Mautner764983d2012-03-22 11:37:36 -0700129 if (appToken.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
130 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700131 } else if (wasAnimating) {
132 // stopped animating, do one more pass through the layout
133 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700134 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700135 mService.debugLayoutRepeats("appToken " + appToken + " done",
136 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700137 }
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700138 }
139 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700140
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700141 final int NEAT = mService.mExitingAppTokens.size();
142 for (i=0; i<NEAT; i++) {
143 final AppWindowToken appToken = mService.mExitingAppTokens.get(i);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700144 final boolean wasAnimating = appToken.animation != null
145 && appToken.animation != WindowManagerService.sDummyAnimation;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700146 if (appToken.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
147 mAnimating = true;
148 } else if (wasAnimating) {
149 // stopped animating, do one more pass through the layout
150 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700151 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700152 mService.debugLayoutRepeats("exiting appToken " + appToken + " done",
153 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700154 }
Craig Mautner764983d2012-03-22 11:37:36 -0700155 }
156 }
157
158 if (mScreenRotationAnimation != null &&
159 (mScreenRotationAnimation.isAnimating() ||
160 mScreenRotationAnimation.mFinishAnimReady)) {
161 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700162 mAnimating = true;
163 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700164 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700165 mScreenRotationAnimation.kill();
166 mScreenRotationAnimation = null;
167 }
168 }
169 }
170
171 private void updateWindowsAndWallpaperLocked() {
172 ++mTransactionSequence;
173
174 for (int i = mService.mWindows.size() - 1; i >= 0; i--) {
175 WindowState w = mService.mWindows.get(i);
Craig Mautnera2c77052012-03-26 12:14:43 -0700176 WindowStateAnimator winAnimator = w.mWinAnimator;
Craig Mautner764983d2012-03-22 11:37:36 -0700177 final WindowManager.LayoutParams attrs = w.mAttrs;
178
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700179 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700180 final boolean wasAnimating = winAnimator.mWasAnimating;
181 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700182
183 if (WindowManagerService.DEBUG_WALLPAPER) {
184 Slog.v(TAG, w + ": wasAnimating=" + wasAnimating +
185 ", nowAnimating=" + nowAnimating);
186 }
187
188 // If this window is animating, make a note that we have
189 // an animating window and take care of a request to run
190 // a detached wallpaper animation.
191 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700192 if (winAnimator.mAnimation != null) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700193 if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700194 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700195 mDetachedWallpaper = w;
Craig Mautner764983d2012-03-22 11:37:36 -0700196 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700197 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
198 if (backgroundColor != 0) {
Craig Mautner764983d2012-03-22 11:37:36 -0700199 if (mWindowAnimationBackground == null
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700200 || (winAnimator.mAnimLayer <
201 mWindowAnimationBackground.mWinAnimator.mAnimLayer)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700202 mWindowAnimationBackground = w;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700203 mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700204 }
205 }
206 }
207 mAnimating = true;
208 }
209
210 // If this window's app token is running a detached wallpaper
211 // animation, make a note so we can ensure the wallpaper is
212 // displayed behind it.
213 if (w.mAppToken != null && w.mAppToken.animation != null
214 && w.mAppToken.animating) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700215 if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0
Craig Mautner764983d2012-03-22 11:37:36 -0700216 && w.mAppToken.animation.getDetachWallpaper()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700217 mDetachedWallpaper = w;
Craig Mautner764983d2012-03-22 11:37:36 -0700218 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700219 final int backgroundColor = w.mAppToken.animation.getBackgroundColor();
220 if (backgroundColor != 0) {
Craig Mautner764983d2012-03-22 11:37:36 -0700221 if (mWindowAnimationBackground == null
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700222 || (winAnimator.mAnimLayer <
223 mWindowAnimationBackground.mWinAnimator.mAnimLayer)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700224 mWindowAnimationBackground = w;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700225 mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700226 }
227 }
228 }
229
Craig Mautnera2c77052012-03-26 12:14:43 -0700230 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == w) {
Craig Mautnera608b882012-03-30 13:03:49 -0700231 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700232 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700233 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700234 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
235 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700236 }
Craig Mautner764983d2012-03-22 11:37:36 -0700237 }
238
239 if (mPolicy.doesForceHide(w, attrs)) {
240 if (!wasAnimating && nowAnimating) {
241 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
242 "Animation started that could impact force hide: "
243 + w);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700244 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700245 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700246 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700247 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
248 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700249 }
Craig Mautner764983d2012-03-22 11:37:36 -0700250 mService.mFocusMayChange = true;
Craig Mautnera2c77052012-03-26 12:14:43 -0700251 } else if (w.isReadyForDisplay() && winAnimator.mAnimation == null) {
Craig Mautner764983d2012-03-22 11:37:36 -0700252 mForceHiding = true;
253 }
254 } else if (mPolicy.canBeForceHidden(w, attrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700255 final boolean changed;
Craig Mautner764983d2012-03-22 11:37:36 -0700256 if (mForceHiding) {
257 changed = w.hideLw(false, false);
258 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
259 "Now policy hidden: " + w);
260 } else {
261 changed = w.showLw(false, false);
262 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
263 "Now policy shown: " + w);
264 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700265 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautner764983d2012-03-22 11:37:36 -0700266 && w.isVisibleNow() /*w.isReadyForDisplay()*/) {
267 // Assume we will need to animate. If
268 // we don't (because the wallpaper will
269 // stay with the lock screen), then we will
270 // clean up later.
271 Animation a = mPolicy.createForceHideEnterAnimation();
272 if (a != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700273 winAnimator.setAnimation(a);
Craig Mautner764983d2012-03-22 11:37:36 -0700274 }
275 }
276 if (mCurrentFocus == null || mCurrentFocus.mLayer < w.mLayer) {
277 // We are showing on to of the current
278 // focus, so re-evaluate focus to make
279 // sure it is correct.
280 mService.mFocusMayChange = true;
281 }
282 }
283 }
284 if (changed && (attrs.flags
285 & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700286 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700287 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700288 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700289 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
290 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700291 }
Craig Mautner764983d2012-03-22 11:37:36 -0700292 }
293 }
294 }
295
296 final AppWindowToken atoken = w.mAppToken;
297 if (atoken != null && (!atoken.allDrawn || atoken.freezingScreen)) {
298 if (atoken.lastTransactionSequence != mTransactionSequence) {
299 atoken.lastTransactionSequence = mTransactionSequence;
300 atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
301 atoken.startingDisplayed = false;
302 }
303 if ((w.isOnScreen() || w.mAttrs.type
304 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
305 && !w.mExiting && !w.mDestroying) {
306 if (WindowManagerService.DEBUG_VISIBILITY ||
307 WindowManagerService.DEBUG_ORIENTATION) {
308 Slog.v(TAG, "Eval win " + w + ": isDrawn="
309 + w.isDrawnLw()
Craig Mautnera2c77052012-03-26 12:14:43 -0700310 + ", isAnimating=" + winAnimator.isAnimating());
Craig Mautner764983d2012-03-22 11:37:36 -0700311 if (!w.isDrawnLw()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700312 Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface
Craig Mautner764983d2012-03-22 11:37:36 -0700313 + " pv=" + w.mPolicyVisibility
Craig Mautner749a7bb2012-04-02 13:49:53 -0700314 + " mDrawState=" + winAnimator.mDrawState
Craig Mautner764983d2012-03-22 11:37:36 -0700315 + " ah=" + w.mAttachedHidden
316 + " th=" + atoken.hiddenRequested
Craig Mautnera2c77052012-03-26 12:14:43 -0700317 + " a=" + winAnimator.mAnimating);
Craig Mautner764983d2012-03-22 11:37:36 -0700318 }
319 }
320 if (w != atoken.startingWindow) {
321 if (!atoken.freezingScreen || !w.mAppFreezing) {
322 atoken.numInterestingWindows++;
323 if (w.isDrawnLw()) {
324 atoken.numDrawnWindows++;
325 if (WindowManagerService.DEBUG_VISIBILITY ||
326 WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG,
327 "tokenMayBeDrawn: " + atoken
328 + " freezingScreen=" + atoken.freezingScreen
329 + " mAppFreezing=" + w.mAppFreezing);
330 mTokenMayBeDrawn = true;
331 }
332 }
333 } else if (w.isDrawnLw()) {
334 atoken.startingDisplayed = true;
335 }
336 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700337 } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700338 if (winAnimator.performShowLocked()) {
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700339 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
340 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700341 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
342 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700343 }
344 }
Craig Mautner764983d2012-03-22 11:37:36 -0700345 }
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700346 if (atoken != null && atoken.thumbnail != null) {
347 if (atoken.thumbnailTransactionSeq != mTransactionSequence) {
348 atoken.thumbnailTransactionSeq = mTransactionSequence;
349 atoken.thumbnailLayer = 0;
350 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700351 if (atoken.thumbnailLayer < winAnimator.mAnimLayer) {
352 atoken.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700353 }
354 }
Craig Mautner764983d2012-03-22 11:37:36 -0700355 } // end forall windows
356 }
357
358 private void testTokenMayBeDrawnLocked() {
359 // See if any windows have been drawn, so they (and others
360 // associated with them) can now be shown.
361 final int NT = mService.mAppTokens.size();
362 for (int i=0; i<NT; i++) {
363 AppWindowToken wtoken = mService.mAppTokens.get(i);
364 if (wtoken.freezingScreen) {
365 int numInteresting = wtoken.numInterestingWindows;
366 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
367 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
368 "allDrawn: " + wtoken
369 + " interesting=" + numInteresting
370 + " drawn=" + wtoken.numDrawnWindows);
371 wtoken.showAllWindowsLocked();
372 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
373 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
374 "Setting mOrientationChangeComplete=true because wtoken "
375 + wtoken + " numInteresting=" + numInteresting
376 + " numDrawn=" + wtoken.numDrawnWindows);
Craig Mautner764983d2012-03-22 11:37:36 -0700377 }
378 } else if (!wtoken.allDrawn) {
379 int numInteresting = wtoken.numInterestingWindows;
380 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
381 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
382 "allDrawn: " + wtoken
383 + " interesting=" + numInteresting
384 + " drawn=" + wtoken.numDrawnWindows);
385 wtoken.allDrawn = true;
386 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700387 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700388 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
389 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700390 }
Craig Mautner764983d2012-03-22 11:37:36 -0700391
392 // We can now show all of the drawn windows!
393 if (!mService.mOpeningApps.contains(wtoken)) {
394 mAnimating |= wtoken.showAllWindowsLocked();
395 }
396 }
397 }
398 }
399 }
400
401 private void performAnimationsLocked() {
Craig Mautner764983d2012-03-22 11:37:36 -0700402 mTokenMayBeDrawn = false;
Craig Mautner764983d2012-03-22 11:37:36 -0700403 mForceHiding = false;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700404 mDetachedWallpaper = null;
Craig Mautner764983d2012-03-22 11:37:36 -0700405 mWindowAnimationBackground = null;
406 mWindowAnimationBackgroundColor = 0;
407
408 updateWindowsAndWallpaperLocked();
409
410 if (mTokenMayBeDrawn) {
411 testTokenMayBeDrawnLocked();
412 }
Craig Mautner764983d2012-03-22 11:37:36 -0700413 }
414
Craig Mautner764983d2012-03-22 11:37:36 -0700415 void animate() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700416 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700417 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700418 mBulkUpdateParams = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700419
420 // Update animations of all applications, including those
421 // associated with exiting/removed apps
422 Surface.openTransaction();
423
424 try {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700425 testWallpaperAndBackgroundLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700426 updateWindowsAppsAndRotationAnimationsLocked();
427 performAnimationsLocked();
428
429 // THIRD LOOP: Update the surfaces of all windows.
430
431 if (mScreenRotationAnimation != null) {
432 mScreenRotationAnimation.updateSurfaces();
433 }
434
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700435 for (int i = mService.mWindows.size() - 1; i >= 0; i--) {
Craig Mautner764983d2012-03-22 11:37:36 -0700436 WindowState w = mService.mWindows.get(i);
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700437 w.mWinAnimator.prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700438 }
439
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700440 if (mDimAnimator != null && mDimAnimator.mDimShown) {
441 mAnimating |= mDimAnimator.updateSurface(mService.mInnerFields.mDimming,
Craig Mautner764983d2012-03-22 11:37:36 -0700442 mCurrentTime, !mService.okToDisplay());
443 }
444
445 if (mService.mBlackFrame != null) {
446 if (mScreenRotationAnimation != null) {
447 mService.mBlackFrame.setMatrix(
448 mScreenRotationAnimation.getEnterTransformation().getMatrix());
449 } else {
450 mService.mBlackFrame.clearMatrix();
451 }
452 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700453
454 if (mDimParams != null) {
455 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
456 }
Craig Mautner764983d2012-03-22 11:37:36 -0700457 } catch (RuntimeException e) {
458 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
459 } finally {
460 Surface.closeTransaction();
461 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700462
Craig Mautnera608b882012-03-30 13:03:49 -0700463 if (mBulkUpdateParams != 0) {
464 mService.bulkSetParameters(mBulkUpdateParams);
Craig Mautnere7ae2502012-03-26 17:11:19 -0700465 }
Craig Mautner764983d2012-03-22 11:37:36 -0700466 }
467
468 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700469 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700470 mCurrentFocus = currentFocus;
471 }
472
473 void setDisplayDimensions(final int curWidth, final int curHeight,
474 final int appWidth, final int appHeight) {
475 mDw = curWidth;
476 mDh = curHeight;
477 mInnerDw = appWidth;
478 mInnerDh = appHeight;
479 }
480
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700481 void startDimming(final WindowStateAnimator winAnimator, final float target,
482 final int width, final int height) {
483 if (mDimAnimator == null) {
484 mDimAnimator = new DimAnimator(mService.mFxSession);
485 }
486 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
487 new DimAnimator.Parameters(winAnimator, width, height, target)));
488 }
489
490 // TODO(cmautner): Move into Handler
491 void stopDimming() {
492 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
493 }
494
Craig Mautnere7ae2502012-03-26 17:11:19 -0700495 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
496 if (mWindowDetachedWallpaper != null) {
497 pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
498 }
499 if (mWindowAnimationBackgroundSurface != null) {
500 pw.println(" mWindowAnimationBackgroundSurface:");
501 mWindowAnimationBackgroundSurface.printTo(" ", pw);
502 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700503 if (mDimAnimator != null) {
504 pw.println(" mDimAnimator:");
505 mDimAnimator.printTo(" ", pw);
506 } else {
507 pw.println( " no DimAnimator ");
508 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700509 }
Craig Mautner764983d2012-03-22 11:37:36 -0700510}