blob: b5cf20135bc388c2def381b8f39df87ba099c2a7 [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 Mautnerb9836b92012-06-11 11:40:09 -070088 void hideWallpapersLocked(final WindowState w) {
89 if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null)
90 || mService.mWallpaperTarget == null) {
91 for (final WindowToken token : mService.mWallpaperTokens) {
92 for (final WindowState wallpaper : token.windows) {
93 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
94 if (!winAnimator.mLastHidden) {
95 winAnimator.hide();
96 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
97 }
98 }
99 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700100 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700101 }
102 }
103
Craig Mautnere7ae2502012-03-26 17:11:19 -0700104 private void testWallpaperAndBackgroundLocked() {
105 if (mWindowDetachedWallpaper != mDetachedWallpaper) {
106 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
107 "Detached wallpaper changed from " + mWindowDetachedWallpaper
108 + " to " + mDetachedWallpaper);
109 mWindowDetachedWallpaper = mDetachedWallpaper;
Craig Mautnera608b882012-03-30 13:03:49 -0700110 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautnere7ae2502012-03-26 17:11:19 -0700111 }
112
113 if (mWindowAnimationBackgroundColor != 0) {
114 // If the window that wants black is the current wallpaper
115 // target, then the black goes *below* the wallpaper so we
116 // don't cause the wallpaper to suddenly disappear.
117 WindowState target = mWindowAnimationBackground;
118 if (mService.mWallpaperTarget == target
119 || mService.mLowerWallpaperTarget == target
120 || mService.mUpperWallpaperTarget == target) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700121 final int N = mService.mWindows.size();
122 for (int i = 0; i < N; i++) {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700123 WindowState w = mService.mWindows.get(i);
124 if (w.mIsWallpaper) {
125 target = w;
126 break;
127 }
128 }
129 }
130 if (mWindowAnimationBackgroundSurface == null) {
131 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
132 }
133 final int dw = mDw;
134 final int dh = mDh;
135 mWindowAnimationBackgroundSurface.show(dw, dh,
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700136 target.mWinAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM,
Craig Mautnere7ae2502012-03-26 17:11:19 -0700137 mWindowAnimationBackgroundColor);
138 } else if (mWindowAnimationBackgroundSurface != null) {
139 mWindowAnimationBackgroundSurface.hide();
140 }
141 }
142
Craig Mautner764983d2012-03-22 11:37:36 -0700143 private void updateWindowsAppsAndRotationAnimationsLocked() {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700144 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
Craig Mautner764983d2012-03-22 11:37:36 -0700145 int i;
Craig Mautneref25d7a2012-05-15 23:01:47 -0700146 final int NAT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700147 for (i=0; i<NAT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700148 final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700149 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700150 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700151 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700152 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700153 } 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("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700158 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700159 }
Craig Mautner83339b42012-05-01 22:13:23 -0700160 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
161 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700162 }
163 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700164
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700165 final int NEAT = mService.mExitingAppTokens.size();
166 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700167 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700168 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700169 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700170 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700171 mAnimating = true;
172 } else if (wasAnimating) {
173 // stopped animating, do one more pass through the layout
174 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700175 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700176 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700177 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700178 }
Craig Mautner83339b42012-05-01 22:13:23 -0700179 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
180 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700181 }
182 }
183
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700184 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700185 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700186 mAnimating = true;
187 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700188 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700189 mScreenRotationAnimation.kill();
190 mScreenRotationAnimation = null;
191 }
192 }
193 }
194
195 private void updateWindowsAndWallpaperLocked() {
196 ++mTransactionSequence;
197
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700198 ArrayList<WindowStateAnimator> unForceHiding = null;
199 boolean wallpaperInUnForceHiding = false;
200
Craig Mautner764983d2012-03-22 11:37:36 -0700201 for (int i = mService.mWindows.size() - 1; i >= 0; i--) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700202 WindowState win = mService.mWindows.get(i);
203 WindowStateAnimator winAnimator = win.mWinAnimator;
204 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700205
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700206 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700207 final boolean wasAnimating = winAnimator.mWasAnimating;
208 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700209
210 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700211 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700212 ", nowAnimating=" + nowAnimating);
213 }
214
215 // If this window is animating, make a note that we have
216 // an animating window and take care of a request to run
217 // a detached wallpaper animation.
218 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700219 if (winAnimator.mAnimation != null) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700220 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700221 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700222 mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700223 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700224 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
225 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 mAnimating = true;
235 }
236
237 // If this window's app token is running a detached wallpaper
238 // animation, make a note so we can ensure the wallpaper is
239 // displayed behind it.
Craig Mautner59431632012-04-04 11:56:44 -0700240 final AppWindowAnimator appAnimator =
Craig Mautnerbec53f72012-04-05 11:49:05 -0700241 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700242 if (appAnimator != null && appAnimator.animation != null
243 && appAnimator.animating) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700244 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautner59431632012-04-04 11:56:44 -0700245 && appAnimator.animation.getDetachWallpaper()) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700246 mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700247 }
Craig Mautner59431632012-04-04 11:56:44 -0700248 final int backgroundColor = appAnimator.animation.getBackgroundColor();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700249 if (backgroundColor != 0) {
Craig Mautner764983d2012-03-22 11:37:36 -0700250 if (mWindowAnimationBackground == null
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700251 || (winAnimator.mAnimLayer <
252 mWindowAnimationBackground.mWinAnimator.mAnimLayer)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700253 mWindowAnimationBackground = win;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700254 mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700255 }
256 }
257 }
258
Craig Mautnerbec53f72012-04-05 11:49:05 -0700259 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700260 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700261 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700262 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700263 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
264 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700265 }
Craig Mautner764983d2012-03-22 11:37:36 -0700266 }
267
Craig Mautnerbec53f72012-04-05 11:49:05 -0700268 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700269 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700270 if (WindowManagerService.DEBUG_ANIM ||
271 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
272 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700273 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700274 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700275 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700276 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
277 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700278 }
Craig Mautner764983d2012-03-22 11:37:36 -0700279 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700280 }
281 if (win.isReadyForDisplay()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700282 mForceHiding = true;
283 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700284 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
285 "Force hide " + mForceHiding
286 + " hasSurface=" + win.mHasSurface
287 + " policyVis=" + win.mPolicyVisibility
288 + " destroying=" + win.mDestroying
289 + " attHidden=" + win.mAttachedHidden
290 + " vis=" + win.mViewVisibility
291 + " hidden=" + win.mRootToken.hidden
292 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700293 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700294 final boolean changed;
Craig Mautner764983d2012-03-22 11:37:36 -0700295 if (mForceHiding) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700296 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700297 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700298 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700299 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700300 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700301 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700302 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700303 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700304 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700305 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700306 if (unForceHiding == null) {
307 unForceHiding = new ArrayList<WindowStateAnimator>();
308 }
309 unForceHiding.add(winAnimator);
310 if ((win.mAttrs.flags&WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
311 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700312 }
313 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700314 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700315 // We are showing on to of the current
316 // focus, so re-evaluate focus to make
317 // sure it is correct.
318 mService.mFocusMayChange = true;
319 }
320 }
321 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700322 if (changed && (flags & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700323 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700324 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700325 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700326 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
327 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700328 }
Craig Mautner764983d2012-03-22 11:37:36 -0700329 }
330 }
331 }
332
Craig Mautnerbec53f72012-04-05 11:49:05 -0700333 final AppWindowToken atoken = win.mAppToken;
Craig Mautner59431632012-04-04 11:56:44 -0700334 if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700335 if (atoken.lastTransactionSequence != mTransactionSequence) {
336 atoken.lastTransactionSequence = mTransactionSequence;
337 atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
338 atoken.startingDisplayed = false;
339 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700340 if ((win.isOnScreen() || winAnimator.mAttrType
Craig Mautner764983d2012-03-22 11:37:36 -0700341 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
Craig Mautnerbec53f72012-04-05 11:49:05 -0700342 && !win.mExiting && !win.mDestroying) {
Craig Mautner764983d2012-03-22 11:37:36 -0700343 if (WindowManagerService.DEBUG_VISIBILITY ||
344 WindowManagerService.DEBUG_ORIENTATION) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700345 Slog.v(TAG, "Eval win " + win + ": isDrawn=" + win.isDrawnLw()
Craig Mautnera2c77052012-03-26 12:14:43 -0700346 + ", isAnimating=" + winAnimator.isAnimating());
Craig Mautnerbec53f72012-04-05 11:49:05 -0700347 if (!win.isDrawnLw()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700348 Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface
Craig Mautnerbec53f72012-04-05 11:49:05 -0700349 + " pv=" + win.mPolicyVisibility
Craig Mautner749a7bb2012-04-02 13:49:53 -0700350 + " mDrawState=" + winAnimator.mDrawState
Craig Mautnerbec53f72012-04-05 11:49:05 -0700351 + " ah=" + win.mAttachedHidden
Craig Mautner764983d2012-03-22 11:37:36 -0700352 + " th=" + atoken.hiddenRequested
Craig Mautnera2c77052012-03-26 12:14:43 -0700353 + " a=" + winAnimator.mAnimating);
Craig Mautner764983d2012-03-22 11:37:36 -0700354 }
355 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700356 if (win != atoken.startingWindow) {
357 if (!atoken.mAppAnimator.freezingScreen || !win.mAppFreezing) {
Craig Mautner764983d2012-03-22 11:37:36 -0700358 atoken.numInterestingWindows++;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700359 if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700360 atoken.numDrawnWindows++;
361 if (WindowManagerService.DEBUG_VISIBILITY ||
362 WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG,
363 "tokenMayBeDrawn: " + atoken
Craig Mautner59431632012-04-04 11:56:44 -0700364 + " freezingScreen=" + atoken.mAppAnimator.freezingScreen
Craig Mautnerbec53f72012-04-05 11:49:05 -0700365 + " mAppFreezing=" + win.mAppFreezing);
Craig Mautner764983d2012-03-22 11:37:36 -0700366 mTokenMayBeDrawn = true;
367 }
368 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700369 } else if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700370 atoken.startingDisplayed = true;
371 }
372 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700373 } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700374 if (winAnimator.performShowLocked()) {
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700375 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
376 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700377 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
378 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700379 }
380 }
Craig Mautner764983d2012-03-22 11:37:36 -0700381 }
Craig Mautner59431632012-04-04 11:56:44 -0700382 final AppWindowAnimator appAnimator =
383 atoken == null ? null : atoken.mAppAnimator;
384 if (appAnimator != null && appAnimator.thumbnail != null) {
385 if (appAnimator.thumbnailTransactionSeq != mTransactionSequence) {
386 appAnimator.thumbnailTransactionSeq = mTransactionSequence;
387 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700388 }
Craig Mautner59431632012-04-04 11:56:44 -0700389 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
390 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700391 }
392 }
Craig Mautner764983d2012-03-22 11:37:36 -0700393 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700394
395 // If we have windows that are being show due to them no longer
396 // being force-hidden, apply the appropriate animation to them.
397 if (unForceHiding != null) {
398 for (int i=unForceHiding.size()-1; i>=0; i--) {
399 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
400 if (a != null) {
Craig Mautner4d7349b2012-04-20 14:52:47 -0700401 final WindowStateAnimator winAnimator = unForceHiding.get(i);
402 winAnimator.setAnimation(a);
403 winAnimator.mAnimationIsEntrance = true;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700404 }
405 }
406 }
Craig Mautner764983d2012-03-22 11:37:36 -0700407 }
408
409 private void testTokenMayBeDrawnLocked() {
410 // See if any windows have been drawn, so they (and others
411 // associated with them) can now be shown.
Craig Mautneref25d7a2012-05-15 23:01:47 -0700412 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
413 final int NT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700414 for (int i=0; i<NT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700415 AppWindowToken wtoken = appTokens.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700416 if (wtoken.mAppAnimator.freezingScreen) {
Craig Mautner764983d2012-03-22 11:37:36 -0700417 int numInteresting = wtoken.numInterestingWindows;
418 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
419 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
420 "allDrawn: " + wtoken
421 + " interesting=" + numInteresting
422 + " drawn=" + wtoken.numDrawnWindows);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700423 wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700424 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
425 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
426 "Setting mOrientationChangeComplete=true because wtoken "
427 + wtoken + " numInteresting=" + numInteresting
428 + " numDrawn=" + wtoken.numDrawnWindows);
Craig Mautner924c2152012-04-23 18:14:07 -0700429 // This will set mOrientationChangeComplete and cause a pass through layout.
430 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautner764983d2012-03-22 11:37:36 -0700431 }
432 } else if (!wtoken.allDrawn) {
433 int numInteresting = wtoken.numInterestingWindows;
434 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
435 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
436 "allDrawn: " + wtoken
437 + " interesting=" + numInteresting
438 + " drawn=" + wtoken.numDrawnWindows);
439 wtoken.allDrawn = true;
440 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700441 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700442 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
443 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700444 }
Craig Mautner764983d2012-03-22 11:37:36 -0700445
446 // We can now show all of the drawn windows!
447 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700448 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700449 }
450 }
451 }
452 }
453 }
454
455 private void performAnimationsLocked() {
Craig Mautner764983d2012-03-22 11:37:36 -0700456 mTokenMayBeDrawn = false;
Craig Mautner764983d2012-03-22 11:37:36 -0700457 mForceHiding = false;
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700458 mDetachedWallpaper = null;
Craig Mautner764983d2012-03-22 11:37:36 -0700459 mWindowAnimationBackground = null;
460 mWindowAnimationBackgroundColor = 0;
461
462 updateWindowsAndWallpaperLocked();
Craig Mautner4d7349b2012-04-20 14:52:47 -0700463 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
464 mPendingActions |= WALLPAPER_ACTION_PENDING;
465 }
Craig Mautner764983d2012-03-22 11:37:36 -0700466
467 if (mTokenMayBeDrawn) {
468 testTokenMayBeDrawnLocked();
469 }
Craig Mautner764983d2012-03-22 11:37:36 -0700470 }
471
Craig Mautner4d7349b2012-04-20 14:52:47 -0700472 synchronized void animate() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700473 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700474 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700475 mBulkUpdateParams = 0;
Chet Haase198e5642012-05-10 09:55:15 -0700476 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700477 mAnimating = false;
478 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
479 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
480 }
Craig Mautner764983d2012-03-22 11:37:36 -0700481
482 // Update animations of all applications, including those
483 // associated with exiting/removed apps
484 Surface.openTransaction();
485
486 try {
487 updateWindowsAppsAndRotationAnimationsLocked();
488 performAnimationsLocked();
Craig Mautner8a197a42012-04-24 16:59:36 -0700489 testWallpaperAndBackgroundLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700490
491 // THIRD LOOP: Update the surfaces of all windows.
492
493 if (mScreenRotationAnimation != null) {
494 mScreenRotationAnimation.updateSurfaces();
495 }
496
Craig Mautner7358fbf2012-04-12 21:06:33 -0700497 final int N = mWinAnimators.size();
498 for (int i = 0; i < N; i++) {
Craig Mautnerad5725d2012-06-05 10:20:56 -0700499 final WindowStateAnimator winAnimator = mWinAnimators.get(i);
500 if (winAnimator.mWin.mIsWallpaper && mService.mWallpaperTarget == null) {
Craig Mautnerb9836b92012-06-11 11:40:09 -0700501 if (!winAnimator.mWin.mWallpaperVisible && !winAnimator.mLastHidden) {
502 // Wallpaper is no longer visible and there is no wp target => hide it.
503 winAnimator.hide();
504 }
Craig Mautnerad5725d2012-06-05 10:20:56 -0700505 continue;
506 }
507 winAnimator.prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700508 }
509
Craig Mautner6af9b922012-04-05 19:25:51 -0700510 if (mDimParams != null) {
511 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
512 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700513 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700514 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700515 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700516 }
517
518 if (mService.mBlackFrame != null) {
519 if (mScreenRotationAnimation != null) {
520 mService.mBlackFrame.setMatrix(
521 mScreenRotationAnimation.getEnterTransformation().getMatrix());
522 } else {
523 mService.mBlackFrame.clearMatrix();
524 }
525 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700526
527 if (mService.mWatermark != null) {
528 mService.mWatermark.drawIfNeeded();
529 }
Craig Mautner764983d2012-03-22 11:37:36 -0700530 } catch (RuntimeException e) {
531 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
532 } finally {
533 Surface.closeTransaction();
534 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700535
Craig Mautner7d8df392012-04-06 15:26:23 -0700536 mService.bulkSetParameters(mBulkUpdateParams, mPendingLayoutChanges);
537
538 if (mAnimating) {
539 mService.scheduleAnimationLocked();
Chet Haase198e5642012-05-10 09:55:15 -0700540 } else if (wasAnimating) {
541 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700542 }
543 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
544 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
545 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
546 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
547 }
Craig Mautner764983d2012-03-22 11:37:36 -0700548 }
549
550 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700551 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700552 mCurrentFocus = currentFocus;
553 }
554
555 void setDisplayDimensions(final int curWidth, final int curHeight,
556 final int appWidth, final int appHeight) {
557 mDw = curWidth;
558 mDh = curHeight;
559 mInnerDw = appWidth;
560 mInnerDh = appHeight;
561 }
562
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700563 void startDimming(final WindowStateAnimator winAnimator, final float target,
564 final int width, final int height) {
565 if (mDimAnimator == null) {
566 mDimAnimator = new DimAnimator(mService.mFxSession);
567 }
Craig Mautner067ca322012-05-18 17:19:51 -0700568 // Only set dim params on the highest dimmed layer.
569 final WindowStateAnimator dimWinAnimator = mDimParams == null
570 ? null : mDimParams.mDimWinAnimator;
571 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
572 if (winAnimator.mSurfaceShown &&
573 (dimWinAnimator == null || !dimWinAnimator.mSurfaceShown
574 || dimWinAnimator.mAnimLayer < winAnimator.mAnimLayer)) {
575 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
576 new DimAnimator.Parameters(winAnimator, width, height, target)));
577 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700578 }
579
580 // TODO(cmautner): Move into Handler
581 void stopDimming() {
582 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
583 }
584
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700585 boolean isDimming() {
586 return mDimParams != null;
587 }
588
Craig Mautneracafd192012-05-10 10:41:02 -0700589 boolean isDimming(final WindowStateAnimator winAnimator) {
590 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
591 }
592
Craig Mautnere7ae2502012-03-26 17:11:19 -0700593 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
594 if (mWindowDetachedWallpaper != null) {
595 pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
596 }
597 if (mWindowAnimationBackgroundSurface != null) {
598 pw.println(" mWindowAnimationBackgroundSurface:");
599 mWindowAnimationBackgroundSurface.printTo(" ", pw);
600 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700601 if (mDimAnimator != null) {
602 pw.println(" mDimAnimator:");
603 mDimAnimator.printTo(" ", pw);
604 } else {
605 pw.println( " no DimAnimator ");
606 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700607 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700608
609 static class SetAnimationParams {
610 final WindowStateAnimator mWinAnimator;
611 final Animation mAnimation;
612 final int mAnimDw;
613 final int mAnimDh;
614 public SetAnimationParams(final WindowStateAnimator winAnimator,
615 final Animation animation, final int animDw, final int animDh) {
616 mWinAnimator = winAnimator;
617 mAnimation = animation;
618 mAnimDw = animDw;
619 mAnimDh = animDh;
620 }
621 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700622
623 synchronized void clearPendingActions() {
624 mPendingActions = 0;
625 }
Craig Mautner764983d2012-03-22 11:37:36 -0700626}