blob: 82d2e6a41731683c22beeb3943e8a9d4cf2af895 [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
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070094 WindowStateAnimator mUniverseBackground = null;
95 int mAboveUniverseLayer = 0;
96
Craig Mautnera608b882012-03-30 13:03:49 -070097 int mBulkUpdateParams = 0;
98
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070099 DimAnimator mDimAnimator = null;
100 DimAnimator.Parameters mDimParams = null;
101
Craig Mautner4d7349b2012-04-20 14:52:47 -0700102 static final int WALLPAPER_ACTION_PENDING = 1;
103 int mPendingActions;
104
Craig Mautner1caa3992012-06-22 09:46:48 -0700105 WindowState mWallpaperTarget = null;
106
Craig Mautner764983d2012-03-22 11:37:36 -0700107 WindowAnimator(final WindowManagerService service, final Context context,
108 final WindowManagerPolicy policy) {
109 mService = service;
110 mContext = context;
111 mPolicy = policy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700112
113 mAnimationRunnable = new Runnable() {
114 @Override
115 public void run() {
116 // TODO(cmautner): When full isolation is achieved for animation, the first lock
117 // goes away and only the WindowAnimator.this remains.
118 synchronized(mService.mWindowMap) {
119 synchronized(WindowAnimator.this) {
120 copyLayoutToAnimParamsLocked();
121 animateLocked();
122 }
123 }
124 }
125 };
Craig Mautner9e809442012-06-22 17:13:04 -0700126
127 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
Craig Mautner1caa3992012-06-22 09:46:48 -0700128 }
129
130 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
131 private void copyLayoutToAnimParamsLocked() {
132 final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
133 synchronized(layoutToAnim) {
134 layoutToAnim.mAnimationScheduled = false;
135
136 mWinAnimators = new ArrayList<WindowStateAnimator>(layoutToAnim.mWinAnimators);
137 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
138 }
139 }
140
141 /** Note that Locked in this case is on mLayoutToAnim */
142 void scheduleAnimationLocked() {
143 final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
144 if (!layoutToAnim.mAnimationScheduled) {
145 layoutToAnim.mAnimationScheduled = true;
146 mChoreographer.postCallback(
147 Choreographer.CALLBACK_ANIMATION, mAnimationRunnable, null);
148 }
Craig Mautner764983d2012-03-22 11:37:36 -0700149 }
150
Craig Mautnerb9836b92012-06-11 11:40:09 -0700151 void hideWallpapersLocked(final WindowState w) {
152 if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null)
153 || mService.mWallpaperTarget == null) {
154 for (final WindowToken token : mService.mWallpaperTokens) {
155 for (final WindowState wallpaper : token.windows) {
156 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
157 if (!winAnimator.mLastHidden) {
158 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700159 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700160 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
161 }
162 }
163 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700164 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700165 }
166 }
167
Craig Mautner764983d2012-03-22 11:37:36 -0700168 private void updateWindowsAppsAndRotationAnimationsLocked() {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700169 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
Craig Mautner764983d2012-03-22 11:37:36 -0700170 int i;
Craig Mautneref25d7a2012-05-15 23:01:47 -0700171 final int NAT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700172 for (i=0; i<NAT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700173 final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700174 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700175 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700176 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700177 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700178 } else if (wasAnimating) {
179 // stopped animating, do one more pass through the layout
180 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700181 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700182 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700183 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700184 }
Craig Mautner83339b42012-05-01 22:13:23 -0700185 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
186 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700187 }
188 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700189
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700190 final int NEAT = mService.mExitingAppTokens.size();
191 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700192 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700193 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700194 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700195 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700196 mAnimating = true;
197 } else if (wasAnimating) {
198 // stopped animating, do one more pass through the layout
199 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700200 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700201 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700202 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700203 }
Craig Mautner83339b42012-05-01 22:13:23 -0700204 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
205 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700206 }
207 }
208
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700209 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700210 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700211 mAnimating = true;
212 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700213 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700214 mScreenRotationAnimation.kill();
215 mScreenRotationAnimation = null;
216 }
217 }
218 }
219
220 private void updateWindowsAndWallpaperLocked() {
221 ++mTransactionSequence;
222
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700223 ArrayList<WindowStateAnimator> unForceHiding = null;
224 boolean wallpaperInUnForceHiding = false;
Craig Mautner9e809442012-06-22 17:13:04 -0700225 WindowStateAnimator windowAnimationBackground = null;
226 int windowAnimationBackgroundColor = 0;
227 WindowState detachedWallpaper = null;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700228
Craig Mautner01cd0e72012-06-18 10:19:11 -0700229 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
230 WindowStateAnimator winAnimator = mWinAnimators.get(i);
231 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700232 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700233
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700234 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700235 final boolean wasAnimating = winAnimator.mWasAnimating;
236 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700237
238 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700239 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700240 ", nowAnimating=" + nowAnimating);
241 }
242
243 // If this window is animating, make a note that we have
244 // an animating window and take care of a request to run
245 // a detached wallpaper animation.
246 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700247 if (winAnimator.mAnimation != null) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700248 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700249 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautner9e809442012-06-22 17:13:04 -0700250 detachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700251 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700252 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
253 if (backgroundColor != 0) {
Craig Mautner9e809442012-06-22 17:13:04 -0700254 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
255 windowAnimationBackground.mAnimLayer)) {
256 windowAnimationBackground = winAnimator;
257 windowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700258 }
259 }
260 }
261 mAnimating = true;
262 }
263
264 // If this window's app token is running a detached wallpaper
265 // animation, make a note so we can ensure the wallpaper is
266 // displayed behind it.
Craig Mautner59431632012-04-04 11:56:44 -0700267 final AppWindowAnimator appAnimator =
Craig Mautnerbec53f72012-04-05 11:49:05 -0700268 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700269 if (appAnimator != null && appAnimator.animation != null
270 && appAnimator.animating) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700271 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautner59431632012-04-04 11:56:44 -0700272 && appAnimator.animation.getDetachWallpaper()) {
Craig Mautner9e809442012-06-22 17:13:04 -0700273 detachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700274 }
Craig Mautner59431632012-04-04 11:56:44 -0700275 final int backgroundColor = appAnimator.animation.getBackgroundColor();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700276 if (backgroundColor != 0) {
Craig Mautner9e809442012-06-22 17:13:04 -0700277 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
278 windowAnimationBackground.mAnimLayer)) {
279 windowAnimationBackground = winAnimator;
280 windowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700281 }
282 }
283 }
284
Craig Mautnerbec53f72012-04-05 11:49:05 -0700285 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700286 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700287 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700288 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700289 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
290 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700291 }
Craig Mautner764983d2012-03-22 11:37:36 -0700292 }
293
Craig Mautnerbec53f72012-04-05 11:49:05 -0700294 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700295 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700296 if (WindowManagerService.DEBUG_ANIM ||
297 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
298 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700299 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700300 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700301 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700302 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
303 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700304 }
Craig Mautner764983d2012-03-22 11:37:36 -0700305 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700306 }
Craig Mautnerf12100e2012-06-25 11:13:24 -0700307 if (win.isReadyForDisplay() && winAnimator.mAnimationIsEntrance) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700308 mInner.mForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700309 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700310 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner01cd0e72012-06-18 10:19:11 -0700311 "Force hide " + mInner.mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700312 + " hasSurface=" + win.mHasSurface
313 + " policyVis=" + win.mPolicyVisibility
314 + " destroying=" + win.mDestroying
315 + " attHidden=" + win.mAttachedHidden
316 + " vis=" + win.mViewVisibility
317 + " hidden=" + win.mRootToken.hidden
318 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700319 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700320 final boolean changed;
Craig Mautnerf12100e2012-06-25 11:13:24 -0700321 if (mInner.mForceHiding && (!winAnimator.isAnimating()
322 || (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700323 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700324 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700325 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700326 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700327 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700328 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700329 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700330 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700331 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700332 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700333 if (unForceHiding == null) {
334 unForceHiding = new ArrayList<WindowStateAnimator>();
335 }
336 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700337 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700338 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700339 }
340 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700341 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700342 // We are showing on to of the current
343 // focus, so re-evaluate focus to make
344 // sure it is correct.
345 mService.mFocusMayChange = true;
346 }
347 }
348 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700349 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700350 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700351 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700352 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700353 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
354 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700355 }
Craig Mautner764983d2012-03-22 11:37:36 -0700356 }
357 }
358 }
359
Craig Mautnerbec53f72012-04-05 11:49:05 -0700360 final AppWindowToken atoken = win.mAppToken;
Craig Mautner59431632012-04-04 11:56:44 -0700361 if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700362 if (atoken.lastTransactionSequence != mTransactionSequence) {
363 atoken.lastTransactionSequence = mTransactionSequence;
364 atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
365 atoken.startingDisplayed = false;
366 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700367 if ((win.isOnScreen() || winAnimator.mAttrType
Craig Mautner764983d2012-03-22 11:37:36 -0700368 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
Craig Mautnerbec53f72012-04-05 11:49:05 -0700369 && !win.mExiting && !win.mDestroying) {
Craig Mautner764983d2012-03-22 11:37:36 -0700370 if (WindowManagerService.DEBUG_VISIBILITY ||
371 WindowManagerService.DEBUG_ORIENTATION) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700372 Slog.v(TAG, "Eval win " + win + ": isDrawn=" + win.isDrawnLw()
Craig Mautnera2c77052012-03-26 12:14:43 -0700373 + ", isAnimating=" + winAnimator.isAnimating());
Craig Mautnerbec53f72012-04-05 11:49:05 -0700374 if (!win.isDrawnLw()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700375 Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface
Craig Mautnerbec53f72012-04-05 11:49:05 -0700376 + " pv=" + win.mPolicyVisibility
Craig Mautner749a7bb2012-04-02 13:49:53 -0700377 + " mDrawState=" + winAnimator.mDrawState
Craig Mautnerbec53f72012-04-05 11:49:05 -0700378 + " ah=" + win.mAttachedHidden
Craig Mautner764983d2012-03-22 11:37:36 -0700379 + " th=" + atoken.hiddenRequested
Craig Mautnera2c77052012-03-26 12:14:43 -0700380 + " a=" + winAnimator.mAnimating);
Craig Mautner764983d2012-03-22 11:37:36 -0700381 }
382 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700383 if (win != atoken.startingWindow) {
384 if (!atoken.mAppAnimator.freezingScreen || !win.mAppFreezing) {
Craig Mautner764983d2012-03-22 11:37:36 -0700385 atoken.numInterestingWindows++;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700386 if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700387 atoken.numDrawnWindows++;
388 if (WindowManagerService.DEBUG_VISIBILITY ||
389 WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG,
390 "tokenMayBeDrawn: " + atoken
Craig Mautner59431632012-04-04 11:56:44 -0700391 + " freezingScreen=" + atoken.mAppAnimator.freezingScreen
Craig Mautnerbec53f72012-04-05 11:49:05 -0700392 + " mAppFreezing=" + win.mAppFreezing);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700393 mInner.mTokenMayBeDrawn = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700394 }
395 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700396 } else if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700397 atoken.startingDisplayed = true;
398 }
399 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700400 } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700401 if (winAnimator.performShowLocked()) {
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700402 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
403 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700404 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
405 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700406 }
407 }
Craig Mautner764983d2012-03-22 11:37:36 -0700408 }
Craig Mautner59431632012-04-04 11:56:44 -0700409 final AppWindowAnimator appAnimator =
410 atoken == null ? null : atoken.mAppAnimator;
411 if (appAnimator != null && appAnimator.thumbnail != null) {
412 if (appAnimator.thumbnailTransactionSeq != mTransactionSequence) {
413 appAnimator.thumbnailTransactionSeq = mTransactionSequence;
414 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700415 }
Craig Mautner59431632012-04-04 11:56:44 -0700416 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
417 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700418 }
419 }
Craig Mautner764983d2012-03-22 11:37:36 -0700420 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700421
Craig Mautner9e809442012-06-22 17:13:04 -0700422 if (mWindowDetachedWallpaper != detachedWallpaper) {
423 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
424 "Detached wallpaper changed from " + mWindowDetachedWallpaper
425 + " to " + detachedWallpaper);
426 mWindowDetachedWallpaper = detachedWallpaper;
427 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
428 }
429
430 if (windowAnimationBackgroundColor != 0) {
431 // If the window that wants black is the current wallpaper
432 // target, then the black goes *below* the wallpaper so we
433 // don't cause the wallpaper to suddenly disappear.
434 int animLayer = windowAnimationBackground.mAnimLayer;
435 WindowState win = windowAnimationBackground.mWin;
436 if (windowAnimationBackground != null && mService.mWallpaperTarget == win
437 || mService.mLowerWallpaperTarget == win
438 || mService.mUpperWallpaperTarget == win) {
439 final int N = mWinAnimators.size();
440 for (int i = 0; i < N; i++) {
441 WindowStateAnimator winAnimator = mWinAnimators.get(i);
442 if (winAnimator.mWin.mIsWallpaper) {
443 animLayer = winAnimator.mAnimLayer;
444 break;
445 }
446 }
447 }
448
449 final int dw = mDw;
450 final int dh = mDh;
451 mWindowAnimationBackgroundSurface.show(dw, dh,
452 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
453 windowAnimationBackgroundColor);
454 } else {
455 mWindowAnimationBackgroundSurface.hide();
456 }
457
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700458 // If we have windows that are being show due to them no longer
459 // being force-hidden, apply the appropriate animation to them.
460 if (unForceHiding != null) {
461 for (int i=unForceHiding.size()-1; i>=0; i--) {
462 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
463 if (a != null) {
Craig Mautner4d7349b2012-04-20 14:52:47 -0700464 final WindowStateAnimator winAnimator = unForceHiding.get(i);
465 winAnimator.setAnimation(a);
466 winAnimator.mAnimationIsEntrance = true;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700467 }
468 }
469 }
Craig Mautner764983d2012-03-22 11:37:36 -0700470 }
471
472 private void testTokenMayBeDrawnLocked() {
473 // See if any windows have been drawn, so they (and others
474 // associated with them) can now be shown.
Craig Mautneref25d7a2012-05-15 23:01:47 -0700475 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
476 final int NT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700477 for (int i=0; i<NT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700478 AppWindowToken wtoken = appTokens.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700479 if (wtoken.mAppAnimator.freezingScreen) {
Craig Mautner764983d2012-03-22 11:37:36 -0700480 int numInteresting = wtoken.numInterestingWindows;
481 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
482 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
483 "allDrawn: " + wtoken
484 + " interesting=" + numInteresting
485 + " drawn=" + wtoken.numDrawnWindows);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700486 wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700487 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
488 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
489 "Setting mOrientationChangeComplete=true because wtoken "
490 + wtoken + " numInteresting=" + numInteresting
491 + " numDrawn=" + wtoken.numDrawnWindows);
Craig Mautner924c2152012-04-23 18:14:07 -0700492 // This will set mOrientationChangeComplete and cause a pass through layout.
493 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautner764983d2012-03-22 11:37:36 -0700494 }
495 } else if (!wtoken.allDrawn) {
496 int numInteresting = wtoken.numInterestingWindows;
497 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
498 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
499 "allDrawn: " + wtoken
500 + " interesting=" + numInteresting
501 + " drawn=" + wtoken.numDrawnWindows);
502 wtoken.allDrawn = true;
503 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700504 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700505 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
506 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700507 }
Craig Mautner764983d2012-03-22 11:37:36 -0700508
509 // We can now show all of the drawn windows!
510 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700511 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700512 }
513 }
514 }
515 }
516 }
517
518 private void performAnimationsLocked() {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700519 mInner.mTokenMayBeDrawn = false;
520 mInner.mForceHiding = false;
Craig Mautner764983d2012-03-22 11:37:36 -0700521
522 updateWindowsAndWallpaperLocked();
Craig Mautner4d7349b2012-04-20 14:52:47 -0700523 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
524 mPendingActions |= WALLPAPER_ACTION_PENDING;
525 }
Craig Mautner764983d2012-03-22 11:37:36 -0700526
Craig Mautner01cd0e72012-06-18 10:19:11 -0700527 if (mInner.mTokenMayBeDrawn) {
Craig Mautner764983d2012-03-22 11:37:36 -0700528 testTokenMayBeDrawnLocked();
529 }
Craig Mautner764983d2012-03-22 11:37:36 -0700530 }
531
Craig Mautner1caa3992012-06-22 09:46:48 -0700532 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
533 /** Locked on mService.mWindowMap and this. */
534 private void animateLocked() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700535 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700536 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700537 mBulkUpdateParams = 0;
Chet Haase198e5642012-05-10 09:55:15 -0700538 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700539 mAnimating = false;
540 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
541 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
542 }
Craig Mautner764983d2012-03-22 11:37:36 -0700543
544 // Update animations of all applications, including those
545 // associated with exiting/removed apps
546 Surface.openTransaction();
547
548 try {
549 updateWindowsAppsAndRotationAnimationsLocked();
550 performAnimationsLocked();
551
552 // THIRD LOOP: Update the surfaces of all windows.
553
554 if (mScreenRotationAnimation != null) {
555 mScreenRotationAnimation.updateSurfaces();
556 }
557
Craig Mautner7358fbf2012-04-12 21:06:33 -0700558 final int N = mWinAnimators.size();
559 for (int i = 0; i < N; i++) {
Craig Mautner0fa77c12012-06-11 15:57:19 -0700560 mWinAnimators.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700561 }
562
Craig Mautner6af9b922012-04-05 19:25:51 -0700563 if (mDimParams != null) {
564 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
565 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700566 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700567 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700568 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700569 }
570
571 if (mService.mBlackFrame != null) {
572 if (mScreenRotationAnimation != null) {
573 mService.mBlackFrame.setMatrix(
574 mScreenRotationAnimation.getEnterTransformation().getMatrix());
575 } else {
576 mService.mBlackFrame.clearMatrix();
577 }
578 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700579
580 if (mService.mWatermark != null) {
581 mService.mWatermark.drawIfNeeded();
582 }
Craig Mautner764983d2012-03-22 11:37:36 -0700583 } catch (RuntimeException e) {
584 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
585 } finally {
586 Surface.closeTransaction();
587 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700588
Craig Mautner01cd0e72012-06-18 10:19:11 -0700589 if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
590 final WindowManagerService.AnimatorToLayoutParams animToLayout = mService.mAnimToLayout;
591 synchronized (animToLayout) {
592 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
593 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
594 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
Craig Mautner9e809442012-06-22 17:13:04 -0700595 mService.setAnimatorParametersLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700596 }
597 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700598
599 if (mAnimating) {
Craig Mautner1caa3992012-06-22 09:46:48 -0700600 synchronized (mLayoutToAnim) {
601 scheduleAnimationLocked();
602 }
Chet Haase198e5642012-05-10 09:55:15 -0700603 } else if (wasAnimating) {
604 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700605 }
606 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
607 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
608 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
609 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
610 }
Craig Mautner764983d2012-03-22 11:37:36 -0700611 }
612
613 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700614 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700615 mCurrentFocus = currentFocus;
616 }
617
618 void setDisplayDimensions(final int curWidth, final int curHeight,
619 final int appWidth, final int appHeight) {
620 mDw = curWidth;
621 mDh = curHeight;
622 mInnerDw = appWidth;
623 mInnerDh = appHeight;
624 }
625
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700626 void startDimming(final WindowStateAnimator winAnimator, final float target,
627 final int width, final int height) {
628 if (mDimAnimator == null) {
629 mDimAnimator = new DimAnimator(mService.mFxSession);
630 }
Craig Mautner067ca322012-05-18 17:19:51 -0700631 // Only set dim params on the highest dimmed layer.
632 final WindowStateAnimator dimWinAnimator = mDimParams == null
633 ? null : mDimParams.mDimWinAnimator;
634 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
635 if (winAnimator.mSurfaceShown &&
636 (dimWinAnimator == null || !dimWinAnimator.mSurfaceShown
637 || dimWinAnimator.mAnimLayer < winAnimator.mAnimLayer)) {
638 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
639 new DimAnimator.Parameters(winAnimator, width, height, target)));
640 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700641 }
642
643 // TODO(cmautner): Move into Handler
644 void stopDimming() {
645 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
646 }
647
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700648 boolean isDimming() {
649 return mDimParams != null;
650 }
651
Craig Mautneracafd192012-05-10 10:41:02 -0700652 boolean isDimming(final WindowStateAnimator winAnimator) {
653 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
654 }
655
Craig Mautnere7ae2502012-03-26 17:11:19 -0700656 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
657 if (mWindowDetachedWallpaper != null) {
658 pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
659 }
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -0700660 if (mUniverseBackground != null) {
661 pw.print(" mUniverseBackground="); pw.println(mUniverseBackground);
662 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700663 if (mWindowAnimationBackgroundSurface != null) {
664 pw.println(" mWindowAnimationBackgroundSurface:");
665 mWindowAnimationBackgroundSurface.printTo(" ", pw);
666 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700667 if (mDimAnimator != null) {
668 pw.println(" mDimAnimator:");
669 mDimAnimator.printTo(" ", pw);
670 } else {
671 pw.println( " no DimAnimator ");
672 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700673 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700674
675 static class SetAnimationParams {
676 final WindowStateAnimator mWinAnimator;
677 final Animation mAnimation;
678 final int mAnimDw;
679 final int mAnimDh;
680 public SetAnimationParams(final WindowStateAnimator winAnimator,
681 final Animation animation, final int animDw, final int animDh) {
682 mWinAnimator = winAnimator;
683 mAnimation = animation;
684 mAnimDw = animDw;
685 mAnimDh = animDh;
686 }
687 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700688
689 synchronized void clearPendingActions() {
690 mPendingActions = 0;
691 }
Craig Mautner764983d2012-03-22 11:37:36 -0700692}