blob: e65d5d248a7c4477a62568ad6b1e09a1bd646afa [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;
17import android.view.Surface;
18import android.view.WindowManager;
Craig Mautner764983d2012-03-22 11:37:36 -070019import android.view.WindowManagerPolicy;
20import android.view.animation.Animation;
Craig Mautner764983d2012-03-22 11:37:36 -070021
22import com.android.internal.policy.impl.PhoneWindowManager;
23
Craig Mautnere7ae2502012-03-26 17:11:19 -070024import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070025import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070026
Craig Mautner764983d2012-03-22 11:37:36 -070027/**
Craig Mautner764983d2012-03-22 11:37:36 -070028 * Singleton class that carries out the animations and Surface operations in a separate task
29 * on behalf of WindowManagerService.
30 */
31public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070032 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070033
34 final WindowManagerService mService;
35 final Context mContext;
36 final WindowManagerPolicy mPolicy;
37
Craig Mautner7358fbf2012-04-12 21:06:33 -070038 ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>();
Craig Mautnerbec53f72012-04-05 11:49:05 -070039
Craig Mautner764983d2012-03-22 11:37:36 -070040 boolean mAnimating;
Craig Mautner01cd0e72012-06-18 10:19:11 -070041
42 /** Variables only intended to be valid within each pass through animate(). Does not contain
43 * persistent state. */
44 private class InnerLoopParams {
45 boolean mTokenMayBeDrawn;
46 boolean mForceHiding;
47 WindowState mDetachedWallpaper = null;
48 WindowState mWindowAnimationBackground;
49 int mWindowAnimationBackgroundColor;
50 }
51 InnerLoopParams mInner = new InnerLoopParams();
52
Craig Mautner764983d2012-03-22 11:37:36 -070053 int mAdjResult;
54
55 int mPendingLayoutChanges;
56
57 /** Overall window dimensions */
58 int mDw, mDh;
59
60 /** Interior window dimensions */
61 int mInnerDw, mInnerDh;
62
63 /** Time of current animation step. Reset on each iteration */
64 long mCurrentTime;
65
66 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
67 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
68 private int mTransactionSequence;
69
70 /** The one and only screen rotation if one is happening */
71 ScreenRotationAnimation mScreenRotationAnimation = null;
72
Craig Mautnere7ae2502012-03-26 17:11:19 -070073 // Window currently running an animation that has requested it be detached
74 // from the wallpaper. This means we need to ensure the wallpaper is
75 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070076 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070077 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070078
Craig Mautnere7ae2502012-03-26 17:11:19 -070079 DimSurface mWindowAnimationBackgroundSurface = null;
80
Craig Mautnera608b882012-03-30 13:03:49 -070081 int mBulkUpdateParams = 0;
82
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070083 DimAnimator mDimAnimator = null;
84 DimAnimator.Parameters mDimParams = null;
85
Craig Mautner4d7349b2012-04-20 14:52:47 -070086 static final int WALLPAPER_ACTION_PENDING = 1;
87 int mPendingActions;
88
Craig Mautner764983d2012-03-22 11:37:36 -070089 WindowAnimator(final WindowManagerService service, final Context context,
90 final WindowManagerPolicy policy) {
91 mService = service;
92 mContext = context;
93 mPolicy = policy;
94 }
95
Craig Mautnerb9836b92012-06-11 11:40:09 -070096 void hideWallpapersLocked(final WindowState w) {
97 if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null)
98 || mService.mWallpaperTarget == null) {
99 for (final WindowToken token : mService.mWallpaperTokens) {
100 for (final WindowState wallpaper : token.windows) {
101 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
102 if (!winAnimator.mLastHidden) {
103 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700104 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700105 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
106 }
107 }
108 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700109 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700110 }
111 }
112
Craig Mautnere7ae2502012-03-26 17:11:19 -0700113 private void testWallpaperAndBackgroundLocked() {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700114 final WindowState detachedWallpaper = mInner.mDetachedWallpaper;
115 if (mWindowDetachedWallpaper != detachedWallpaper) {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700116 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
117 "Detached wallpaper changed from " + mWindowDetachedWallpaper
Craig Mautner01cd0e72012-06-18 10:19:11 -0700118 + " to " + detachedWallpaper);
119 mWindowDetachedWallpaper = detachedWallpaper;
Craig Mautnera608b882012-03-30 13:03:49 -0700120 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautnere7ae2502012-03-26 17:11:19 -0700121 }
122
Craig Mautner01cd0e72012-06-18 10:19:11 -0700123 if (mInner.mWindowAnimationBackgroundColor != 0) {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700124 // If the window that wants black is the current wallpaper
125 // target, then the black goes *below* the wallpaper so we
126 // don't cause the wallpaper to suddenly disappear.
Craig Mautner01cd0e72012-06-18 10:19:11 -0700127 WindowState target = mInner.mWindowAnimationBackground;
Craig Mautnere7ae2502012-03-26 17:11:19 -0700128 if (mService.mWallpaperTarget == target
129 || mService.mLowerWallpaperTarget == target
130 || mService.mUpperWallpaperTarget == target) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700131 final int N = mService.mWindows.size();
132 for (int i = 0; i < N; i++) {
Craig Mautnere7ae2502012-03-26 17:11:19 -0700133 WindowState w = mService.mWindows.get(i);
134 if (w.mIsWallpaper) {
135 target = w;
136 break;
137 }
138 }
139 }
140 if (mWindowAnimationBackgroundSurface == null) {
141 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
142 }
143 final int dw = mDw;
144 final int dh = mDh;
145 mWindowAnimationBackgroundSurface.show(dw, dh,
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700146 target.mWinAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM,
Craig Mautner01cd0e72012-06-18 10:19:11 -0700147 mInner.mWindowAnimationBackgroundColor);
Craig Mautnere7ae2502012-03-26 17:11:19 -0700148 } else if (mWindowAnimationBackgroundSurface != null) {
149 mWindowAnimationBackgroundSurface.hide();
150 }
151 }
152
Craig Mautner764983d2012-03-22 11:37:36 -0700153 private void updateWindowsAppsAndRotationAnimationsLocked() {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700154 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
Craig Mautner764983d2012-03-22 11:37:36 -0700155 int i;
Craig Mautneref25d7a2012-05-15 23:01:47 -0700156 final int NAT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700157 for (i=0; i<NAT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700158 final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700159 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700160 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700161 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700162 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700163 } else if (wasAnimating) {
164 // stopped animating, do one more pass through the layout
165 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700166 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700167 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700168 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700169 }
Craig Mautner83339b42012-05-01 22:13:23 -0700170 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
171 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700172 }
173 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700174
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700175 final int NEAT = mService.mExitingAppTokens.size();
176 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700177 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700178 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700179 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700180 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700181 mAnimating = true;
182 } else if (wasAnimating) {
183 // stopped animating, do one more pass through the layout
184 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700185 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700186 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700187 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700188 }
Craig Mautner83339b42012-05-01 22:13:23 -0700189 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
190 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700191 }
192 }
193
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700194 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700195 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700196 mAnimating = true;
197 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700198 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700199 mScreenRotationAnimation.kill();
200 mScreenRotationAnimation = null;
201 }
202 }
203 }
204
205 private void updateWindowsAndWallpaperLocked() {
206 ++mTransactionSequence;
207
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700208 ArrayList<WindowStateAnimator> unForceHiding = null;
209 boolean wallpaperInUnForceHiding = false;
210
Craig Mautner01cd0e72012-06-18 10:19:11 -0700211 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
212 WindowStateAnimator winAnimator = mWinAnimators.get(i);
213 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700214 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700215
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700216 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700217 final boolean wasAnimating = winAnimator.mWasAnimating;
218 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700219
220 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700221 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700222 ", nowAnimating=" + nowAnimating);
223 }
224
225 // If this window is animating, make a note that we have
226 // an animating window and take care of a request to run
227 // a detached wallpaper animation.
228 if (nowAnimating) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700229 if (winAnimator.mAnimation != null) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700230 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautnera2c77052012-03-26 12:14:43 -0700231 && winAnimator.mAnimation.getDetachWallpaper()) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700232 mInner.mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700233 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700234 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
235 if (backgroundColor != 0) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700236 final WindowState background = mInner.mWindowAnimationBackground;
237 if (background == null || (winAnimator.mAnimLayer <
238 background.mWinAnimator.mAnimLayer)) {
239 mInner.mWindowAnimationBackground = win;
240 mInner.mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700241 }
242 }
243 }
244 mAnimating = true;
245 }
246
247 // If this window's app token is running a detached wallpaper
248 // animation, make a note so we can ensure the wallpaper is
249 // displayed behind it.
Craig Mautner59431632012-04-04 11:56:44 -0700250 final AppWindowAnimator appAnimator =
Craig Mautnerbec53f72012-04-05 11:49:05 -0700251 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700252 if (appAnimator != null && appAnimator.animation != null
253 && appAnimator.animating) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700254 if ((flags & FLAG_SHOW_WALLPAPER) != 0
Craig Mautner59431632012-04-04 11:56:44 -0700255 && appAnimator.animation.getDetachWallpaper()) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700256 mInner.mDetachedWallpaper = win;
Craig Mautner764983d2012-03-22 11:37:36 -0700257 }
Craig Mautner59431632012-04-04 11:56:44 -0700258 final int backgroundColor = appAnimator.animation.getBackgroundColor();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700259 if (backgroundColor != 0) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700260 final WindowState background = mInner.mWindowAnimationBackground;
261 if (background == null || (winAnimator.mAnimLayer <
262 background.mWinAnimator.mAnimLayer)) {
263 mInner.mWindowAnimationBackground = win;
264 mInner.mWindowAnimationBackgroundColor = backgroundColor;
Craig Mautner764983d2012-03-22 11:37:36 -0700265 }
266 }
267 }
268
Craig Mautnerbec53f72012-04-05 11:49:05 -0700269 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700270 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700271 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700272 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700273 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
274 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700275 }
Craig Mautner764983d2012-03-22 11:37:36 -0700276 }
277
Craig Mautnerbec53f72012-04-05 11:49:05 -0700278 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700279 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700280 if (WindowManagerService.DEBUG_ANIM ||
281 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
282 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700283 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
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 3",
287 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700288 }
Craig Mautner764983d2012-03-22 11:37:36 -0700289 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700290 }
Craig Mautnerf03e4c52012-06-14 14:11:27 -0700291 if (win.isReadyForDisplay() && !winAnimator.isAnimating()) {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700292 mInner.mForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700293 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700294 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner01cd0e72012-06-18 10:19:11 -0700295 "Force hide " + mInner.mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700296 + " hasSurface=" + win.mHasSurface
297 + " policyVis=" + win.mPolicyVisibility
298 + " destroying=" + win.mDestroying
299 + " attHidden=" + win.mAttachedHidden
300 + " vis=" + win.mViewVisibility
301 + " hidden=" + win.mRootToken.hidden
302 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700303 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700304 final boolean changed;
Craig Mautner01cd0e72012-06-18 10:19:11 -0700305 if (mInner.mForceHiding && !winAnimator.isAnimating()) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700306 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700307 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700308 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700309 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700310 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700311 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700312 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700313 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700314 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700315 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700316 if (unForceHiding == null) {
317 unForceHiding = new ArrayList<WindowStateAnimator>();
318 }
319 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700320 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700321 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700322 }
323 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700324 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700325 // We are showing on to of the current
326 // focus, so re-evaluate focus to make
327 // sure it is correct.
328 mService.mFocusMayChange = true;
329 }
330 }
331 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700332 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700333 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700334 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700335 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700336 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
337 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700338 }
Craig Mautner764983d2012-03-22 11:37:36 -0700339 }
340 }
341 }
342
Craig Mautnerbec53f72012-04-05 11:49:05 -0700343 final AppWindowToken atoken = win.mAppToken;
Craig Mautner59431632012-04-04 11:56:44 -0700344 if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700345 if (atoken.lastTransactionSequence != mTransactionSequence) {
346 atoken.lastTransactionSequence = mTransactionSequence;
347 atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
348 atoken.startingDisplayed = false;
349 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700350 if ((win.isOnScreen() || winAnimator.mAttrType
Craig Mautner764983d2012-03-22 11:37:36 -0700351 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
Craig Mautnerbec53f72012-04-05 11:49:05 -0700352 && !win.mExiting && !win.mDestroying) {
Craig Mautner764983d2012-03-22 11:37:36 -0700353 if (WindowManagerService.DEBUG_VISIBILITY ||
354 WindowManagerService.DEBUG_ORIENTATION) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700355 Slog.v(TAG, "Eval win " + win + ": isDrawn=" + win.isDrawnLw()
Craig Mautnera2c77052012-03-26 12:14:43 -0700356 + ", isAnimating=" + winAnimator.isAnimating());
Craig Mautnerbec53f72012-04-05 11:49:05 -0700357 if (!win.isDrawnLw()) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700358 Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface
Craig Mautnerbec53f72012-04-05 11:49:05 -0700359 + " pv=" + win.mPolicyVisibility
Craig Mautner749a7bb2012-04-02 13:49:53 -0700360 + " mDrawState=" + winAnimator.mDrawState
Craig Mautnerbec53f72012-04-05 11:49:05 -0700361 + " ah=" + win.mAttachedHidden
Craig Mautner764983d2012-03-22 11:37:36 -0700362 + " th=" + atoken.hiddenRequested
Craig Mautnera2c77052012-03-26 12:14:43 -0700363 + " a=" + winAnimator.mAnimating);
Craig Mautner764983d2012-03-22 11:37:36 -0700364 }
365 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700366 if (win != atoken.startingWindow) {
367 if (!atoken.mAppAnimator.freezingScreen || !win.mAppFreezing) {
Craig Mautner764983d2012-03-22 11:37:36 -0700368 atoken.numInterestingWindows++;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700369 if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700370 atoken.numDrawnWindows++;
371 if (WindowManagerService.DEBUG_VISIBILITY ||
372 WindowManagerService.DEBUG_ORIENTATION) Slog.v(TAG,
373 "tokenMayBeDrawn: " + atoken
Craig Mautner59431632012-04-04 11:56:44 -0700374 + " freezingScreen=" + atoken.mAppAnimator.freezingScreen
Craig Mautnerbec53f72012-04-05 11:49:05 -0700375 + " mAppFreezing=" + win.mAppFreezing);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700376 mInner.mTokenMayBeDrawn = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700377 }
378 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700379 } else if (win.isDrawnLw()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700380 atoken.startingDisplayed = true;
381 }
382 }
Craig Mautner749a7bb2012-04-02 13:49:53 -0700383 } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700384 if (winAnimator.performShowLocked()) {
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700385 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
386 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700387 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
388 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700389 }
390 }
Craig Mautner764983d2012-03-22 11:37:36 -0700391 }
Craig Mautner59431632012-04-04 11:56:44 -0700392 final AppWindowAnimator appAnimator =
393 atoken == null ? null : atoken.mAppAnimator;
394 if (appAnimator != null && appAnimator.thumbnail != null) {
395 if (appAnimator.thumbnailTransactionSeq != mTransactionSequence) {
396 appAnimator.thumbnailTransactionSeq = mTransactionSequence;
397 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700398 }
Craig Mautner59431632012-04-04 11:56:44 -0700399 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
400 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700401 }
402 }
Craig Mautner764983d2012-03-22 11:37:36 -0700403 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700404
405 // If we have windows that are being show due to them no longer
406 // being force-hidden, apply the appropriate animation to them.
407 if (unForceHiding != null) {
408 for (int i=unForceHiding.size()-1; i>=0; i--) {
409 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
410 if (a != null) {
Craig Mautner4d7349b2012-04-20 14:52:47 -0700411 final WindowStateAnimator winAnimator = unForceHiding.get(i);
412 winAnimator.setAnimation(a);
413 winAnimator.mAnimationIsEntrance = true;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700414 }
415 }
416 }
Craig Mautner764983d2012-03-22 11:37:36 -0700417 }
418
419 private void testTokenMayBeDrawnLocked() {
420 // See if any windows have been drawn, so they (and others
421 // associated with them) can now be shown.
Craig Mautneref25d7a2012-05-15 23:01:47 -0700422 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
423 final int NT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700424 for (int i=0; i<NT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700425 AppWindowToken wtoken = appTokens.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700426 if (wtoken.mAppAnimator.freezingScreen) {
Craig Mautner764983d2012-03-22 11:37:36 -0700427 int numInteresting = wtoken.numInterestingWindows;
428 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
429 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
430 "allDrawn: " + wtoken
431 + " interesting=" + numInteresting
432 + " drawn=" + wtoken.numDrawnWindows);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700433 wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700434 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
435 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
436 "Setting mOrientationChangeComplete=true because wtoken "
437 + wtoken + " numInteresting=" + numInteresting
438 + " numDrawn=" + wtoken.numDrawnWindows);
Craig Mautner924c2152012-04-23 18:14:07 -0700439 // This will set mOrientationChangeComplete and cause a pass through layout.
440 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautner764983d2012-03-22 11:37:36 -0700441 }
442 } else if (!wtoken.allDrawn) {
443 int numInteresting = wtoken.numInterestingWindows;
444 if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
445 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
446 "allDrawn: " + wtoken
447 + " interesting=" + numInteresting
448 + " drawn=" + wtoken.numDrawnWindows);
449 wtoken.allDrawn = true;
450 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700451 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700452 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
453 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700454 }
Craig Mautner764983d2012-03-22 11:37:36 -0700455
456 // We can now show all of the drawn windows!
457 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700458 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700459 }
460 }
461 }
462 }
463 }
464
465 private void performAnimationsLocked() {
Craig Mautner01cd0e72012-06-18 10:19:11 -0700466 mInner.mTokenMayBeDrawn = false;
467 mInner.mForceHiding = false;
468 mInner.mDetachedWallpaper = null;
469 mInner.mWindowAnimationBackground = null;
470 mInner.mWindowAnimationBackgroundColor = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700471
472 updateWindowsAndWallpaperLocked();
Craig Mautner4d7349b2012-04-20 14:52:47 -0700473 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
474 mPendingActions |= WALLPAPER_ACTION_PENDING;
475 }
Craig Mautner764983d2012-03-22 11:37:36 -0700476
Craig Mautner01cd0e72012-06-18 10:19:11 -0700477 if (mInner.mTokenMayBeDrawn) {
Craig Mautner764983d2012-03-22 11:37:36 -0700478 testTokenMayBeDrawnLocked();
479 }
Craig Mautner764983d2012-03-22 11:37:36 -0700480 }
481
Craig Mautner4d7349b2012-04-20 14:52:47 -0700482 synchronized void animate() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700483 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700484 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautnera608b882012-03-30 13:03:49 -0700485 mBulkUpdateParams = 0;
Chet Haase198e5642012-05-10 09:55:15 -0700486 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700487 mAnimating = false;
488 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
489 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
490 }
Craig Mautner764983d2012-03-22 11:37:36 -0700491
492 // Update animations of all applications, including those
493 // associated with exiting/removed apps
494 Surface.openTransaction();
495
496 try {
497 updateWindowsAppsAndRotationAnimationsLocked();
498 performAnimationsLocked();
Craig Mautner8a197a42012-04-24 16:59:36 -0700499 testWallpaperAndBackgroundLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700500
501 // THIRD LOOP: Update the surfaces of all windows.
502
503 if (mScreenRotationAnimation != null) {
504 mScreenRotationAnimation.updateSurfaces();
505 }
506
Craig Mautner7358fbf2012-04-12 21:06:33 -0700507 final int N = mWinAnimators.size();
508 for (int i = 0; i < N; i++) {
Craig Mautner0fa77c12012-06-11 15:57:19 -0700509 mWinAnimators.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700510 }
511
Craig Mautner6af9b922012-04-05 19:25:51 -0700512 if (mDimParams != null) {
513 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
514 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700515 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700516 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700517 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700518 }
519
520 if (mService.mBlackFrame != null) {
521 if (mScreenRotationAnimation != null) {
522 mService.mBlackFrame.setMatrix(
523 mScreenRotationAnimation.getEnterTransformation().getMatrix());
524 } else {
525 mService.mBlackFrame.clearMatrix();
526 }
527 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700528
529 if (mService.mWatermark != null) {
530 mService.mWatermark.drawIfNeeded();
531 }
Craig Mautner764983d2012-03-22 11:37:36 -0700532 } catch (RuntimeException e) {
533 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
534 } finally {
535 Surface.closeTransaction();
536 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700537
Craig Mautner01cd0e72012-06-18 10:19:11 -0700538 if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
539 final WindowManagerService.AnimatorToLayoutParams animToLayout = mService.mAnimToLayout;
540 synchronized (animToLayout) {
541 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
542 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
543 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
544 mService.setAnimatorParameters();
545 }
546 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700547
548 if (mAnimating) {
549 mService.scheduleAnimationLocked();
Chet Haase198e5642012-05-10 09:55:15 -0700550 } else if (wasAnimating) {
551 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700552 }
553 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
554 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
555 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
556 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
557 }
Craig Mautner764983d2012-03-22 11:37:36 -0700558 }
559
560 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700561 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700562 mCurrentFocus = currentFocus;
563 }
564
565 void setDisplayDimensions(final int curWidth, final int curHeight,
566 final int appWidth, final int appHeight) {
567 mDw = curWidth;
568 mDh = curHeight;
569 mInnerDw = appWidth;
570 mInnerDh = appHeight;
571 }
572
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700573 void startDimming(final WindowStateAnimator winAnimator, final float target,
574 final int width, final int height) {
575 if (mDimAnimator == null) {
576 mDimAnimator = new DimAnimator(mService.mFxSession);
577 }
Craig Mautner067ca322012-05-18 17:19:51 -0700578 // Only set dim params on the highest dimmed layer.
579 final WindowStateAnimator dimWinAnimator = mDimParams == null
580 ? null : mDimParams.mDimWinAnimator;
581 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
582 if (winAnimator.mSurfaceShown &&
583 (dimWinAnimator == null || !dimWinAnimator.mSurfaceShown
584 || dimWinAnimator.mAnimLayer < winAnimator.mAnimLayer)) {
585 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
586 new DimAnimator.Parameters(winAnimator, width, height, target)));
587 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700588 }
589
590 // TODO(cmautner): Move into Handler
591 void stopDimming() {
592 mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
593 }
594
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700595 boolean isDimming() {
596 return mDimParams != null;
597 }
598
Craig Mautneracafd192012-05-10 10:41:02 -0700599 boolean isDimming(final WindowStateAnimator winAnimator) {
600 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
601 }
602
Craig Mautnere7ae2502012-03-26 17:11:19 -0700603 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
604 if (mWindowDetachedWallpaper != null) {
605 pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
606 }
607 if (mWindowAnimationBackgroundSurface != null) {
608 pw.println(" mWindowAnimationBackgroundSurface:");
609 mWindowAnimationBackgroundSurface.printTo(" ", pw);
610 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700611 if (mDimAnimator != null) {
612 pw.println(" mDimAnimator:");
613 mDimAnimator.printTo(" ", pw);
614 } else {
615 pw.println( " no DimAnimator ");
616 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700617 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700618
619 static class SetAnimationParams {
620 final WindowStateAnimator mWinAnimator;
621 final Animation mAnimation;
622 final int mAnimDw;
623 final int mAnimDh;
624 public SetAnimationParams(final WindowStateAnimator winAnimator,
625 final Animation animation, final int animDw, final int animDh) {
626 mWinAnimator = winAnimator;
627 mAnimation = animation;
628 mAnimDw = animDw;
629 mAnimDh = animDh;
630 }
631 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700632
633 synchronized void clearPendingActions() {
634 mPendingActions = 0;
635 }
Craig Mautner764983d2012-03-22 11:37:36 -0700636}