blob: 0b76fec257c86d1f158571828c085e46a93efe73 [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 Mautner322e4032012-07-13 13:35:20 -070024import com.android.server.wm.WindowManagerService.AppWindowAnimParams;
Craig Mautner711f90a2012-07-03 18:43:52 -070025import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;
Craig Mautner764983d2012-03-22 11:37:36 -070026
Craig Mautnere7ae2502012-03-26 17:11:19 -070027import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070028import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070029
Craig Mautner764983d2012-03-22 11:37:36 -070030/**
Craig Mautner764983d2012-03-22 11:37:36 -070031 * Singleton class that carries out the animations and Surface operations in a separate task
32 * on behalf of WindowManagerService.
33 */
34public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070035 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070036
37 final WindowManagerService mService;
38 final Context mContext;
39 final WindowManagerPolicy mPolicy;
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
Craig Mautner1caa3992012-06-22 09:46:48 -070045 final Runnable mAnimationRunnable;
46
Craig Mautner764983d2012-03-22 11:37:36 -070047 int mAdjResult;
48
49 int mPendingLayoutChanges;
50
51 /** Overall window dimensions */
52 int mDw, mDh;
53
54 /** Interior window dimensions */
55 int mInnerDw, mInnerDh;
56
57 /** Time of current animation step. Reset on each iteration */
58 long mCurrentTime;
59
60 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
61 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
Craig Mautner6fbda632012-07-03 09:26:39 -070062 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070063
64 /** The one and only screen rotation if one is happening */
65 ScreenRotationAnimation mScreenRotationAnimation = null;
66
Craig Mautnere7ae2502012-03-26 17:11:19 -070067 // Window currently running an animation that has requested it be detached
68 // from the wallpaper. This means we need to ensure the wallpaper is
69 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070070 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070071 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070072
Craig Mautnere7ae2502012-03-26 17:11:19 -070073 DimSurface mWindowAnimationBackgroundSurface = null;
74
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070075 WindowStateAnimator mUniverseBackground = null;
76 int mAboveUniverseLayer = 0;
77
Craig Mautnera608b882012-03-30 13:03:49 -070078 int mBulkUpdateParams = 0;
79
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070080 DimAnimator mDimAnimator = null;
81 DimAnimator.Parameters mDimParams = null;
82
Craig Mautner4d7349b2012-04-20 14:52:47 -070083 static final int WALLPAPER_ACTION_PENDING = 1;
84 int mPendingActions;
85
Craig Mautner1caa3992012-06-22 09:46:48 -070086 WindowState mWallpaperTarget = null;
Craig Mautner918b53b2012-07-09 14:15:54 -070087 AppWindowAnimator mWpAppAnimator = null;
88 WindowState mLowerWallpaperTarget = null;
89 WindowState mUpperWallpaperTarget = null;
Craig Mautner1caa3992012-06-22 09:46:48 -070090
Craig Mautner322e4032012-07-13 13:35:20 -070091 ArrayList<AppWindowAnimator> mAppAnimators = new ArrayList<AppWindowAnimator>();
92
Craig Mautner918b53b2012-07-09 14:15:54 -070093 ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
94
95 /** Parameters being passed from this into mService. */
96 static class AnimatorToLayoutParams {
97 boolean mUpdateQueued;
98 int mBulkUpdateParams;
99 int mPendingLayoutChanges;
100 WindowState mWindowDetachedWallpaper;
101 }
102 /** Do not modify unless holding mService.mWindowMap or this and mAnimToLayout in that order */
Craig Mautner711f90a2012-07-03 18:43:52 -0700103 final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();
104
Craig Mautner918b53b2012-07-09 14:15:54 -0700105 WindowAnimator(final WindowManagerService service) {
Craig Mautner764983d2012-03-22 11:37:36 -0700106 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -0700107 mContext = service.mContext;
108 mPolicy = service.mPolicy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700109
110 mAnimationRunnable = new Runnable() {
111 @Override
112 public void run() {
113 // TODO(cmautner): When full isolation is achieved for animation, the first lock
114 // goes away and only the WindowAnimator.this remains.
115 synchronized(mService.mWindowMap) {
116 synchronized(WindowAnimator.this) {
117 copyLayoutToAnimParamsLocked();
118 animateLocked();
119 }
120 }
121 }
122 };
Craig Mautner9e809442012-06-22 17:13:04 -0700123
124 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
Craig Mautnera76fdb72012-07-03 19:03:02 -0700125 mDimAnimator = new DimAnimator(mService.mFxSession);
Craig Mautner1caa3992012-06-22 09:46:48 -0700126 }
127
Craig Mautner711f90a2012-07-03 18:43:52 -0700128 /** Locked on mAnimToLayout */
129 void updateAnimToLayoutLocked() {
130 final AnimatorToLayoutParams animToLayout = mAnimToLayout;
131 synchronized (animToLayout) {
132 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
133 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
134 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
135
136 if (!animToLayout.mUpdateQueued) {
137 animToLayout.mUpdateQueued = true;
138 mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
139 }
140 }
141 }
142
Craig Mautner1caa3992012-06-22 09:46:48 -0700143 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
144 private void copyLayoutToAnimParamsLocked() {
Craig Mautner711f90a2012-07-03 18:43:52 -0700145 final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
Craig Mautner1caa3992012-06-22 09:46:48 -0700146 synchronized(layoutToAnim) {
147 layoutToAnim.mAnimationScheduled = false;
148
Craig Mautner322e4032012-07-13 13:35:20 -0700149 if (!layoutToAnim.mParamsModified) {
150 return;
151 }
152 layoutToAnim.mParamsModified = false;
153
Craig Mautner918b53b2012-07-09 14:15:54 -0700154 if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) {
155 layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED;
156 mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
157 }
158
Craig Mautner1caa3992012-06-22 09:46:48 -0700159 mWinAnimators = new ArrayList<WindowStateAnimator>(layoutToAnim.mWinAnimators);
160 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
Craig Mautner918b53b2012-07-09 14:15:54 -0700161 mWpAppAnimator = mWallpaperTarget == null
162 ? null : mWallpaperTarget.mAppToken == null
163 ? null : mWallpaperTarget.mAppToken.mAppAnimator;
164 mLowerWallpaperTarget = layoutToAnim.mLowerWallpaperTarget;
165 mUpperWallpaperTarget = layoutToAnim.mUpperWallpaperTarget;
Craig Mautnera76fdb72012-07-03 19:03:02 -0700166
167 // Set the new DimAnimator params.
168 DimAnimator.Parameters dimParams = layoutToAnim.mDimParams;
169 if (dimParams == null) {
170 mDimParams = dimParams;
171 } else {
172 final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
173
174 // Only set dim params on the highest dimmed layer.
175 final WindowStateAnimator existingDimWinAnimator = mDimParams == null
176 ? null : mDimParams.mDimWinAnimator;
177 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
178 if (newWinAnimator.mSurfaceShown &&
179 (existingDimWinAnimator == null || !existingDimWinAnimator.mSurfaceShown
180 || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
181 mDimParams = dimParams;
182 }
183 }
Craig Mautner322e4032012-07-13 13:35:20 -0700184
185 mAppAnimators.clear();
186 final int N = layoutToAnim.mAppWindowAnimParams.size();
187 for (int i = 0; i < N; i++) {
188 final AppWindowAnimParams params = layoutToAnim.mAppWindowAnimParams.get(i);
189 AppWindowAnimator appAnimator = params.mAppAnimator;
190 appAnimator.mAllAppWinAnimators =
191 new ArrayList<WindowStateAnimator>(params.mWinAnimators);
192 mAppAnimators.add(appAnimator);
193 }
Craig Mautner1caa3992012-06-22 09:46:48 -0700194 }
195 }
196
Craig Mautnerb9836b92012-06-11 11:40:09 -0700197 void hideWallpapersLocked(final WindowState w) {
Craig Mautner918b53b2012-07-09 14:15:54 -0700198 if ((mWallpaperTarget == w && mLowerWallpaperTarget == null) || mWallpaperTarget == null) {
199 final int numTokens = mWallpaperTokens.size();
200 for (int i = numTokens - 1; i >= 0; i--) {
201 final WindowToken token = mWallpaperTokens.get(i);
202 final int numWindows = token.windows.size();
203 for (int j = numWindows - 1; j >= 0; j--) {
204 final WindowState wallpaper = token.windows.get(j);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700205 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
206 if (!winAnimator.mLastHidden) {
207 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700208 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700209 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
210 }
211 }
212 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700213 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700214 }
215 }
216
Craig Mautner764983d2012-03-22 11:37:36 -0700217 private void updateWindowsAppsAndRotationAnimationsLocked() {
218 int i;
Craig Mautner322e4032012-07-13 13:35:20 -0700219 final int NAT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700220 for (i=0; i<NAT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700221 final AppWindowAnimator appAnimator = mAppAnimators.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700222 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700223 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700224 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700225 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700226 } else if (wasAnimating) {
227 // stopped animating, do one more pass through the layout
228 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700229 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700230 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700231 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700232 }
Craig Mautner83339b42012-05-01 22:13:23 -0700233 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
234 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700235 }
236 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700237
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700238 final int NEAT = mService.mExitingAppTokens.size();
239 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700240 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700241 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700242 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700243 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700244 mAnimating = true;
245 } else if (wasAnimating) {
246 // stopped animating, do one more pass through the layout
247 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700248 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700249 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700250 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700251 }
Craig Mautner83339b42012-05-01 22:13:23 -0700252 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
253 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700254 }
255 }
256
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700257 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700258 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700259 mAnimating = true;
260 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700261 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700262 mScreenRotationAnimation.kill();
263 mScreenRotationAnimation = null;
264 }
265 }
266 }
267
Craig Mautner078ea0a2012-06-25 11:04:29 -0700268 private void updateWindowsLocked() {
Craig Mautner6fbda632012-07-03 09:26:39 -0700269 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700270
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700271 ArrayList<WindowStateAnimator> unForceHiding = null;
272 boolean wallpaperInUnForceHiding = false;
273
Craig Mautner4bf18a72012-07-10 14:08:16 -0700274 // forceHiding states.
275 final int KEYGUARD_NOT_SHOWN = 0;
276 final int KEYGUARD_ANIMATING_IN = 1;
277 final int KEYGUARD_SHOWN = 2;
278 final int KEYGUARD_ANIMATING_OUT = 3;
279 int forceHiding = KEYGUARD_NOT_SHOWN;
280
Craig Mautner01cd0e72012-06-18 10:19:11 -0700281 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
282 WindowStateAnimator winAnimator = mWinAnimators.get(i);
283 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700284 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700285
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700286 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700287 final boolean wasAnimating = winAnimator.mWasAnimating;
288 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700289
290 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700291 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700292 ", nowAnimating=" + nowAnimating);
293 }
294
Craig Mautner918b53b2012-07-09 14:15:54 -0700295 if (wasAnimating && !winAnimator.mAnimating && mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700296 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700297 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700298 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700299 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
300 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700301 }
Craig Mautner764983d2012-03-22 11:37:36 -0700302 }
303
Craig Mautnerbec53f72012-04-05 11:49:05 -0700304 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700305 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700306 if (WindowManagerService.DEBUG_ANIM ||
307 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
308 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700309 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700310 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700311 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700312 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
313 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700314 }
Craig Mautner764983d2012-03-22 11:37:36 -0700315 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700316 }
Craig Mautner4bf18a72012-07-10 14:08:16 -0700317 if (win.isReadyForDisplay()) {
318 if (nowAnimating) {
319 if (winAnimator.mAnimationIsEntrance) {
320 forceHiding = KEYGUARD_ANIMATING_IN;
321 } else {
322 forceHiding = KEYGUARD_ANIMATING_OUT;
323 }
324 } else {
325 forceHiding = KEYGUARD_SHOWN;
326 }
Craig Mautner764983d2012-03-22 11:37:36 -0700327 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700328 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner078ea0a2012-06-25 11:04:29 -0700329 "Force hide " + forceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700330 + " hasSurface=" + win.mHasSurface
331 + " policyVis=" + win.mPolicyVisibility
332 + " destroying=" + win.mDestroying
333 + " attHidden=" + win.mAttachedHidden
334 + " vis=" + win.mViewVisibility
335 + " hidden=" + win.mRootToken.hidden
336 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700337 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautner4bf18a72012-07-10 14:08:16 -0700338 final boolean hideWhenLocked =
339 (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700340 final boolean changed;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700341 if (((forceHiding == KEYGUARD_ANIMATING_IN)
342 && (!winAnimator.isAnimating() || hideWhenLocked))
343 || ((forceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700344 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700345 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700346 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700347 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700348 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700349 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700350 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700351 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700352 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700353 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700354 if (unForceHiding == null) {
355 unForceHiding = new ArrayList<WindowStateAnimator>();
356 }
357 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700358 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700359 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700360 }
361 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700362 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700363 // We are showing on to of the current
364 // focus, so re-evaluate focus to make
365 // sure it is correct.
366 mService.mFocusMayChange = true;
367 }
368 }
369 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700370 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700371 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700372 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700373 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700374 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
375 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700376 }
Craig Mautner764983d2012-03-22 11:37:36 -0700377 }
378 }
379 }
380
Craig Mautnerbec53f72012-04-05 11:49:05 -0700381 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700382 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
383 if (atoken == null || atoken.allDrawn) {
384 if (winAnimator.performShowLocked()) {
385 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
386 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
387 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
388 mPendingLayoutChanges);
Craig Mautner764983d2012-03-22 11:37:36 -0700389 }
390 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700391 }
Craig Mautner764983d2012-03-22 11:37:36 -0700392 }
Craig Mautner322e4032012-07-13 13:35:20 -0700393 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700394 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700395 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
396 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700397 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700398 }
Craig Mautner59431632012-04-04 11:56:44 -0700399 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
400 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700401 }
402 }
Craig Mautner764983d2012-03-22 11:37:36 -0700403 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700404
Craig Mautner078ea0a2012-06-25 11:04:29 -0700405 // If we have windows that are being show due to them no longer
406 // being force-hidden, apply the appropriate animation to them.
407 if (unForceHiding != null) {
408 for (int i=unForceHiding.size()-1; i>=0; i--) {
409 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
410 if (a != null) {
411 final WindowStateAnimator winAnimator = unForceHiding.get(i);
412 winAnimator.setAnimation(a);
413 winAnimator.mAnimationIsEntrance = true;
414 }
415 }
416 }
417 }
418
419 private void updateWallpaperLocked() {
420 WindowStateAnimator windowAnimationBackground = null;
421 int windowAnimationBackgroundColor = 0;
422 WindowState detachedWallpaper = null;
423
424 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
425 WindowStateAnimator winAnimator = mWinAnimators.get(i);
426 if (winAnimator.mSurface == null) {
427 continue;
428 }
429
430 final int flags = winAnimator.mAttrFlags;
431 final WindowState win = winAnimator.mWin;
432
433 // If this window is animating, make a note that we have
434 // an animating window and take care of a request to run
435 // a detached wallpaper animation.
436 if (winAnimator.mAnimating) {
437 if (winAnimator.mAnimation != null) {
438 if ((flags & FLAG_SHOW_WALLPAPER) != 0
439 && winAnimator.mAnimation.getDetachWallpaper()) {
440 detachedWallpaper = win;
441 }
442 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
443 if (backgroundColor != 0) {
444 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
445 windowAnimationBackground.mAnimLayer)) {
446 windowAnimationBackground = winAnimator;
447 windowAnimationBackgroundColor = backgroundColor;
448 }
449 }
450 }
451 mAnimating = true;
452 }
453
454 // If this window's app token is running a detached wallpaper
455 // animation, make a note so we can ensure the wallpaper is
456 // displayed behind it.
Craig Mautner322e4032012-07-13 13:35:20 -0700457 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700458 if (appAnimator != null && appAnimator.animation != null
459 && appAnimator.animating) {
460 if ((flags & FLAG_SHOW_WALLPAPER) != 0
461 && appAnimator.animation.getDetachWallpaper()) {
462 detachedWallpaper = win;
463 }
464
465 final int backgroundColor = appAnimator.animation.getBackgroundColor();
466 if (backgroundColor != 0) {
467 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
468 windowAnimationBackground.mAnimLayer)) {
469 windowAnimationBackground = winAnimator;
470 windowAnimationBackgroundColor = backgroundColor;
471 }
472 }
473 }
474 } // end forall windows
475
Craig Mautner9e809442012-06-22 17:13:04 -0700476 if (mWindowDetachedWallpaper != detachedWallpaper) {
477 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
478 "Detached wallpaper changed from " + mWindowDetachedWallpaper
479 + " to " + detachedWallpaper);
480 mWindowDetachedWallpaper = detachedWallpaper;
481 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
482 }
483
484 if (windowAnimationBackgroundColor != 0) {
485 // If the window that wants black is the current wallpaper
486 // target, then the black goes *below* the wallpaper so we
487 // don't cause the wallpaper to suddenly disappear.
488 int animLayer = windowAnimationBackground.mAnimLayer;
489 WindowState win = windowAnimationBackground.mWin;
Craig Mautner918b53b2012-07-09 14:15:54 -0700490 if (windowAnimationBackground != null && mWallpaperTarget == win
491 || mLowerWallpaperTarget == win || mUpperWallpaperTarget == win) {
Craig Mautner9e809442012-06-22 17:13:04 -0700492 final int N = mWinAnimators.size();
493 for (int i = 0; i < N; i++) {
494 WindowStateAnimator winAnimator = mWinAnimators.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700495 if (winAnimator.mIsWallpaper) {
Craig Mautner9e809442012-06-22 17:13:04 -0700496 animLayer = winAnimator.mAnimLayer;
497 break;
498 }
499 }
500 }
501
Craig Mautner078ea0a2012-06-25 11:04:29 -0700502 mWindowAnimationBackgroundSurface.show(mDw, mDh,
Craig Mautner9e809442012-06-22 17:13:04 -0700503 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
504 windowAnimationBackgroundColor);
505 } else {
506 mWindowAnimationBackgroundSurface.hide();
507 }
Craig Mautner764983d2012-03-22 11:37:36 -0700508 }
509
510 private void testTokenMayBeDrawnLocked() {
511 // See if any windows have been drawn, so they (and others
512 // associated with them) can now be shown.
Craig Mautner322e4032012-07-13 13:35:20 -0700513 final int NT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700514 for (int i=0; i<NT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700515 AppWindowAnimator appAnimator = mAppAnimators.get(i);
516 AppWindowToken wtoken = appAnimator.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700517 final boolean allDrawn = wtoken.allDrawn;
Craig Mautner322e4032012-07-13 13:35:20 -0700518 if (allDrawn != appAnimator.allDrawn) {
519 appAnimator.allDrawn = allDrawn;
Craig Mautner6fbda632012-07-03 09:26:39 -0700520 if (allDrawn) {
521 // The token has now changed state to having all
522 // windows shown... what to do, what to do?
Craig Mautner322e4032012-07-13 13:35:20 -0700523 if (appAnimator.freezingScreen) {
524 appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700525 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
526 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
527 "Setting mOrientationChangeComplete=true because wtoken "
528 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
529 + " numDrawn=" + wtoken.numDrawnWindows);
530 // This will set mOrientationChangeComplete and cause a pass through layout.
531 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
532 } else {
533 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
534 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
535 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
536 mPendingLayoutChanges);
537 }
Craig Mautner764983d2012-03-22 11:37:36 -0700538
Craig Mautner6fbda632012-07-03 09:26:39 -0700539 // We can now show all of the drawn windows!
540 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautner322e4032012-07-13 13:35:20 -0700541 mAnimating |= appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700542 }
Craig Mautner764983d2012-03-22 11:37:36 -0700543 }
544 }
545 }
546 }
547 }
548
549 private void performAnimationsLocked() {
Craig Mautner078ea0a2012-06-25 11:04:29 -0700550 updateWindowsLocked();
551 updateWallpaperLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700552
Craig Mautner4d7349b2012-04-20 14:52:47 -0700553 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
554 mPendingActions |= WALLPAPER_ACTION_PENDING;
555 }
Craig Mautner764983d2012-03-22 11:37:36 -0700556
Craig Mautner6fbda632012-07-03 09:26:39 -0700557 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700558 }
559
Craig Mautner1caa3992012-06-22 09:46:48 -0700560 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
561 /** Locked on mService.mWindowMap and this. */
562 private void animateLocked() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700563 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700564 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700565 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700566 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700567 mAnimating = false;
568 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
569 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
570 }
Craig Mautner764983d2012-03-22 11:37:36 -0700571
572 // Update animations of all applications, including those
573 // associated with exiting/removed apps
574 Surface.openTransaction();
575
576 try {
577 updateWindowsAppsAndRotationAnimationsLocked();
578 performAnimationsLocked();
579
580 // THIRD LOOP: Update the surfaces of all windows.
581
582 if (mScreenRotationAnimation != null) {
583 mScreenRotationAnimation.updateSurfaces();
584 }
585
Craig Mautner7358fbf2012-04-12 21:06:33 -0700586 final int N = mWinAnimators.size();
587 for (int i = 0; i < N; i++) {
Craig Mautner0fa77c12012-06-11 15:57:19 -0700588 mWinAnimators.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700589 }
590
Craig Mautner6af9b922012-04-05 19:25:51 -0700591 if (mDimParams != null) {
592 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
593 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700594 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700595 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700596 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700597 }
598
599 if (mService.mBlackFrame != null) {
600 if (mScreenRotationAnimation != null) {
601 mService.mBlackFrame.setMatrix(
602 mScreenRotationAnimation.getEnterTransformation().getMatrix());
603 } else {
604 mService.mBlackFrame.clearMatrix();
605 }
606 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700607
608 if (mService.mWatermark != null) {
609 mService.mWatermark.drawIfNeeded();
610 }
Craig Mautner764983d2012-03-22 11:37:36 -0700611 } catch (RuntimeException e) {
612 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
613 } finally {
614 Surface.closeTransaction();
615 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700616
Craig Mautner01cd0e72012-06-18 10:19:11 -0700617 if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700618 updateAnimToLayoutLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700619 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700620
621 if (mAnimating) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700622 synchronized (mService.mLayoutToAnim) {
623 mService.scheduleAnimationLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -0700624 }
Chet Haase198e5642012-05-10 09:55:15 -0700625 } else if (wasAnimating) {
626 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700627 }
628 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
629 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
630 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
631 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
632 }
Craig Mautner764983d2012-03-22 11:37:36 -0700633 }
634
635 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700636 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700637 mCurrentFocus = currentFocus;
638 }
639
640 void setDisplayDimensions(final int curWidth, final int curHeight,
641 final int appWidth, final int appHeight) {
642 mDw = curWidth;
643 mDh = curHeight;
644 mInnerDw = appWidth;
645 mInnerDh = appHeight;
646 }
647
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700648 boolean isDimming() {
649 return mDimParams != null;
650 }
651
Craig Mautneracafd192012-05-10 10:41:02 -0700652 boolean isDimming(final WindowStateAnimator winAnimator) {
653 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
654 }
655
Craig Mautnere7ae2502012-03-26 17:11:19 -0700656 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700657 if (dumpAll) {
658 if (mWindowDetachedWallpaper != null) {
659 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
660 pw.println(mWindowDetachedWallpaper);
661 }
662 pw.print(prefix); pw.print("mAnimTransactionSequence=");
663 pw.println(mAnimTransactionSequence);
664 if (mWindowAnimationBackgroundSurface != null) {
665 pw.print(prefix); pw.print("mWindowAnimationBackgroundSurface:");
666 mWindowAnimationBackgroundSurface.printTo(prefix + " ", pw);
667 }
668 if (mDimAnimator != null) {
669 pw.print(prefix); pw.print("mDimAnimator:");
670 mDimAnimator.printTo(prefix + " ", pw);
671 } else {
672 pw.print(prefix); pw.print("no DimAnimator ");
673 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700674 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700675 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700676
677 static class SetAnimationParams {
678 final WindowStateAnimator mWinAnimator;
679 final Animation mAnimation;
680 final int mAnimDw;
681 final int mAnimDh;
682 public SetAnimationParams(final WindowStateAnimator winAnimator,
683 final Animation animation, final int animDw, final int animDh) {
684 mWinAnimator = winAnimator;
685 mAnimation = animation;
686 mAnimDw = animDw;
687 mAnimDh = animDh;
688 }
689 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700690
691 synchronized void clearPendingActions() {
692 mPendingActions = 0;
693 }
Craig Mautner764983d2012-03-22 11:37:36 -0700694}