blob: 528b374cf82b3a855856a64fcc3767e37feb3d76 [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;
11
12import static com.android.server.wm.WindowManagerService.H.SET_DIM_PARAMETERS;
Craig Mautnera608b882012-03-30 13:03:49 -070013
Craig Mautner764983d2012-03-22 11:37:36 -070014import android.content.Context;
15import android.os.SystemClock;
16import android.util.Log;
17import android.util.Slog;
Craig Mautner1caa3992012-06-22 09:46:48 -070018import android.view.Choreographer;
Craig Mautner764983d2012-03-22 11:37:36 -070019import 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;
24
Craig Mautnere7ae2502012-03-26 17:11:19 -070025import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070026import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070027
Craig Mautner764983d2012-03-22 11:37:36 -070028/**
Craig Mautner764983d2012-03-22 11:37:36 -070029 * Singleton class that carries out the animations and Surface operations in a separate task
30 * on behalf of WindowManagerService.
31 */
32public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070033 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070034
35 final WindowManagerService mService;
36 final Context mContext;
37 final WindowManagerPolicy mPolicy;
38
Craig Mautner1caa3992012-06-22 09:46:48 -070039 final Choreographer mChoreographer = Choreographer.getInstance();
40
Craig Mautner7358fbf2012-04-12 21:06:33 -070041 ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
Craig Mautnerbec53f72012-04-05 11:49:05 -070042
Craig Mautner764983d2012-03-22 11:37:36 -070043 boolean mAnimating;
Craig Mautner01cd0e72012-06-18 10:19:11 -070044
45 /** Variables only intended to be valid within each pass through animate(). Does not contain
46 * persistent state. */
47 private class InnerLoopParams {
Craig Mautner01cd0e72012-06-18 10:19:11 -070048 boolean mForceHiding;
Craig Mautner01cd0e72012-06-18 10:19:11 -070049 }
50 InnerLoopParams mInner = new InnerLoopParams();
51
Craig Mautner1caa3992012-06-22 09:46:48 -070052 static class LayoutToAnimatorParams {
53 boolean mAnimationScheduled;
54 ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
55 WindowState mWallpaperTarget;
56 }
57 /** Params from WindowManagerService. Do not modify or read without first locking on
58 * either WindowManagerService.mWindowMap or WindowManagerService.mAnimator.and then on
59 * mLayoutToAnim */
60 final LayoutToAnimatorParams mLayoutToAnim = new LayoutToAnimatorParams();
61
62 final Runnable mAnimationRunnable;
63
Craig Mautner764983d2012-03-22 11:37:36 -070064 int mAdjResult;
65
66 int mPendingLayoutChanges;
67
68 /** Overall window dimensions */
69 int mDw, mDh;
70
71 /** Interior window dimensions */
72 int mInnerDw, mInnerDh;
73
74 /** Time of current animation step. Reset on each iteration */
75 long mCurrentTime;
76
77 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
78 * 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 -070079 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070080
81 /** The one and only screen rotation if one is happening */
82 ScreenRotationAnimation mScreenRotationAnimation = null;
83
Craig Mautnere7ae2502012-03-26 17:11:19 -070084 // Window currently running an animation that has requested it be detached
85 // from the wallpaper. This means we need to ensure the wallpaper is
86 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070087 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070088 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070089
Craig Mautnere7ae2502012-03-26 17:11:19 -070090 DimSurface mWindowAnimationBackgroundSurface = null;
91
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070092 WindowStateAnimator mUniverseBackground = null;
93 int mAboveUniverseLayer = 0;
94
Craig Mautnera608b882012-03-30 13:03:49 -070095 int mBulkUpdateParams = 0;
96
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070097 DimAnimator mDimAnimator = null;
98 DimAnimator.Parameters mDimParams = null;
99
Craig Mautner4d7349b2012-04-20 14:52:47 -0700100 static final int WALLPAPER_ACTION_PENDING = 1;
101 int mPendingActions;
102
Craig Mautner1caa3992012-06-22 09:46:48 -0700103 WindowState mWallpaperTarget = null;
104
Craig Mautner764983d2012-03-22 11:37:36 -0700105 WindowAnimator(final WindowManagerService service, final Context context,
106 final WindowManagerPolicy policy) {
107 mService = service;
108 mContext = context;
109 mPolicy = policy;
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
125 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
Craig Mautner1caa3992012-06-22 09:46:48 -0700126 }
127
128 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
129 private void copyLayoutToAnimParamsLocked() {
130 final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
131 synchronized(layoutToAnim) {
132 layoutToAnim.mAnimationScheduled = false;
133
134 mWinAnimators = new ArrayList<WindowStateAnimator>(layoutToAnim.mWinAnimators);
135 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
136 }
137 }
138
139 /** Note that Locked in this case is on mLayoutToAnim */
140 void scheduleAnimationLocked() {
141 final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
142 if (!layoutToAnim.mAnimationScheduled) {
143 layoutToAnim.mAnimationScheduled = true;
144 mChoreographer.postCallback(
145 Choreographer.CALLBACK_ANIMATION, mAnimationRunnable, null);
146 }
Craig Mautner764983d2012-03-22 11:37:36 -0700147 }
148
Craig Mautnerb9836b92012-06-11 11:40:09 -0700149 void hideWallpapersLocked(final WindowState w) {
150 if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null)
151 || mService.mWallpaperTarget == null) {
152 for (final WindowToken token : mService.mWallpaperTokens) {
153 for (final WindowState wallpaper : token.windows) {
154 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
155 if (!winAnimator.mLastHidden) {
156 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700157 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700158 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
159 }
160 }
161 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700162 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700163 }
164 }
165
Craig Mautner764983d2012-03-22 11:37:36 -0700166 private void updateWindowsAppsAndRotationAnimationsLocked() {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700167 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
Craig Mautner764983d2012-03-22 11:37:36 -0700168 int i;
Craig Mautneref25d7a2012-05-15 23:01:47 -0700169 final int NAT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700170 for (i=0; i<NAT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700171 final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700172 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700173 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700174 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700175 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700176 } else if (wasAnimating) {
177 // stopped animating, do one more pass through the layout
178 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700179 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700180 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700181 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700182 }
Craig Mautner83339b42012-05-01 22:13:23 -0700183 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
184 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700185 }
186 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700187
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700188 final int NEAT = mService.mExitingAppTokens.size();
189 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700190 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700191 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700192 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700193 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700194 mAnimating = true;
195 } else if (wasAnimating) {
196 // stopped animating, do one more pass through the layout
197 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700198 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700199 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700200 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700201 }
Craig Mautner83339b42012-05-01 22:13:23 -0700202 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
203 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700204 }
205 }
206
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700207 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700208 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700209 mAnimating = true;
210 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700211 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700212 mScreenRotationAnimation.kill();
213 mScreenRotationAnimation = null;
214 }
215 }
216 }
217
218 private void updateWindowsAndWallpaperLocked() {
Craig Mautner6fbda632012-07-03 09:26:39 -0700219 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700220
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700221 ArrayList<WindowStateAnimator> unForceHiding = null;
222 boolean wallpaperInUnForceHiding = false;
Craig Mautner9e809442012-06-22 17:13:04 -0700223 WindowStateAnimator windowAnimationBackground = null;
224 int windowAnimationBackgroundColor = 0;
225 WindowState detachedWallpaper = null;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700226
Craig Mautner01cd0e72012-06-18 10:19:11 -0700227 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
228 WindowStateAnimator winAnimator = mWinAnimators.get(i);
229 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700230 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700231
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700232 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700233 final boolean wasAnimating = winAnimator.mWasAnimating;
234 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700235
236 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700237 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700238 ", nowAnimating=" + nowAnimating);
239 }
240
241 // If this window is animating, make a note that we have
242 // an animating window and take care of a request to run
243 // a detached wallpaper animation.
244 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700245 if (winAnimator.mAnimation != null) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700246 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700247 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautner9e809442012-06-22 17:13:04 -0700248 detachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700249 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700250 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
251 if (backgroundColor != 0) {
Craig Mautner9e809442012-06-22 17:13:04 -0700252 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
253 windowAnimationBackground.mAnimLayer)) {
254 windowAnimationBackground = winAnimator;
255 windowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700256 }
257 }
258 }
259 mAnimating = true;
260 }
261
262 // If this window's app token is running a detached wallpaper
263 // animation, make a note so we can ensure the wallpaper is
264 // displayed behind it.
Craig Mautner59431632012-04-04 11:56:44 -0700265 final AppWindowAnimator appAnimator =
Craig Mautnerbec53f72012-04-05 11:49:05 -0700266 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700267 if (appAnimator != null && appAnimator.animation != null
268 && appAnimator.animating) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700269 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautner59431632012-04-04 11:56:44 -0700270 && appAnimator.animation.getDetachWallpaper()) {
Craig Mautner9e809442012-06-22 17:13:04 -0700271 detachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700272 }
Craig Mautner59431632012-04-04 11:56:44 -0700273 final int backgroundColor = appAnimator.animation.getBackgroundColor();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700274 if (backgroundColor != 0) {
Craig Mautner9e809442012-06-22 17:13:04 -0700275 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
276 windowAnimationBackground.mAnimLayer)) {
277 windowAnimationBackground = winAnimator;
278 windowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700279 }
280 }
281 }
282
Craig Mautnerbec53f72012-04-05 11:49:05 -0700283 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700284 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700285 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700286 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700287 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
288 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700289 }
Craig Mautner764983d2012-03-22 11:37:36 -0700290 }
291
Craig Mautnerbec53f72012-04-05 11:49:05 -0700292 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700293 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700294 if (WindowManagerService.DEBUG_ANIM ||
295 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
296 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700297 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700298 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700299 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700300 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
301 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700302 }
Craig Mautner764983d2012-03-22 11:37:36 -0700303 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700304 }
Craig Mautnerf12100e2012-06-25 11:13:24 -0700305 if (win.isReadyForDisplay() && winAnimator.mAnimationIsEntrance) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700306 mInner.mForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700307 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700308 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner01cd0e72012-06-18 10:19:11 -0700309 "Force hide " + mInner.mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700310 + " hasSurface=" + win.mHasSurface
311 + " policyVis=" + win.mPolicyVisibility
312 + " destroying=" + win.mDestroying
313 + " attHidden=" + win.mAttachedHidden
314 + " vis=" + win.mViewVisibility
315 + " hidden=" + win.mRootToken.hidden
316 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700317 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700318 final boolean changed;
Craig Mautnerf12100e2012-06-25 11:13:24 -0700319 if (mInner.mForceHiding && (!winAnimator.isAnimating()
320 || (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700321 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700322 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700323 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700324 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700325 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700326 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700327 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700328 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700329 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700330 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700331 if (unForceHiding == null) {
332 unForceHiding = new ArrayList<WindowStateAnimator>();
333 }
334 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700335 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700336 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700337 }
338 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700339 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700340 // We are showing on to of the current
341 // focus, so re-evaluate focus to make
342 // sure it is correct.
343 mService.mFocusMayChange = true;
344 }
345 }
346 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700347 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700348 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700349 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700350 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700351 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
352 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700353 }
Craig Mautner764983d2012-03-22 11:37:36 -0700354 }
355 }
356 }
357
Craig Mautnerbec53f72012-04-05 11:49:05 -0700358 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700359 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
360 if (atoken == null || atoken.allDrawn) {
361 if (winAnimator.performShowLocked()) {
362 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
363 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
364 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
365 mPendingLayoutChanges);
Craig Mautner764983d2012-03-22 11:37:36 -0700366 }
367 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700368 }
Craig Mautner764983d2012-03-22 11:37:36 -0700369 }
Craig Mautner59431632012-04-04 11:56:44 -0700370 final AppWindowAnimator appAnimator =
371 atoken == null ? null : atoken.mAppAnimator;
372 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700373 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
374 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700375 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700376 }
Craig Mautner59431632012-04-04 11:56:44 -0700377 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
378 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700379 }
380 }
Craig Mautner764983d2012-03-22 11:37:36 -0700381 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700382
Craig Mautner9e809442012-06-22 17:13:04 -0700383 if (mWindowDetachedWallpaper != detachedWallpaper) {
384 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
385 "Detached wallpaper changed from " + mWindowDetachedWallpaper
386 + " to " + detachedWallpaper);
387 mWindowDetachedWallpaper = detachedWallpaper;
388 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
389 }
390
391 if (windowAnimationBackgroundColor != 0) {
392 // If the window that wants black is the current wallpaper
393 // target, then the black goes *below* the wallpaper so we
394 // don't cause the wallpaper to suddenly disappear.
395 int animLayer = windowAnimationBackground.mAnimLayer;
396 WindowState win = windowAnimationBackground.mWin;
397 if (windowAnimationBackground != null && mService.mWallpaperTarget == win
398 || mService.mLowerWallpaperTarget == win
399 || mService.mUpperWallpaperTarget == win) {
400 final int N = mWinAnimators.size();
401 for (int i = 0; i < N; i++) {
402 WindowStateAnimator winAnimator = mWinAnimators.get(i);
403 if (winAnimator.mWin.mIsWallpaper) {
404 animLayer = winAnimator.mAnimLayer;
405 break;
406 }
407 }
408 }
409
410 final int dw = mDw;
411 final int dh = mDh;
412 mWindowAnimationBackgroundSurface.show(dw, dh,
413 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
414 windowAnimationBackgroundColor);
415 } else {
416 mWindowAnimationBackgroundSurface.hide();
417 }
418
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700419 // If we have windows that are being show due to them no longer
420 // being force-hidden, apply the appropriate animation to them.
421 if (unForceHiding != null) {
422 for (int i=unForceHiding.size()-1; i>=0; i--) {
423 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
424 if (a != null) {
Craig Mautner4d7349b2012-04-20 14:52:47 -0700425 final WindowStateAnimator winAnimator = unForceHiding.get(i);
426 winAnimator.setAnimation(a);
427 winAnimator.mAnimationIsEntrance = true;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700428 }
429 }
430 }
Craig Mautner764983d2012-03-22 11:37:36 -0700431 }
432
433 private void testTokenMayBeDrawnLocked() {
434 // See if any windows have been drawn, so they (and others
435 // associated with them) can now be shown.
Craig Mautneref25d7a2012-05-15 23:01:47 -0700436 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
437 final int NT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700438 for (int i=0; i<NT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700439 AppWindowToken wtoken = appTokens.get(i);
Craig Mautner6fbda632012-07-03 09:26:39 -0700440 final boolean allDrawn = wtoken.allDrawn;
441 if (allDrawn != wtoken.mAppAnimator.allDrawn) {
442 wtoken.mAppAnimator.allDrawn = allDrawn;
443 if (allDrawn) {
444 // The token has now changed state to having all
445 // windows shown... what to do, what to do?
446 if (wtoken.mAppAnimator.freezingScreen) {
447 wtoken.mAppAnimator.showAllWindowsLocked();
448 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
449 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
450 "Setting mOrientationChangeComplete=true because wtoken "
451 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
452 + " numDrawn=" + wtoken.numDrawnWindows);
453 // This will set mOrientationChangeComplete and cause a pass through layout.
454 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
455 } else {
456 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
457 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
458 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
459 mPendingLayoutChanges);
460 }
Craig Mautner764983d2012-03-22 11:37:36 -0700461
Craig Mautner6fbda632012-07-03 09:26:39 -0700462 // We can now show all of the drawn windows!
463 if (!mService.mOpeningApps.contains(wtoken)) {
464 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
465 }
Craig Mautner764983d2012-03-22 11:37:36 -0700466 }
467 }
468 }
469 }
470 }
471
472 private void performAnimationsLocked() {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700473 mInner.mForceHiding = false;
Craig Mautner764983d2012-03-22 11:37:36 -0700474
475 updateWindowsAndWallpaperLocked();
Craig Mautner4d7349b2012-04-20 14:52:47 -0700476 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
477 mPendingActions |= WALLPAPER_ACTION_PENDING;
478 }
Craig Mautner764983d2012-03-22 11:37:36 -0700479
Craig Mautner6fbda632012-07-03 09:26:39 -0700480 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700481 }
482
Craig Mautner1caa3992012-06-22 09:46:48 -0700483 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
484 /** Locked on mService.mWindowMap and this. */
485 private void animateLocked() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700486 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700487 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700488 mBulkUpdateParams = 0;
Chet Haase198e5642012-05-10 09:55:15 -0700489 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700490 mAnimating = false;
491 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
492 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
493 }
Craig Mautner764983d2012-03-22 11:37:36 -0700494
495 // Update animations of all applications, including those
496 // associated with exiting/removed apps
497 Surface.openTransaction();
498
499 try {
500 updateWindowsAppsAndRotationAnimationsLocked();
501 performAnimationsLocked();
502
503 // THIRD LOOP: Update the surfaces of all windows.
504
505 if (mScreenRotationAnimation != null) {
506 mScreenRotationAnimation.updateSurfaces();
507 }
508
Craig Mautner7358fbf2012-04-12 21:06:33 -0700509 final int N = mWinAnimators.size();
510 for (int i = 0; i < N; i++) {
Craig Mautner0fa77c12012-06-11 15:57:19 -0700511 mWinAnimators.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700512 }
513
Craig Mautner6af9b922012-04-05 19:25:51 -0700514 if (mDimParams != null) {
515 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
516 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700517 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700518 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700519 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700520 }
521
522 if (mService.mBlackFrame != null) {
523 if (mScreenRotationAnimation != null) {
524 mService.mBlackFrame.setMatrix(
525 mScreenRotationAnimation.getEnterTransformation().getMatrix());
526 } else {
527 mService.mBlackFrame.clearMatrix();
528 }
529 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700530
531 if (mService.mWatermark != null) {
532 mService.mWatermark.drawIfNeeded();
533 }
Craig Mautner764983d2012-03-22 11:37:36 -0700534 } catch (RuntimeException e) {
535 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
536 } finally {
537 Surface.closeTransaction();
538 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700539
Craig Mautner01cd0e72012-06-18 10:19:11 -0700540 if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
541 final WindowManagerService.AnimatorToLayoutParams animToLayout = mService.mAnimToLayout;
542 synchronized (animToLayout) {
543 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
544 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
545 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
Craig Mautner9e809442012-06-22 17:13:04 -0700546 mService.setAnimatorParametersLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700547 }
548 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700549
550 if (mAnimating) {
Craig Mautner1caa3992012-06-22 09:46:48 -0700551 synchronized (mLayoutToAnim) {
552 scheduleAnimationLocked();
553 }
Chet Haase198e5642012-05-10 09:55:15 -0700554 } else if (wasAnimating) {
555 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700556 }
557 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
558 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
559 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
560 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
561 }
Craig Mautner764983d2012-03-22 11:37:36 -0700562 }
563
564 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700565 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700566 mCurrentFocus = currentFocus;
567 }
568
569 void setDisplayDimensions(final int curWidth, final int curHeight,
570 final int appWidth, final int appHeight) {
571 mDw = curWidth;
572 mDh = curHeight;
573 mInnerDw = appWidth;
574 mInnerDh = appHeight;
575 }
576
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700577 void startDimming(final WindowStateAnimator winAnimator, final float target,
578 final int width, final int height) {
579 if (mDimAnimator == null) {
580 mDimAnimator = new DimAnimator(mService.mFxSession);
581 }
Craig Mautner067ca322012-05-18 17:19:51 -0700582 // Only set dim params on the highest dimmed layer.
583 final WindowStateAnimator dimWinAnimator = mDimParams == null
584 ? null : mDimParams.mDimWinAnimator;
585 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
586 if (winAnimator.mSurfaceShown &&
587 (dimWinAnimator == null || !dimWinAnimator.mSurfaceShown
588 || dimWinAnimator.mAnimLayer < winAnimator.mAnimLayer)) {
589 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
590 new DimAnimator.Parameters(winAnimator, width, height, target)));
591 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700592 }
593
594 // TODO(cmautner): Move into Handler
595 void stopDimming() {
596 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
597 }
598
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700599 boolean isDimming() {
600 return mDimParams != null;
601 }
602
Craig Mautneracafd192012-05-10 10:41:02 -0700603 boolean isDimming(final WindowStateAnimator winAnimator) {
604 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
605 }
606
Craig Mautnere7ae2502012-03-26 17:11:19 -0700607 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700608 if (dumpAll) {
609 if (mWindowDetachedWallpaper != null) {
610 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
611 pw.println(mWindowDetachedWallpaper);
612 }
613 pw.print(prefix); pw.print("mAnimTransactionSequence=");
614 pw.println(mAnimTransactionSequence);
615 if (mWindowAnimationBackgroundSurface != null) {
616 pw.print(prefix); pw.print("mWindowAnimationBackgroundSurface:");
617 mWindowAnimationBackgroundSurface.printTo(prefix + " ", pw);
618 }
619 if (mDimAnimator != null) {
620 pw.print(prefix); pw.print("mDimAnimator:");
621 mDimAnimator.printTo(prefix + " ", pw);
622 } else {
623 pw.print(prefix); pw.print("no DimAnimator ");
624 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700625 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700626 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700627
628 static class SetAnimationParams {
629 final WindowStateAnimator mWinAnimator;
630 final Animation mAnimation;
631 final int mAnimDw;
632 final int mAnimDh;
633 public SetAnimationParams(final WindowStateAnimator winAnimator,
634 final Animation animation, final int animDw, final int animDh) {
635 mWinAnimator = winAnimator;
636 mAnimation = animation;
637 mAnimDw = animDw;
638 mAnimDh = animDh;
639 }
640 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700641
642 synchronized void clearPendingActions() {
643 mPendingActions = 0;
644 }
Craig Mautner764983d2012-03-22 11:37:36 -0700645}