blob: 77f94d95e55a824d28b57e1886d7e4734918d20c [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/**
Craig Mautner764983d2012-03-22 11:37:36 -070027 * Singleton class that carries out the animations and Surface operations in a separate task
28 * on behalf of WindowManagerService.
29 */
30public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070031 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070032
33 final WindowManagerService mService;
34 final Context mContext;
35 final WindowManagerPolicy mPolicy;
36
37 boolean mAnimating;
Craig Mautner764983d2012-03-22 11:37:36 -070038 boolean mTokenMayBeDrawn;
39 boolean mForceHiding;
40 WindowState mWindowAnimationBackground;
41 int mWindowAnimationBackgroundColor;
42 int mAdjResult;
43
44 int mPendingLayoutChanges;
45
46 /** Overall window dimensions */
47 int mDw, mDh;
48
49 /** Interior window dimensions */
50 int mInnerDw, mInnerDh;
51
52 /** Time of current animation step. Reset on each iteration */
53 long mCurrentTime;
54
55 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
56 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
57 private int mTransactionSequence;
58
59 /** The one and only screen rotation if one is happening */
60 ScreenRotationAnimation mScreenRotationAnimation = null;
61
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
65 // seen.
66 WindowState mWindowDetachedWallpaper = null;
67 WindowState mDetachedWallpaper = null;
Craig Mautnere7ae2502012-03-26 17:11:19 -070068 DimSurface mWindowAnimationBackgroundSurface = null;
69
Craig Mautnera608b882012-03-30 13:03:49 -070070 int mBulkUpdateParams = 0;
71
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070072 DimAnimator mDimAnimator = null;
73 DimAnimator.Parameters mDimParams = null;
74
Craig Mautner764983d2012-03-22 11:37:36 -070075 WindowAnimator(final WindowManagerService service, final Context context,
76 final WindowManagerPolicy policy) {
77 mService = service;
78 mContext = context;
79 mPolicy = policy;
80 }
81
Craig Mautnere7ae2502012-03-26 17:11:19 -070082 private void testWallpaperAndBackgroundLocked() {
83 if (mWindowDetachedWallpaper != mDetachedWallpaper) {
84 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
85 "Detached wallpaper changed from " + mWindowDetachedWallpaper
86 + " to " + mDetachedWallpaper);
87 mWindowDetachedWallpaper = mDetachedWallpaper;
Craig Mautnera608b882012-03-30 13:03:49 -070088 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautnere7ae2502012-03-26 17:11:19 -070089 }
90
91 if (mWindowAnimationBackgroundColor != 0) {
92 // If the window that wants black is the current wallpaper
93 // target, then the black goes *below* the wallpaper so we
94 // don't cause the wallpaper to suddenly disappear.
95 WindowState target = mWindowAnimationBackground;
96 if (mService.mWallpaperTarget == target
97 || mService.mLowerWallpaperTarget == target
98 || mService.mUpperWallpaperTarget == target) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070099 final int N = mService.mWindows.size();
100 for (int i = 0; i < N; i++) {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700101 WindowState w = mService.mWindows.get(i);
102 if (w.mIsWallpaper) {
103 target = w;
104 break;
105 }
106 }
107 }
108 if (mWindowAnimationBackgroundSurface == null) {
109 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
110 }
111 final int dw = mDw;
112 final int dh = mDh;
113 mWindowAnimationBackgroundSurface.show(dw, dh,
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700114 target.mWinAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM,
Craig Mautnere7ae2502012-03-26 17:11:19 -0700115 mWindowAnimationBackgroundColor);
116 } else if (mWindowAnimationBackgroundSurface != null) {
117 mWindowAnimationBackgroundSurface.hide();
118 }
119 }
120
Craig Mautner764983d2012-03-22 11:37:36 -0700121 private void updateWindowsAppsAndRotationAnimationsLocked() {
122 int i;
123 final int NAT = mService.mAppTokens.size();
124 for (i=0; i<NAT; i++) {
Craig Mautner59431632012-04-04 11:56:44 -0700125 final AppWindowAnimator appAnimator = mService.mAppTokens.get(i).mAppAnimator;
126 final boolean wasAnimating = appAnimator.animation != null
127 && appAnimator.animation != WindowManagerService.sDummyAnimation;
128 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700129 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700130 } else if (wasAnimating) {
131 // stopped animating, do one more pass through the layout
132 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700133 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700134 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700135 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700136 }
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700137 }
138 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700139
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700140 final int NEAT = mService.mExitingAppTokens.size();
141 for (i=0; i<NEAT; i++) {
Craig Mautner59431632012-04-04 11:56:44 -0700142 final AppWindowAnimator appAnimator = mService.mAppTokens.get(i).mAppAnimator;
143 final boolean wasAnimating = appAnimator.animation != null
144 && appAnimator.animation != WindowManagerService.sDummyAnimation;
145 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700146 mAnimating = true;
147 } else if (wasAnimating) {
148 // stopped animating, do one more pass through the layout
149 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700150 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700151 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
152 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700153 }
Craig Mautner764983d2012-03-22 11:37:36 -0700154 }
155 }
156
157 if (mScreenRotationAnimation != null &&
158 (mScreenRotationAnimation.isAnimating() ||
159 mScreenRotationAnimation.mFinishAnimReady)) {
160 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700161 mAnimating = true;
162 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700163 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700164 mScreenRotationAnimation.kill();
165 mScreenRotationAnimation = null;
166 }
167 }
168 }
169
170 private void updateWindowsAndWallpaperLocked() {
171 ++mTransactionSequence;
172
173 for (int i = mService.mWindows.size() - 1; i >= 0; i--) {
174 WindowState w = mService.mWindows.get(i);
Craig Mautnera2c77052012-03-26 12:14:43 -0700175 WindowStateAnimator winAnimator = w.mWinAnimator;
Craig Mautner764983d2012-03-22 11:37:36 -0700176 final WindowManager.LayoutParams attrs = w.mAttrs;
177
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700178 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700179 final boolean wasAnimating = winAnimator.mWasAnimating;
180 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700181
182 if (WindowManagerService.DEBUG_WALLPAPER) {
183 Slog.v(TAG, w + ": wasAnimating=" + wasAnimating +
184 ", nowAnimating=" + nowAnimating);
185 }
186
187 // If this window is animating, make a note that we have
188 // an animating window and take care of a request to run
189 // a detached wallpaper animation.
190 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700191 if (winAnimator.mAnimation != null) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700192 if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700193 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700194 mDetachedWallpaper = w;
Craig Mautner764983d2012-03-22 11:37:36 -0700195 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700196 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
197 if (backgroundColor != 0) {
Craig Mautner764983d2012-03-22 11:37:36 -0700198 if (mWindowAnimationBackground == null
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700199 || (winAnimator.mAnimLayer <
200 mWindowAnimationBackground.mWinAnimator.mAnimLayer)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700201 mWindowAnimationBackground = w;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700202 mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700203 }
204 }
205 }
206 mAnimating = true;
207 }
208
209 // If this window's app token is running a detached wallpaper
210 // animation, make a note so we can ensure the wallpaper is
211 // displayed behind it.
Craig Mautner59431632012-04-04 11:56:44 -0700212 final AppWindowAnimator appAnimator =
213 w.mAppToken == null ? null : w.mAppToken.mAppAnimator;
214 if (appAnimator != null && appAnimator.animation != null
215 && appAnimator.animating) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700216 if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0
Craig Mautner59431632012-04-04 11:56:44 -0700217 && appAnimator.animation.getDetachWallpaper()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700218 mDetachedWallpaper = w;
Craig Mautner764983d2012-03-22 11:37:36 -0700219 }
Craig Mautner59431632012-04-04 11:56:44 -0700220 final int backgroundColor = appAnimator.animation.getBackgroundColor();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700221 if (backgroundColor != 0) {
Craig Mautner764983d2012-03-22 11:37:36 -0700222 if (mWindowAnimationBackground == null
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700223 || (winAnimator.mAnimLayer <
224 mWindowAnimationBackground.mWinAnimator.mAnimLayer)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700225 mWindowAnimationBackground = w;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700226 mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700227 }
228 }
229 }
230
Craig Mautnera2c77052012-03-26 12:14:43 -0700231 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == w) {
Craig Mautnera608b882012-03-30 13:03:49 -0700232 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700233 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700234 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700235 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
236 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700237 }
Craig Mautner764983d2012-03-22 11:37:36 -0700238 }
239
240 if (mPolicy.doesForceHide(w, attrs)) {
241 if (!wasAnimating && nowAnimating) {
242 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
243 "Animation started that could impact force hide: "
244 + w);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700245 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700246 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700247 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700248 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
249 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700250 }
Craig Mautner764983d2012-03-22 11:37:36 -0700251 mService.mFocusMayChange = true;
Craig Mautnera2c77052012-03-26 12:14:43 -0700252 } else if (w.isReadyForDisplay() && winAnimator.mAnimation == null) {
Craig Mautner764983d2012-03-22 11:37:36 -0700253 mForceHiding = true;
254 }
255 } else if (mPolicy.canBeForceHidden(w, attrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700256 final boolean changed;
Craig Mautner764983d2012-03-22 11:37:36 -0700257 if (mForceHiding) {
258 changed = w.hideLw(false, false);
259 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
260 "Now policy hidden: " + w);
261 } else {
262 changed = w.showLw(false, false);
263 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
264 "Now policy shown: " + w);
265 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700266 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautner764983d2012-03-22 11:37:36 -0700267 && w.isVisibleNow() /*w.isReadyForDisplay()*/) {
268 // Assume we will need to animate. If
269 // we don't (because the wallpaper will
270 // stay with the lock screen), then we will
271 // clean up later.
272 Animation a = mPolicy.createForceHideEnterAnimation();
273 if (a != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700274 winAnimator.setAnimation(a);
Craig Mautner764983d2012-03-22 11:37:36 -0700275 }
276 }
277 if (mCurrentFocus == null || mCurrentFocus.mLayer < w.mLayer) {
278 // We are showing on to of the current
279 // focus, so re-evaluate focus to make
280 // sure it is correct.
281 mService.mFocusMayChange = true;
282 }
283 }
284 }
285 if (changed && (attrs.flags
286 & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700287 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700288 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700289 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700290 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
291 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700292 }
Craig Mautner764983d2012-03-22 11:37:36 -0700293 }
294 }
295 }
296
297 final AppWindowToken atoken = w.mAppToken;
Craig Mautner59431632012-04-04 11:56:44 -0700298 if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700299 if (atoken.lastTransactionSequence != mTransactionSequence) {
300 atoken.lastTransactionSequence = mTransactionSequence;
301 atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
302 atoken.startingDisplayed = false;
303 }
304 if ((w.isOnScreen() || w.mAttrs.type
305 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
306 && !w.mExiting && !w.mDestroying) {
307 if (WindowManagerService.DEBUG_VISIBILITY ||
308 WindowManagerService.DEBUG_ORIENTATION) {
309 Slog.v(TAG, "Eval win " + w + ": isDrawn="
310 + w.isDrawnLw()
Craig Mautnera2c77052012-03-26 12:14:43 -0700311 + ", isAnimating=" + winAnimator.isAnimating());
Craig Mautner764983d2012-03-22 11:37:36 -0700312 if (!w.isDrawnLw()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700313 Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface
Craig Mautner764983d2012-03-22 11:37:36 -0700314 + " pv=" + w.mPolicyVisibility
Craig Mautner749a7bb2012-04-02 13:49:53 -0700315 + " mDrawState=" + winAnimator.mDrawState
Craig Mautner764983d2012-03-22 11:37:36 -0700316 + " ah=" + w.mAttachedHidden
317 + " th=" + atoken.hiddenRequested
Craig Mautnera2c77052012-03-26 12:14:43 -0700318 + " a=" + winAnimator.mAnimating);
Craig Mautner764983d2012-03-22 11:37:36 -0700319 }
320 }
321 if (w != atoken.startingWindow) {
Craig Mautner59431632012-04-04 11:56:44 -0700322 if (!atoken.mAppAnimator.freezingScreen || !w.mAppFreezing) {
Craig Mautner764983d2012-03-22 11:37:36 -0700323 atoken.numInterestingWindows++;
324 if (w.isDrawnLw()) {
325 atoken.numDrawnWindows++;
326 if (WindowManagerService.DEBUG_VISIBILITY ||
327 WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG,
328 "tokenMayBeDrawn: " + atoken
Craig Mautner59431632012-04-04 11:56:44 -0700329 + " freezingScreen=" + atoken.mAppAnimator.freezingScreen
Craig Mautner764983d2012-03-22 11:37:36 -0700330 + " mAppFreezing=" + w.mAppFreezing);
331 mTokenMayBeDrawn = true;
332 }
333 }
334 } else if (w.isDrawnLw()) {
335 atoken.startingDisplayed = true;
336 }
337 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700338 } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700339 if (winAnimator.performShowLocked()) {
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700340 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
341 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700342 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
343 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700344 }
345 }
Craig Mautner764983d2012-03-22 11:37:36 -0700346 }
Craig Mautner59431632012-04-04 11:56:44 -0700347 final AppWindowAnimator appAnimator =
348 atoken == null ? null : atoken.mAppAnimator;
349 if (appAnimator != null && appAnimator.thumbnail != null) {
350 if (appAnimator.thumbnailTransactionSeq != mTransactionSequence) {
351 appAnimator.thumbnailTransactionSeq = mTransactionSequence;
352 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700353 }
Craig Mautner59431632012-04-04 11:56:44 -0700354 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
355 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700356 }
357 }
Craig Mautner764983d2012-03-22 11:37:36 -0700358 } // end forall windows
359 }
360
361 private void testTokenMayBeDrawnLocked() {
362 // See if any windows have been drawn, so they (and others
363 // associated with them) can now be shown.
364 final int NT = mService.mAppTokens.size();
365 for (int i=0; i<NT; i++) {
366 AppWindowToken wtoken = mService.mAppTokens.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700367 if (wtoken.mAppAnimator.freezingScreen) {
Craig Mautner764983d2012-03-22 11:37:36 -0700368 int numInteresting = wtoken.numInterestingWindows;
369 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
370 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
371 "allDrawn: " + wtoken
372 + " interesting=" + numInteresting
373 + " drawn=" + wtoken.numDrawnWindows);
374 wtoken.showAllWindowsLocked();
375 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
376 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
377 "Setting mOrientationChangeComplete=true because wtoken "
378 + wtoken + " numInteresting=" + numInteresting
379 + " numDrawn=" + wtoken.numDrawnWindows);
Craig Mautner764983d2012-03-22 11:37:36 -0700380 }
381 } else if (!wtoken.allDrawn) {
382 int numInteresting = wtoken.numInterestingWindows;
383 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
384 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
385 "allDrawn: " + wtoken
386 + " interesting=" + numInteresting
387 + " drawn=" + wtoken.numDrawnWindows);
388 wtoken.allDrawn = true;
389 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700390 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700391 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
392 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700393 }
Craig Mautner764983d2012-03-22 11:37:36 -0700394
395 // We can now show all of the drawn windows!
396 if (!mService.mOpeningApps.contains(wtoken)) {
397 mAnimating |= wtoken.showAllWindowsLocked();
398 }
399 }
400 }
401 }
402 }
403
404 private void performAnimationsLocked() {
Craig Mautner764983d2012-03-22 11:37:36 -0700405 mTokenMayBeDrawn = false;
Craig Mautner764983d2012-03-22 11:37:36 -0700406 mForceHiding = false;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700407 mDetachedWallpaper = null;
Craig Mautner764983d2012-03-22 11:37:36 -0700408 mWindowAnimationBackground = null;
409 mWindowAnimationBackgroundColor = 0;
410
411 updateWindowsAndWallpaperLocked();
412
413 if (mTokenMayBeDrawn) {
414 testTokenMayBeDrawnLocked();
415 }
Craig Mautner764983d2012-03-22 11:37:36 -0700416 }
417
Craig Mautner764983d2012-03-22 11:37:36 -0700418 void animate() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700419 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700420 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700421 mBulkUpdateParams = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700422
423 // Update animations of all applications, including those
424 // associated with exiting/removed apps
425 Surface.openTransaction();
426
427 try {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700428 testWallpaperAndBackgroundLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700429 updateWindowsAppsAndRotationAnimationsLocked();
430 performAnimationsLocked();
431
432 // THIRD LOOP: Update the surfaces of all windows.
433
434 if (mScreenRotationAnimation != null) {
435 mScreenRotationAnimation.updateSurfaces();
436 }
437
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700438 for (int i = mService.mWindows.size() - 1; i >= 0; i--) {
Craig Mautner764983d2012-03-22 11:37:36 -0700439 WindowState w = mService.mWindows.get(i);
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700440 w.mWinAnimator.prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700441 }
442
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700443 if (mDimAnimator != null && mDimAnimator.mDimShown) {
444 mAnimating |= mDimAnimator.updateSurface(mService.mInnerFields.mDimming,
Craig Mautner764983d2012-03-22 11:37:36 -0700445 mCurrentTime, !mService.okToDisplay());
446 }
447
448 if (mService.mBlackFrame != null) {
449 if (mScreenRotationAnimation != null) {
450 mService.mBlackFrame.setMatrix(
451 mScreenRotationAnimation.getEnterTransformation().getMatrix());
452 } else {
453 mService.mBlackFrame.clearMatrix();
454 }
455 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700456
457 if (mDimParams != null) {
458 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
459 }
Craig Mautner764983d2012-03-22 11:37:36 -0700460 } catch (RuntimeException e) {
461 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
462 } finally {
463 Surface.closeTransaction();
464 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700465
Craig Mautnera608b882012-03-30 13:03:49 -0700466 if (mBulkUpdateParams != 0) {
467 mService.bulkSetParameters(mBulkUpdateParams);
Craig Mautnere7ae2502012-03-26 17:11:19 -0700468 }
Craig Mautner764983d2012-03-22 11:37:36 -0700469 }
470
471 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700472 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700473 mCurrentFocus = currentFocus;
474 }
475
476 void setDisplayDimensions(final int curWidth, final int curHeight,
477 final int appWidth, final int appHeight) {
478 mDw = curWidth;
479 mDh = curHeight;
480 mInnerDw = appWidth;
481 mInnerDh = appHeight;
482 }
483
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700484 void startDimming(final WindowStateAnimator winAnimator, final float target,
485 final int width, final int height) {
486 if (mDimAnimator == null) {
487 mDimAnimator = new DimAnimator(mService.mFxSession);
488 }
489 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
490 new DimAnimator.Parameters(winAnimator, width, height, target)));
491 }
492
493 // TODO(cmautner): Move into Handler
494 void stopDimming() {
495 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
496 }
497
Craig Mautnere7ae2502012-03-26 17:11:19 -0700498 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
499 if (mWindowDetachedWallpaper != null) {
500 pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
501 }
502 if (mWindowAnimationBackgroundSurface != null) {
503 pw.println(" mWindowAnimationBackgroundSurface:");
504 mWindowAnimationBackgroundSurface.printTo(" ", pw);
505 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700506 if (mDimAnimator != null) {
507 pw.println(" mDimAnimator:");
508 mDimAnimator.printTo(" ", pw);
509 } else {
510 pw.println( " no DimAnimator ");
511 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700512 }
Craig Mautner764983d2012-03-22 11:37:36 -0700513}