blob: 0be661200404d7f96937517715c8bb3d2985e55b [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;
Craig Mautnerbec53f72012-04-05 11:49:05 -070025import java.util.HashSet;
Craig Mautnere7ae2502012-03-26 17:11:19 -070026
Craig Mautner764983d2012-03-22 11:37:36 -070027/**
Craig Mautner764983d2012-03-22 11:37:36 -070028 * 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
Craig Mautnerbec53f72012-04-05 11:49:05 -070038 HashSet<WindowStateAnimator> mWinAnimators = new HashSet<WindowStateAnimator>();
39 HashSet<WindowStateAnimator> mFinished = new HashSet<WindowStateAnimator>();
40
Craig Mautner764983d2012-03-22 11:37:36 -070041 boolean mAnimating;
Craig Mautner764983d2012-03-22 11:37:36 -070042 boolean mTokenMayBeDrawn;
43 boolean mForceHiding;
44 WindowState mWindowAnimationBackground;
45 int mWindowAnimationBackgroundColor;
46 int mAdjResult;
47
48 int mPendingLayoutChanges;
49
50 /** Overall window dimensions */
51 int mDw, mDh;
52
53 /** Interior window dimensions */
54 int mInnerDw, mInnerDh;
55
56 /** Time of current animation step. Reset on each iteration */
57 long mCurrentTime;
58
59 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
60 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
61 private int mTransactionSequence;
62
63 /** The one and only screen rotation if one is happening */
64 ScreenRotationAnimation mScreenRotationAnimation = null;
65
Craig Mautnere7ae2502012-03-26 17:11:19 -070066 // Window currently running an animation that has requested it be detached
67 // from the wallpaper. This means we need to ensure the wallpaper is
68 // visible behind it in case it animates in a way that would allow it to be
69 // seen.
70 WindowState mWindowDetachedWallpaper = null;
71 WindowState mDetachedWallpaper = null;
Craig Mautnere7ae2502012-03-26 17:11:19 -070072 DimSurface mWindowAnimationBackgroundSurface = null;
73
Craig Mautnera608b882012-03-30 13:03:49 -070074 int mBulkUpdateParams = 0;
75
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070076 DimAnimator mDimAnimator = null;
77 DimAnimator.Parameters mDimParams = null;
78
Craig Mautner764983d2012-03-22 11:37:36 -070079 WindowAnimator(final WindowManagerService service, final Context context,
80 final WindowManagerPolicy policy) {
81 mService = service;
82 mContext = context;
83 mPolicy = policy;
84 }
85
Craig Mautnere7ae2502012-03-26 17:11:19 -070086 private void testWallpaperAndBackgroundLocked() {
87 if (mWindowDetachedWallpaper != mDetachedWallpaper) {
88 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
89 "Detached wallpaper changed from " + mWindowDetachedWallpaper
90 + " to " + mDetachedWallpaper);
91 mWindowDetachedWallpaper = mDetachedWallpaper;
Craig Mautnera608b882012-03-30 13:03:49 -070092 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautnere7ae2502012-03-26 17:11:19 -070093 }
94
95 if (mWindowAnimationBackgroundColor != 0) {
96 // If the window that wants black is the current wallpaper
97 // target, then the black goes *below* the wallpaper so we
98 // don't cause the wallpaper to suddenly disappear.
99 WindowState target = mWindowAnimationBackground;
100 if (mService.mWallpaperTarget == target
101 || mService.mLowerWallpaperTarget == target
102 || mService.mUpperWallpaperTarget == target) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700103 final int N = mService.mWindows.size();
104 for (int i = 0; i < N; i++) {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700105 WindowState w = mService.mWindows.get(i);
106 if (w.mIsWallpaper) {
107 target = w;
108 break;
109 }
110 }
111 }
112 if (mWindowAnimationBackgroundSurface == null) {
113 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
114 }
115 final int dw = mDw;
116 final int dh = mDh;
117 mWindowAnimationBackgroundSurface.show(dw, dh,
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700118 target.mWinAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM,
Craig Mautnere7ae2502012-03-26 17:11:19 -0700119 mWindowAnimationBackgroundColor);
120 } else if (mWindowAnimationBackgroundSurface != null) {
121 mWindowAnimationBackgroundSurface.hide();
122 }
123 }
124
Craig Mautner764983d2012-03-22 11:37:36 -0700125 private void updateWindowsAppsAndRotationAnimationsLocked() {
126 int i;
127 final int NAT = mService.mAppTokens.size();
128 for (i=0; i<NAT; i++) {
Craig Mautner59431632012-04-04 11:56:44 -0700129 final AppWindowAnimator appAnimator = mService.mAppTokens.get(i).mAppAnimator;
130 final boolean wasAnimating = appAnimator.animation != null
131 && appAnimator.animation != WindowManagerService.sDummyAnimation;
132 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700133 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700134 } else if (wasAnimating) {
135 // stopped animating, do one more pass through the layout
136 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700137 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700138 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700139 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700140 }
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700141 }
142 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700143
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700144 final int NEAT = mService.mExitingAppTokens.size();
145 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700146 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700147 final boolean wasAnimating = appAnimator.animation != null
148 && appAnimator.animation != WindowManagerService.sDummyAnimation;
149 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700150 mAnimating = true;
151 } else if (wasAnimating) {
152 // stopped animating, do one more pass through the layout
153 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700154 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700155 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
156 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700157 }
Craig Mautner764983d2012-03-22 11:37:36 -0700158 }
159 }
160
161 if (mScreenRotationAnimation != null &&
162 (mScreenRotationAnimation.isAnimating() ||
163 mScreenRotationAnimation.mFinishAnimReady)) {
164 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700165 mAnimating = true;
166 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700167 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700168 mScreenRotationAnimation.kill();
169 mScreenRotationAnimation = null;
170 }
171 }
172 }
173
174 private void updateWindowsAndWallpaperLocked() {
175 ++mTransactionSequence;
176
177 for (int i = mService.mWindows.size() - 1; i >= 0; i--) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700178 WindowState win = mService.mWindows.get(i);
179 WindowStateAnimator winAnimator = win.mWinAnimator;
180 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700181
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700182 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700183 final boolean wasAnimating = winAnimator.mWasAnimating;
184 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700185
186 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700187 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700188 ", nowAnimating=" + nowAnimating);
189 }
190
191 // If this window is animating, make a note that we have
192 // an animating window and take care of a request to run
193 // a detached wallpaper animation.
194 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700195 if (winAnimator.mAnimation != null) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700196 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700197 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700198 mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700199 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700200 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
201 if (backgroundColor != 0) {
Craig Mautner764983d2012-03-22 11:37:36 -0700202 if (mWindowAnimationBackground == null
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700203 || (winAnimator.mAnimLayer <
204 mWindowAnimationBackground.mWinAnimator.mAnimLayer)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700205 mWindowAnimationBackground = win;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700206 mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700207 }
208 }
209 }
210 mAnimating = true;
211 }
212
213 // If this window's app token is running a detached wallpaper
214 // animation, make a note so we can ensure the wallpaper is
215 // displayed behind it.
Craig Mautner59431632012-04-04 11:56:44 -0700216 final AppWindowAnimator appAnimator =
Craig Mautnerbec53f72012-04-05 11:49:05 -0700217 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700218 if (appAnimator != null && appAnimator.animation != null
219 && appAnimator.animating) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700220 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautner59431632012-04-04 11:56:44 -0700221 && appAnimator.animation.getDetachWallpaper()) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700222 mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700223 }
Craig Mautner59431632012-04-04 11:56:44 -0700224 final int backgroundColor = appAnimator.animation.getBackgroundColor();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700225 if (backgroundColor != 0) {
Craig Mautner764983d2012-03-22 11:37:36 -0700226 if (mWindowAnimationBackground == null
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700227 || (winAnimator.mAnimLayer <
228 mWindowAnimationBackground.mWinAnimator.mAnimLayer)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700229 mWindowAnimationBackground = win;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700230 mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700231 }
232 }
233 }
234
Craig Mautnerbec53f72012-04-05 11:49:05 -0700235 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700236 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700237 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700238 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700239 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
240 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700241 }
Craig Mautner764983d2012-03-22 11:37:36 -0700242 }
243
Craig Mautnerbec53f72012-04-05 11:49:05 -0700244 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700245 if (!wasAnimating && nowAnimating) {
246 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
247 "Animation started that could impact force hide: "
Craig Mautnerbec53f72012-04-05 11:49:05 -0700248 + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700249 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700250 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700251 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700252 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
253 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700254 }
Craig Mautner764983d2012-03-22 11:37:36 -0700255 mService.mFocusMayChange = true;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700256 } else if (win.isReadyForDisplay() && winAnimator.mAnimation == null) {
Craig Mautner764983d2012-03-22 11:37:36 -0700257 mForceHiding = true;
258 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700259 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700260 final boolean changed;
Craig Mautner764983d2012-03-22 11:37:36 -0700261 if (mForceHiding) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700262 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700263 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700264 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700265 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700266 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700267 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700268 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700269 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700270 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700271 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Craig Mautner764983d2012-03-22 11:37:36 -0700272 // Assume we will need to animate. If
273 // we don't (because the wallpaper will
274 // stay with the lock screen), then we will
275 // clean up later.
276 Animation a = mPolicy.createForceHideEnterAnimation();
277 if (a != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700278 winAnimator.setAnimation(a);
Craig Mautner764983d2012-03-22 11:37:36 -0700279 }
280 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700281 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700282 // We are showing on to of the current
283 // focus, so re-evaluate focus to make
284 // sure it is correct.
285 mService.mFocusMayChange = true;
286 }
287 }
288 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700289 if (changed && (flags & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700290 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700291 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700292 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700293 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
294 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700295 }
Craig Mautner764983d2012-03-22 11:37:36 -0700296 }
297 }
298 }
299
Craig Mautnerbec53f72012-04-05 11:49:05 -0700300 final AppWindowToken atoken = win.mAppToken;
Craig Mautner59431632012-04-04 11:56:44 -0700301 if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700302 if (atoken.lastTransactionSequence != mTransactionSequence) {
303 atoken.lastTransactionSequence = mTransactionSequence;
304 atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
305 atoken.startingDisplayed = false;
306 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700307 if ((win.isOnScreen() || winAnimator.mAttrType
Craig Mautner764983d2012-03-22 11:37:36 -0700308 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
Craig Mautnerbec53f72012-04-05 11:49:05 -0700309 && !win.mExiting && !win.mDestroying) {
Craig Mautner764983d2012-03-22 11:37:36 -0700310 if (WindowManagerService.DEBUG_VISIBILITY ||
311 WindowManagerService.DEBUG_ORIENTATION) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700312 Slog.v(TAG, "Eval win " + win + ": isDrawn=" + win.isDrawnLw()
Craig Mautnera2c77052012-03-26 12:14:43 -0700313 + ", isAnimating=" + winAnimator.isAnimating());
Craig Mautnerbec53f72012-04-05 11:49:05 -0700314 if (!win.isDrawnLw()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700315 Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface
Craig Mautnerbec53f72012-04-05 11:49:05 -0700316 + " pv=" + win.mPolicyVisibility
Craig Mautner749a7bb2012-04-02 13:49:53 -0700317 + " mDrawState=" + winAnimator.mDrawState
Craig Mautnerbec53f72012-04-05 11:49:05 -0700318 + " ah=" + win.mAttachedHidden
Craig Mautner764983d2012-03-22 11:37:36 -0700319 + " th=" + atoken.hiddenRequested
Craig Mautnera2c77052012-03-26 12:14:43 -0700320 + " a=" + winAnimator.mAnimating);
Craig Mautner764983d2012-03-22 11:37:36 -0700321 }
322 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700323 if (win != atoken.startingWindow) {
324 if (!atoken.mAppAnimator.freezingScreen || !win.mAppFreezing) {
Craig Mautner764983d2012-03-22 11:37:36 -0700325 atoken.numInterestingWindows++;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700326 if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700327 atoken.numDrawnWindows++;
328 if (WindowManagerService.DEBUG_VISIBILITY ||
329 WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG,
330 "tokenMayBeDrawn: " + atoken
Craig Mautner59431632012-04-04 11:56:44 -0700331 + " freezingScreen=" + atoken.mAppAnimator.freezingScreen
Craig Mautnerbec53f72012-04-05 11:49:05 -0700332 + " mAppFreezing=" + win.mAppFreezing);
Craig Mautner764983d2012-03-22 11:37:36 -0700333 mTokenMayBeDrawn = true;
334 }
335 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700336 } else if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700337 atoken.startingDisplayed = true;
338 }
339 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700340 } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700341 if (winAnimator.performShowLocked()) {
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700342 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
343 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700344 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
345 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700346 }
347 }
Craig Mautner764983d2012-03-22 11:37:36 -0700348 }
Craig Mautner59431632012-04-04 11:56:44 -0700349 final AppWindowAnimator appAnimator =
350 atoken == null ? null : atoken.mAppAnimator;
351 if (appAnimator != null && appAnimator.thumbnail != null) {
352 if (appAnimator.thumbnailTransactionSeq != mTransactionSequence) {
353 appAnimator.thumbnailTransactionSeq = mTransactionSequence;
354 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700355 }
Craig Mautner59431632012-04-04 11:56:44 -0700356 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
357 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700358 }
359 }
Craig Mautner764983d2012-03-22 11:37:36 -0700360 } // end forall windows
361 }
362
363 private void testTokenMayBeDrawnLocked() {
364 // See if any windows have been drawn, so they (and others
365 // associated with them) can now be shown.
366 final int NT = mService.mAppTokens.size();
367 for (int i=0; i<NT; i++) {
368 AppWindowToken wtoken = mService.mAppTokens.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700369 if (wtoken.mAppAnimator.freezingScreen) {
Craig Mautner764983d2012-03-22 11:37:36 -0700370 int numInteresting = wtoken.numInterestingWindows;
371 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
372 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
373 "allDrawn: " + wtoken
374 + " interesting=" + numInteresting
375 + " drawn=" + wtoken.numDrawnWindows);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700376 wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700377 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
378 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
379 "Setting mOrientationChangeComplete=true because wtoken "
380 + wtoken + " numInteresting=" + numInteresting
381 + " numDrawn=" + wtoken.numDrawnWindows);
Craig Mautner764983d2012-03-22 11:37:36 -0700382 }
383 } else if (!wtoken.allDrawn) {
384 int numInteresting = wtoken.numInterestingWindows;
385 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
386 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
387 "allDrawn: " + wtoken
388 + " interesting=" + numInteresting
389 + " drawn=" + wtoken.numDrawnWindows);
390 wtoken.allDrawn = true;
391 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700392 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700393 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
394 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700395 }
Craig Mautner764983d2012-03-22 11:37:36 -0700396
397 // We can now show all of the drawn windows!
398 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700399 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700400 }
401 }
402 }
403 }
404 }
405
406 private void performAnimationsLocked() {
Craig Mautner764983d2012-03-22 11:37:36 -0700407 mTokenMayBeDrawn = false;
Craig Mautner764983d2012-03-22 11:37:36 -0700408 mForceHiding = false;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700409 mDetachedWallpaper = null;
Craig Mautner764983d2012-03-22 11:37:36 -0700410 mWindowAnimationBackground = null;
411 mWindowAnimationBackgroundColor = 0;
412
413 updateWindowsAndWallpaperLocked();
414
415 if (mTokenMayBeDrawn) {
416 testTokenMayBeDrawnLocked();
417 }
Craig Mautner764983d2012-03-22 11:37:36 -0700418 }
419
Craig Mautner764983d2012-03-22 11:37:36 -0700420 void animate() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700421 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700422 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700423 mBulkUpdateParams = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700424
425 // Update animations of all applications, including those
426 // associated with exiting/removed apps
427 Surface.openTransaction();
428
429 try {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700430 testWallpaperAndBackgroundLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700431 updateWindowsAppsAndRotationAnimationsLocked();
432 performAnimationsLocked();
433
434 // THIRD LOOP: Update the surfaces of all windows.
435
436 if (mScreenRotationAnimation != null) {
437 mScreenRotationAnimation.updateSurfaces();
438 }
439
Craig Mautnerbec53f72012-04-05 11:49:05 -0700440 mFinished.clear();
441 for (final WindowStateAnimator winAnimator : mWinAnimators) {
442 if (winAnimator.mSurface == null) {
443 mFinished.add(winAnimator);
444 } else {
445 winAnimator.prepareSurfaceLocked(true);
446 }
447 }
448 for (final WindowStateAnimator winAnimator : mFinished) {
449 mWinAnimators.remove(winAnimator);
Craig Mautner764983d2012-03-22 11:37:36 -0700450 }
451
Craig Mautner6af9b922012-04-05 19:25:51 -0700452 if (mDimParams != null) {
453 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
454 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700455 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700456 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700457 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700458 }
459
460 if (mService.mBlackFrame != null) {
461 if (mScreenRotationAnimation != null) {
462 mService.mBlackFrame.setMatrix(
463 mScreenRotationAnimation.getEnterTransformation().getMatrix());
464 } else {
465 mService.mBlackFrame.clearMatrix();
466 }
467 }
468 } catch (RuntimeException e) {
469 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
470 } finally {
471 Surface.closeTransaction();
472 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700473
Craig Mautner73850cb2012-04-10 12:56:27 -0700474 mService.bulkSetParameters(mBulkUpdateParams);
Craig Mautner764983d2012-03-22 11:37:36 -0700475 }
476
477 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700478 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700479 mCurrentFocus = currentFocus;
480 }
481
482 void setDisplayDimensions(final int curWidth, final int curHeight,
483 final int appWidth, final int appHeight) {
484 mDw = curWidth;
485 mDh = curHeight;
486 mInnerDw = appWidth;
487 mInnerDh = appHeight;
488 }
489
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700490 void startDimming(final WindowStateAnimator winAnimator, final float target,
491 final int width, final int height) {
492 if (mDimAnimator == null) {
493 mDimAnimator = new DimAnimator(mService.mFxSession);
494 }
495 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
496 new DimAnimator.Parameters(winAnimator, width, height, target)));
497 }
498
499 // TODO(cmautner): Move into Handler
500 void stopDimming() {
501 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
502 }
503
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700504 boolean isDimming() {
505 return mDimParams != null;
506 }
507
Craig Mautnere7ae2502012-03-26 17:11:19 -0700508 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
509 if (mWindowDetachedWallpaper != null) {
510 pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
511 }
512 if (mWindowAnimationBackgroundSurface != null) {
513 pw.println(" mWindowAnimationBackgroundSurface:");
514 mWindowAnimationBackgroundSurface.printTo(" ", pw);
515 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700516 if (mDimAnimator != null) {
517 pw.println(" mDimAnimator:");
518 mDimAnimator.printTo(" ", pw);
519 } else {
520 pw.println( " no DimAnimator ");
521 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700522 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700523
524 static class SetAnimationParams {
525 final WindowStateAnimator mWinAnimator;
526 final Animation mAnimation;
527 final int mAnimDw;
528 final int mAnimDh;
529 public SetAnimationParams(final WindowStateAnimator winAnimator,
530 final Animation animation, final int animDw, final int animDh) {
531 mWinAnimator = winAnimator;
532 mAnimation = animation;
533 mAnimDw = animDw;
534 mAnimDh = animDh;
535 }
536 }
Craig Mautner764983d2012-03-22 11:37:36 -0700537}