blob: b0c858c0d723837104ee2a33317b9ff837fe20b0 [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 Mautner7358fbf2012-04-12 21:06:33 -070042 ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
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 Mautner918b53b2012-07-09 14:15:54 -0700106 WindowAnimator(final WindowManagerService service) {
Craig Mautner764983d2012-03-22 11:37:36 -0700107 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -0700108 mContext = service.mContext;
109 mPolicy = service.mPolicy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700110
111 mAnimationRunnable = new Runnable() {
112 @Override
113 public void run() {
114 // TODO(cmautner): When full isolation is achieved for animation, the first lock
115 // goes away and only the WindowAnimator.this remains.
116 synchronized(mService.mWindowMap) {
117 synchronized(WindowAnimator.this) {
118 copyLayoutToAnimParamsLocked();
119 animateLocked();
120 }
121 }
122 }
123 };
Craig Mautner9e809442012-06-22 17:13:04 -0700124
Craig Mautner6881a102012-07-27 13:04:51 -0700125 mWindowAnimationBackgroundSurface =
126 new DimSurface(mService.mFxSession, Display.DEFAULT_DISPLAY);
127 mDimAnimator = new DimAnimator(mService.mFxSession, Display.DEFAULT_DISPLAY);
Craig Mautner1caa3992012-06-22 09:46:48 -0700128 }
129
Craig Mautner711f90a2012-07-03 18:43:52 -0700130 /** Locked on mAnimToLayout */
131 void updateAnimToLayoutLocked() {
132 final AnimatorToLayoutParams animToLayout = mAnimToLayout;
133 synchronized (animToLayout) {
134 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
135 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
136 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
137
138 if (!animToLayout.mUpdateQueued) {
139 animToLayout.mUpdateQueued = true;
140 mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
141 }
142 }
143 }
144
Craig Mautner1caa3992012-06-22 09:46:48 -0700145 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
146 private void copyLayoutToAnimParamsLocked() {
Craig Mautner711f90a2012-07-03 18:43:52 -0700147 final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
Craig Mautner1caa3992012-06-22 09:46:48 -0700148 synchronized(layoutToAnim) {
149 layoutToAnim.mAnimationScheduled = false;
150
Craig Mautner322e4032012-07-13 13:35:20 -0700151 if (!layoutToAnim.mParamsModified) {
152 return;
153 }
154 layoutToAnim.mParamsModified = false;
155
Craig Mautner918b53b2012-07-09 14:15:54 -0700156 if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) {
157 layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED;
158 mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
159 }
160
Craig Mautner1caa3992012-06-22 09:46:48 -0700161 mWinAnimators = new ArrayList<WindowStateAnimator>(layoutToAnim.mWinAnimators);
162 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
Craig Mautner918b53b2012-07-09 14:15:54 -0700163 mWpAppAnimator = mWallpaperTarget == null
164 ? null : mWallpaperTarget.mAppToken == null
165 ? null : mWallpaperTarget.mAppToken.mAppAnimator;
166 mLowerWallpaperTarget = layoutToAnim.mLowerWallpaperTarget;
167 mUpperWallpaperTarget = layoutToAnim.mUpperWallpaperTarget;
Craig Mautnera76fdb72012-07-03 19:03:02 -0700168
169 // Set the new DimAnimator params.
170 DimAnimator.Parameters dimParams = layoutToAnim.mDimParams;
171 if (dimParams == null) {
172 mDimParams = dimParams;
173 } else {
174 final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
175
176 // Only set dim params on the highest dimmed layer.
177 final WindowStateAnimator existingDimWinAnimator = mDimParams == null
178 ? null : mDimParams.mDimWinAnimator;
179 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
180 if (newWinAnimator.mSurfaceShown &&
181 (existingDimWinAnimator == null || !existingDimWinAnimator.mSurfaceShown
182 || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
183 mDimParams = dimParams;
184 }
185 }
Craig Mautner322e4032012-07-13 13:35:20 -0700186
187 mAppAnimators.clear();
188 final int N = layoutToAnim.mAppWindowAnimParams.size();
189 for (int i = 0; i < N; i++) {
190 final AppWindowAnimParams params = layoutToAnim.mAppWindowAnimParams.get(i);
191 AppWindowAnimator appAnimator = params.mAppAnimator;
192 appAnimator.mAllAppWinAnimators =
193 new ArrayList<WindowStateAnimator>(params.mWinAnimators);
194 mAppAnimators.add(appAnimator);
195 }
Craig Mautner1caa3992012-06-22 09:46:48 -0700196 }
197 }
198
Craig Mautnerb9836b92012-06-11 11:40:09 -0700199 void hideWallpapersLocked(final WindowState w) {
Craig Mautner918b53b2012-07-09 14:15:54 -0700200 if ((mWallpaperTarget == w && mLowerWallpaperTarget == null) || mWallpaperTarget == null) {
201 final int numTokens = mWallpaperTokens.size();
202 for (int i = numTokens - 1; i >= 0; i--) {
203 final WindowToken token = mWallpaperTokens.get(i);
204 final int numWindows = token.windows.size();
205 for (int j = numWindows - 1; j >= 0; j--) {
206 final WindowState wallpaper = token.windows.get(j);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700207 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
208 if (!winAnimator.mLastHidden) {
209 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700210 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700211 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
212 }
213 }
214 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700215 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700216 }
217 }
218
Craig Mautner764983d2012-03-22 11:37:36 -0700219 private void updateWindowsAppsAndRotationAnimationsLocked() {
220 int i;
Craig Mautner322e4032012-07-13 13:35:20 -0700221 final int NAT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700222 for (i=0; i<NAT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700223 final AppWindowAnimator appAnimator = mAppAnimators.get(i);
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 Mautner764983d2012-03-22 11:37:36 -0700227 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700228 } 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 Mautner59431632012-04-04 11:56:44 -0700232 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700233 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 " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700237 }
238 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700239
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700240 final int NEAT = mService.mExitingAppTokens.size();
241 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700242 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700243 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700244 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700245 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700246 mAnimating = true;
247 } else if (wasAnimating) {
248 // stopped animating, do one more pass through the layout
249 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700250 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700251 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700252 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700253 }
Craig Mautner83339b42012-05-01 22:13:23 -0700254 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
255 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700256 }
257 }
258
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700259 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700260 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700261 mAnimating = true;
262 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700263 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700264 mScreenRotationAnimation.kill();
265 mScreenRotationAnimation = null;
266 }
267 }
268 }
269
Craig Mautner078ea0a2012-06-25 11:04:29 -0700270 private void updateWindowsLocked() {
Craig Mautner6fbda632012-07-03 09:26:39 -0700271 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700272
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700273 ArrayList<WindowStateAnimator> unForceHiding = null;
274 boolean wallpaperInUnForceHiding = false;
275
Craig Mautner4bf18a72012-07-10 14:08:16 -0700276 // forceHiding states.
277 final int KEYGUARD_NOT_SHOWN = 0;
278 final int KEYGUARD_ANIMATING_IN = 1;
279 final int KEYGUARD_SHOWN = 2;
280 final int KEYGUARD_ANIMATING_OUT = 3;
281 int forceHiding = KEYGUARD_NOT_SHOWN;
282
Craig Mautner01cd0e72012-06-18 10:19:11 -0700283 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
284 WindowStateAnimator winAnimator = mWinAnimators.get(i);
285 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700286 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700287
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700288 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700289 final boolean wasAnimating = winAnimator.mWasAnimating;
290 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700291
292 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700293 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700294 ", nowAnimating=" + nowAnimating);
295 }
296
Craig Mautner918b53b2012-07-09 14:15:54 -0700297 if (wasAnimating && !winAnimator.mAnimating && mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700298 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700299 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700300 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700301 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
302 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700303 }
Craig Mautner764983d2012-03-22 11:37:36 -0700304 }
305
Craig Mautnerbec53f72012-04-05 11:49:05 -0700306 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700307 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700308 if (WindowManagerService.DEBUG_ANIM ||
309 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
310 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700311 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700312 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700313 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700314 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
315 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700316 }
Craig Mautner764983d2012-03-22 11:37:36 -0700317 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700318 }
Craig Mautner4bf18a72012-07-10 14:08:16 -0700319 if (win.isReadyForDisplay()) {
320 if (nowAnimating) {
321 if (winAnimator.mAnimationIsEntrance) {
322 forceHiding = KEYGUARD_ANIMATING_IN;
323 } else {
324 forceHiding = KEYGUARD_ANIMATING_OUT;
325 }
326 } else {
327 forceHiding = KEYGUARD_SHOWN;
328 }
Craig Mautner764983d2012-03-22 11:37:36 -0700329 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700330 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner078ea0a2012-06-25 11:04:29 -0700331 "Force hide " + forceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700332 + " hasSurface=" + win.mHasSurface
333 + " policyVis=" + win.mPolicyVisibility
334 + " destroying=" + win.mDestroying
335 + " attHidden=" + win.mAttachedHidden
336 + " vis=" + win.mViewVisibility
337 + " hidden=" + win.mRootToken.hidden
338 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700339 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautner4bf18a72012-07-10 14:08:16 -0700340 final boolean hideWhenLocked =
341 (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700342 final boolean changed;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700343 if (((forceHiding == KEYGUARD_ANIMATING_IN)
344 && (!winAnimator.isAnimating() || hideWhenLocked))
345 || ((forceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700346 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700347 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700348 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700349 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700350 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700351 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700352 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700353 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700354 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700355 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700356 if (unForceHiding == null) {
357 unForceHiding = new ArrayList<WindowStateAnimator>();
358 }
359 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700360 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700361 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700362 }
363 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700364 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700365 // We are showing on to of the current
366 // focus, so re-evaluate focus to make
367 // sure it is correct.
368 mService.mFocusMayChange = true;
369 }
370 }
371 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700372 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700373 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700374 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700375 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700376 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
377 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700378 }
Craig Mautner764983d2012-03-22 11:37:36 -0700379 }
380 }
381 }
382
Craig Mautnerbec53f72012-04-05 11:49:05 -0700383 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700384 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
385 if (atoken == null || atoken.allDrawn) {
386 if (winAnimator.performShowLocked()) {
387 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
388 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
389 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
390 mPendingLayoutChanges);
Craig Mautner764983d2012-03-22 11:37:36 -0700391 }
392 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700393 }
Craig Mautner764983d2012-03-22 11:37:36 -0700394 }
Craig Mautner322e4032012-07-13 13:35:20 -0700395 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700396 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700397 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
398 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700399 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700400 }
Craig Mautner59431632012-04-04 11:56:44 -0700401 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
402 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700403 }
404 }
Craig Mautner764983d2012-03-22 11:37:36 -0700405 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700406
Craig Mautner078ea0a2012-06-25 11:04:29 -0700407 // If we have windows that are being show due to them no longer
408 // being force-hidden, apply the appropriate animation to them.
409 if (unForceHiding != null) {
410 for (int i=unForceHiding.size()-1; i>=0; i--) {
411 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
412 if (a != null) {
413 final WindowStateAnimator winAnimator = unForceHiding.get(i);
414 winAnimator.setAnimation(a);
415 winAnimator.mAnimationIsEntrance = true;
416 }
417 }
418 }
419 }
420
421 private void updateWallpaperLocked() {
422 WindowStateAnimator windowAnimationBackground = null;
423 int windowAnimationBackgroundColor = 0;
424 WindowState detachedWallpaper = null;
425
426 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
427 WindowStateAnimator winAnimator = mWinAnimators.get(i);
428 if (winAnimator.mSurface == null) {
429 continue;
430 }
431
432 final int flags = winAnimator.mAttrFlags;
433 final WindowState win = winAnimator.mWin;
434
435 // If this window is animating, make a note that we have
436 // an animating window and take care of a request to run
437 // a detached wallpaper animation.
438 if (winAnimator.mAnimating) {
439 if (winAnimator.mAnimation != null) {
440 if ((flags & FLAG_SHOW_WALLPAPER) != 0
441 && winAnimator.mAnimation.getDetachWallpaper()) {
442 detachedWallpaper = win;
443 }
444 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
445 if (backgroundColor != 0) {
446 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
447 windowAnimationBackground.mAnimLayer)) {
448 windowAnimationBackground = winAnimator;
449 windowAnimationBackgroundColor = backgroundColor;
450 }
451 }
452 }
453 mAnimating = true;
454 }
455
456 // If this window's app token is running a detached wallpaper
457 // animation, make a note so we can ensure the wallpaper is
458 // displayed behind it.
Craig Mautner322e4032012-07-13 13:35:20 -0700459 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700460 if (appAnimator != null && appAnimator.animation != null
461 && appAnimator.animating) {
462 if ((flags & FLAG_SHOW_WALLPAPER) != 0
463 && appAnimator.animation.getDetachWallpaper()) {
464 detachedWallpaper = win;
465 }
466
467 final int backgroundColor = appAnimator.animation.getBackgroundColor();
468 if (backgroundColor != 0) {
469 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
470 windowAnimationBackground.mAnimLayer)) {
471 windowAnimationBackground = winAnimator;
472 windowAnimationBackgroundColor = backgroundColor;
473 }
474 }
475 }
476 } // end forall windows
477
Craig Mautner9e809442012-06-22 17:13:04 -0700478 if (mWindowDetachedWallpaper != detachedWallpaper) {
479 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
480 "Detached wallpaper changed from " + mWindowDetachedWallpaper
481 + " to " + detachedWallpaper);
482 mWindowDetachedWallpaper = detachedWallpaper;
483 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
484 }
485
486 if (windowAnimationBackgroundColor != 0) {
487 // If the window that wants black is the current wallpaper
488 // target, then the black goes *below* the wallpaper so we
489 // don't cause the wallpaper to suddenly disappear.
490 int animLayer = windowAnimationBackground.mAnimLayer;
491 WindowState win = windowAnimationBackground.mWin;
Craig Mautner918b53b2012-07-09 14:15:54 -0700492 if (windowAnimationBackground != null && mWallpaperTarget == win
493 || mLowerWallpaperTarget == win || mUpperWallpaperTarget == win) {
Craig Mautner9e809442012-06-22 17:13:04 -0700494 final int N = mWinAnimators.size();
495 for (int i = 0; i < N; i++) {
496 WindowStateAnimator winAnimator = mWinAnimators.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700497 if (winAnimator.mIsWallpaper) {
Craig Mautner9e809442012-06-22 17:13:04 -0700498 animLayer = winAnimator.mAnimLayer;
499 break;
500 }
501 }
502 }
503
Craig Mautner078ea0a2012-06-25 11:04:29 -0700504 mWindowAnimationBackgroundSurface.show(mDw, mDh,
Craig Mautner9e809442012-06-22 17:13:04 -0700505 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
506 windowAnimationBackgroundColor);
507 } else {
508 mWindowAnimationBackgroundSurface.hide();
509 }
Craig Mautner764983d2012-03-22 11:37:36 -0700510 }
511
512 private void testTokenMayBeDrawnLocked() {
513 // See if any windows have been drawn, so they (and others
514 // associated with them) can now be shown.
Craig Mautner322e4032012-07-13 13:35:20 -0700515 final int NT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700516 for (int i=0; i<NT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700517 AppWindowAnimator appAnimator = mAppAnimators.get(i);
518 AppWindowToken wtoken = appAnimator.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700519 final boolean allDrawn = wtoken.allDrawn;
Craig Mautner322e4032012-07-13 13:35:20 -0700520 if (allDrawn != appAnimator.allDrawn) {
521 appAnimator.allDrawn = allDrawn;
Craig Mautner6fbda632012-07-03 09:26:39 -0700522 if (allDrawn) {
523 // The token has now changed state to having all
524 // windows shown... what to do, what to do?
Craig Mautner322e4032012-07-13 13:35:20 -0700525 if (appAnimator.freezingScreen) {
526 appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700527 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
528 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
529 "Setting mOrientationChangeComplete=true because wtoken "
530 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
531 + " numDrawn=" + wtoken.numDrawnWindows);
532 // This will set mOrientationChangeComplete and cause a pass through layout.
533 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
534 } else {
535 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
536 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
537 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
538 mPendingLayoutChanges);
539 }
Craig Mautner764983d2012-03-22 11:37:36 -0700540
Craig Mautner6fbda632012-07-03 09:26:39 -0700541 // We can now show all of the drawn windows!
542 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautner322e4032012-07-13 13:35:20 -0700543 mAnimating |= appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700544 }
Craig Mautner764983d2012-03-22 11:37:36 -0700545 }
546 }
547 }
548 }
549 }
550
551 private void performAnimationsLocked() {
Craig Mautner078ea0a2012-06-25 11:04:29 -0700552 updateWindowsLocked();
553 updateWallpaperLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700554
Craig Mautner4d7349b2012-04-20 14:52:47 -0700555 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
556 mPendingActions |= WALLPAPER_ACTION_PENDING;
557 }
Craig Mautner764983d2012-03-22 11:37:36 -0700558
Craig Mautner6fbda632012-07-03 09:26:39 -0700559 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700560 }
561
Craig Mautner1caa3992012-06-22 09:46:48 -0700562 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
563 /** Locked on mService.mWindowMap and this. */
564 private void animateLocked() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700565 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700566 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700567 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700568 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700569 mAnimating = false;
570 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
571 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
572 }
Craig Mautner764983d2012-03-22 11:37:36 -0700573
574 // Update animations of all applications, including those
575 // associated with exiting/removed apps
576 Surface.openTransaction();
577
578 try {
579 updateWindowsAppsAndRotationAnimationsLocked();
580 performAnimationsLocked();
581
582 // THIRD LOOP: Update the surfaces of all windows.
583
584 if (mScreenRotationAnimation != null) {
585 mScreenRotationAnimation.updateSurfaces();
586 }
587
Craig Mautner7358fbf2012-04-12 21:06:33 -0700588 final int N = mWinAnimators.size();
589 for (int i = 0; i < N; i++) {
Craig Mautner0fa77c12012-06-11 15:57:19 -0700590 mWinAnimators.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700591 }
592
Craig Mautner6af9b922012-04-05 19:25:51 -0700593 if (mDimParams != null) {
594 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
595 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700596 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700597 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700598 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700599 }
600
601 if (mService.mBlackFrame != null) {
602 if (mScreenRotationAnimation != null) {
603 mService.mBlackFrame.setMatrix(
604 mScreenRotationAnimation.getEnterTransformation().getMatrix());
605 } else {
606 mService.mBlackFrame.clearMatrix();
607 }
608 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700609
610 if (mService.mWatermark != null) {
611 mService.mWatermark.drawIfNeeded();
612 }
Craig Mautner764983d2012-03-22 11:37:36 -0700613 } catch (RuntimeException e) {
614 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
615 } finally {
616 Surface.closeTransaction();
617 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700618
Craig Mautner01cd0e72012-06-18 10:19:11 -0700619 if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700620 updateAnimToLayoutLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700621 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700622
623 if (mAnimating) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700624 synchronized (mService.mLayoutToAnim) {
625 mService.scheduleAnimationLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -0700626 }
Chet Haase198e5642012-05-10 09:55:15 -0700627 } else if (wasAnimating) {
628 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700629 }
630 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
631 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
632 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
633 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
634 }
Craig Mautner764983d2012-03-22 11:37:36 -0700635 }
636
637 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700638 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700639 mCurrentFocus = currentFocus;
640 }
641
642 void setDisplayDimensions(final int curWidth, final int curHeight,
643 final int appWidth, final int appHeight) {
644 mDw = curWidth;
645 mDh = curHeight;
646 mInnerDw = appWidth;
647 mInnerDh = appHeight;
648 }
649
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700650 boolean isDimming() {
651 return mDimParams != null;
652 }
653
Craig Mautneracafd192012-05-10 10:41:02 -0700654 boolean isDimming(final WindowStateAnimator winAnimator) {
655 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
656 }
657
Craig Mautnere7ae2502012-03-26 17:11:19 -0700658 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700659 if (dumpAll) {
660 if (mWindowDetachedWallpaper != null) {
661 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
662 pw.println(mWindowDetachedWallpaper);
663 }
664 pw.print(prefix); pw.print("mAnimTransactionSequence=");
665 pw.println(mAnimTransactionSequence);
666 if (mWindowAnimationBackgroundSurface != null) {
667 pw.print(prefix); pw.print("mWindowAnimationBackgroundSurface:");
668 mWindowAnimationBackgroundSurface.printTo(prefix + " ", pw);
669 }
670 if (mDimAnimator != null) {
671 pw.print(prefix); pw.print("mDimAnimator:");
672 mDimAnimator.printTo(prefix + " ", pw);
673 } else {
674 pw.print(prefix); pw.print("no DimAnimator ");
675 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700676 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700677 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700678
679 static class SetAnimationParams {
680 final WindowStateAnimator mWinAnimator;
681 final Animation mAnimation;
682 final int mAnimDw;
683 final int mAnimDh;
684 public SetAnimationParams(final WindowStateAnimator winAnimator,
685 final Animation animation, final int animDw, final int animDh) {
686 mWinAnimator = winAnimator;
687 mAnimation = animation;
688 mAnimDw = animDw;
689 mAnimDh = animDh;
690 }
691 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700692
693 synchronized void clearPendingActions() {
694 mPendingActions = 0;
695 }
Craig Mautner764983d2012-03-22 11:37:36 -0700696}