blob: 85ae77c5806e24e78fa9c055fd7aea271352de7f [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;
20import android.view.WindowManager;
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;
25
Craig Mautnere7ae2502012-03-26 17:11:19 -070026import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070027import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070028
Craig Mautner764983d2012-03-22 11:37:36 -070029/**
Craig Mautner764983d2012-03-22 11:37:36 -070030 * Singleton class that carries out the animations and Surface operations in a separate task
31 * on behalf of WindowManagerService.
32 */
33public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070034 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070035
36 final WindowManagerService mService;
37 final Context mContext;
38 final WindowManagerPolicy mPolicy;
39
Craig Mautner1caa3992012-06-22 09:46:48 -070040 final Choreographer mChoreographer = Choreographer.getInstance();
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
46 /** Variables only intended to be valid within each pass through animate(). Does not contain
47 * persistent state. */
48 private class InnerLoopParams {
49 boolean mTokenMayBeDrawn;
50 boolean mForceHiding;
Craig Mautner01cd0e72012-06-18 10:19:11 -070051 }
52 InnerLoopParams mInner = new InnerLoopParams();
53
Craig Mautner1caa3992012-06-22 09:46:48 -070054 static class LayoutToAnimatorParams {
55 boolean mAnimationScheduled;
56 ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
57 WindowState mWallpaperTarget;
58 }
59 /** Params from WindowManagerService. Do not modify or read without first locking on
60 * either WindowManagerService.mWindowMap or WindowManagerService.mAnimator.and then on
61 * mLayoutToAnim */
62 final LayoutToAnimatorParams mLayoutToAnim = new LayoutToAnimatorParams();
63
64 final Runnable mAnimationRunnable;
65
Craig Mautner764983d2012-03-22 11:37:36 -070066 int mAdjResult;
67
68 int mPendingLayoutChanges;
69
70 /** Overall window dimensions */
71 int mDw, mDh;
72
73 /** Interior window dimensions */
74 int mInnerDw, mInnerDh;
75
76 /** Time of current animation step. Reset on each iteration */
77 long mCurrentTime;
78
79 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
80 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
81 private int mTransactionSequence;
82
83 /** The one and only screen rotation if one is happening */
84 ScreenRotationAnimation mScreenRotationAnimation = null;
85
Craig Mautnere7ae2502012-03-26 17:11:19 -070086 // Window currently running an animation that has requested it be detached
87 // from the wallpaper. This means we need to ensure the wallpaper is
88 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070089 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070090 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070091
Craig Mautnere7ae2502012-03-26 17:11:19 -070092 DimSurface mWindowAnimationBackgroundSurface = null;
93
Craig Mautnera608b882012-03-30 13:03:49 -070094 int mBulkUpdateParams = 0;
95
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070096 DimAnimator mDimAnimator = null;
97 DimAnimator.Parameters mDimParams = null;
98
Craig Mautner4d7349b2012-04-20 14:52:47 -070099 static final int WALLPAPER_ACTION_PENDING = 1;
100 int mPendingActions;
101
Craig Mautner1caa3992012-06-22 09:46:48 -0700102 WindowState mWallpaperTarget = null;
103
Craig Mautner764983d2012-03-22 11:37:36 -0700104 WindowAnimator(final WindowManagerService service, final Context context,
105 final WindowManagerPolicy policy) {
106 mService = service;
107 mContext = context;
108 mPolicy = policy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700109
110 mAnimationRunnable = new Runnable() {
111 @Override
112 public void run() {
113 // TODO(cmautner): When full isolation is achieved for animation, the first lock
114 // goes away and only the WindowAnimator.this remains.
115 synchronized(mService.mWindowMap) {
116 synchronized(WindowAnimator.this) {
117 copyLayoutToAnimParamsLocked();
118 animateLocked();
119 }
120 }
121 }
122 };
Craig Mautner9e809442012-06-22 17:13:04 -0700123
124 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
Craig Mautner1caa3992012-06-22 09:46:48 -0700125 }
126
127 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
128 private void copyLayoutToAnimParamsLocked() {
129 final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
130 synchronized(layoutToAnim) {
131 layoutToAnim.mAnimationScheduled = false;
132
133 mWinAnimators = new ArrayList<WindowStateAnimator>(layoutToAnim.mWinAnimators);
134 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
135 }
136 }
137
138 /** Note that Locked in this case is on mLayoutToAnim */
139 void scheduleAnimationLocked() {
140 final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
141 if (!layoutToAnim.mAnimationScheduled) {
142 layoutToAnim.mAnimationScheduled = true;
143 mChoreographer.postCallback(
144 Choreographer.CALLBACK_ANIMATION, mAnimationRunnable, null);
145 }
Craig Mautner764983d2012-03-22 11:37:36 -0700146 }
147
Craig Mautnerb9836b92012-06-11 11:40:09 -0700148 void hideWallpapersLocked(final WindowState w) {
149 if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null)
150 || mService.mWallpaperTarget == null) {
151 for (final WindowToken token : mService.mWallpaperTokens) {
152 for (final WindowState wallpaper : token.windows) {
153 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
154 if (!winAnimator.mLastHidden) {
155 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700156 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700157 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
158 }
159 }
160 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700161 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700162 }
163 }
164
Craig Mautner764983d2012-03-22 11:37:36 -0700165 private void updateWindowsAppsAndRotationAnimationsLocked() {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700166 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
Craig Mautner764983d2012-03-22 11:37:36 -0700167 int i;
Craig Mautneref25d7a2012-05-15 23:01:47 -0700168 final int NAT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700169 for (i=0; i<NAT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700170 final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700171 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700172 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700173 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700174 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700175 } else if (wasAnimating) {
176 // stopped animating, do one more pass through the layout
177 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700178 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700179 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700180 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700181 }
Craig Mautner83339b42012-05-01 22:13:23 -0700182 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
183 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700184 }
185 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700186
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700187 final int NEAT = mService.mExitingAppTokens.size();
188 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700189 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700190 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700191 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700192 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700193 mAnimating = true;
194 } else if (wasAnimating) {
195 // stopped animating, do one more pass through the layout
196 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700197 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700198 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700199 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700200 }
Craig Mautner83339b42012-05-01 22:13:23 -0700201 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
202 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700203 }
204 }
205
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700206 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700207 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700208 mAnimating = true;
209 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700210 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700211 mScreenRotationAnimation.kill();
212 mScreenRotationAnimation = null;
213 }
214 }
215 }
216
217 private void updateWindowsAndWallpaperLocked() {
218 ++mTransactionSequence;
219
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700220 ArrayList<WindowStateAnimator> unForceHiding = null;
221 boolean wallpaperInUnForceHiding = false;
Craig Mautner9e809442012-06-22 17:13:04 -0700222 WindowStateAnimator windowAnimationBackground = null;
223 int windowAnimationBackgroundColor = 0;
224 WindowState detachedWallpaper = null;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700225
Craig Mautner01cd0e72012-06-18 10:19:11 -0700226 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
227 WindowStateAnimator winAnimator = mWinAnimators.get(i);
228 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700229 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700230
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700231 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700232 final boolean wasAnimating = winAnimator.mWasAnimating;
233 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700234
235 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700236 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700237 ", nowAnimating=" + nowAnimating);
238 }
239
240 // If this window is animating, make a note that we have
241 // an animating window and take care of a request to run
242 // a detached wallpaper animation.
243 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700244 if (winAnimator.mAnimation != null) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700245 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700246 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautner9e809442012-06-22 17:13:04 -0700247 detachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700248 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700249 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
250 if (backgroundColor != 0) {
Craig Mautner9e809442012-06-22 17:13:04 -0700251 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
252 windowAnimationBackground.mAnimLayer)) {
253 windowAnimationBackground = winAnimator;
254 windowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700255 }
256 }
257 }
258 mAnimating = true;
259 }
260
261 // If this window's app token is running a detached wallpaper
262 // animation, make a note so we can ensure the wallpaper is
263 // displayed behind it.
Craig Mautner59431632012-04-04 11:56:44 -0700264 final AppWindowAnimator appAnimator =
Craig Mautnerbec53f72012-04-05 11:49:05 -0700265 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700266 if (appAnimator != null && appAnimator.animation != null
267 && appAnimator.animating) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700268 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautner59431632012-04-04 11:56:44 -0700269 && appAnimator.animation.getDetachWallpaper()) {
Craig Mautner9e809442012-06-22 17:13:04 -0700270 detachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700271 }
Craig Mautner59431632012-04-04 11:56:44 -0700272 final int backgroundColor = appAnimator.animation.getBackgroundColor();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700273 if (backgroundColor != 0) {
Craig Mautner9e809442012-06-22 17:13:04 -0700274 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
275 windowAnimationBackground.mAnimLayer)) {
276 windowAnimationBackground = winAnimator;
277 windowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700278 }
279 }
280 }
281
Craig Mautnerbec53f72012-04-05 11:49:05 -0700282 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700283 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700284 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700285 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700286 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
287 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700288 }
Craig Mautner764983d2012-03-22 11:37:36 -0700289 }
290
Craig Mautnerbec53f72012-04-05 11:49:05 -0700291 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700292 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700293 if (WindowManagerService.DEBUG_ANIM ||
294 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
295 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700296 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700297 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700298 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700299 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
300 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700301 }
Craig Mautner764983d2012-03-22 11:37:36 -0700302 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700303 }
Craig Mautnerf12100e2012-06-25 11:13:24 -0700304 if (win.isReadyForDisplay() && winAnimator.mAnimationIsEntrance) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700305 mInner.mForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700306 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700307 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner01cd0e72012-06-18 10:19:11 -0700308 "Force hide " + mInner.mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700309 + " hasSurface=" + win.mHasSurface
310 + " policyVis=" + win.mPolicyVisibility
311 + " destroying=" + win.mDestroying
312 + " attHidden=" + win.mAttachedHidden
313 + " vis=" + win.mViewVisibility
314 + " hidden=" + win.mRootToken.hidden
315 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700316 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700317 final boolean changed;
Craig Mautnerf12100e2012-06-25 11:13:24 -0700318 if (mInner.mForceHiding && (!winAnimator.isAnimating()
319 || (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700320 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700321 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700322 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700323 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700324 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700325 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700326 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700327 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700328 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700329 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700330 if (unForceHiding == null) {
331 unForceHiding = new ArrayList<WindowStateAnimator>();
332 }
333 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700334 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700335 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700336 }
337 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700338 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700339 // We are showing on to of the current
340 // focus, so re-evaluate focus to make
341 // sure it is correct.
342 mService.mFocusMayChange = true;
343 }
344 }
345 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700346 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700347 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700348 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700349 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700350 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
351 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700352 }
Craig Mautner764983d2012-03-22 11:37:36 -0700353 }
354 }
355 }
356
Craig Mautnerbec53f72012-04-05 11:49:05 -0700357 final AppWindowToken atoken = win.mAppToken;
Craig Mautner59431632012-04-04 11:56:44 -0700358 if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700359 if (atoken.lastTransactionSequence != mTransactionSequence) {
360 atoken.lastTransactionSequence = mTransactionSequence;
361 atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
362 atoken.startingDisplayed = false;
363 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700364 if ((win.isOnScreen() || winAnimator.mAttrType
Craig Mautner764983d2012-03-22 11:37:36 -0700365 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
Craig Mautnerbec53f72012-04-05 11:49:05 -0700366 && !win.mExiting && !win.mDestroying) {
Craig Mautner764983d2012-03-22 11:37:36 -0700367 if (WindowManagerService.DEBUG_VISIBILITY ||
368 WindowManagerService.DEBUG_ORIENTATION) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700369 Slog.v(TAG, "Eval win " + win + ": isDrawn=" + win.isDrawnLw()
Craig Mautnera2c77052012-03-26 12:14:43 -0700370 + ", isAnimating=" + winAnimator.isAnimating());
Craig Mautnerbec53f72012-04-05 11:49:05 -0700371 if (!win.isDrawnLw()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700372 Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface
Craig Mautnerbec53f72012-04-05 11:49:05 -0700373 + " pv=" + win.mPolicyVisibility
Craig Mautner749a7bb2012-04-02 13:49:53 -0700374 + " mDrawState=" + winAnimator.mDrawState
Craig Mautnerbec53f72012-04-05 11:49:05 -0700375 + " ah=" + win.mAttachedHidden
Craig Mautner764983d2012-03-22 11:37:36 -0700376 + " th=" + atoken.hiddenRequested
Craig Mautnera2c77052012-03-26 12:14:43 -0700377 + " a=" + winAnimator.mAnimating);
Craig Mautner764983d2012-03-22 11:37:36 -0700378 }
379 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700380 if (win != atoken.startingWindow) {
381 if (!atoken.mAppAnimator.freezingScreen || !win.mAppFreezing) {
Craig Mautner764983d2012-03-22 11:37:36 -0700382 atoken.numInterestingWindows++;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700383 if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700384 atoken.numDrawnWindows++;
385 if (WindowManagerService.DEBUG_VISIBILITY ||
386 WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG,
387 "tokenMayBeDrawn: " + atoken
Craig Mautner59431632012-04-04 11:56:44 -0700388 + " freezingScreen=" + atoken.mAppAnimator.freezingScreen
Craig Mautnerbec53f72012-04-05 11:49:05 -0700389 + " mAppFreezing=" + win.mAppFreezing);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700390 mInner.mTokenMayBeDrawn = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700391 }
392 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700393 } else if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700394 atoken.startingDisplayed = true;
395 }
396 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700397 } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700398 if (winAnimator.performShowLocked()) {
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700399 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
400 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700401 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
402 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700403 }
404 }
Craig Mautner764983d2012-03-22 11:37:36 -0700405 }
Craig Mautner59431632012-04-04 11:56:44 -0700406 final AppWindowAnimator appAnimator =
407 atoken == null ? null : atoken.mAppAnimator;
408 if (appAnimator != null && appAnimator.thumbnail != null) {
409 if (appAnimator.thumbnailTransactionSeq != mTransactionSequence) {
410 appAnimator.thumbnailTransactionSeq = mTransactionSequence;
411 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700412 }
Craig Mautner59431632012-04-04 11:56:44 -0700413 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
414 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700415 }
416 }
Craig Mautner764983d2012-03-22 11:37:36 -0700417 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700418
Craig Mautner9e809442012-06-22 17:13:04 -0700419 if (mWindowDetachedWallpaper != detachedWallpaper) {
420 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
421 "Detached wallpaper changed from " + mWindowDetachedWallpaper
422 + " to " + detachedWallpaper);
423 mWindowDetachedWallpaper = detachedWallpaper;
424 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
425 }
426
427 if (windowAnimationBackgroundColor != 0) {
428 // If the window that wants black is the current wallpaper
429 // target, then the black goes *below* the wallpaper so we
430 // don't cause the wallpaper to suddenly disappear.
431 int animLayer = windowAnimationBackground.mAnimLayer;
432 WindowState win = windowAnimationBackground.mWin;
433 if (windowAnimationBackground != null && mService.mWallpaperTarget == win
434 || mService.mLowerWallpaperTarget == win
435 || mService.mUpperWallpaperTarget == win) {
436 final int N = mWinAnimators.size();
437 for (int i = 0; i < N; i++) {
438 WindowStateAnimator winAnimator = mWinAnimators.get(i);
439 if (winAnimator.mWin.mIsWallpaper) {
440 animLayer = winAnimator.mAnimLayer;
441 break;
442 }
443 }
444 }
445
446 final int dw = mDw;
447 final int dh = mDh;
448 mWindowAnimationBackgroundSurface.show(dw, dh,
449 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
450 windowAnimationBackgroundColor);
451 } else {
452 mWindowAnimationBackgroundSurface.hide();
453 }
454
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700455 // If we have windows that are being show due to them no longer
456 // being force-hidden, apply the appropriate animation to them.
457 if (unForceHiding != null) {
458 for (int i=unForceHiding.size()-1; i>=0; i--) {
459 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
460 if (a != null) {
Craig Mautner4d7349b2012-04-20 14:52:47 -0700461 final WindowStateAnimator winAnimator = unForceHiding.get(i);
462 winAnimator.setAnimation(a);
463 winAnimator.mAnimationIsEntrance = true;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700464 }
465 }
466 }
Craig Mautner764983d2012-03-22 11:37:36 -0700467 }
468
469 private void testTokenMayBeDrawnLocked() {
470 // See if any windows have been drawn, so they (and others
471 // associated with them) can now be shown.
Craig Mautneref25d7a2012-05-15 23:01:47 -0700472 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
473 final int NT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700474 for (int i=0; i<NT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700475 AppWindowToken wtoken = appTokens.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700476 if (wtoken.mAppAnimator.freezingScreen) {
Craig Mautner764983d2012-03-22 11:37:36 -0700477 int numInteresting = wtoken.numInterestingWindows;
478 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
479 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
480 "allDrawn: " + wtoken
481 + " interesting=" + numInteresting
482 + " drawn=" + wtoken.numDrawnWindows);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700483 wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700484 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
485 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
486 "Setting mOrientationChangeComplete=true because wtoken "
487 + wtoken + " numInteresting=" + numInteresting
488 + " numDrawn=" + wtoken.numDrawnWindows);
Craig Mautner924c2152012-04-23 18:14:07 -0700489 // This will set mOrientationChangeComplete and cause a pass through layout.
490 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautner764983d2012-03-22 11:37:36 -0700491 }
492 } else if (!wtoken.allDrawn) {
493 int numInteresting = wtoken.numInterestingWindows;
494 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
495 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
496 "allDrawn: " + wtoken
497 + " interesting=" + numInteresting
498 + " drawn=" + wtoken.numDrawnWindows);
499 wtoken.allDrawn = true;
500 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700501 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700502 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
503 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700504 }
Craig Mautner764983d2012-03-22 11:37:36 -0700505
506 // We can now show all of the drawn windows!
507 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700508 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700509 }
510 }
511 }
512 }
513 }
514
515 private void performAnimationsLocked() {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700516 mInner.mTokenMayBeDrawn = false;
517 mInner.mForceHiding = false;
Craig Mautner764983d2012-03-22 11:37:36 -0700518
519 updateWindowsAndWallpaperLocked();
Craig Mautner4d7349b2012-04-20 14:52:47 -0700520 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
521 mPendingActions |= WALLPAPER_ACTION_PENDING;
522 }
Craig Mautner764983d2012-03-22 11:37:36 -0700523
Craig Mautner01cd0e72012-06-18 10:19:11 -0700524 if (mInner.mTokenMayBeDrawn) {
Craig Mautner764983d2012-03-22 11:37:36 -0700525 testTokenMayBeDrawnLocked();
526 }
Craig Mautner764983d2012-03-22 11:37:36 -0700527 }
528
Craig Mautner1caa3992012-06-22 09:46:48 -0700529 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
530 /** Locked on mService.mWindowMap and this. */
531 private void animateLocked() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700532 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700533 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700534 mBulkUpdateParams = 0;
Chet Haase198e5642012-05-10 09:55:15 -0700535 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700536 mAnimating = false;
537 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
538 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
539 }
Craig Mautner764983d2012-03-22 11:37:36 -0700540
541 // Update animations of all applications, including those
542 // associated with exiting/removed apps
543 Surface.openTransaction();
544
545 try {
546 updateWindowsAppsAndRotationAnimationsLocked();
547 performAnimationsLocked();
548
549 // THIRD LOOP: Update the surfaces of all windows.
550
551 if (mScreenRotationAnimation != null) {
552 mScreenRotationAnimation.updateSurfaces();
553 }
554
Craig Mautner7358fbf2012-04-12 21:06:33 -0700555 final int N = mWinAnimators.size();
556 for (int i = 0; i < N; i++) {
Craig Mautner0fa77c12012-06-11 15:57:19 -0700557 mWinAnimators.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700558 }
559
Craig Mautner6af9b922012-04-05 19:25:51 -0700560 if (mDimParams != null) {
561 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
562 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700563 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700564 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700565 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700566 }
567
568 if (mService.mBlackFrame != null) {
569 if (mScreenRotationAnimation != null) {
570 mService.mBlackFrame.setMatrix(
571 mScreenRotationAnimation.getEnterTransformation().getMatrix());
572 } else {
573 mService.mBlackFrame.clearMatrix();
574 }
575 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700576
577 if (mService.mWatermark != null) {
578 mService.mWatermark.drawIfNeeded();
579 }
Craig Mautner764983d2012-03-22 11:37:36 -0700580 } catch (RuntimeException e) {
581 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
582 } finally {
583 Surface.closeTransaction();
584 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700585
Craig Mautner01cd0e72012-06-18 10:19:11 -0700586 if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
587 final WindowManagerService.AnimatorToLayoutParams animToLayout = mService.mAnimToLayout;
588 synchronized (animToLayout) {
589 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
590 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
591 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
Craig Mautner9e809442012-06-22 17:13:04 -0700592 mService.setAnimatorParametersLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700593 }
594 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700595
596 if (mAnimating) {
Craig Mautner1caa3992012-06-22 09:46:48 -0700597 synchronized (mLayoutToAnim) {
598 scheduleAnimationLocked();
599 }
Chet Haase198e5642012-05-10 09:55:15 -0700600 } else if (wasAnimating) {
601 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700602 }
603 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
604 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
605 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
606 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
607 }
Craig Mautner764983d2012-03-22 11:37:36 -0700608 }
609
610 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700611 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700612 mCurrentFocus = currentFocus;
613 }
614
615 void setDisplayDimensions(final int curWidth, final int curHeight,
616 final int appWidth, final int appHeight) {
617 mDw = curWidth;
618 mDh = curHeight;
619 mInnerDw = appWidth;
620 mInnerDh = appHeight;
621 }
622
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700623 void startDimming(final WindowStateAnimator winAnimator, final float target,
624 final int width, final int height) {
625 if (mDimAnimator == null) {
626 mDimAnimator = new DimAnimator(mService.mFxSession);
627 }
Craig Mautner067ca322012-05-18 17:19:51 -0700628 // Only set dim params on the highest dimmed layer.
629 final WindowStateAnimator dimWinAnimator = mDimParams == null
630 ? null : mDimParams.mDimWinAnimator;
631 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
632 if (winAnimator.mSurfaceShown &&
633 (dimWinAnimator == null || !dimWinAnimator.mSurfaceShown
634 || dimWinAnimator.mAnimLayer < winAnimator.mAnimLayer)) {
635 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
636 new DimAnimator.Parameters(winAnimator, width, height, target)));
637 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700638 }
639
640 // TODO(cmautner): Move into Handler
641 void stopDimming() {
642 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
643 }
644
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700645 boolean isDimming() {
646 return mDimParams != null;
647 }
648
Craig Mautneracafd192012-05-10 10:41:02 -0700649 boolean isDimming(final WindowStateAnimator winAnimator) {
650 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
651 }
652
Craig Mautnere7ae2502012-03-26 17:11:19 -0700653 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
654 if (mWindowDetachedWallpaper != null) {
655 pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
656 }
657 if (mWindowAnimationBackgroundSurface != null) {
658 pw.println(" mWindowAnimationBackgroundSurface:");
659 mWindowAnimationBackgroundSurface.printTo(" ", pw);
660 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700661 if (mDimAnimator != null) {
662 pw.println(" mDimAnimator:");
663 mDimAnimator.printTo(" ", pw);
664 } else {
665 pw.println( " no DimAnimator ");
666 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700667 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700668
669 static class SetAnimationParams {
670 final WindowStateAnimator mWinAnimator;
671 final Animation mAnimation;
672 final int mAnimDw;
673 final int mAnimDh;
674 public SetAnimationParams(final WindowStateAnimator winAnimator,
675 final Animation animation, final int animDw, final int animDh) {
676 mWinAnimator = winAnimator;
677 mAnimation = animation;
678 mAnimDw = animDw;
679 mAnimDh = animDh;
680 }
681 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700682
683 synchronized void clearPendingActions() {
684 mPendingActions = 0;
685 }
Craig Mautner764983d2012-03-22 11:37:36 -0700686}