blob: fa009eb81b7ba5d873012ecc29c17e94164153c5 [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 Mautnerbec53f72012-04-05 11:49:05 -070026import java.util.HashSet;
Craig Mautnere7ae2502012-03-26 17:11:19 -070027
Craig Mautner764983d2012-03-22 11:37:36 -070028/**
Craig Mautner764983d2012-03-22 11:37:36 -070029 * Singleton class that carries out the animations and Surface operations in a separate task
30 * on behalf of WindowManagerService.
31 */
32public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070033 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070034
35 final WindowManagerService mService;
36 final Context mContext;
37 final WindowManagerPolicy mPolicy;
38
Craig Mautnerbec53f72012-04-05 11:49:05 -070039 HashSet<WindowStateAnimator> mWinAnimators = new HashSet<WindowStateAnimator>();
40 HashSet<WindowStateAnimator> mFinished = new HashSet<WindowStateAnimator>();
41
Craig Mautner764983d2012-03-22 11:37:36 -070042 boolean mAnimating;
Craig Mautner764983d2012-03-22 11:37:36 -070043 boolean mTokenMayBeDrawn;
44 boolean mForceHiding;
45 WindowState mWindowAnimationBackground;
46 int mWindowAnimationBackgroundColor;
47 int mAdjResult;
48
49 int mPendingLayoutChanges;
50
51 /** Overall window dimensions */
52 int mDw, mDh;
53
54 /** Interior window dimensions */
55 int mInnerDw, mInnerDh;
56
57 /** Time of current animation step. Reset on each iteration */
58 long mCurrentTime;
59
60 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
61 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
62 private int mTransactionSequence;
63
64 /** The one and only screen rotation if one is happening */
65 ScreenRotationAnimation mScreenRotationAnimation = null;
66
Craig Mautnere7ae2502012-03-26 17:11:19 -070067 // Window currently running an animation that has requested it be detached
68 // from the wallpaper. This means we need to ensure the wallpaper is
69 // visible behind it in case it animates in a way that would allow it to be
70 // seen.
71 WindowState mWindowDetachedWallpaper = null;
72 WindowState mDetachedWallpaper = null;
Craig Mautnere7ae2502012-03-26 17:11:19 -070073 DimSurface mWindowAnimationBackgroundSurface = null;
74
Craig Mautnera608b882012-03-30 13:03:49 -070075 int mBulkUpdateParams = 0;
76
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070077 DimAnimator mDimAnimator = null;
78 DimAnimator.Parameters mDimParams = null;
79
Craig Mautner764983d2012-03-22 11:37:36 -070080 WindowAnimator(final WindowManagerService service, final Context context,
81 final WindowManagerPolicy policy) {
82 mService = service;
83 mContext = context;
84 mPolicy = policy;
85 }
86
Craig Mautnere7ae2502012-03-26 17:11:19 -070087 private void testWallpaperAndBackgroundLocked() {
88 if (mWindowDetachedWallpaper != mDetachedWallpaper) {
89 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
90 "Detached wallpaper changed from " + mWindowDetachedWallpaper
91 + " to " + mDetachedWallpaper);
92 mWindowDetachedWallpaper = mDetachedWallpaper;
Craig Mautnera608b882012-03-30 13:03:49 -070093 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautnere7ae2502012-03-26 17:11:19 -070094 }
95
96 if (mWindowAnimationBackgroundColor != 0) {
97 // If the window that wants black is the current wallpaper
98 // target, then the black goes *below* the wallpaper so we
99 // don't cause the wallpaper to suddenly disappear.
100 WindowState target = mWindowAnimationBackground;
101 if (mService.mWallpaperTarget == target
102 || mService.mLowerWallpaperTarget == target
103 || mService.mUpperWallpaperTarget == target) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700104 final int N = mService.mWindows.size();
105 for (int i = 0; i < N; i++) {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700106 WindowState w = mService.mWindows.get(i);
107 if (w.mIsWallpaper) {
108 target = w;
109 break;
110 }
111 }
112 }
113 if (mWindowAnimationBackgroundSurface == null) {
114 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
115 }
116 final int dw = mDw;
117 final int dh = mDh;
118 mWindowAnimationBackgroundSurface.show(dw, dh,
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700119 target.mWinAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM,
Craig Mautnere7ae2502012-03-26 17:11:19 -0700120 mWindowAnimationBackgroundColor);
121 } else if (mWindowAnimationBackgroundSurface != null) {
122 mWindowAnimationBackgroundSurface.hide();
123 }
124 }
125
Craig Mautner764983d2012-03-22 11:37:36 -0700126 private void updateWindowsAppsAndRotationAnimationsLocked() {
127 int i;
128 final int NAT = mService.mAppTokens.size();
129 for (i=0; i<NAT; i++) {
Craig Mautner59431632012-04-04 11:56:44 -0700130 final AppWindowAnimator appAnimator = mService.mAppTokens.get(i).mAppAnimator;
131 final boolean wasAnimating = appAnimator.animation != null
132 && appAnimator.animation != WindowManagerService.sDummyAnimation;
133 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700134 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700135 } else if (wasAnimating) {
136 // stopped animating, do one more pass through the layout
137 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700138 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700139 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700140 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700141 }
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700142 }
143 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700144
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700145 final int NEAT = mService.mExitingAppTokens.size();
146 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700147 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700148 final boolean wasAnimating = appAnimator.animation != null
149 && appAnimator.animation != WindowManagerService.sDummyAnimation;
150 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700151 mAnimating = true;
152 } else if (wasAnimating) {
153 // stopped animating, do one more pass through the layout
154 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700155 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700156 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
157 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700158 }
Craig Mautner764983d2012-03-22 11:37:36 -0700159 }
160 }
161
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700162 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700163 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700164 mAnimating = true;
165 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700166 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700167 mScreenRotationAnimation.kill();
168 mScreenRotationAnimation = null;
169 }
170 }
171 }
172
173 private void updateWindowsAndWallpaperLocked() {
174 ++mTransactionSequence;
175
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700176 ArrayList<WindowStateAnimator> unForceHiding = null;
177 boolean wallpaperInUnForceHiding = false;
178
Craig Mautner764983d2012-03-22 11:37:36 -0700179 for (int i = mService.mWindows.size() - 1; i >= 0; i--) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700180 WindowState win = mService.mWindows.get(i);
181 WindowStateAnimator winAnimator = win.mWinAnimator;
182 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700183
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700184 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700185 final boolean wasAnimating = winAnimator.mWasAnimating;
186 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700187
188 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700189 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700190 ", nowAnimating=" + nowAnimating);
191 }
192
193 // If this window is animating, make a note that we have
194 // an animating window and take care of a request to run
195 // a detached wallpaper animation.
196 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700197 if (winAnimator.mAnimation != null) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700198 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700199 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700200 mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700201 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700202 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
203 if (backgroundColor != 0) {
Craig Mautner764983d2012-03-22 11:37:36 -0700204 if (mWindowAnimationBackground == null
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700205 || (winAnimator.mAnimLayer <
206 mWindowAnimationBackground.mWinAnimator.mAnimLayer)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700207 mWindowAnimationBackground = win;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700208 mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700209 }
210 }
211 }
212 mAnimating = true;
213 }
214
215 // If this window's app token is running a detached wallpaper
216 // animation, make a note so we can ensure the wallpaper is
217 // displayed behind it.
Craig Mautner59431632012-04-04 11:56:44 -0700218 final AppWindowAnimator appAnimator =
Craig Mautnerbec53f72012-04-05 11:49:05 -0700219 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700220 if (appAnimator != null && appAnimator.animation != null
221 && appAnimator.animating) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700222 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautner59431632012-04-04 11:56:44 -0700223 && appAnimator.animation.getDetachWallpaper()) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700224 mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700225 }
Craig Mautner59431632012-04-04 11:56:44 -0700226 final int backgroundColor = appAnimator.animation.getBackgroundColor();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700227 if (backgroundColor != 0) {
Craig Mautner764983d2012-03-22 11:37:36 -0700228 if (mWindowAnimationBackground == null
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700229 || (winAnimator.mAnimLayer <
230 mWindowAnimationBackground.mWinAnimator.mAnimLayer)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700231 mWindowAnimationBackground = win;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700232 mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700233 }
234 }
235 }
236
Craig Mautnerbec53f72012-04-05 11:49:05 -0700237 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700238 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700239 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700240 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700241 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
242 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700243 }
Craig Mautner764983d2012-03-22 11:37:36 -0700244 }
245
Craig Mautnerbec53f72012-04-05 11:49:05 -0700246 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700247 if (!wasAnimating && nowAnimating) {
248 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
249 "Animation started that could impact force hide: "
Craig Mautnerbec53f72012-04-05 11:49:05 -0700250 + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700251 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700252 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700253 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700254 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
255 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700256 }
Craig Mautner764983d2012-03-22 11:37:36 -0700257 mService.mFocusMayChange = true;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700258 } else if (win.isReadyForDisplay() && winAnimator.mAnimation == null) {
Craig Mautner764983d2012-03-22 11:37:36 -0700259 mForceHiding = true;
260 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700261 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700262 final boolean changed;
Craig Mautner764983d2012-03-22 11:37:36 -0700263 if (mForceHiding) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700264 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700265 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700266 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700267 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700268 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700269 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700270 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700271 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700272 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700273 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700274 if (unForceHiding == null) {
275 unForceHiding = new ArrayList<WindowStateAnimator>();
276 }
277 unForceHiding.add(winAnimator);
278 if ((win.mAttrs.flags&WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
279 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700280 }
281 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700282 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700283 // We are showing on to of the current
284 // focus, so re-evaluate focus to make
285 // sure it is correct.
286 mService.mFocusMayChange = true;
287 }
288 }
289 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700290 if (changed && (flags & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700291 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700292 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700293 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700294 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
295 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700296 }
Craig Mautner764983d2012-03-22 11:37:36 -0700297 }
298 }
299 }
300
Craig Mautnerbec53f72012-04-05 11:49:05 -0700301 final AppWindowToken atoken = win.mAppToken;
Craig Mautner59431632012-04-04 11:56:44 -0700302 if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700303 if (atoken.lastTransactionSequence != mTransactionSequence) {
304 atoken.lastTransactionSequence = mTransactionSequence;
305 atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
306 atoken.startingDisplayed = false;
307 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700308 if ((win.isOnScreen() || winAnimator.mAttrType
Craig Mautner764983d2012-03-22 11:37:36 -0700309 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
Craig Mautnerbec53f72012-04-05 11:49:05 -0700310 && !win.mExiting && !win.mDestroying) {
Craig Mautner764983d2012-03-22 11:37:36 -0700311 if (WindowManagerService.DEBUG_VISIBILITY ||
312 WindowManagerService.DEBUG_ORIENTATION) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700313 Slog.v(TAG, "Eval win " + win + ": isDrawn=" + win.isDrawnLw()
Craig Mautnera2c77052012-03-26 12:14:43 -0700314 + ", isAnimating=" + winAnimator.isAnimating());
Craig Mautnerbec53f72012-04-05 11:49:05 -0700315 if (!win.isDrawnLw()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700316 Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface
Craig Mautnerbec53f72012-04-05 11:49:05 -0700317 + " pv=" + win.mPolicyVisibility
Craig Mautner749a7bb2012-04-02 13:49:53 -0700318 + " mDrawState=" + winAnimator.mDrawState
Craig Mautnerbec53f72012-04-05 11:49:05 -0700319 + " ah=" + win.mAttachedHidden
Craig Mautner764983d2012-03-22 11:37:36 -0700320 + " th=" + atoken.hiddenRequested
Craig Mautnera2c77052012-03-26 12:14:43 -0700321 + " a=" + winAnimator.mAnimating);
Craig Mautner764983d2012-03-22 11:37:36 -0700322 }
323 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700324 if (win != atoken.startingWindow) {
325 if (!atoken.mAppAnimator.freezingScreen || !win.mAppFreezing) {
Craig Mautner764983d2012-03-22 11:37:36 -0700326 atoken.numInterestingWindows++;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700327 if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700328 atoken.numDrawnWindows++;
329 if (WindowManagerService.DEBUG_VISIBILITY ||
330 WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG,
331 "tokenMayBeDrawn: " + atoken
Craig Mautner59431632012-04-04 11:56:44 -0700332 + " freezingScreen=" + atoken.mAppAnimator.freezingScreen
Craig Mautnerbec53f72012-04-05 11:49:05 -0700333 + " mAppFreezing=" + win.mAppFreezing);
Craig Mautner764983d2012-03-22 11:37:36 -0700334 mTokenMayBeDrawn = true;
335 }
336 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700337 } else if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700338 atoken.startingDisplayed = true;
339 }
340 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700341 } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700342 if (winAnimator.performShowLocked()) {
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700343 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
344 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700345 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
346 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700347 }
348 }
Craig Mautner764983d2012-03-22 11:37:36 -0700349 }
Craig Mautner59431632012-04-04 11:56:44 -0700350 final AppWindowAnimator appAnimator =
351 atoken == null ? null : atoken.mAppAnimator;
352 if (appAnimator != null && appAnimator.thumbnail != null) {
353 if (appAnimator.thumbnailTransactionSeq != mTransactionSequence) {
354 appAnimator.thumbnailTransactionSeq = mTransactionSequence;
355 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700356 }
Craig Mautner59431632012-04-04 11:56:44 -0700357 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
358 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700359 }
360 }
Craig Mautner764983d2012-03-22 11:37:36 -0700361 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700362
363 // If we have windows that are being show due to them no longer
364 // being force-hidden, apply the appropriate animation to them.
365 if (unForceHiding != null) {
366 for (int i=unForceHiding.size()-1; i>=0; i--) {
367 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
368 if (a != null) {
369 unForceHiding.get(i).setAnimation(a);
370 }
371 }
372 }
Craig Mautner764983d2012-03-22 11:37:36 -0700373 }
374
375 private void testTokenMayBeDrawnLocked() {
376 // See if any windows have been drawn, so they (and others
377 // associated with them) can now be shown.
378 final int NT = mService.mAppTokens.size();
379 for (int i=0; i<NT; i++) {
380 AppWindowToken wtoken = mService.mAppTokens.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700381 if (wtoken.mAppAnimator.freezingScreen) {
Craig Mautner764983d2012-03-22 11:37:36 -0700382 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);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700388 wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700389 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
390 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
391 "Setting mOrientationChangeComplete=true because wtoken "
392 + wtoken + " numInteresting=" + numInteresting
393 + " numDrawn=" + wtoken.numDrawnWindows);
Craig Mautner764983d2012-03-22 11:37:36 -0700394 }
395 } else if (!wtoken.allDrawn) {
396 int numInteresting = wtoken.numInterestingWindows;
397 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
398 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
399 "allDrawn: " + wtoken
400 + " interesting=" + numInteresting
401 + " drawn=" + wtoken.numDrawnWindows);
402 wtoken.allDrawn = true;
403 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700404 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700405 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
406 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700407 }
Craig Mautner764983d2012-03-22 11:37:36 -0700408
409 // We can now show all of the drawn windows!
410 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700411 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700412 }
413 }
414 }
415 }
416 }
417
418 private void performAnimationsLocked() {
Craig Mautner764983d2012-03-22 11:37:36 -0700419 mTokenMayBeDrawn = false;
Craig Mautner764983d2012-03-22 11:37:36 -0700420 mForceHiding = false;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700421 mDetachedWallpaper = null;
Craig Mautner764983d2012-03-22 11:37:36 -0700422 mWindowAnimationBackground = null;
423 mWindowAnimationBackgroundColor = 0;
424
425 updateWindowsAndWallpaperLocked();
426
427 if (mTokenMayBeDrawn) {
428 testTokenMayBeDrawnLocked();
429 }
Craig Mautner764983d2012-03-22 11:37:36 -0700430 }
431
Craig Mautner764983d2012-03-22 11:37:36 -0700432 void animate() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700433 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700434 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700435 mBulkUpdateParams = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700436
437 // Update animations of all applications, including those
438 // associated with exiting/removed apps
439 Surface.openTransaction();
440
441 try {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700442 testWallpaperAndBackgroundLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700443 updateWindowsAppsAndRotationAnimationsLocked();
444 performAnimationsLocked();
445
446 // THIRD LOOP: Update the surfaces of all windows.
447
448 if (mScreenRotationAnimation != null) {
449 mScreenRotationAnimation.updateSurfaces();
450 }
451
Craig Mautnerbec53f72012-04-05 11:49:05 -0700452 mFinished.clear();
453 for (final WindowStateAnimator winAnimator : mWinAnimators) {
454 if (winAnimator.mSurface == null) {
455 mFinished.add(winAnimator);
456 } else {
457 winAnimator.prepareSurfaceLocked(true);
458 }
459 }
460 for (final WindowStateAnimator winAnimator : mFinished) {
461 mWinAnimators.remove(winAnimator);
Craig Mautner764983d2012-03-22 11:37:36 -0700462 }
463
Craig Mautner6af9b922012-04-05 19:25:51 -0700464 if (mDimParams != null) {
465 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
466 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700467 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700468 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700469 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700470 }
471
472 if (mService.mBlackFrame != null) {
473 if (mScreenRotationAnimation != null) {
474 mService.mBlackFrame.setMatrix(
475 mScreenRotationAnimation.getEnterTransformation().getMatrix());
476 } else {
477 mService.mBlackFrame.clearMatrix();
478 }
479 }
480 } catch (RuntimeException e) {
481 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
482 } finally {
483 Surface.closeTransaction();
484 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700485
Craig Mautner73850cb2012-04-10 12:56:27 -0700486 mService.bulkSetParameters(mBulkUpdateParams);
Craig Mautner764983d2012-03-22 11:37:36 -0700487 }
488
489 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700490 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700491 mCurrentFocus = currentFocus;
492 }
493
494 void setDisplayDimensions(final int curWidth, final int curHeight,
495 final int appWidth, final int appHeight) {
496 mDw = curWidth;
497 mDh = curHeight;
498 mInnerDw = appWidth;
499 mInnerDh = appHeight;
500 }
501
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700502 void startDimming(final WindowStateAnimator winAnimator, final float target,
503 final int width, final int height) {
504 if (mDimAnimator == null) {
505 mDimAnimator = new DimAnimator(mService.mFxSession);
506 }
507 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
508 new DimAnimator.Parameters(winAnimator, width, height, target)));
509 }
510
511 // TODO(cmautner): Move into Handler
512 void stopDimming() {
513 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
514 }
515
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700516 boolean isDimming() {
517 return mDimParams != null;
518 }
519
Craig Mautnere7ae2502012-03-26 17:11:19 -0700520 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
521 if (mWindowDetachedWallpaper != null) {
522 pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
523 }
524 if (mWindowAnimationBackgroundSurface != null) {
525 pw.println(" mWindowAnimationBackgroundSurface:");
526 mWindowAnimationBackgroundSurface.printTo(" ", pw);
527 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700528 if (mDimAnimator != null) {
529 pw.println(" mDimAnimator:");
530 mDimAnimator.printTo(" ", pw);
531 } else {
532 pw.println( " no DimAnimator ");
533 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700534 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700535
536 static class SetAnimationParams {
537 final WindowStateAnimator mWinAnimator;
538 final Animation mAnimation;
539 final int mAnimDw;
540 final int mAnimDh;
541 public SetAnimationParams(final WindowStateAnimator winAnimator,
542 final Animation animation, final int animDw, final int animDh) {
543 mWinAnimator = winAnimator;
544 mAnimation = animation;
545 mAnimDw = animDw;
546 mAnimDh = animDh;
547 }
548 }
Craig Mautner764983d2012-03-22 11:37:36 -0700549}