blob: f946f6cc56343cc89c984f5bfaa3d95c57cfec69 [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;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070025import java.util.ArrayList;
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 Mautner7358fbf2012-04-12 21:06:33 -070038 ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
Craig Mautnerbec53f72012-04-05 11:49:05 -070039
Craig Mautner764983d2012-03-22 11:37:36 -070040 boolean mAnimating;
Craig Mautner764983d2012-03-22 11:37:36 -070041 boolean mTokenMayBeDrawn;
42 boolean mForceHiding;
43 WindowState mWindowAnimationBackground;
44 int mWindowAnimationBackgroundColor;
45 int mAdjResult;
46
47 int mPendingLayoutChanges;
48
49 /** Overall window dimensions */
50 int mDw, mDh;
51
52 /** Interior window dimensions */
53 int mInnerDw, mInnerDh;
54
55 /** 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. */
60 private int mTransactionSequence;
61
62 /** The one and only screen rotation if one is happening */
63 ScreenRotationAnimation mScreenRotationAnimation = null;
64
Craig Mautnere7ae2502012-03-26 17:11:19 -070065 // Window currently running an animation that has requested it be detached
66 // from the wallpaper. This means we need to ensure the wallpaper is
67 // visible behind it in case it animates in a way that would allow it to be
68 // seen.
69 WindowState mWindowDetachedWallpaper = null;
70 WindowState mDetachedWallpaper = null;
Craig Mautnere7ae2502012-03-26 17:11:19 -070071 DimSurface mWindowAnimationBackgroundSurface = null;
72
Craig Mautnera608b882012-03-30 13:03:49 -070073 int mBulkUpdateParams = 0;
74
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070075 DimAnimator mDimAnimator = null;
76 DimAnimator.Parameters mDimParams = null;
77
Craig Mautner4d7349b2012-04-20 14:52:47 -070078 static final int WALLPAPER_ACTION_PENDING = 1;
79 int mPendingActions;
80
Craig Mautner764983d2012-03-22 11:37:36 -070081 WindowAnimator(final WindowManagerService service, final Context context,
82 final WindowManagerPolicy policy) {
83 mService = service;
84 mContext = context;
85 mPolicy = policy;
86 }
87
Craig Mautnere7ae2502012-03-26 17:11:19 -070088 private void testWallpaperAndBackgroundLocked() {
89 if (mWindowDetachedWallpaper != mDetachedWallpaper) {
90 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
91 "Detached wallpaper changed from " + mWindowDetachedWallpaper
92 + " to " + mDetachedWallpaper);
93 mWindowDetachedWallpaper = mDetachedWallpaper;
Craig Mautnera608b882012-03-30 13:03:49 -070094 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautnere7ae2502012-03-26 17:11:19 -070095 }
96
97 if (mWindowAnimationBackgroundColor != 0) {
98 // If the window that wants black is the current wallpaper
99 // target, then the black goes *below* the wallpaper so we
100 // don't cause the wallpaper to suddenly disappear.
101 WindowState target = mWindowAnimationBackground;
102 if (mService.mWallpaperTarget == target
103 || mService.mLowerWallpaperTarget == target
104 || mService.mUpperWallpaperTarget == target) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700105 final int N = mService.mWindows.size();
106 for (int i = 0; i < N; i++) {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700107 WindowState w = mService.mWindows.get(i);
108 if (w.mIsWallpaper) {
109 target = w;
110 break;
111 }
112 }
113 }
114 if (mWindowAnimationBackgroundSurface == null) {
115 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
116 }
117 final int dw = mDw;
118 final int dh = mDh;
119 mWindowAnimationBackgroundSurface.show(dw, dh,
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700120 target.mWinAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM,
Craig Mautnere7ae2502012-03-26 17:11:19 -0700121 mWindowAnimationBackgroundColor);
122 } else if (mWindowAnimationBackgroundSurface != null) {
123 mWindowAnimationBackgroundSurface.hide();
124 }
125 }
126
Craig Mautner764983d2012-03-22 11:37:36 -0700127 private void updateWindowsAppsAndRotationAnimationsLocked() {
128 int i;
129 final int NAT = mService.mAppTokens.size();
130 for (i=0; i<NAT; i++) {
Craig Mautner59431632012-04-04 11:56:44 -0700131 final AppWindowAnimator appAnimator = mService.mAppTokens.get(i).mAppAnimator;
132 final boolean wasAnimating = appAnimator.animation != null
133 && appAnimator.animation != WindowManagerService.sDummyAnimation;
134 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700135 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700136 } else if (wasAnimating) {
137 // stopped animating, do one more pass through the layout
138 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700139 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700140 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700141 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700142 }
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700143 }
144 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700145
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700146 final int NEAT = mService.mExitingAppTokens.size();
147 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700148 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700149 final boolean wasAnimating = appAnimator.animation != null
150 && appAnimator.animation != WindowManagerService.sDummyAnimation;
151 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700152 mAnimating = true;
153 } else if (wasAnimating) {
154 // stopped animating, do one more pass through the layout
155 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700156 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700157 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
158 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700159 }
Craig Mautner764983d2012-03-22 11:37:36 -0700160 }
161 }
162
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700163 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700164 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
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700177 ArrayList<WindowStateAnimator> unForceHiding = null;
178 boolean wallpaperInUnForceHiding = false;
179
Craig Mautner764983d2012-03-22 11:37:36 -0700180 for (int i = mService.mWindows.size() - 1; i >= 0; i--) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700181 WindowState win = mService.mWindows.get(i);
182 WindowStateAnimator winAnimator = win.mWinAnimator;
183 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700184
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700185 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700186 final boolean wasAnimating = winAnimator.mWasAnimating;
187 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700188
189 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700190 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700191 ", nowAnimating=" + nowAnimating);
192 }
193
194 // If this window is animating, make a note that we have
195 // an animating window and take care of a request to run
196 // a detached wallpaper animation.
197 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700198 if (winAnimator.mAnimation != null) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700199 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700200 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700201 mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700202 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700203 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
204 if (backgroundColor != 0) {
Craig Mautner764983d2012-03-22 11:37:36 -0700205 if (mWindowAnimationBackground == null
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700206 || (winAnimator.mAnimLayer <
207 mWindowAnimationBackground.mWinAnimator.mAnimLayer)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700208 mWindowAnimationBackground = win;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700209 mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700210 }
211 }
212 }
213 mAnimating = true;
214 }
215
216 // If this window's app token is running a detached wallpaper
217 // animation, make a note so we can ensure the wallpaper is
218 // displayed behind it.
Craig Mautner59431632012-04-04 11:56:44 -0700219 final AppWindowAnimator appAnimator =
Craig Mautnerbec53f72012-04-05 11:49:05 -0700220 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700221 if (appAnimator != null && appAnimator.animation != null
222 && appAnimator.animating) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700223 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautner59431632012-04-04 11:56:44 -0700224 && appAnimator.animation.getDetachWallpaper()) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700225 mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700226 }
Craig Mautner59431632012-04-04 11:56:44 -0700227 final int backgroundColor = appAnimator.animation.getBackgroundColor();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700228 if (backgroundColor != 0) {
Craig Mautner764983d2012-03-22 11:37:36 -0700229 if (mWindowAnimationBackground == null
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700230 || (winAnimator.mAnimLayer <
231 mWindowAnimationBackground.mWinAnimator.mAnimLayer)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700232 mWindowAnimationBackground = win;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700233 mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700234 }
235 }
236 }
237
Craig Mautnerbec53f72012-04-05 11:49:05 -0700238 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700239 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700240 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700241 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700242 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
243 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700244 }
Craig Mautner764983d2012-03-22 11:37:36 -0700245 }
246
Craig Mautnerbec53f72012-04-05 11:49:05 -0700247 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700248 if (!wasAnimating && nowAnimating) {
249 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
250 "Animation started that could impact force hide: "
Craig Mautnerbec53f72012-04-05 11:49:05 -0700251 + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700252 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700253 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700254 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700255 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
256 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700257 }
Craig Mautner764983d2012-03-22 11:37:36 -0700258 mService.mFocusMayChange = true;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700259 } else if (win.isReadyForDisplay() && winAnimator.mAnimation == null) {
Craig Mautner764983d2012-03-22 11:37:36 -0700260 mForceHiding = true;
261 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700262 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700263 final boolean changed;
Craig Mautner764983d2012-03-22 11:37:36 -0700264 if (mForceHiding) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700265 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700266 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700267 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700268 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700269 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700270 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700271 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700272 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700273 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700274 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700275 if (unForceHiding == null) {
276 unForceHiding = new ArrayList<WindowStateAnimator>();
277 }
278 unForceHiding.add(winAnimator);
279 if ((win.mAttrs.flags&WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
280 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700281 }
282 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700283 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700284 // We are showing on to of the current
285 // focus, so re-evaluate focus to make
286 // sure it is correct.
287 mService.mFocusMayChange = true;
288 }
289 }
290 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700291 if (changed && (flags & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700292 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700293 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700294 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700295 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
296 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700297 }
Craig Mautner764983d2012-03-22 11:37:36 -0700298 }
299 }
300 }
301
Craig Mautnerbec53f72012-04-05 11:49:05 -0700302 final AppWindowToken atoken = win.mAppToken;
Craig Mautner59431632012-04-04 11:56:44 -0700303 if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700304 if (atoken.lastTransactionSequence != mTransactionSequence) {
305 atoken.lastTransactionSequence = mTransactionSequence;
306 atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
307 atoken.startingDisplayed = false;
308 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700309 if ((win.isOnScreen() || winAnimator.mAttrType
Craig Mautner764983d2012-03-22 11:37:36 -0700310 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
Craig Mautnerbec53f72012-04-05 11:49:05 -0700311 && !win.mExiting && !win.mDestroying) {
Craig Mautner764983d2012-03-22 11:37:36 -0700312 if (WindowManagerService.DEBUG_VISIBILITY ||
313 WindowManagerService.DEBUG_ORIENTATION) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700314 Slog.v(TAG, "Eval win " + win + ": isDrawn=" + win.isDrawnLw()
Craig Mautnera2c77052012-03-26 12:14:43 -0700315 + ", isAnimating=" + winAnimator.isAnimating());
Craig Mautnerbec53f72012-04-05 11:49:05 -0700316 if (!win.isDrawnLw()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700317 Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface
Craig Mautnerbec53f72012-04-05 11:49:05 -0700318 + " pv=" + win.mPolicyVisibility
Craig Mautner749a7bb2012-04-02 13:49:53 -0700319 + " mDrawState=" + winAnimator.mDrawState
Craig Mautnerbec53f72012-04-05 11:49:05 -0700320 + " ah=" + win.mAttachedHidden
Craig Mautner764983d2012-03-22 11:37:36 -0700321 + " th=" + atoken.hiddenRequested
Craig Mautnera2c77052012-03-26 12:14:43 -0700322 + " a=" + winAnimator.mAnimating);
Craig Mautner764983d2012-03-22 11:37:36 -0700323 }
324 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700325 if (win != atoken.startingWindow) {
326 if (!atoken.mAppAnimator.freezingScreen || !win.mAppFreezing) {
Craig Mautner764983d2012-03-22 11:37:36 -0700327 atoken.numInterestingWindows++;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700328 if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700329 atoken.numDrawnWindows++;
330 if (WindowManagerService.DEBUG_VISIBILITY ||
331 WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG,
332 "tokenMayBeDrawn: " + atoken
Craig Mautner59431632012-04-04 11:56:44 -0700333 + " freezingScreen=" + atoken.mAppAnimator.freezingScreen
Craig Mautnerbec53f72012-04-05 11:49:05 -0700334 + " mAppFreezing=" + win.mAppFreezing);
Craig Mautner764983d2012-03-22 11:37:36 -0700335 mTokenMayBeDrawn = true;
336 }
337 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700338 } else if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700339 atoken.startingDisplayed = true;
340 }
341 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700342 } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700343 if (winAnimator.performShowLocked()) {
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700344 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
345 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700346 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
347 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700348 }
349 }
Craig Mautner764983d2012-03-22 11:37:36 -0700350 }
Craig Mautner59431632012-04-04 11:56:44 -0700351 final AppWindowAnimator appAnimator =
352 atoken == null ? null : atoken.mAppAnimator;
353 if (appAnimator != null && appAnimator.thumbnail != null) {
354 if (appAnimator.thumbnailTransactionSeq != mTransactionSequence) {
355 appAnimator.thumbnailTransactionSeq = mTransactionSequence;
356 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700357 }
Craig Mautner59431632012-04-04 11:56:44 -0700358 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
359 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700360 }
361 }
Craig Mautner764983d2012-03-22 11:37:36 -0700362 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700363
364 // If we have windows that are being show due to them no longer
365 // being force-hidden, apply the appropriate animation to them.
366 if (unForceHiding != null) {
367 for (int i=unForceHiding.size()-1; i>=0; i--) {
368 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
369 if (a != null) {
Craig Mautner4d7349b2012-04-20 14:52:47 -0700370 final WindowStateAnimator winAnimator = unForceHiding.get(i);
371 winAnimator.setAnimation(a);
372 winAnimator.mAnimationIsEntrance = true;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700373 }
374 }
375 }
Craig Mautner764983d2012-03-22 11:37:36 -0700376 }
377
378 private void testTokenMayBeDrawnLocked() {
379 // See if any windows have been drawn, so they (and others
380 // associated with them) can now be shown.
381 final int NT = mService.mAppTokens.size();
382 for (int i=0; i<NT; i++) {
383 AppWindowToken wtoken = mService.mAppTokens.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700384 if (wtoken.mAppAnimator.freezingScreen) {
Craig Mautner764983d2012-03-22 11:37:36 -0700385 int numInteresting = wtoken.numInterestingWindows;
386 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
387 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
388 "allDrawn: " + wtoken
389 + " interesting=" + numInteresting
390 + " drawn=" + wtoken.numDrawnWindows);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700391 wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700392 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
393 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
394 "Setting mOrientationChangeComplete=true because wtoken "
395 + wtoken + " numInteresting=" + numInteresting
396 + " numDrawn=" + wtoken.numDrawnWindows);
Craig Mautner764983d2012-03-22 11:37:36 -0700397 }
398 } else if (!wtoken.allDrawn) {
399 int numInteresting = wtoken.numInterestingWindows;
400 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
401 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
402 "allDrawn: " + wtoken
403 + " interesting=" + numInteresting
404 + " drawn=" + wtoken.numDrawnWindows);
405 wtoken.allDrawn = true;
406 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700407 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700408 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
409 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700410 }
Craig Mautner764983d2012-03-22 11:37:36 -0700411
412 // We can now show all of the drawn windows!
413 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700414 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700415 }
416 }
417 }
418 }
419 }
420
421 private void performAnimationsLocked() {
Craig Mautner764983d2012-03-22 11:37:36 -0700422 mTokenMayBeDrawn = false;
Craig Mautner764983d2012-03-22 11:37:36 -0700423 mForceHiding = false;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700424 mDetachedWallpaper = null;
Craig Mautner764983d2012-03-22 11:37:36 -0700425 mWindowAnimationBackground = null;
426 mWindowAnimationBackgroundColor = 0;
427
428 updateWindowsAndWallpaperLocked();
Craig Mautner4d7349b2012-04-20 14:52:47 -0700429 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
430 mPendingActions |= WALLPAPER_ACTION_PENDING;
431 }
Craig Mautner764983d2012-03-22 11:37:36 -0700432
433 if (mTokenMayBeDrawn) {
434 testTokenMayBeDrawnLocked();
435 }
Craig Mautner764983d2012-03-22 11:37:36 -0700436 }
437
Craig Mautner4d7349b2012-04-20 14:52:47 -0700438 synchronized void animate() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700439 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700440 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700441 mBulkUpdateParams = 0;
Craig Mautner7d8df392012-04-06 15:26:23 -0700442 mAnimating = false;
443 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
444 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
445 }
Craig Mautner764983d2012-03-22 11:37:36 -0700446
447 // Update animations of all applications, including those
448 // associated with exiting/removed apps
449 Surface.openTransaction();
450
451 try {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700452 testWallpaperAndBackgroundLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700453 updateWindowsAppsAndRotationAnimationsLocked();
454 performAnimationsLocked();
455
456 // THIRD LOOP: Update the surfaces of all windows.
457
458 if (mScreenRotationAnimation != null) {
459 mScreenRotationAnimation.updateSurfaces();
460 }
461
Craig Mautner7358fbf2012-04-12 21:06:33 -0700462 final int N = mWinAnimators.size();
463 for (int i = 0; i < N; i++) {
464 mWinAnimators.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700465 }
466
Craig Mautner6af9b922012-04-05 19:25:51 -0700467 if (mDimParams != null) {
468 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
469 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700470 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700471 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700472 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700473 }
474
475 if (mService.mBlackFrame != null) {
476 if (mScreenRotationAnimation != null) {
477 mService.mBlackFrame.setMatrix(
478 mScreenRotationAnimation.getEnterTransformation().getMatrix());
479 } else {
480 mService.mBlackFrame.clearMatrix();
481 }
482 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700483
484 if (mService.mWatermark != null) {
485 mService.mWatermark.drawIfNeeded();
486 }
Craig Mautner764983d2012-03-22 11:37:36 -0700487 } catch (RuntimeException e) {
488 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
489 } finally {
490 Surface.closeTransaction();
491 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700492
Craig Mautner7d8df392012-04-06 15:26:23 -0700493 mService.bulkSetParameters(mBulkUpdateParams, mPendingLayoutChanges);
494
495 if (mAnimating) {
496 mService.scheduleAnimationLocked();
497 }
498 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
499 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
500 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
501 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
502 }
Craig Mautner764983d2012-03-22 11:37:36 -0700503 }
504
505 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700506 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700507 mCurrentFocus = currentFocus;
508 }
509
510 void setDisplayDimensions(final int curWidth, final int curHeight,
511 final int appWidth, final int appHeight) {
512 mDw = curWidth;
513 mDh = curHeight;
514 mInnerDw = appWidth;
515 mInnerDh = appHeight;
516 }
517
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700518 void startDimming(final WindowStateAnimator winAnimator, final float target,
519 final int width, final int height) {
520 if (mDimAnimator == null) {
521 mDimAnimator = new DimAnimator(mService.mFxSession);
522 }
523 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
524 new DimAnimator.Parameters(winAnimator, width, height, target)));
525 }
526
527 // TODO(cmautner): Move into Handler
528 void stopDimming() {
529 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
530 }
531
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700532 boolean isDimming() {
533 return mDimParams != null;
534 }
535
Craig Mautnere7ae2502012-03-26 17:11:19 -0700536 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
537 if (mWindowDetachedWallpaper != null) {
538 pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
539 }
540 if (mWindowAnimationBackgroundSurface != null) {
541 pw.println(" mWindowAnimationBackgroundSurface:");
542 mWindowAnimationBackgroundSurface.printTo(" ", pw);
543 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700544 if (mDimAnimator != null) {
545 pw.println(" mDimAnimator:");
546 mDimAnimator.printTo(" ", pw);
547 } else {
548 pw.println( " no DimAnimator ");
549 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700550 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700551
552 static class SetAnimationParams {
553 final WindowStateAnimator mWinAnimator;
554 final Animation mAnimation;
555 final int mAnimDw;
556 final int mAnimDh;
557 public SetAnimationParams(final WindowStateAnimator winAnimator,
558 final Animation animation, final int animDw, final int animDh) {
559 mWinAnimator = winAnimator;
560 mAnimation = animation;
561 mAnimDw = animDw;
562 mAnimDh = animDh;
563 }
564 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700565
566 synchronized void clearPendingActions() {
567 mPendingActions = 0;
568 }
Craig Mautner764983d2012-03-22 11:37:36 -0700569}