blob: 580f00d4e4d7014d449574fe57cb3a80d2ecd69d [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;
Craig Mautner6881a102012-07-27 13:04:51 -070019import android.view.Display;
Craig Mautner764983d2012-03-22 11:37:36 -070020import android.view.Surface;
Craig Mautner764983d2012-03-22 11:37:36 -070021import android.view.WindowManagerPolicy;
22import android.view.animation.Animation;
Craig Mautner764983d2012-03-22 11:37:36 -070023
24import com.android.internal.policy.impl.PhoneWindowManager;
Craig Mautner322e4032012-07-13 13:35:20 -070025import com.android.server.wm.WindowManagerService.AppWindowAnimParams;
Craig Mautner711f90a2012-07-03 18:43:52 -070026import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;
Craig Mautner764983d2012-03-22 11:37:36 -070027
Craig Mautnere7ae2502012-03-26 17:11:19 -070028import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070029import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070030
Craig Mautner764983d2012-03-22 11:37:36 -070031/**
Craig Mautner764983d2012-03-22 11:37:36 -070032 * Singleton class that carries out the animations and Surface operations in a separate task
33 * on behalf of WindowManagerService.
34 */
35public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070036 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070037
38 final WindowManagerService mService;
39 final Context mContext;
40 final WindowManagerPolicy mPolicy;
41
Craig Mautner59c00972012-07-30 12:10:24 -070042 ArrayList<WinAnimatorList> mWinAnimatorLists = new ArrayList<WinAnimatorList>();
Craig Mautnerbec53f72012-04-05 11:49:05 -070043
Craig Mautner764983d2012-03-22 11:37:36 -070044 boolean mAnimating;
Craig Mautner01cd0e72012-06-18 10:19:11 -070045
Craig Mautner1caa3992012-06-22 09:46:48 -070046 final Runnable mAnimationRunnable;
47
Craig Mautner764983d2012-03-22 11:37:36 -070048 int mAdjResult;
49
50 int mPendingLayoutChanges;
51
52 /** Overall window dimensions */
53 int mDw, mDh;
54
55 /** Interior window dimensions */
56 int mInnerDw, mInnerDh;
57
58 /** Time of current animation step. Reset on each iteration */
59 long mCurrentTime;
60
61 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
62 * 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 -070063 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070064
65 /** The one and only screen rotation if one is happening */
66 ScreenRotationAnimation mScreenRotationAnimation = null;
67
Craig Mautnere7ae2502012-03-26 17:11:19 -070068 // Window currently running an animation that has requested it be detached
69 // from the wallpaper. This means we need to ensure the wallpaper is
70 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070071 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070072 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070073
Craig Mautnere7ae2502012-03-26 17:11:19 -070074 DimSurface mWindowAnimationBackgroundSurface = null;
75
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070076 WindowStateAnimator mUniverseBackground = null;
77 int mAboveUniverseLayer = 0;
78
Craig Mautnera608b882012-03-30 13:03:49 -070079 int mBulkUpdateParams = 0;
80
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070081 DimAnimator mDimAnimator = null;
82 DimAnimator.Parameters mDimParams = null;
83
Craig Mautner4d7349b2012-04-20 14:52:47 -070084 static final int WALLPAPER_ACTION_PENDING = 1;
85 int mPendingActions;
86
Craig Mautner1caa3992012-06-22 09:46:48 -070087 WindowState mWallpaperTarget = null;
Craig Mautner918b53b2012-07-09 14:15:54 -070088 AppWindowAnimator mWpAppAnimator = null;
89 WindowState mLowerWallpaperTarget = null;
90 WindowState mUpperWallpaperTarget = null;
Craig Mautner1caa3992012-06-22 09:46:48 -070091
Craig Mautner322e4032012-07-13 13:35:20 -070092 ArrayList<AppWindowAnimator> mAppAnimators = new ArrayList<AppWindowAnimator>();
93
Craig Mautner918b53b2012-07-09 14:15:54 -070094 ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
95
96 /** Parameters being passed from this into mService. */
97 static class AnimatorToLayoutParams {
98 boolean mUpdateQueued;
99 int mBulkUpdateParams;
100 int mPendingLayoutChanges;
101 WindowState mWindowDetachedWallpaper;
102 }
103 /** Do not modify unless holding mService.mWindowMap or this and mAnimToLayout in that order */
Craig Mautner711f90a2012-07-03 18:43:52 -0700104 final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();
105
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700106 boolean mInitialized = false;
107
Craig Mautner918b53b2012-07-09 14:15:54 -0700108 WindowAnimator(final WindowManagerService service) {
Craig Mautner764983d2012-03-22 11:37:36 -0700109 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -0700110 mContext = service.mContext;
111 mPolicy = service.mPolicy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700112
113 mAnimationRunnable = new Runnable() {
114 @Override
115 public void run() {
116 // TODO(cmautner): When full isolation is achieved for animation, the first lock
117 // goes away and only the WindowAnimator.this remains.
118 synchronized(mService.mWindowMap) {
119 synchronized(WindowAnimator.this) {
120 copyLayoutToAnimParamsLocked();
121 animateLocked();
122 }
123 }
124 }
125 };
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700126 }
Craig Mautner9e809442012-06-22 17:13:04 -0700127
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700128 void initializeLocked(final int layerStack) {
Craig Mautner6881a102012-07-27 13:04:51 -0700129 mWindowAnimationBackgroundSurface =
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700130 new DimSurface(mService.mFxSession, layerStack);
131 mDimAnimator = new DimAnimator(mService.mFxSession, layerStack);
132 mInitialized = true;
Craig Mautner1caa3992012-06-22 09:46:48 -0700133 }
134
Craig Mautner711f90a2012-07-03 18:43:52 -0700135 /** Locked on mAnimToLayout */
136 void updateAnimToLayoutLocked() {
137 final AnimatorToLayoutParams animToLayout = mAnimToLayout;
138 synchronized (animToLayout) {
139 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
140 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
141 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
142
143 if (!animToLayout.mUpdateQueued) {
144 animToLayout.mUpdateQueued = true;
145 mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
146 }
147 }
148 }
149
Craig Mautner1caa3992012-06-22 09:46:48 -0700150 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
151 private void copyLayoutToAnimParamsLocked() {
Craig Mautner711f90a2012-07-03 18:43:52 -0700152 final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
Craig Mautner1caa3992012-06-22 09:46:48 -0700153 synchronized(layoutToAnim) {
154 layoutToAnim.mAnimationScheduled = false;
155
Craig Mautner322e4032012-07-13 13:35:20 -0700156 if (!layoutToAnim.mParamsModified) {
157 return;
158 }
159 layoutToAnim.mParamsModified = false;
160
Craig Mautner918b53b2012-07-09 14:15:54 -0700161 if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) {
162 layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED;
163 mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
164 }
165
Craig Mautner59c00972012-07-30 12:10:24 -0700166 mWinAnimatorLists =
167 new ArrayList<WinAnimatorList>(layoutToAnim.mWinAnimatorLists);
Craig Mautner1caa3992012-06-22 09:46:48 -0700168 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
Craig Mautner918b53b2012-07-09 14:15:54 -0700169 mWpAppAnimator = mWallpaperTarget == null
170 ? null : mWallpaperTarget.mAppToken == null
171 ? null : mWallpaperTarget.mAppToken.mAppAnimator;
172 mLowerWallpaperTarget = layoutToAnim.mLowerWallpaperTarget;
173 mUpperWallpaperTarget = layoutToAnim.mUpperWallpaperTarget;
Craig Mautnera76fdb72012-07-03 19:03:02 -0700174
175 // Set the new DimAnimator params.
176 DimAnimator.Parameters dimParams = layoutToAnim.mDimParams;
177 if (dimParams == null) {
178 mDimParams = dimParams;
179 } else {
180 final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
181
182 // Only set dim params on the highest dimmed layer.
183 final WindowStateAnimator existingDimWinAnimator = mDimParams == null
184 ? null : mDimParams.mDimWinAnimator;
185 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
186 if (newWinAnimator.mSurfaceShown &&
187 (existingDimWinAnimator == null || !existingDimWinAnimator.mSurfaceShown
188 || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
189 mDimParams = dimParams;
190 }
191 }
Craig Mautner322e4032012-07-13 13:35:20 -0700192
193 mAppAnimators.clear();
194 final int N = layoutToAnim.mAppWindowAnimParams.size();
195 for (int i = 0; i < N; i++) {
196 final AppWindowAnimParams params = layoutToAnim.mAppWindowAnimParams.get(i);
197 AppWindowAnimator appAnimator = params.mAppAnimator;
Craig Mautnerbea12bd2012-08-20 10:18:34 -0700198 appAnimator.mAllAppWinAnimators.clear();
199 appAnimator.mAllAppWinAnimators.addAll(params.mWinAnimators);
Craig Mautner322e4032012-07-13 13:35:20 -0700200 mAppAnimators.add(appAnimator);
201 }
Craig Mautner1caa3992012-06-22 09:46:48 -0700202 }
203 }
204
Craig Mautnerb9836b92012-06-11 11:40:09 -0700205 void hideWallpapersLocked(final WindowState w) {
Craig Mautner918b53b2012-07-09 14:15:54 -0700206 if ((mWallpaperTarget == w && mLowerWallpaperTarget == null) || mWallpaperTarget == null) {
207 final int numTokens = mWallpaperTokens.size();
208 for (int i = numTokens - 1; i >= 0; i--) {
209 final WindowToken token = mWallpaperTokens.get(i);
210 final int numWindows = token.windows.size();
211 for (int j = numWindows - 1; j >= 0; j--) {
212 final WindowState wallpaper = token.windows.get(j);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700213 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
214 if (!winAnimator.mLastHidden) {
215 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700216 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700217 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
218 }
219 }
220 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700221 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700222 }
223 }
224
Craig Mautner764983d2012-03-22 11:37:36 -0700225 private void updateWindowsAppsAndRotationAnimationsLocked() {
226 int i;
Craig Mautner322e4032012-07-13 13:35:20 -0700227 final int NAT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700228 for (i=0; i<NAT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700229 final AppWindowAnimator appAnimator = mAppAnimators.get(i);
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 Mautner764983d2012-03-22 11:37:36 -0700233 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700234 } 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 Mautner59431632012-04-04 11:56:44 -0700238 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700239 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 " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700243 }
244 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700245
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700246 final int NEAT = mService.mExitingAppTokens.size();
247 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700248 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700249 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700250 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700251 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700252 mAnimating = true;
253 } else if (wasAnimating) {
254 // stopped animating, do one more pass through the layout
255 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700256 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700257 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700258 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700259 }
Craig Mautner83339b42012-05-01 22:13:23 -0700260 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
261 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700262 }
263 }
264
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700265 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700266 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700267 mAnimating = true;
268 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700269 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700270 mScreenRotationAnimation.kill();
271 mScreenRotationAnimation = null;
272 }
273 }
274 }
275
Craig Mautner59c00972012-07-30 12:10:24 -0700276 private void updateWindowsLocked(final WinAnimatorList winAnimatorList) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700277 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700278
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700279 ArrayList<WindowStateAnimator> unForceHiding = null;
280 boolean wallpaperInUnForceHiding = false;
281
Craig Mautner4bf18a72012-07-10 14:08:16 -0700282 // forceHiding states.
283 final int KEYGUARD_NOT_SHOWN = 0;
284 final int KEYGUARD_ANIMATING_IN = 1;
285 final int KEYGUARD_SHOWN = 2;
286 final int KEYGUARD_ANIMATING_OUT = 3;
287 int forceHiding = KEYGUARD_NOT_SHOWN;
288
Craig Mautner59c00972012-07-30 12:10:24 -0700289 for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
290 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700291 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700292 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700293
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700294 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700295 final boolean wasAnimating = winAnimator.mWasAnimating;
296 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700297
298 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700299 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700300 ", nowAnimating=" + nowAnimating);
301 }
302
Craig Mautner918b53b2012-07-09 14:15:54 -0700303 if (wasAnimating && !winAnimator.mAnimating && mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700304 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700305 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700306 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700307 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
308 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700309 }
Craig Mautner764983d2012-03-22 11:37:36 -0700310 }
311
Craig Mautnerbec53f72012-04-05 11:49:05 -0700312 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700313 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700314 if (WindowManagerService.DEBUG_ANIM ||
315 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
316 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700317 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700318 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700319 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700320 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
321 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700322 }
Craig Mautner764983d2012-03-22 11:37:36 -0700323 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700324 }
Craig Mautner4bf18a72012-07-10 14:08:16 -0700325 if (win.isReadyForDisplay()) {
326 if (nowAnimating) {
327 if (winAnimator.mAnimationIsEntrance) {
328 forceHiding = KEYGUARD_ANIMATING_IN;
329 } else {
330 forceHiding = KEYGUARD_ANIMATING_OUT;
331 }
332 } else {
333 forceHiding = KEYGUARD_SHOWN;
334 }
Craig Mautner764983d2012-03-22 11:37:36 -0700335 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700336 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner078ea0a2012-06-25 11:04:29 -0700337 "Force hide " + forceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700338 + " hasSurface=" + win.mHasSurface
339 + " policyVis=" + win.mPolicyVisibility
340 + " destroying=" + win.mDestroying
341 + " attHidden=" + win.mAttachedHidden
342 + " vis=" + win.mViewVisibility
343 + " hidden=" + win.mRootToken.hidden
344 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700345 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautner4bf18a72012-07-10 14:08:16 -0700346 final boolean hideWhenLocked =
347 (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700348 final boolean changed;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700349 if (((forceHiding == KEYGUARD_ANIMATING_IN)
350 && (!winAnimator.isAnimating() || hideWhenLocked))
351 || ((forceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700352 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700353 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700354 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700355 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700356 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700357 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700358 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700359 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700360 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700361 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700362 if (unForceHiding == null) {
363 unForceHiding = new ArrayList<WindowStateAnimator>();
364 }
365 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700366 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700367 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700368 }
369 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700370 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700371 // We are showing on to of the current
372 // focus, so re-evaluate focus to make
373 // sure it is correct.
374 mService.mFocusMayChange = true;
375 }
376 }
377 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700378 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700379 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700380 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700381 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700382 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
383 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700384 }
Craig Mautner764983d2012-03-22 11:37:36 -0700385 }
386 }
387 }
388
Craig Mautnerbec53f72012-04-05 11:49:05 -0700389 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700390 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
391 if (atoken == null || atoken.allDrawn) {
392 if (winAnimator.performShowLocked()) {
393 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
394 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
395 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
396 mPendingLayoutChanges);
Craig Mautner764983d2012-03-22 11:37:36 -0700397 }
398 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700399 }
Craig Mautner764983d2012-03-22 11:37:36 -0700400 }
Craig Mautner322e4032012-07-13 13:35:20 -0700401 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700402 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700403 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
404 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700405 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700406 }
Craig Mautner59431632012-04-04 11:56:44 -0700407 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
408 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700409 }
410 }
Craig Mautner764983d2012-03-22 11:37:36 -0700411 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700412
Craig Mautner078ea0a2012-06-25 11:04:29 -0700413 // If we have windows that are being show due to them no longer
414 // being force-hidden, apply the appropriate animation to them.
415 if (unForceHiding != null) {
416 for (int i=unForceHiding.size()-1; i>=0; i--) {
417 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
418 if (a != null) {
419 final WindowStateAnimator winAnimator = unForceHiding.get(i);
420 winAnimator.setAnimation(a);
421 winAnimator.mAnimationIsEntrance = true;
422 }
423 }
424 }
425 }
426
Craig Mautner59c00972012-07-30 12:10:24 -0700427 private void updateWallpaperLocked(final WinAnimatorList winAnimatorList) {
Craig Mautner078ea0a2012-06-25 11:04:29 -0700428 WindowStateAnimator windowAnimationBackground = null;
429 int windowAnimationBackgroundColor = 0;
430 WindowState detachedWallpaper = null;
431
Craig Mautner59c00972012-07-30 12:10:24 -0700432 for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
433 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner078ea0a2012-06-25 11:04:29 -0700434 if (winAnimator.mSurface == null) {
435 continue;
436 }
437
438 final int flags = winAnimator.mAttrFlags;
439 final WindowState win = winAnimator.mWin;
440
441 // If this window is animating, make a note that we have
442 // an animating window and take care of a request to run
443 // a detached wallpaper animation.
444 if (winAnimator.mAnimating) {
445 if (winAnimator.mAnimation != null) {
446 if ((flags & FLAG_SHOW_WALLPAPER) != 0
447 && winAnimator.mAnimation.getDetachWallpaper()) {
448 detachedWallpaper = win;
449 }
450 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
451 if (backgroundColor != 0) {
452 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
453 windowAnimationBackground.mAnimLayer)) {
454 windowAnimationBackground = winAnimator;
455 windowAnimationBackgroundColor = backgroundColor;
456 }
457 }
458 }
459 mAnimating = true;
460 }
461
462 // If this window's app token is running a detached wallpaper
463 // animation, make a note so we can ensure the wallpaper is
464 // displayed behind it.
Craig Mautner322e4032012-07-13 13:35:20 -0700465 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700466 if (appAnimator != null && appAnimator.animation != null
467 && appAnimator.animating) {
468 if ((flags & FLAG_SHOW_WALLPAPER) != 0
469 && appAnimator.animation.getDetachWallpaper()) {
470 detachedWallpaper = win;
471 }
472
473 final int backgroundColor = appAnimator.animation.getBackgroundColor();
474 if (backgroundColor != 0) {
475 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
476 windowAnimationBackground.mAnimLayer)) {
477 windowAnimationBackground = winAnimator;
478 windowAnimationBackgroundColor = backgroundColor;
479 }
480 }
481 }
482 } // end forall windows
483
Craig Mautner9e809442012-06-22 17:13:04 -0700484 if (mWindowDetachedWallpaper != detachedWallpaper) {
485 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
486 "Detached wallpaper changed from " + mWindowDetachedWallpaper
487 + " to " + detachedWallpaper);
488 mWindowDetachedWallpaper = detachedWallpaper;
489 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
490 }
491
492 if (windowAnimationBackgroundColor != 0) {
493 // If the window that wants black is the current wallpaper
494 // target, then the black goes *below* the wallpaper so we
495 // don't cause the wallpaper to suddenly disappear.
496 int animLayer = windowAnimationBackground.mAnimLayer;
497 WindowState win = windowAnimationBackground.mWin;
Craig Mautner59c00972012-07-30 12:10:24 -0700498 if (mWallpaperTarget == win
Craig Mautner918b53b2012-07-09 14:15:54 -0700499 || mLowerWallpaperTarget == win || mUpperWallpaperTarget == win) {
Craig Mautner59c00972012-07-30 12:10:24 -0700500 final int N = winAnimatorList.size();
Craig Mautner9e809442012-06-22 17:13:04 -0700501 for (int i = 0; i < N; i++) {
Craig Mautner59c00972012-07-30 12:10:24 -0700502 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700503 if (winAnimator.mIsWallpaper) {
Craig Mautner9e809442012-06-22 17:13:04 -0700504 animLayer = winAnimator.mAnimLayer;
505 break;
506 }
507 }
508 }
509
Craig Mautner078ea0a2012-06-25 11:04:29 -0700510 mWindowAnimationBackgroundSurface.show(mDw, mDh,
Craig Mautner9e809442012-06-22 17:13:04 -0700511 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
512 windowAnimationBackgroundColor);
513 } else {
514 mWindowAnimationBackgroundSurface.hide();
515 }
Craig Mautner764983d2012-03-22 11:37:36 -0700516 }
517
518 private void testTokenMayBeDrawnLocked() {
519 // See if any windows have been drawn, so they (and others
520 // associated with them) can now be shown.
Craig Mautner322e4032012-07-13 13:35:20 -0700521 final int NT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700522 for (int i=0; i<NT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700523 AppWindowAnimator appAnimator = mAppAnimators.get(i);
524 AppWindowToken wtoken = appAnimator.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700525 final boolean allDrawn = wtoken.allDrawn;
Craig Mautner322e4032012-07-13 13:35:20 -0700526 if (allDrawn != appAnimator.allDrawn) {
527 appAnimator.allDrawn = allDrawn;
Craig Mautner6fbda632012-07-03 09:26:39 -0700528 if (allDrawn) {
529 // The token has now changed state to having all
530 // windows shown... what to do, what to do?
Craig Mautner322e4032012-07-13 13:35:20 -0700531 if (appAnimator.freezingScreen) {
532 appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700533 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
534 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
535 "Setting mOrientationChangeComplete=true because wtoken "
536 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
537 + " numDrawn=" + wtoken.numDrawnWindows);
538 // This will set mOrientationChangeComplete and cause a pass through layout.
539 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
540 } else {
541 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
542 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
543 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
544 mPendingLayoutChanges);
545 }
Craig Mautner764983d2012-03-22 11:37:36 -0700546
Craig Mautner6fbda632012-07-03 09:26:39 -0700547 // We can now show all of the drawn windows!
548 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautner322e4032012-07-13 13:35:20 -0700549 mAnimating |= appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700550 }
Craig Mautner764983d2012-03-22 11:37:36 -0700551 }
552 }
553 }
554 }
555 }
556
Craig Mautner59c00972012-07-30 12:10:24 -0700557 private void performAnimationsLocked(final WinAnimatorList winAnimatorList) {
558 updateWindowsLocked(winAnimatorList);
559 updateWallpaperLocked(winAnimatorList);
Craig Mautner764983d2012-03-22 11:37:36 -0700560
Craig Mautner4d7349b2012-04-20 14:52:47 -0700561 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
562 mPendingActions |= WALLPAPER_ACTION_PENDING;
563 }
Craig Mautner764983d2012-03-22 11:37:36 -0700564
Craig Mautner6fbda632012-07-03 09:26:39 -0700565 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700566 }
567
Craig Mautner1caa3992012-06-22 09:46:48 -0700568 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
569 /** Locked on mService.mWindowMap and this. */
570 private void animateLocked() {
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700571 if (!mInitialized) {
572 return;
573 }
Craig Mautner59c00972012-07-30 12:10:24 -0700574 for (int i = mWinAnimatorLists.size() - 1; i >= 0; i--) {
575 animateLocked(mWinAnimatorLists.get(i));
576 }
577 }
578
579 private void animateLocked(final WinAnimatorList winAnimatorList) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700580 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700581 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700582 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700583 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700584 mAnimating = false;
585 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
586 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
587 }
Craig Mautner764983d2012-03-22 11:37:36 -0700588
589 // Update animations of all applications, including those
590 // associated with exiting/removed apps
591 Surface.openTransaction();
592
593 try {
594 updateWindowsAppsAndRotationAnimationsLocked();
Craig Mautner59c00972012-07-30 12:10:24 -0700595 performAnimationsLocked(winAnimatorList);
Craig Mautner764983d2012-03-22 11:37:36 -0700596
597 // THIRD LOOP: Update the surfaces of all windows.
598
599 if (mScreenRotationAnimation != null) {
600 mScreenRotationAnimation.updateSurfaces();
601 }
602
Craig Mautner59c00972012-07-30 12:10:24 -0700603 final int N = winAnimatorList.size();
Craig Mautner7358fbf2012-04-12 21:06:33 -0700604 for (int i = 0; i < N; i++) {
Craig Mautner59c00972012-07-30 12:10:24 -0700605 winAnimatorList.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700606 }
607
Craig Mautner6af9b922012-04-05 19:25:51 -0700608 if (mDimParams != null) {
609 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
610 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700611 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700612 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700613 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700614 }
615
616 if (mService.mBlackFrame != null) {
617 if (mScreenRotationAnimation != null) {
618 mService.mBlackFrame.setMatrix(
619 mScreenRotationAnimation.getEnterTransformation().getMatrix());
620 } else {
621 mService.mBlackFrame.clearMatrix();
622 }
623 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700624
625 if (mService.mWatermark != null) {
626 mService.mWatermark.drawIfNeeded();
627 }
Craig Mautner764983d2012-03-22 11:37:36 -0700628 } catch (RuntimeException e) {
629 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
630 } finally {
631 Surface.closeTransaction();
632 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700633
Craig Mautner01cd0e72012-06-18 10:19:11 -0700634 if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700635 updateAnimToLayoutLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700636 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700637
638 if (mAnimating) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700639 synchronized (mService.mLayoutToAnim) {
640 mService.scheduleAnimationLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -0700641 }
Chet Haase198e5642012-05-10 09:55:15 -0700642 } else if (wasAnimating) {
643 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700644 }
645 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
646 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
647 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
648 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
649 }
Craig Mautner764983d2012-03-22 11:37:36 -0700650 }
651
652 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700653 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700654 mCurrentFocus = currentFocus;
655 }
656
657 void setDisplayDimensions(final int curWidth, final int curHeight,
658 final int appWidth, final int appHeight) {
659 mDw = curWidth;
660 mDh = curHeight;
661 mInnerDw = appWidth;
662 mInnerDh = appHeight;
663 }
664
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700665 boolean isDimming() {
666 return mDimParams != null;
667 }
668
Craig Mautneracafd192012-05-10 10:41:02 -0700669 boolean isDimming(final WindowStateAnimator winAnimator) {
670 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
671 }
672
Craig Mautnere7ae2502012-03-26 17:11:19 -0700673 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700674 if (dumpAll) {
675 if (mWindowDetachedWallpaper != null) {
676 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
677 pw.println(mWindowDetachedWallpaper);
678 }
679 pw.print(prefix); pw.print("mAnimTransactionSequence=");
680 pw.println(mAnimTransactionSequence);
681 if (mWindowAnimationBackgroundSurface != null) {
682 pw.print(prefix); pw.print("mWindowAnimationBackgroundSurface:");
683 mWindowAnimationBackgroundSurface.printTo(prefix + " ", pw);
684 }
685 if (mDimAnimator != null) {
686 pw.print(prefix); pw.print("mDimAnimator:");
687 mDimAnimator.printTo(prefix + " ", pw);
688 } else {
689 pw.print(prefix); pw.print("no DimAnimator ");
690 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700691 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700692 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700693
694 static class SetAnimationParams {
695 final WindowStateAnimator mWinAnimator;
696 final Animation mAnimation;
697 final int mAnimDw;
698 final int mAnimDh;
699 public SetAnimationParams(final WindowStateAnimator winAnimator,
700 final Animation animation, final int animDw, final int animDh) {
701 mWinAnimator = winAnimator;
702 mAnimation = animation;
703 mAnimDw = animDw;
704 mAnimDh = animDh;
705 }
706 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700707
708 synchronized void clearPendingActions() {
709 mPendingActions = 0;
710 }
Craig Mautner764983d2012-03-22 11:37:36 -0700711}