blob: 0934ddb6544b3610dd2e9fccec5602f325f95df1 [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;
Craig Mautner1caa3992012-06-22 09:46:48 -070017import android.view.Choreographer;
Craig Mautner764983d2012-03-22 11:37:36 -070018import android.view.Surface;
19import android.view.WindowManager;
Craig Mautner764983d2012-03-22 11:37:36 -070020import android.view.WindowManagerPolicy;
21import android.view.animation.Animation;
Craig Mautner764983d2012-03-22 11:37:36 -070022
23import com.android.internal.policy.impl.PhoneWindowManager;
24
Craig Mautnere7ae2502012-03-26 17:11:19 -070025import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070026import java.util.ArrayList;
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 Mautner1caa3992012-06-22 09:46:48 -070039 final Choreographer mChoreographer = Choreographer.getInstance();
40
Craig Mautner7358fbf2012-04-12 21:06:33 -070041 ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
Craig Mautnerbec53f72012-04-05 11:49:05 -070042
Craig Mautner764983d2012-03-22 11:37:36 -070043 boolean mAnimating;
Craig Mautner01cd0e72012-06-18 10:19:11 -070044
45 /** Variables only intended to be valid within each pass through animate(). Does not contain
46 * persistent state. */
47 private class InnerLoopParams {
48 boolean mTokenMayBeDrawn;
49 boolean mForceHiding;
50 WindowState mDetachedWallpaper = null;
51 WindowState mWindowAnimationBackground;
52 int mWindowAnimationBackgroundColor;
53 }
54 InnerLoopParams mInner = new InnerLoopParams();
55
Craig Mautner1caa3992012-06-22 09:46:48 -070056 static class LayoutToAnimatorParams {
57 boolean mAnimationScheduled;
58 ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
59 WindowState mWallpaperTarget;
60 }
61 /** Params from WindowManagerService. Do not modify or read without first locking on
62 * either WindowManagerService.mWindowMap or WindowManagerService.mAnimator.and then on
63 * mLayoutToAnim */
64 final LayoutToAnimatorParams mLayoutToAnim = new LayoutToAnimatorParams();
65
66 final Runnable mAnimationRunnable;
67
Craig Mautner764983d2012-03-22 11:37:36 -070068 int mAdjResult;
69
70 int mPendingLayoutChanges;
71
72 /** Overall window dimensions */
73 int mDw, mDh;
74
75 /** Interior window dimensions */
76 int mInnerDw, mInnerDh;
77
78 /** Time of current animation step. Reset on each iteration */
79 long mCurrentTime;
80
81 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
82 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
83 private int mTransactionSequence;
84
85 /** The one and only screen rotation if one is happening */
86 ScreenRotationAnimation mScreenRotationAnimation = null;
87
Craig Mautnere7ae2502012-03-26 17:11:19 -070088 // Window currently running an animation that has requested it be detached
89 // from the wallpaper. This means we need to ensure the wallpaper is
90 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070091 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070092 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070093
Craig Mautnere7ae2502012-03-26 17:11:19 -070094 DimSurface mWindowAnimationBackgroundSurface = null;
95
Craig Mautnera608b882012-03-30 13:03:49 -070096 int mBulkUpdateParams = 0;
97
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070098 DimAnimator mDimAnimator = null;
99 DimAnimator.Parameters mDimParams = null;
100
Craig Mautner4d7349b2012-04-20 14:52:47 -0700101 static final int WALLPAPER_ACTION_PENDING = 1;
102 int mPendingActions;
103
Craig Mautner1caa3992012-06-22 09:46:48 -0700104 WindowState mWallpaperTarget = null;
105
Craig Mautner764983d2012-03-22 11:37:36 -0700106 WindowAnimator(final WindowManagerService service, final Context context,
107 final WindowManagerPolicy policy) {
108 mService = service;
109 mContext = context;
110 mPolicy = policy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700111
112 mAnimationRunnable = new Runnable() {
113 @Override
114 public void run() {
115 // TODO(cmautner): When full isolation is achieved for animation, the first lock
116 // goes away and only the WindowAnimator.this remains.
117 synchronized(mService.mWindowMap) {
118 synchronized(WindowAnimator.this) {
119 copyLayoutToAnimParamsLocked();
120 animateLocked();
121 }
122 }
123 }
124 };
125 }
126
127 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
128 private void copyLayoutToAnimParamsLocked() {
129 final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
130 synchronized(layoutToAnim) {
131 layoutToAnim.mAnimationScheduled = false;
132
133 mWinAnimators = new ArrayList<WindowStateAnimator>(layoutToAnim.mWinAnimators);
134 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
135 }
136 }
137
138 /** Note that Locked in this case is on mLayoutToAnim */
139 void scheduleAnimationLocked() {
140 final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
141 if (!layoutToAnim.mAnimationScheduled) {
142 layoutToAnim.mAnimationScheduled = true;
143 mChoreographer.postCallback(
144 Choreographer.CALLBACK_ANIMATION, mAnimationRunnable, null);
145 }
Craig Mautner764983d2012-03-22 11:37:36 -0700146 }
147
Craig Mautnerb9836b92012-06-11 11:40:09 -0700148 void hideWallpapersLocked(final WindowState w) {
149 if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null)
150 || mService.mWallpaperTarget == null) {
151 for (final WindowToken token : mService.mWallpaperTokens) {
152 for (final WindowState wallpaper : token.windows) {
153 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
154 if (!winAnimator.mLastHidden) {
155 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700156 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700157 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
158 }
159 }
160 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700161 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700162 }
163 }
164
Craig Mautnere7ae2502012-03-26 17:11:19 -0700165 private void testWallpaperAndBackgroundLocked() {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700166 final WindowState detachedWallpaper = mInner.mDetachedWallpaper;
167 if (mWindowDetachedWallpaper != detachedWallpaper) {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700168 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
169 "Detached wallpaper changed from " + mWindowDetachedWallpaper
Craig Mautner01cd0e72012-06-18 10:19:11 -0700170 + " to " + detachedWallpaper);
171 mWindowDetachedWallpaper = detachedWallpaper;
Craig Mautnera608b882012-03-30 13:03:49 -0700172 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautnere7ae2502012-03-26 17:11:19 -0700173 }
174
Craig Mautner01cd0e72012-06-18 10:19:11 -0700175 if (mInner.mWindowAnimationBackgroundColor != 0) {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700176 // If the window that wants black is the current wallpaper
177 // target, then the black goes *below* the wallpaper so we
178 // don't cause the wallpaper to suddenly disappear.
Craig Mautner01cd0e72012-06-18 10:19:11 -0700179 WindowState target = mInner.mWindowAnimationBackground;
Craig Mautnere7ae2502012-03-26 17:11:19 -0700180 if (mService.mWallpaperTarget == target
181 || mService.mLowerWallpaperTarget == target
182 || mService.mUpperWallpaperTarget == target) {
Craig Mautner1caa3992012-06-22 09:46:48 -0700183 final int N = mWinAnimators.size();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700184 for (int i = 0; i < N; i++) {
Craig Mautner1caa3992012-06-22 09:46:48 -0700185 WindowStateAnimator winAnimator = mWinAnimators.get(i);
186 if (winAnimator.mWin.mIsWallpaper) {
187 target = winAnimator.mWin;
Craig Mautnere7ae2502012-03-26 17:11:19 -0700188 break;
189 }
190 }
191 }
192 if (mWindowAnimationBackgroundSurface == null) {
193 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
194 }
195 final int dw = mDw;
196 final int dh = mDh;
197 mWindowAnimationBackgroundSurface.show(dw, dh,
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700198 target.mWinAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM,
Craig Mautner01cd0e72012-06-18 10:19:11 -0700199 mInner.mWindowAnimationBackgroundColor);
Craig Mautnere7ae2502012-03-26 17:11:19 -0700200 } else if (mWindowAnimationBackgroundSurface != null) {
201 mWindowAnimationBackgroundSurface.hide();
202 }
203 }
204
Craig Mautner764983d2012-03-22 11:37:36 -0700205 private void updateWindowsAppsAndRotationAnimationsLocked() {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700206 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
Craig Mautner764983d2012-03-22 11:37:36 -0700207 int i;
Craig Mautneref25d7a2012-05-15 23:01:47 -0700208 final int NAT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700209 for (i=0; i<NAT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700210 final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700211 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700212 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700213 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700214 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700215 } else if (wasAnimating) {
216 // stopped animating, do one more pass through the layout
217 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700218 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700219 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700220 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700221 }
Craig Mautner83339b42012-05-01 22:13:23 -0700222 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
223 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700224 }
225 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700226
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700227 final int NEAT = mService.mExitingAppTokens.size();
228 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700229 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700230 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700231 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700232 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700233 mAnimating = true;
234 } else if (wasAnimating) {
235 // stopped animating, do one more pass through the layout
236 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700237 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700238 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700239 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700240 }
Craig Mautner83339b42012-05-01 22:13:23 -0700241 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
242 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700243 }
244 }
245
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700246 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700247 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700248 mAnimating = true;
249 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700250 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700251 mScreenRotationAnimation.kill();
252 mScreenRotationAnimation = null;
253 }
254 }
255 }
256
257 private void updateWindowsAndWallpaperLocked() {
258 ++mTransactionSequence;
259
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700260 ArrayList<WindowStateAnimator> unForceHiding = null;
261 boolean wallpaperInUnForceHiding = false;
262
Craig Mautner01cd0e72012-06-18 10:19:11 -0700263 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
264 WindowStateAnimator winAnimator = mWinAnimators.get(i);
265 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700266 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700267
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700268 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700269 final boolean wasAnimating = winAnimator.mWasAnimating;
270 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700271
272 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700273 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700274 ", nowAnimating=" + nowAnimating);
275 }
276
277 // If this window is animating, make a note that we have
278 // an animating window and take care of a request to run
279 // a detached wallpaper animation.
280 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700281 if (winAnimator.mAnimation != null) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700282 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700283 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700284 mInner.mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700285 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700286 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
287 if (backgroundColor != 0) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700288 final WindowState background = mInner.mWindowAnimationBackground;
289 if (background == null || (winAnimator.mAnimLayer <
290 background.mWinAnimator.mAnimLayer)) {
291 mInner.mWindowAnimationBackground = win;
292 mInner.mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700293 }
294 }
295 }
296 mAnimating = true;
297 }
298
299 // If this window's app token is running a detached wallpaper
300 // animation, make a note so we can ensure the wallpaper is
301 // displayed behind it.
Craig Mautner59431632012-04-04 11:56:44 -0700302 final AppWindowAnimator appAnimator =
Craig Mautnerbec53f72012-04-05 11:49:05 -0700303 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700304 if (appAnimator != null && appAnimator.animation != null
305 && appAnimator.animating) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700306 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautner59431632012-04-04 11:56:44 -0700307 && appAnimator.animation.getDetachWallpaper()) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700308 mInner.mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700309 }
Craig Mautner59431632012-04-04 11:56:44 -0700310 final int backgroundColor = appAnimator.animation.getBackgroundColor();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700311 if (backgroundColor != 0) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700312 final WindowState background = mInner.mWindowAnimationBackground;
313 if (background == null || (winAnimator.mAnimLayer <
314 background.mWinAnimator.mAnimLayer)) {
315 mInner.mWindowAnimationBackground = win;
316 mInner.mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700317 }
318 }
319 }
320
Craig Mautnerbec53f72012-04-05 11:49:05 -0700321 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700322 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700323 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700324 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700325 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
326 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700327 }
Craig Mautner764983d2012-03-22 11:37:36 -0700328 }
329
Craig Mautnerbec53f72012-04-05 11:49:05 -0700330 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700331 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700332 if (WindowManagerService.DEBUG_ANIM ||
333 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
334 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700335 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700336 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700337 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700338 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
339 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700340 }
Craig Mautner764983d2012-03-22 11:37:36 -0700341 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700342 }
Craig Mautnerf03e4c52012-06-14 14:11:27 -0700343 if (win.isReadyForDisplay() && !winAnimator.isAnimating()) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700344 mInner.mForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700345 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700346 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner01cd0e72012-06-18 10:19:11 -0700347 "Force hide " + mInner.mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700348 + " hasSurface=" + win.mHasSurface
349 + " policyVis=" + win.mPolicyVisibility
350 + " destroying=" + win.mDestroying
351 + " attHidden=" + win.mAttachedHidden
352 + " vis=" + win.mViewVisibility
353 + " hidden=" + win.mRootToken.hidden
354 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700355 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700356 final boolean changed;
Craig Mautner01cd0e72012-06-18 10:19:11 -0700357 if (mInner.mForceHiding && !winAnimator.isAnimating()) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700358 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700359 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700360 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700361 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700362 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700363 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700364 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700365 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700366 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700367 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700368 if (unForceHiding == null) {
369 unForceHiding = new ArrayList<WindowStateAnimator>();
370 }
371 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700372 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700373 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700374 }
375 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700376 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700377 // We are showing on to of the current
378 // focus, so re-evaluate focus to make
379 // sure it is correct.
380 mService.mFocusMayChange = true;
381 }
382 }
383 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700384 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700385 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700386 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700387 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700388 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
389 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700390 }
Craig Mautner764983d2012-03-22 11:37:36 -0700391 }
392 }
393 }
394
Craig Mautnerbec53f72012-04-05 11:49:05 -0700395 final AppWindowToken atoken = win.mAppToken;
Craig Mautner59431632012-04-04 11:56:44 -0700396 if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700397 if (atoken.lastTransactionSequence != mTransactionSequence) {
398 atoken.lastTransactionSequence = mTransactionSequence;
399 atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
400 atoken.startingDisplayed = false;
401 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700402 if ((win.isOnScreen() || winAnimator.mAttrType
Craig Mautner764983d2012-03-22 11:37:36 -0700403 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
Craig Mautnerbec53f72012-04-05 11:49:05 -0700404 && !win.mExiting && !win.mDestroying) {
Craig Mautner764983d2012-03-22 11:37:36 -0700405 if (WindowManagerService.DEBUG_VISIBILITY ||
406 WindowManagerService.DEBUG_ORIENTATION) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700407 Slog.v(TAG, "Eval win " + win + ": isDrawn=" + win.isDrawnLw()
Craig Mautnera2c77052012-03-26 12:14:43 -0700408 + ", isAnimating=" + winAnimator.isAnimating());
Craig Mautnerbec53f72012-04-05 11:49:05 -0700409 if (!win.isDrawnLw()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700410 Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface
Craig Mautnerbec53f72012-04-05 11:49:05 -0700411 + " pv=" + win.mPolicyVisibility
Craig Mautner749a7bb2012-04-02 13:49:53 -0700412 + " mDrawState=" + winAnimator.mDrawState
Craig Mautnerbec53f72012-04-05 11:49:05 -0700413 + " ah=" + win.mAttachedHidden
Craig Mautner764983d2012-03-22 11:37:36 -0700414 + " th=" + atoken.hiddenRequested
Craig Mautnera2c77052012-03-26 12:14:43 -0700415 + " a=" + winAnimator.mAnimating);
Craig Mautner764983d2012-03-22 11:37:36 -0700416 }
417 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700418 if (win != atoken.startingWindow) {
419 if (!atoken.mAppAnimator.freezingScreen || !win.mAppFreezing) {
Craig Mautner764983d2012-03-22 11:37:36 -0700420 atoken.numInterestingWindows++;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700421 if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700422 atoken.numDrawnWindows++;
423 if (WindowManagerService.DEBUG_VISIBILITY ||
424 WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG,
425 "tokenMayBeDrawn: " + atoken
Craig Mautner59431632012-04-04 11:56:44 -0700426 + " freezingScreen=" + atoken.mAppAnimator.freezingScreen
Craig Mautnerbec53f72012-04-05 11:49:05 -0700427 + " mAppFreezing=" + win.mAppFreezing);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700428 mInner.mTokenMayBeDrawn = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700429 }
430 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700431 } else if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700432 atoken.startingDisplayed = true;
433 }
434 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700435 } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700436 if (winAnimator.performShowLocked()) {
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700437 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
438 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700439 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
440 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700441 }
442 }
Craig Mautner764983d2012-03-22 11:37:36 -0700443 }
Craig Mautner59431632012-04-04 11:56:44 -0700444 final AppWindowAnimator appAnimator =
445 atoken == null ? null : atoken.mAppAnimator;
446 if (appAnimator != null && appAnimator.thumbnail != null) {
447 if (appAnimator.thumbnailTransactionSeq != mTransactionSequence) {
448 appAnimator.thumbnailTransactionSeq = mTransactionSequence;
449 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700450 }
Craig Mautner59431632012-04-04 11:56:44 -0700451 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
452 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700453 }
454 }
Craig Mautner764983d2012-03-22 11:37:36 -0700455 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700456
457 // If we have windows that are being show due to them no longer
458 // being force-hidden, apply the appropriate animation to them.
459 if (unForceHiding != null) {
460 for (int i=unForceHiding.size()-1; i>=0; i--) {
461 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
462 if (a != null) {
Craig Mautner4d7349b2012-04-20 14:52:47 -0700463 final WindowStateAnimator winAnimator = unForceHiding.get(i);
464 winAnimator.setAnimation(a);
465 winAnimator.mAnimationIsEntrance = true;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700466 }
467 }
468 }
Craig Mautner764983d2012-03-22 11:37:36 -0700469 }
470
471 private void testTokenMayBeDrawnLocked() {
472 // See if any windows have been drawn, so they (and others
473 // associated with them) can now be shown.
Craig Mautneref25d7a2012-05-15 23:01:47 -0700474 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
475 final int NT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700476 for (int i=0; i<NT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700477 AppWindowToken wtoken = appTokens.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700478 if (wtoken.mAppAnimator.freezingScreen) {
Craig Mautner764983d2012-03-22 11:37:36 -0700479 int numInteresting = wtoken.numInterestingWindows;
480 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
481 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
482 "allDrawn: " + wtoken
483 + " interesting=" + numInteresting
484 + " drawn=" + wtoken.numDrawnWindows);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700485 wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700486 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
487 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
488 "Setting mOrientationChangeComplete=true because wtoken "
489 + wtoken + " numInteresting=" + numInteresting
490 + " numDrawn=" + wtoken.numDrawnWindows);
Craig Mautner924c2152012-04-23 18:14:07 -0700491 // This will set mOrientationChangeComplete and cause a pass through layout.
492 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautner764983d2012-03-22 11:37:36 -0700493 }
494 } else if (!wtoken.allDrawn) {
495 int numInteresting = wtoken.numInterestingWindows;
496 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
497 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
498 "allDrawn: " + wtoken
499 + " interesting=" + numInteresting
500 + " drawn=" + wtoken.numDrawnWindows);
501 wtoken.allDrawn = true;
502 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700503 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700504 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
505 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700506 }
Craig Mautner764983d2012-03-22 11:37:36 -0700507
508 // We can now show all of the drawn windows!
509 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700510 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700511 }
512 }
513 }
514 }
515 }
516
517 private void performAnimationsLocked() {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700518 mInner.mTokenMayBeDrawn = false;
519 mInner.mForceHiding = false;
520 mInner.mDetachedWallpaper = null;
521 mInner.mWindowAnimationBackground = null;
522 mInner.mWindowAnimationBackgroundColor = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700523
524 updateWindowsAndWallpaperLocked();
Craig Mautner4d7349b2012-04-20 14:52:47 -0700525 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
526 mPendingActions |= WALLPAPER_ACTION_PENDING;
527 }
Craig Mautner764983d2012-03-22 11:37:36 -0700528
Craig Mautner01cd0e72012-06-18 10:19:11 -0700529 if (mInner.mTokenMayBeDrawn) {
Craig Mautner764983d2012-03-22 11:37:36 -0700530 testTokenMayBeDrawnLocked();
531 }
Craig Mautner764983d2012-03-22 11:37:36 -0700532 }
533
Craig Mautner1caa3992012-06-22 09:46:48 -0700534 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
535 /** Locked on mService.mWindowMap and this. */
536 private void animateLocked() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700537 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700538 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700539 mBulkUpdateParams = 0;
Chet Haase198e5642012-05-10 09:55:15 -0700540 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700541 mAnimating = false;
542 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
543 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
544 }
Craig Mautner764983d2012-03-22 11:37:36 -0700545
546 // Update animations of all applications, including those
547 // associated with exiting/removed apps
548 Surface.openTransaction();
549
550 try {
551 updateWindowsAppsAndRotationAnimationsLocked();
552 performAnimationsLocked();
Craig Mautner8a197a42012-04-24 16:59:36 -0700553 testWallpaperAndBackgroundLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700554
555 // THIRD LOOP: Update the surfaces of all windows.
556
557 if (mScreenRotationAnimation != null) {
558 mScreenRotationAnimation.updateSurfaces();
559 }
560
Craig Mautner7358fbf2012-04-12 21:06:33 -0700561 final int N = mWinAnimators.size();
562 for (int i = 0; i < N; i++) {
Craig Mautner0fa77c12012-06-11 15:57:19 -0700563 mWinAnimators.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700564 }
565
Craig Mautner6af9b922012-04-05 19:25:51 -0700566 if (mDimParams != null) {
567 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
568 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700569 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700570 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700571 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700572 }
573
574 if (mService.mBlackFrame != null) {
575 if (mScreenRotationAnimation != null) {
576 mService.mBlackFrame.setMatrix(
577 mScreenRotationAnimation.getEnterTransformation().getMatrix());
578 } else {
579 mService.mBlackFrame.clearMatrix();
580 }
581 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700582
583 if (mService.mWatermark != null) {
584 mService.mWatermark.drawIfNeeded();
585 }
Craig Mautner764983d2012-03-22 11:37:36 -0700586 } catch (RuntimeException e) {
587 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
588 } finally {
589 Surface.closeTransaction();
590 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700591
Craig Mautner01cd0e72012-06-18 10:19:11 -0700592 if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
593 final WindowManagerService.AnimatorToLayoutParams animToLayout = mService.mAnimToLayout;
594 synchronized (animToLayout) {
595 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
596 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
597 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
598 mService.setAnimatorParameters();
599 }
600 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700601
602 if (mAnimating) {
Craig Mautner1caa3992012-06-22 09:46:48 -0700603 synchronized (mLayoutToAnim) {
604 scheduleAnimationLocked();
605 }
Chet Haase198e5642012-05-10 09:55:15 -0700606 } else if (wasAnimating) {
607 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700608 }
609 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
610 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
611 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
612 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
613 }
Craig Mautner764983d2012-03-22 11:37:36 -0700614 }
615
616 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700617 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700618 mCurrentFocus = currentFocus;
619 }
620
621 void setDisplayDimensions(final int curWidth, final int curHeight,
622 final int appWidth, final int appHeight) {
623 mDw = curWidth;
624 mDh = curHeight;
625 mInnerDw = appWidth;
626 mInnerDh = appHeight;
627 }
628
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700629 void startDimming(final WindowStateAnimator winAnimator, final float target,
630 final int width, final int height) {
631 if (mDimAnimator == null) {
632 mDimAnimator = new DimAnimator(mService.mFxSession);
633 }
Craig Mautner067ca322012-05-18 17:19:51 -0700634 // Only set dim params on the highest dimmed layer.
635 final WindowStateAnimator dimWinAnimator = mDimParams == null
636 ? null : mDimParams.mDimWinAnimator;
637 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
638 if (winAnimator.mSurfaceShown &&
639 (dimWinAnimator == null || !dimWinAnimator.mSurfaceShown
640 || dimWinAnimator.mAnimLayer < winAnimator.mAnimLayer)) {
641 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
642 new DimAnimator.Parameters(winAnimator, width, height, target)));
643 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700644 }
645
646 // TODO(cmautner): Move into Handler
647 void stopDimming() {
648 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
649 }
650
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700651 boolean isDimming() {
652 return mDimParams != null;
653 }
654
Craig Mautneracafd192012-05-10 10:41:02 -0700655 boolean isDimming(final WindowStateAnimator winAnimator) {
656 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
657 }
658
Craig Mautnere7ae2502012-03-26 17:11:19 -0700659 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
660 if (mWindowDetachedWallpaper != null) {
661 pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
662 }
663 if (mWindowAnimationBackgroundSurface != null) {
664 pw.println(" mWindowAnimationBackgroundSurface:");
665 mWindowAnimationBackgroundSurface.printTo(" ", pw);
666 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700667 if (mDimAnimator != null) {
668 pw.println(" mDimAnimator:");
669 mDimAnimator.printTo(" ", pw);
670 } else {
671 pw.println( " no DimAnimator ");
672 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700673 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700674
675 static class SetAnimationParams {
676 final WindowStateAnimator mWinAnimator;
677 final Animation mAnimation;
678 final int mAnimDw;
679 final int mAnimDh;
680 public SetAnimationParams(final WindowStateAnimator winAnimator,
681 final Animation animation, final int animDw, final int animDh) {
682 mWinAnimator = winAnimator;
683 mAnimation = animation;
684 mAnimDw = animDw;
685 mAnimDh = animDh;
686 }
687 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700688
689 synchronized void clearPendingActions() {
690 mPendingActions = 0;
691 }
Craig Mautner764983d2012-03-22 11:37:36 -0700692}