blob: eb98e7d1d8507e3be4d806dbe0eafd8f6eacfb30 [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;
Craig Mautnerf12100e2012-06-25 11:13:24 -07006import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
Craig Mautner764983d2012-03-22 11:37:36 -07007
Craig Mautnera608b882012-03-30 13:03:49 -07008import static com.android.server.wm.WindowManagerService.LayoutFields.SET_UPDATE_ROTATION;
9import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_MAY_CHANGE;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070010import static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED;
Craig Mautner2639da52012-07-09 09:39:06 -070011import static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070012
Craig Mautner711f90a2012-07-03 18:43:52 -070013import static com.android.server.wm.WindowManagerService.H.UPDATE_ANIM_PARAMETERS;
Craig Mautnera608b882012-03-30 13:03:49 -070014
Craig Mautner764983d2012-03-22 11:37:36 -070015import android.content.Context;
16import android.os.SystemClock;
17import android.util.Log;
18import android.util.Slog;
19import android.view.Surface;
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;
Craig Mautner711f90a2012-07-03 18:43:52 -070024import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;
Craig Mautner764983d2012-03-22 11:37:36 -070025
Craig Mautnere7ae2502012-03-26 17:11:19 -070026import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070027import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070028
Craig Mautner764983d2012-03-22 11:37:36 -070029/**
Craig Mautner764983d2012-03-22 11:37:36 -070030 * Singleton class that carries out the animations and Surface operations in a separate task
31 * on behalf of WindowManagerService.
32 */
33public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070034 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070035
36 final WindowManagerService mService;
37 final Context mContext;
38 final WindowManagerPolicy mPolicy;
39
Craig Mautner7358fbf2012-04-12 21:06:33 -070040 ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
Craig Mautnerbec53f72012-04-05 11:49:05 -070041
Craig Mautner764983d2012-03-22 11:37:36 -070042 boolean mAnimating;
Craig Mautner01cd0e72012-06-18 10:19:11 -070043
Craig Mautner1caa3992012-06-22 09:46:48 -070044 final Runnable mAnimationRunnable;
45
Craig Mautner764983d2012-03-22 11:37:36 -070046 int mAdjResult;
47
48 int mPendingLayoutChanges;
49
50 /** Overall window dimensions */
51 int mDw, mDh;
52
53 /** Interior window dimensions */
54 int mInnerDw, mInnerDh;
55
56 /** Time of current animation step. Reset on each iteration */
57 long mCurrentTime;
58
59 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
60 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
Craig Mautner6fbda632012-07-03 09:26:39 -070061 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070062
63 /** The one and only screen rotation if one is happening */
64 ScreenRotationAnimation mScreenRotationAnimation = null;
65
Craig Mautnere7ae2502012-03-26 17:11:19 -070066 // Window currently running an animation that has requested it be detached
67 // from the wallpaper. This means we need to ensure the wallpaper is
68 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070069 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070070 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070071
Craig Mautnere7ae2502012-03-26 17:11:19 -070072 DimSurface mWindowAnimationBackgroundSurface = null;
73
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070074 WindowStateAnimator mUniverseBackground = null;
75 int mAboveUniverseLayer = 0;
76
Craig Mautnera608b882012-03-30 13:03:49 -070077 int mBulkUpdateParams = 0;
78
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070079 DimAnimator mDimAnimator = null;
80 DimAnimator.Parameters mDimParams = null;
81
Craig Mautner4d7349b2012-04-20 14:52:47 -070082 static final int WALLPAPER_ACTION_PENDING = 1;
83 int mPendingActions;
84
Craig Mautner1caa3992012-06-22 09:46:48 -070085 WindowState mWallpaperTarget = null;
Craig Mautner918b53b2012-07-09 14:15:54 -070086 AppWindowAnimator mWpAppAnimator = null;
87 WindowState mLowerWallpaperTarget = null;
88 WindowState mUpperWallpaperTarget = null;
Craig Mautner1caa3992012-06-22 09:46:48 -070089
Craig Mautner918b53b2012-07-09 14:15:54 -070090 ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
91
92 /** Parameters being passed from this into mService. */
93 static class AnimatorToLayoutParams {
94 boolean mUpdateQueued;
95 int mBulkUpdateParams;
96 int mPendingLayoutChanges;
97 WindowState mWindowDetachedWallpaper;
98 }
99 /** Do not modify unless holding mService.mWindowMap or this and mAnimToLayout in that order */
Craig Mautner711f90a2012-07-03 18:43:52 -0700100 final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();
101
Craig Mautner918b53b2012-07-09 14:15:54 -0700102 WindowAnimator(final WindowManagerService service) {
Craig Mautner764983d2012-03-22 11:37:36 -0700103 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -0700104 mContext = service.mContext;
105 mPolicy = service.mPolicy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700106
107 mAnimationRunnable = new Runnable() {
108 @Override
109 public void run() {
110 // TODO(cmautner): When full isolation is achieved for animation, the first lock
111 // goes away and only the WindowAnimator.this remains.
112 synchronized(mService.mWindowMap) {
113 synchronized(WindowAnimator.this) {
114 copyLayoutToAnimParamsLocked();
115 animateLocked();
116 }
117 }
118 }
119 };
Craig Mautner9e809442012-06-22 17:13:04 -0700120
121 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
Craig Mautnera76fdb72012-07-03 19:03:02 -0700122 mDimAnimator = new DimAnimator(mService.mFxSession);
Craig Mautner1caa3992012-06-22 09:46:48 -0700123 }
124
Craig Mautner711f90a2012-07-03 18:43:52 -0700125 /** Locked on mAnimToLayout */
126 void updateAnimToLayoutLocked() {
127 final AnimatorToLayoutParams animToLayout = mAnimToLayout;
128 synchronized (animToLayout) {
129 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
130 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
131 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
132
133 if (!animToLayout.mUpdateQueued) {
134 animToLayout.mUpdateQueued = true;
135 mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
136 }
137 }
138 }
139
Craig Mautner1caa3992012-06-22 09:46:48 -0700140 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
141 private void copyLayoutToAnimParamsLocked() {
Craig Mautner711f90a2012-07-03 18:43:52 -0700142 final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
Craig Mautner1caa3992012-06-22 09:46:48 -0700143 synchronized(layoutToAnim) {
144 layoutToAnim.mAnimationScheduled = false;
145
Craig Mautner918b53b2012-07-09 14:15:54 -0700146 if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) {
147 layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED;
148 mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
149 }
150
Craig Mautner1caa3992012-06-22 09:46:48 -0700151 mWinAnimators = new ArrayList<WindowStateAnimator>(layoutToAnim.mWinAnimators);
152 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
Craig Mautner918b53b2012-07-09 14:15:54 -0700153 mWpAppAnimator = mWallpaperTarget == null
154 ? null : mWallpaperTarget.mAppToken == null
155 ? null : mWallpaperTarget.mAppToken.mAppAnimator;
156 mLowerWallpaperTarget = layoutToAnim.mLowerWallpaperTarget;
157 mUpperWallpaperTarget = layoutToAnim.mUpperWallpaperTarget;
Craig Mautnera76fdb72012-07-03 19:03:02 -0700158
159 // Set the new DimAnimator params.
160 DimAnimator.Parameters dimParams = layoutToAnim.mDimParams;
161 if (dimParams == null) {
162 mDimParams = dimParams;
163 } else {
164 final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
165
166 // Only set dim params on the highest dimmed layer.
167 final WindowStateAnimator existingDimWinAnimator = mDimParams == null
168 ? null : mDimParams.mDimWinAnimator;
169 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
170 if (newWinAnimator.mSurfaceShown &&
171 (existingDimWinAnimator == null || !existingDimWinAnimator.mSurfaceShown
172 || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
173 mDimParams = dimParams;
174 }
175 }
Craig Mautner1caa3992012-06-22 09:46:48 -0700176 }
177 }
178
Craig Mautnerb9836b92012-06-11 11:40:09 -0700179 void hideWallpapersLocked(final WindowState w) {
Craig Mautner918b53b2012-07-09 14:15:54 -0700180 if ((mWallpaperTarget == w && mLowerWallpaperTarget == null) || mWallpaperTarget == null) {
181 final int numTokens = mWallpaperTokens.size();
182 for (int i = numTokens - 1; i >= 0; i--) {
183 final WindowToken token = mWallpaperTokens.get(i);
184 final int numWindows = token.windows.size();
185 for (int j = numWindows - 1; j >= 0; j--) {
186 final WindowState wallpaper = token.windows.get(j);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700187 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
188 if (!winAnimator.mLastHidden) {
189 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700190 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700191 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
192 }
193 }
194 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700195 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700196 }
197 }
198
Craig Mautner764983d2012-03-22 11:37:36 -0700199 private void updateWindowsAppsAndRotationAnimationsLocked() {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700200 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
Craig Mautner764983d2012-03-22 11:37:36 -0700201 int i;
Craig Mautneref25d7a2012-05-15 23:01:47 -0700202 final int NAT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700203 for (i=0; i<NAT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700204 final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700205 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700206 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700207 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700208 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700209 } else if (wasAnimating) {
210 // stopped animating, do one more pass through the layout
211 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700212 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700213 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700214 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700215 }
Craig Mautner83339b42012-05-01 22:13:23 -0700216 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
217 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700218 }
219 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700220
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700221 final int NEAT = mService.mExitingAppTokens.size();
222 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700223 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700224 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700225 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700226 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700227 mAnimating = true;
228 } else if (wasAnimating) {
229 // stopped animating, do one more pass through the layout
230 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700231 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700232 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700233 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700234 }
Craig Mautner83339b42012-05-01 22:13:23 -0700235 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
236 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700237 }
238 }
239
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700240 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700241 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700242 mAnimating = true;
243 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700244 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700245 mScreenRotationAnimation.kill();
246 mScreenRotationAnimation = null;
247 }
248 }
249 }
250
Craig Mautner078ea0a2012-06-25 11:04:29 -0700251 private void updateWindowsLocked() {
Craig Mautner6fbda632012-07-03 09:26:39 -0700252 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700253
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700254 ArrayList<WindowStateAnimator> unForceHiding = null;
255 boolean wallpaperInUnForceHiding = false;
256
Craig Mautner4bf18a72012-07-10 14:08:16 -0700257 // forceHiding states.
258 final int KEYGUARD_NOT_SHOWN = 0;
259 final int KEYGUARD_ANIMATING_IN = 1;
260 final int KEYGUARD_SHOWN = 2;
261 final int KEYGUARD_ANIMATING_OUT = 3;
262 int forceHiding = KEYGUARD_NOT_SHOWN;
263
Craig Mautner01cd0e72012-06-18 10:19:11 -0700264 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
265 WindowStateAnimator winAnimator = mWinAnimators.get(i);
266 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700267 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700268
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700269 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700270 final boolean wasAnimating = winAnimator.mWasAnimating;
271 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700272
273 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700274 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700275 ", nowAnimating=" + nowAnimating);
276 }
277
Craig Mautner918b53b2012-07-09 14:15:54 -0700278 if (wasAnimating && !winAnimator.mAnimating && mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700279 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700280 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700281 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700282 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
283 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700284 }
Craig Mautner764983d2012-03-22 11:37:36 -0700285 }
286
Craig Mautnerbec53f72012-04-05 11:49:05 -0700287 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700288 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700289 if (WindowManagerService.DEBUG_ANIM ||
290 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
291 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700292 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700293 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700294 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700295 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
296 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700297 }
Craig Mautner764983d2012-03-22 11:37:36 -0700298 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700299 }
Craig Mautner4bf18a72012-07-10 14:08:16 -0700300 if (win.isReadyForDisplay()) {
301 if (nowAnimating) {
302 if (winAnimator.mAnimationIsEntrance) {
303 forceHiding = KEYGUARD_ANIMATING_IN;
304 } else {
305 forceHiding = KEYGUARD_ANIMATING_OUT;
306 }
307 } else {
308 forceHiding = KEYGUARD_SHOWN;
309 }
Craig Mautner764983d2012-03-22 11:37:36 -0700310 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700311 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner078ea0a2012-06-25 11:04:29 -0700312 "Force hide " + forceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700313 + " hasSurface=" + win.mHasSurface
314 + " policyVis=" + win.mPolicyVisibility
315 + " destroying=" + win.mDestroying
316 + " attHidden=" + win.mAttachedHidden
317 + " vis=" + win.mViewVisibility
318 + " hidden=" + win.mRootToken.hidden
319 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700320 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautner4bf18a72012-07-10 14:08:16 -0700321 final boolean hideWhenLocked =
322 (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700323 final boolean changed;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700324 if (((forceHiding == KEYGUARD_ANIMATING_IN)
325 && (!winAnimator.isAnimating() || hideWhenLocked))
326 || ((forceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700327 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700328 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700329 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700330 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700331 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700332 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700333 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700334 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700335 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700336 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700337 if (unForceHiding == null) {
338 unForceHiding = new ArrayList<WindowStateAnimator>();
339 }
340 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700341 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700342 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700343 }
344 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700345 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700346 // We are showing on to of the current
347 // focus, so re-evaluate focus to make
348 // sure it is correct.
349 mService.mFocusMayChange = true;
350 }
351 }
352 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700353 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700354 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700355 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700356 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700357 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
358 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700359 }
Craig Mautner764983d2012-03-22 11:37:36 -0700360 }
361 }
362 }
363
Craig Mautnerbec53f72012-04-05 11:49:05 -0700364 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700365 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
366 if (atoken == null || atoken.allDrawn) {
367 if (winAnimator.performShowLocked()) {
368 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
369 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
370 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
371 mPendingLayoutChanges);
Craig Mautner764983d2012-03-22 11:37:36 -0700372 }
373 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700374 }
Craig Mautner764983d2012-03-22 11:37:36 -0700375 }
Craig Mautner59431632012-04-04 11:56:44 -0700376 final AppWindowAnimator appAnimator =
377 atoken == null ? null : atoken.mAppAnimator;
378 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700379 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
380 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700381 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700382 }
Craig Mautner59431632012-04-04 11:56:44 -0700383 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
384 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700385 }
386 }
Craig Mautner764983d2012-03-22 11:37:36 -0700387 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700388
Craig Mautner078ea0a2012-06-25 11:04:29 -0700389 // If we have windows that are being show due to them no longer
390 // being force-hidden, apply the appropriate animation to them.
391 if (unForceHiding != null) {
392 for (int i=unForceHiding.size()-1; i>=0; i--) {
393 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
394 if (a != null) {
395 final WindowStateAnimator winAnimator = unForceHiding.get(i);
396 winAnimator.setAnimation(a);
397 winAnimator.mAnimationIsEntrance = true;
398 }
399 }
400 }
401 }
402
403 private void updateWallpaperLocked() {
404 WindowStateAnimator windowAnimationBackground = null;
405 int windowAnimationBackgroundColor = 0;
406 WindowState detachedWallpaper = null;
407
408 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
409 WindowStateAnimator winAnimator = mWinAnimators.get(i);
410 if (winAnimator.mSurface == null) {
411 continue;
412 }
413
414 final int flags = winAnimator.mAttrFlags;
415 final WindowState win = winAnimator.mWin;
416
417 // If this window is animating, make a note that we have
418 // an animating window and take care of a request to run
419 // a detached wallpaper animation.
420 if (winAnimator.mAnimating) {
421 if (winAnimator.mAnimation != null) {
422 if ((flags & FLAG_SHOW_WALLPAPER) != 0
423 && winAnimator.mAnimation.getDetachWallpaper()) {
424 detachedWallpaper = win;
425 }
426 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
427 if (backgroundColor != 0) {
428 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
429 windowAnimationBackground.mAnimLayer)) {
430 windowAnimationBackground = winAnimator;
431 windowAnimationBackgroundColor = backgroundColor;
432 }
433 }
434 }
435 mAnimating = true;
436 }
437
438 // If this window's app token is running a detached wallpaper
439 // animation, make a note so we can ensure the wallpaper is
440 // displayed behind it.
441 final AppWindowAnimator appAnimator =
442 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
443 if (appAnimator != null && appAnimator.animation != null
444 && appAnimator.animating) {
445 if ((flags & FLAG_SHOW_WALLPAPER) != 0
446 && appAnimator.animation.getDetachWallpaper()) {
447 detachedWallpaper = win;
448 }
449
450 final int backgroundColor = appAnimator.animation.getBackgroundColor();
451 if (backgroundColor != 0) {
452 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
453 windowAnimationBackground.mAnimLayer)) {
454 windowAnimationBackground = winAnimator;
455 windowAnimationBackgroundColor = backgroundColor;
456 }
457 }
458 }
459 } // end forall windows
460
Craig Mautner9e809442012-06-22 17:13:04 -0700461 if (mWindowDetachedWallpaper != detachedWallpaper) {
462 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
463 "Detached wallpaper changed from " + mWindowDetachedWallpaper
464 + " to " + detachedWallpaper);
465 mWindowDetachedWallpaper = detachedWallpaper;
466 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
467 }
468
469 if (windowAnimationBackgroundColor != 0) {
470 // If the window that wants black is the current wallpaper
471 // target, then the black goes *below* the wallpaper so we
472 // don't cause the wallpaper to suddenly disappear.
473 int animLayer = windowAnimationBackground.mAnimLayer;
474 WindowState win = windowAnimationBackground.mWin;
Craig Mautner918b53b2012-07-09 14:15:54 -0700475 if (windowAnimationBackground != null && mWallpaperTarget == win
476 || mLowerWallpaperTarget == win || mUpperWallpaperTarget == win) {
Craig Mautner9e809442012-06-22 17:13:04 -0700477 final int N = mWinAnimators.size();
478 for (int i = 0; i < N; i++) {
479 WindowStateAnimator winAnimator = mWinAnimators.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700480 if (winAnimator.mIsWallpaper) {
Craig Mautner9e809442012-06-22 17:13:04 -0700481 animLayer = winAnimator.mAnimLayer;
482 break;
483 }
484 }
485 }
486
Craig Mautner078ea0a2012-06-25 11:04:29 -0700487 mWindowAnimationBackgroundSurface.show(mDw, mDh,
Craig Mautner9e809442012-06-22 17:13:04 -0700488 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
489 windowAnimationBackgroundColor);
490 } else {
491 mWindowAnimationBackgroundSurface.hide();
492 }
Craig Mautner764983d2012-03-22 11:37:36 -0700493 }
494
495 private void testTokenMayBeDrawnLocked() {
496 // See if any windows have been drawn, so they (and others
497 // associated with them) can now be shown.
Craig Mautneref25d7a2012-05-15 23:01:47 -0700498 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
499 final int NT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700500 for (int i=0; i<NT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700501 AppWindowToken wtoken = appTokens.get(i);
Craig Mautner6fbda632012-07-03 09:26:39 -0700502 final boolean allDrawn = wtoken.allDrawn;
503 if (allDrawn != wtoken.mAppAnimator.allDrawn) {
504 wtoken.mAppAnimator.allDrawn = allDrawn;
505 if (allDrawn) {
506 // The token has now changed state to having all
507 // windows shown... what to do, what to do?
508 if (wtoken.mAppAnimator.freezingScreen) {
509 wtoken.mAppAnimator.showAllWindowsLocked();
510 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
511 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
512 "Setting mOrientationChangeComplete=true because wtoken "
513 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
514 + " numDrawn=" + wtoken.numDrawnWindows);
515 // This will set mOrientationChangeComplete and cause a pass through layout.
516 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
517 } else {
518 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
519 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
520 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
521 mPendingLayoutChanges);
522 }
Craig Mautner764983d2012-03-22 11:37:36 -0700523
Craig Mautner6fbda632012-07-03 09:26:39 -0700524 // We can now show all of the drawn windows!
525 if (!mService.mOpeningApps.contains(wtoken)) {
526 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
527 }
Craig Mautner764983d2012-03-22 11:37:36 -0700528 }
529 }
530 }
531 }
532 }
533
534 private void performAnimationsLocked() {
Craig Mautner078ea0a2012-06-25 11:04:29 -0700535 updateWindowsLocked();
536 updateWallpaperLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700537
Craig Mautner4d7349b2012-04-20 14:52:47 -0700538 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
539 mPendingActions |= WALLPAPER_ACTION_PENDING;
540 }
Craig Mautner764983d2012-03-22 11:37:36 -0700541
Craig Mautner6fbda632012-07-03 09:26:39 -0700542 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700543 }
544
Craig Mautner1caa3992012-06-22 09:46:48 -0700545 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
546 /** Locked on mService.mWindowMap and this. */
547 private void animateLocked() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700548 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700549 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700550 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700551 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700552 mAnimating = false;
553 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
554 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
555 }
Craig Mautner764983d2012-03-22 11:37:36 -0700556
557 // Update animations of all applications, including those
558 // associated with exiting/removed apps
559 Surface.openTransaction();
560
561 try {
562 updateWindowsAppsAndRotationAnimationsLocked();
563 performAnimationsLocked();
564
565 // THIRD LOOP: Update the surfaces of all windows.
566
567 if (mScreenRotationAnimation != null) {
568 mScreenRotationAnimation.updateSurfaces();
569 }
570
Craig Mautner7358fbf2012-04-12 21:06:33 -0700571 final int N = mWinAnimators.size();
572 for (int i = 0; i < N; i++) {
Craig Mautner0fa77c12012-06-11 15:57:19 -0700573 mWinAnimators.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700574 }
575
Craig Mautner6af9b922012-04-05 19:25:51 -0700576 if (mDimParams != null) {
577 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
578 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700579 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700580 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700581 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700582 }
583
584 if (mService.mBlackFrame != null) {
585 if (mScreenRotationAnimation != null) {
586 mService.mBlackFrame.setMatrix(
587 mScreenRotationAnimation.getEnterTransformation().getMatrix());
588 } else {
589 mService.mBlackFrame.clearMatrix();
590 }
591 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700592
593 if (mService.mWatermark != null) {
594 mService.mWatermark.drawIfNeeded();
595 }
Craig Mautner764983d2012-03-22 11:37:36 -0700596 } catch (RuntimeException e) {
597 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
598 } finally {
599 Surface.closeTransaction();
600 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700601
Craig Mautner01cd0e72012-06-18 10:19:11 -0700602 if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700603 updateAnimToLayoutLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700604 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700605
606 if (mAnimating) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700607 synchronized (mService.mLayoutToAnim) {
608 mService.scheduleAnimationLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -0700609 }
Chet Haase198e5642012-05-10 09:55:15 -0700610 } else if (wasAnimating) {
611 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700612 }
613 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
614 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
615 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
616 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
617 }
Craig Mautner764983d2012-03-22 11:37:36 -0700618 }
619
620 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700621 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700622 mCurrentFocus = currentFocus;
623 }
624
625 void setDisplayDimensions(final int curWidth, final int curHeight,
626 final int appWidth, final int appHeight) {
627 mDw = curWidth;
628 mDh = curHeight;
629 mInnerDw = appWidth;
630 mInnerDh = appHeight;
631 }
632
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700633 boolean isDimming() {
634 return mDimParams != null;
635 }
636
Craig Mautneracafd192012-05-10 10:41:02 -0700637 boolean isDimming(final WindowStateAnimator winAnimator) {
638 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
639 }
640
Craig Mautnere7ae2502012-03-26 17:11:19 -0700641 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700642 if (dumpAll) {
643 if (mWindowDetachedWallpaper != null) {
644 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
645 pw.println(mWindowDetachedWallpaper);
646 }
647 pw.print(prefix); pw.print("mAnimTransactionSequence=");
648 pw.println(mAnimTransactionSequence);
649 if (mWindowAnimationBackgroundSurface != null) {
650 pw.print(prefix); pw.print("mWindowAnimationBackgroundSurface:");
651 mWindowAnimationBackgroundSurface.printTo(prefix + " ", pw);
652 }
653 if (mDimAnimator != null) {
654 pw.print(prefix); pw.print("mDimAnimator:");
655 mDimAnimator.printTo(prefix + " ", pw);
656 } else {
657 pw.print(prefix); pw.print("no DimAnimator ");
658 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700659 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700660 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700661
662 static class SetAnimationParams {
663 final WindowStateAnimator mWinAnimator;
664 final Animation mAnimation;
665 final int mAnimDw;
666 final int mAnimDh;
667 public SetAnimationParams(final WindowStateAnimator winAnimator,
668 final Animation animation, final int animDw, final int animDh) {
669 mWinAnimator = winAnimator;
670 mAnimation = animation;
671 mAnimDw = animDw;
672 mAnimDh = animDh;
673 }
674 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700675
676 synchronized void clearPendingActions() {
677 mPendingActions = 0;
678 }
Craig Mautner764983d2012-03-22 11:37:36 -0700679}