blob: 168b272f4fbcac2a285d9f92658c9a1e62ea0008 [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;
6
Craig Mautnera608b882012-03-30 13:03:49 -07007import static com.android.server.wm.WindowManagerService.LayoutFields.SET_UPDATE_ROTATION;
8import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_MAY_CHANGE;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -07009import static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED;
10
11import static com.android.server.wm.WindowManagerService.H.SET_DIM_PARAMETERS;
Craig Mautnera608b882012-03-30 13:03:49 -070012
Craig Mautner764983d2012-03-22 11:37:36 -070013import android.content.Context;
14import android.os.SystemClock;
15import android.util.Log;
16import android.util.Slog;
Craig Mautner1caa3992012-06-22 09:46:48 -070017import android.view.Choreographer;
Craig Mautner764983d2012-03-22 11:37:36 -070018import android.view.Surface;
19import android.view.WindowManager;
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 {
48 boolean mTokenMayBeDrawn;
49 boolean mForceHiding;
Craig Mautner01cd0e72012-06-18 10:19:11 -070050 }
51 InnerLoopParams mInner = new InnerLoopParams();
52
Craig Mautner1caa3992012-06-22 09:46:48 -070053 static class LayoutToAnimatorParams {
54 boolean mAnimationScheduled;
55 ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
56 WindowState mWallpaperTarget;
57 }
58 /** Params from WindowManagerService. Do not modify or read without first locking on
59 * either WindowManagerService.mWindowMap or WindowManagerService.mAnimator.and then on
60 * mLayoutToAnim */
61 final LayoutToAnimatorParams mLayoutToAnim = new LayoutToAnimatorParams();
62
63 final Runnable mAnimationRunnable;
64
Craig Mautner764983d2012-03-22 11:37:36 -070065 int mAdjResult;
66
67 int mPendingLayoutChanges;
68
69 /** Overall window dimensions */
70 int mDw, mDh;
71
72 /** Interior window dimensions */
73 int mInnerDw, mInnerDh;
74
75 /** Time of current animation step. Reset on each iteration */
76 long mCurrentTime;
77
78 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
79 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
80 private int mTransactionSequence;
81
82 /** The one and only screen rotation if one is happening */
83 ScreenRotationAnimation mScreenRotationAnimation = null;
84
Craig Mautnere7ae2502012-03-26 17:11:19 -070085 // Window currently running an animation that has requested it be detached
86 // from the wallpaper. This means we need to ensure the wallpaper is
87 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070088 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070089 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070090
Craig Mautnere7ae2502012-03-26 17:11:19 -070091 DimSurface mWindowAnimationBackgroundSurface = null;
92
Craig Mautnera608b882012-03-30 13:03:49 -070093 int mBulkUpdateParams = 0;
94
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070095 DimAnimator mDimAnimator = null;
96 DimAnimator.Parameters mDimParams = null;
97
Craig Mautner4d7349b2012-04-20 14:52:47 -070098 static final int WALLPAPER_ACTION_PENDING = 1;
99 int mPendingActions;
100
Craig Mautner1caa3992012-06-22 09:46:48 -0700101 WindowState mWallpaperTarget = null;
102
Craig Mautner764983d2012-03-22 11:37:36 -0700103 WindowAnimator(final WindowManagerService service, final Context context,
104 final WindowManagerPolicy policy) {
105 mService = service;
106 mContext = context;
107 mPolicy = policy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700108
109 mAnimationRunnable = new Runnable() {
110 @Override
111 public void run() {
112 // TODO(cmautner): When full isolation is achieved for animation, the first lock
113 // goes away and only the WindowAnimator.this remains.
114 synchronized(mService.mWindowMap) {
115 synchronized(WindowAnimator.this) {
116 copyLayoutToAnimParamsLocked();
117 animateLocked();
118 }
119 }
120 }
121 };
Craig Mautner9e809442012-06-22 17:13:04 -0700122
123 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
Craig Mautner1caa3992012-06-22 09:46:48 -0700124 }
125
126 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
127 private void copyLayoutToAnimParamsLocked() {
128 final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
129 synchronized(layoutToAnim) {
130 layoutToAnim.mAnimationScheduled = false;
131
132 mWinAnimators = new ArrayList<WindowStateAnimator>(layoutToAnim.mWinAnimators);
133 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
134 }
135 }
136
137 /** Note that Locked in this case is on mLayoutToAnim */
138 void scheduleAnimationLocked() {
139 final LayoutToAnimatorParams layoutToAnim = mLayoutToAnim;
140 if (!layoutToAnim.mAnimationScheduled) {
141 layoutToAnim.mAnimationScheduled = true;
142 mChoreographer.postCallback(
143 Choreographer.CALLBACK_ANIMATION, mAnimationRunnable, null);
144 }
Craig Mautner764983d2012-03-22 11:37:36 -0700145 }
146
Craig Mautnerb9836b92012-06-11 11:40:09 -0700147 void hideWallpapersLocked(final WindowState w) {
148 if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null)
149 || mService.mWallpaperTarget == null) {
150 for (final WindowToken token : mService.mWallpaperTokens) {
151 for (final WindowState wallpaper : token.windows) {
152 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
153 if (!winAnimator.mLastHidden) {
154 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700155 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700156 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
157 }
158 }
159 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700160 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700161 }
162 }
163
Craig Mautner764983d2012-03-22 11:37:36 -0700164 private void updateWindowsAppsAndRotationAnimationsLocked() {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700165 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
Craig Mautner764983d2012-03-22 11:37:36 -0700166 int i;
Craig Mautneref25d7a2012-05-15 23:01:47 -0700167 final int NAT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700168 for (i=0; i<NAT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700169 final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700170 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700171 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700172 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700173 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700174 } else if (wasAnimating) {
175 // stopped animating, do one more pass through the layout
176 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700177 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700178 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700179 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700180 }
Craig Mautner83339b42012-05-01 22:13:23 -0700181 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
182 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700183 }
184 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700185
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700186 final int NEAT = mService.mExitingAppTokens.size();
187 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700188 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700189 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700190 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700191 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700192 mAnimating = true;
193 } else if (wasAnimating) {
194 // stopped animating, do one more pass through the layout
195 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700196 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700197 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700198 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700199 }
Craig Mautner83339b42012-05-01 22:13:23 -0700200 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
201 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700202 }
203 }
204
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700205 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700206 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700207 mAnimating = true;
208 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700209 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700210 mScreenRotationAnimation.kill();
211 mScreenRotationAnimation = null;
212 }
213 }
214 }
215
216 private void updateWindowsAndWallpaperLocked() {
217 ++mTransactionSequence;
218
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700219 ArrayList<WindowStateAnimator> unForceHiding = null;
220 boolean wallpaperInUnForceHiding = false;
Craig Mautner9e809442012-06-22 17:13:04 -0700221 WindowStateAnimator windowAnimationBackground = null;
222 int windowAnimationBackgroundColor = 0;
223 WindowState detachedWallpaper = null;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700224
Craig Mautner01cd0e72012-06-18 10:19:11 -0700225 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
226 WindowStateAnimator winAnimator = mWinAnimators.get(i);
227 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700228 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700229
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700230 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700231 final boolean wasAnimating = winAnimator.mWasAnimating;
232 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700233
234 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700235 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700236 ", nowAnimating=" + nowAnimating);
237 }
238
239 // If this window is animating, make a note that we have
240 // an animating window and take care of a request to run
241 // a detached wallpaper animation.
242 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700243 if (winAnimator.mAnimation != null) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700244 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700245 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautner9e809442012-06-22 17:13:04 -0700246 detachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700247 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700248 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
249 if (backgroundColor != 0) {
Craig Mautner9e809442012-06-22 17:13:04 -0700250 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
251 windowAnimationBackground.mAnimLayer)) {
252 windowAnimationBackground = winAnimator;
253 windowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700254 }
255 }
256 }
257 mAnimating = true;
258 }
259
260 // If this window's app token is running a detached wallpaper
261 // animation, make a note so we can ensure the wallpaper is
262 // displayed behind it.
Craig Mautner59431632012-04-04 11:56:44 -0700263 final AppWindowAnimator appAnimator =
Craig Mautnerbec53f72012-04-05 11:49:05 -0700264 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700265 if (appAnimator != null && appAnimator.animation != null
266 && appAnimator.animating) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700267 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautner59431632012-04-04 11:56:44 -0700268 && appAnimator.animation.getDetachWallpaper()) {
Craig Mautner9e809442012-06-22 17:13:04 -0700269 detachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700270 }
Craig Mautner59431632012-04-04 11:56:44 -0700271 final int backgroundColor = appAnimator.animation.getBackgroundColor();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700272 if (backgroundColor != 0) {
Craig Mautner9e809442012-06-22 17:13:04 -0700273 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
274 windowAnimationBackground.mAnimLayer)) {
275 windowAnimationBackground = winAnimator;
276 windowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700277 }
278 }
279 }
280
Craig Mautnerbec53f72012-04-05 11:49:05 -0700281 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700282 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700283 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700284 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700285 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
286 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700287 }
Craig Mautner764983d2012-03-22 11:37:36 -0700288 }
289
Craig Mautnerbec53f72012-04-05 11:49:05 -0700290 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700291 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700292 if (WindowManagerService.DEBUG_ANIM ||
293 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
294 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700295 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700296 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700297 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700298 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
299 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700300 }
Craig Mautner764983d2012-03-22 11:37:36 -0700301 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700302 }
Craig Mautnerf03e4c52012-06-14 14:11:27 -0700303 if (win.isReadyForDisplay() && !winAnimator.isAnimating()) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700304 mInner.mForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700305 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700306 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner01cd0e72012-06-18 10:19:11 -0700307 "Force hide " + mInner.mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700308 + " hasSurface=" + win.mHasSurface
309 + " policyVis=" + win.mPolicyVisibility
310 + " destroying=" + win.mDestroying
311 + " attHidden=" + win.mAttachedHidden
312 + " vis=" + win.mViewVisibility
313 + " hidden=" + win.mRootToken.hidden
314 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700315 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700316 final boolean changed;
Craig Mautner01cd0e72012-06-18 10:19:11 -0700317 if (mInner.mForceHiding && !winAnimator.isAnimating()) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700318 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700319 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700320 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700321 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700322 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700323 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700324 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700325 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700326 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700327 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700328 if (unForceHiding == null) {
329 unForceHiding = new ArrayList<WindowStateAnimator>();
330 }
331 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700332 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700333 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700334 }
335 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700336 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700337 // We are showing on to of the current
338 // focus, so re-evaluate focus to make
339 // sure it is correct.
340 mService.mFocusMayChange = true;
341 }
342 }
343 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700344 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700345 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700346 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700347 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700348 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
349 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700350 }
Craig Mautner764983d2012-03-22 11:37:36 -0700351 }
352 }
353 }
354
Craig Mautnerbec53f72012-04-05 11:49:05 -0700355 final AppWindowToken atoken = win.mAppToken;
Craig Mautner59431632012-04-04 11:56:44 -0700356 if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700357 if (atoken.lastTransactionSequence != mTransactionSequence) {
358 atoken.lastTransactionSequence = mTransactionSequence;
359 atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
360 atoken.startingDisplayed = false;
361 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700362 if ((win.isOnScreen() || winAnimator.mAttrType
Craig Mautner764983d2012-03-22 11:37:36 -0700363 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
Craig Mautnerbec53f72012-04-05 11:49:05 -0700364 && !win.mExiting && !win.mDestroying) {
Craig Mautner764983d2012-03-22 11:37:36 -0700365 if (WindowManagerService.DEBUG_VISIBILITY ||
366 WindowManagerService.DEBUG_ORIENTATION) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700367 Slog.v(TAG, "Eval win " + win + ": isDrawn=" + win.isDrawnLw()
Craig Mautnera2c77052012-03-26 12:14:43 -0700368 + ", isAnimating=" + winAnimator.isAnimating());
Craig Mautnerbec53f72012-04-05 11:49:05 -0700369 if (!win.isDrawnLw()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700370 Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface
Craig Mautnerbec53f72012-04-05 11:49:05 -0700371 + " pv=" + win.mPolicyVisibility
Craig Mautner749a7bb2012-04-02 13:49:53 -0700372 + " mDrawState=" + winAnimator.mDrawState
Craig Mautnerbec53f72012-04-05 11:49:05 -0700373 + " ah=" + win.mAttachedHidden
Craig Mautner764983d2012-03-22 11:37:36 -0700374 + " th=" + atoken.hiddenRequested
Craig Mautnera2c77052012-03-26 12:14:43 -0700375 + " a=" + winAnimator.mAnimating);
Craig Mautner764983d2012-03-22 11:37:36 -0700376 }
377 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700378 if (win != atoken.startingWindow) {
379 if (!atoken.mAppAnimator.freezingScreen || !win.mAppFreezing) {
Craig Mautner764983d2012-03-22 11:37:36 -0700380 atoken.numInterestingWindows++;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700381 if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700382 atoken.numDrawnWindows++;
383 if (WindowManagerService.DEBUG_VISIBILITY ||
384 WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG,
385 "tokenMayBeDrawn: " + atoken
Craig Mautner59431632012-04-04 11:56:44 -0700386 + " freezingScreen=" + atoken.mAppAnimator.freezingScreen
Craig Mautnerbec53f72012-04-05 11:49:05 -0700387 + " mAppFreezing=" + win.mAppFreezing);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700388 mInner.mTokenMayBeDrawn = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700389 }
390 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700391 } else if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700392 atoken.startingDisplayed = true;
393 }
394 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700395 } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700396 if (winAnimator.performShowLocked()) {
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700397 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
398 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700399 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
400 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700401 }
402 }
Craig Mautner764983d2012-03-22 11:37:36 -0700403 }
Craig Mautner59431632012-04-04 11:56:44 -0700404 final AppWindowAnimator appAnimator =
405 atoken == null ? null : atoken.mAppAnimator;
406 if (appAnimator != null && appAnimator.thumbnail != null) {
407 if (appAnimator.thumbnailTransactionSeq != mTransactionSequence) {
408 appAnimator.thumbnailTransactionSeq = mTransactionSequence;
409 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700410 }
Craig Mautner59431632012-04-04 11:56:44 -0700411 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
412 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700413 }
414 }
Craig Mautner764983d2012-03-22 11:37:36 -0700415 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700416
Craig Mautner9e809442012-06-22 17:13:04 -0700417 if (mWindowDetachedWallpaper != detachedWallpaper) {
418 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
419 "Detached wallpaper changed from " + mWindowDetachedWallpaper
420 + " to " + detachedWallpaper);
421 mWindowDetachedWallpaper = detachedWallpaper;
422 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
423 }
424
425 if (windowAnimationBackgroundColor != 0) {
426 // If the window that wants black is the current wallpaper
427 // target, then the black goes *below* the wallpaper so we
428 // don't cause the wallpaper to suddenly disappear.
429 int animLayer = windowAnimationBackground.mAnimLayer;
430 WindowState win = windowAnimationBackground.mWin;
431 if (windowAnimationBackground != null && mService.mWallpaperTarget == win
432 || mService.mLowerWallpaperTarget == win
433 || mService.mUpperWallpaperTarget == win) {
434 final int N = mWinAnimators.size();
435 for (int i = 0; i < N; i++) {
436 WindowStateAnimator winAnimator = mWinAnimators.get(i);
437 if (winAnimator.mWin.mIsWallpaper) {
438 animLayer = winAnimator.mAnimLayer;
439 break;
440 }
441 }
442 }
443
444 final int dw = mDw;
445 final int dh = mDh;
446 mWindowAnimationBackgroundSurface.show(dw, dh,
447 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
448 windowAnimationBackgroundColor);
449 } else {
450 mWindowAnimationBackgroundSurface.hide();
451 }
452
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700453 // If we have windows that are being show due to them no longer
454 // being force-hidden, apply the appropriate animation to them.
455 if (unForceHiding != null) {
456 for (int i=unForceHiding.size()-1; i>=0; i--) {
457 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
458 if (a != null) {
Craig Mautner4d7349b2012-04-20 14:52:47 -0700459 final WindowStateAnimator winAnimator = unForceHiding.get(i);
460 winAnimator.setAnimation(a);
461 winAnimator.mAnimationIsEntrance = true;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700462 }
463 }
464 }
Craig Mautner764983d2012-03-22 11:37:36 -0700465 }
466
467 private void testTokenMayBeDrawnLocked() {
468 // See if any windows have been drawn, so they (and others
469 // associated with them) can now be shown.
Craig Mautneref25d7a2012-05-15 23:01:47 -0700470 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
471 final int NT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700472 for (int i=0; i<NT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700473 AppWindowToken wtoken = appTokens.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700474 if (wtoken.mAppAnimator.freezingScreen) {
Craig Mautner764983d2012-03-22 11:37:36 -0700475 int numInteresting = wtoken.numInterestingWindows;
476 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
477 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
478 "allDrawn: " + wtoken
479 + " interesting=" + numInteresting
480 + " drawn=" + wtoken.numDrawnWindows);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700481 wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700482 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
483 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
484 "Setting mOrientationChangeComplete=true because wtoken "
485 + wtoken + " numInteresting=" + numInteresting
486 + " numDrawn=" + wtoken.numDrawnWindows);
Craig Mautner924c2152012-04-23 18:14:07 -0700487 // This will set mOrientationChangeComplete and cause a pass through layout.
488 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautner764983d2012-03-22 11:37:36 -0700489 }
490 } else if (!wtoken.allDrawn) {
491 int numInteresting = wtoken.numInterestingWindows;
492 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
493 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
494 "allDrawn: " + wtoken
495 + " interesting=" + numInteresting
496 + " drawn=" + wtoken.numDrawnWindows);
497 wtoken.allDrawn = true;
498 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700499 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700500 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
501 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700502 }
Craig Mautner764983d2012-03-22 11:37:36 -0700503
504 // We can now show all of the drawn windows!
505 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700506 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700507 }
508 }
509 }
510 }
511 }
512
513 private void performAnimationsLocked() {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700514 mInner.mTokenMayBeDrawn = false;
515 mInner.mForceHiding = false;
Craig Mautner764983d2012-03-22 11:37:36 -0700516
517 updateWindowsAndWallpaperLocked();
Craig Mautner4d7349b2012-04-20 14:52:47 -0700518 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
519 mPendingActions |= WALLPAPER_ACTION_PENDING;
520 }
Craig Mautner764983d2012-03-22 11:37:36 -0700521
Craig Mautner01cd0e72012-06-18 10:19:11 -0700522 if (mInner.mTokenMayBeDrawn) {
Craig Mautner764983d2012-03-22 11:37:36 -0700523 testTokenMayBeDrawnLocked();
524 }
Craig Mautner764983d2012-03-22 11:37:36 -0700525 }
526
Craig Mautner1caa3992012-06-22 09:46:48 -0700527 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
528 /** Locked on mService.mWindowMap and this. */
529 private void animateLocked() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700530 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700531 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700532 mBulkUpdateParams = 0;
Chet Haase198e5642012-05-10 09:55:15 -0700533 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700534 mAnimating = false;
535 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
536 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
537 }
Craig Mautner764983d2012-03-22 11:37:36 -0700538
539 // Update animations of all applications, including those
540 // associated with exiting/removed apps
541 Surface.openTransaction();
542
543 try {
544 updateWindowsAppsAndRotationAnimationsLocked();
545 performAnimationsLocked();
546
547 // THIRD LOOP: Update the surfaces of all windows.
548
549 if (mScreenRotationAnimation != null) {
550 mScreenRotationAnimation.updateSurfaces();
551 }
552
Craig Mautner7358fbf2012-04-12 21:06:33 -0700553 final int N = mWinAnimators.size();
554 for (int i = 0; i < N; i++) {
Craig Mautner0fa77c12012-06-11 15:57:19 -0700555 mWinAnimators.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700556 }
557
Craig Mautner6af9b922012-04-05 19:25:51 -0700558 if (mDimParams != null) {
559 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
560 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700561 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700562 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700563 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700564 }
565
566 if (mService.mBlackFrame != null) {
567 if (mScreenRotationAnimation != null) {
568 mService.mBlackFrame.setMatrix(
569 mScreenRotationAnimation.getEnterTransformation().getMatrix());
570 } else {
571 mService.mBlackFrame.clearMatrix();
572 }
573 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700574
575 if (mService.mWatermark != null) {
576 mService.mWatermark.drawIfNeeded();
577 }
Craig Mautner764983d2012-03-22 11:37:36 -0700578 } catch (RuntimeException e) {
579 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
580 } finally {
581 Surface.closeTransaction();
582 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700583
Craig Mautner01cd0e72012-06-18 10:19:11 -0700584 if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
585 final WindowManagerService.AnimatorToLayoutParams animToLayout = mService.mAnimToLayout;
586 synchronized (animToLayout) {
587 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
588 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
589 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
Craig Mautner9e809442012-06-22 17:13:04 -0700590 mService.setAnimatorParametersLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700591 }
592 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700593
594 if (mAnimating) {
Craig Mautner1caa3992012-06-22 09:46:48 -0700595 synchronized (mLayoutToAnim) {
596 scheduleAnimationLocked();
597 }
Chet Haase198e5642012-05-10 09:55:15 -0700598 } else if (wasAnimating) {
599 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700600 }
601 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
602 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
603 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
604 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
605 }
Craig Mautner764983d2012-03-22 11:37:36 -0700606 }
607
608 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700609 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700610 mCurrentFocus = currentFocus;
611 }
612
613 void setDisplayDimensions(final int curWidth, final int curHeight,
614 final int appWidth, final int appHeight) {
615 mDw = curWidth;
616 mDh = curHeight;
617 mInnerDw = appWidth;
618 mInnerDh = appHeight;
619 }
620
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700621 void startDimming(final WindowStateAnimator winAnimator, final float target,
622 final int width, final int height) {
623 if (mDimAnimator == null) {
624 mDimAnimator = new DimAnimator(mService.mFxSession);
625 }
Craig Mautner067ca322012-05-18 17:19:51 -0700626 // Only set dim params on the highest dimmed layer.
627 final WindowStateAnimator dimWinAnimator = mDimParams == null
628 ? null : mDimParams.mDimWinAnimator;
629 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
630 if (winAnimator.mSurfaceShown &&
631 (dimWinAnimator == null || !dimWinAnimator.mSurfaceShown
632 || dimWinAnimator.mAnimLayer < winAnimator.mAnimLayer)) {
633 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
634 new DimAnimator.Parameters(winAnimator, width, height, target)));
635 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700636 }
637
638 // TODO(cmautner): Move into Handler
639 void stopDimming() {
640 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
641 }
642
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700643 boolean isDimming() {
644 return mDimParams != null;
645 }
646
Craig Mautneracafd192012-05-10 10:41:02 -0700647 boolean isDimming(final WindowStateAnimator winAnimator) {
648 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
649 }
650
Craig Mautnere7ae2502012-03-26 17:11:19 -0700651 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
652 if (mWindowDetachedWallpaper != null) {
653 pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
654 }
655 if (mWindowAnimationBackgroundSurface != null) {
656 pw.println(" mWindowAnimationBackgroundSurface:");
657 mWindowAnimationBackgroundSurface.printTo(" ", pw);
658 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700659 if (mDimAnimator != null) {
660 pw.println(" mDimAnimator:");
661 mDimAnimator.printTo(" ", pw);
662 } else {
663 pw.println( " no DimAnimator ");
664 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700665 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700666
667 static class SetAnimationParams {
668 final WindowStateAnimator mWinAnimator;
669 final Animation mAnimation;
670 final int mAnimDw;
671 final int mAnimDh;
672 public SetAnimationParams(final WindowStateAnimator winAnimator,
673 final Animation animation, final int animDw, final int animDh) {
674 mWinAnimator = winAnimator;
675 mAnimation = animation;
676 mAnimDw = animDw;
677 mAnimDh = animDh;
678 }
679 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700680
681 synchronized void clearPendingActions() {
682 mPendingActions = 0;
683 }
Craig Mautner764983d2012-03-22 11:37:36 -0700684}