blob: af373e4adf1e4908ca900acf01a580ae1362a399 [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;
Craig Mautner2639da52012-07-09 09:39:06 -070011import static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070012
Craig Mautner711f90a2012-07-03 18:43:52 -070013import static com.android.server.wm.WindowManagerService.H.UPDATE_ANIM_PARAMETERS;
Craig Mautnera608b882012-03-30 13:03:49 -070014
Craig Mautner764983d2012-03-22 11:37:36 -070015import android.content.Context;
16import android.os.SystemClock;
17import android.util.Log;
18import android.util.Slog;
19import android.view.Surface;
Craig Mautner764983d2012-03-22 11:37:36 -070020import android.view.WindowManagerPolicy;
21import android.view.animation.Animation;
Craig Mautner764983d2012-03-22 11:37:36 -070022
23import com.android.internal.policy.impl.PhoneWindowManager;
Craig Mautner711f90a2012-07-03 18:43:52 -070024import com.android.server.wm.WindowManagerService.AnimatorToLayoutParams;
25import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;
Craig Mautner764983d2012-03-22 11:37:36 -070026
Craig Mautnere7ae2502012-03-26 17:11:19 -070027import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070028import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070029
Craig Mautner764983d2012-03-22 11:37:36 -070030/**
Craig Mautner764983d2012-03-22 11:37:36 -070031 * Singleton class that carries out the animations and Surface operations in a separate task
32 * on behalf of WindowManagerService.
33 */
34public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070035 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070036
37 final WindowManagerService mService;
38 final Context mContext;
39 final WindowManagerPolicy mPolicy;
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
Craig Mautner1caa3992012-06-22 09:46:48 -070045 final Runnable mAnimationRunnable;
46
Craig Mautner764983d2012-03-22 11:37:36 -070047 int mAdjResult;
48
49 int mPendingLayoutChanges;
50
51 /** Overall window dimensions */
52 int mDw, mDh;
53
54 /** Interior window dimensions */
55 int mInnerDw, mInnerDh;
56
57 /** Time of current animation step. Reset on each iteration */
58 long mCurrentTime;
59
60 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
61 * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
Craig Mautner6fbda632012-07-03 09:26:39 -070062 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070063
64 /** The one and only screen rotation if one is happening */
65 ScreenRotationAnimation mScreenRotationAnimation = null;
66
Craig Mautnere7ae2502012-03-26 17:11:19 -070067 // Window currently running an animation that has requested it be detached
68 // from the wallpaper. This means we need to ensure the wallpaper is
69 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070070 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070071 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070072
Craig Mautnere7ae2502012-03-26 17:11:19 -070073 DimSurface mWindowAnimationBackgroundSurface = null;
74
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070075 WindowStateAnimator mUniverseBackground = null;
76 int mAboveUniverseLayer = 0;
77
Craig Mautnera608b882012-03-30 13:03:49 -070078 int mBulkUpdateParams = 0;
79
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070080 DimAnimator mDimAnimator = null;
81 DimAnimator.Parameters mDimParams = null;
82
Craig Mautner4d7349b2012-04-20 14:52:47 -070083 static final int WALLPAPER_ACTION_PENDING = 1;
84 int mPendingActions;
85
Craig Mautner1caa3992012-06-22 09:46:48 -070086 WindowState mWallpaperTarget = null;
87
Craig Mautner711f90a2012-07-03 18:43:52 -070088 final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();
89
Craig Mautner764983d2012-03-22 11:37:36 -070090 WindowAnimator(final WindowManagerService service, final Context context,
91 final WindowManagerPolicy policy) {
92 mService = service;
93 mContext = context;
94 mPolicy = policy;
Craig Mautner1caa3992012-06-22 09:46:48 -070095
96 mAnimationRunnable = new Runnable() {
97 @Override
98 public void run() {
99 // TODO(cmautner): When full isolation is achieved for animation, the first lock
100 // goes away and only the WindowAnimator.this remains.
101 synchronized(mService.mWindowMap) {
102 synchronized(WindowAnimator.this) {
103 copyLayoutToAnimParamsLocked();
104 animateLocked();
105 }
106 }
107 }
108 };
Craig Mautner9e809442012-06-22 17:13:04 -0700109
110 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
Craig Mautnera76fdb72012-07-03 19:03:02 -0700111 mDimAnimator = new DimAnimator(mService.mFxSession);
Craig Mautner1caa3992012-06-22 09:46:48 -0700112 }
113
Craig Mautner711f90a2012-07-03 18:43:52 -0700114 /** Locked on mAnimToLayout */
115 void updateAnimToLayoutLocked() {
116 final AnimatorToLayoutParams animToLayout = mAnimToLayout;
117 synchronized (animToLayout) {
118 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
119 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges;
120 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
121
122 if (!animToLayout.mUpdateQueued) {
123 animToLayout.mUpdateQueued = true;
124 mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
125 }
126 }
127 }
128
Craig Mautner1caa3992012-06-22 09:46:48 -0700129 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
130 private void copyLayoutToAnimParamsLocked() {
Craig Mautner711f90a2012-07-03 18:43:52 -0700131 final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
Craig Mautner1caa3992012-06-22 09:46:48 -0700132 synchronized(layoutToAnim) {
133 layoutToAnim.mAnimationScheduled = false;
134
135 mWinAnimators = new ArrayList<WindowStateAnimator>(layoutToAnim.mWinAnimators);
136 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
Craig Mautnera76fdb72012-07-03 19:03:02 -0700137
138 // Set the new DimAnimator params.
139 DimAnimator.Parameters dimParams = layoutToAnim.mDimParams;
140 if (dimParams == null) {
141 mDimParams = dimParams;
142 } else {
143 final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
144
145 // Only set dim params on the highest dimmed layer.
146 final WindowStateAnimator existingDimWinAnimator = mDimParams == null
147 ? null : mDimParams.mDimWinAnimator;
148 // Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
149 if (newWinAnimator.mSurfaceShown &&
150 (existingDimWinAnimator == null || !existingDimWinAnimator.mSurfaceShown
151 || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
152 mDimParams = dimParams;
153 }
154 }
Craig Mautner1caa3992012-06-22 09:46:48 -0700155 }
156 }
157
Craig Mautnerb9836b92012-06-11 11:40:09 -0700158 void hideWallpapersLocked(final WindowState w) {
159 if ((mService.mWallpaperTarget == w && mService.mLowerWallpaperTarget == null)
160 || mService.mWallpaperTarget == null) {
161 for (final WindowToken token : mService.mWallpaperTokens) {
162 for (final WindowState wallpaper : token.windows) {
163 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
164 if (!winAnimator.mLastHidden) {
165 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700166 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700167 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
168 }
169 }
170 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700171 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700172 }
173 }
174
Craig Mautner764983d2012-03-22 11:37:36 -0700175 private void updateWindowsAppsAndRotationAnimationsLocked() {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700176 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
Craig Mautner764983d2012-03-22 11:37:36 -0700177 int i;
Craig Mautneref25d7a2012-05-15 23:01:47 -0700178 final int NAT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700179 for (i=0; i<NAT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700180 final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700181 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700182 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700183 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700184 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700185 } else if (wasAnimating) {
186 // stopped animating, do one more pass through the layout
187 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700188 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner59431632012-04-04 11:56:44 -0700189 mService.debugLayoutRepeats("appToken " + appAnimator.mAppToken + " done",
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700190 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700191 }
Craig Mautner83339b42012-05-01 22:13:23 -0700192 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
193 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700194 }
195 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700196
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700197 final int NEAT = mService.mExitingAppTokens.size();
198 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700199 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700200 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700201 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700202 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700203 mAnimating = true;
204 } else if (wasAnimating) {
205 // stopped animating, do one more pass through the layout
206 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700207 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner83339b42012-05-01 22:13:23 -0700208 mService.debugLayoutRepeats("exiting appToken " + appAnimator.mAppToken
Craig Mautner59431632012-04-04 11:56:44 -0700209 + " done", mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700210 }
Craig Mautner83339b42012-05-01 22:13:23 -0700211 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
212 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700213 }
214 }
215
Dianne Hackborn187ae2102012-04-11 18:12:06 -0700216 if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
Craig Mautner764983d2012-03-22 11:37:36 -0700217 if (mScreenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700218 mAnimating = true;
219 } else {
Craig Mautnera608b882012-03-30 13:03:49 -0700220 mBulkUpdateParams |= SET_UPDATE_ROTATION;
Craig Mautner764983d2012-03-22 11:37:36 -0700221 mScreenRotationAnimation.kill();
222 mScreenRotationAnimation = null;
223 }
224 }
225 }
226
Craig Mautner078ea0a2012-06-25 11:04:29 -0700227 private void updateWindowsLocked() {
Craig Mautner6fbda632012-07-03 09:26:39 -0700228 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700229
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700230 ArrayList<WindowStateAnimator> unForceHiding = null;
231 boolean wallpaperInUnForceHiding = false;
232
Craig Mautner078ea0a2012-06-25 11:04:29 -0700233 boolean forceHiding = false;
Craig Mautner01cd0e72012-06-18 10:19:11 -0700234 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
235 WindowStateAnimator winAnimator = mWinAnimators.get(i);
236 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700237 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700238
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700239 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700240 final boolean wasAnimating = winAnimator.mWasAnimating;
241 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700242
243 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700244 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700245 ", nowAnimating=" + nowAnimating);
246 }
247
Craig Mautnerbec53f72012-04-05 11:49:05 -0700248 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700249 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700250 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700251 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700252 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
253 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700254 }
Craig Mautner764983d2012-03-22 11:37:36 -0700255 }
256
Craig Mautnerbec53f72012-04-05 11:49:05 -0700257 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700258 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700259 if (WindowManagerService.DEBUG_ANIM ||
260 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
261 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700262 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner764983d2012-03-22 11:37:36 -0700263 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700264 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700265 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
266 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700267 }
Craig Mautner764983d2012-03-22 11:37:36 -0700268 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700269 }
Craig Mautnerf12100e2012-06-25 11:13:24 -0700270 if (win.isReadyForDisplay() && winAnimator.mAnimationIsEntrance) {
Craig Mautner078ea0a2012-06-25 11:04:29 -0700271 forceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700272 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700273 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner078ea0a2012-06-25 11:04:29 -0700274 "Force hide " + forceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700275 + " hasSurface=" + win.mHasSurface
276 + " policyVis=" + win.mPolicyVisibility
277 + " destroying=" + win.mDestroying
278 + " attHidden=" + win.mAttachedHidden
279 + " vis=" + win.mViewVisibility
280 + " hidden=" + win.mRootToken.hidden
281 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700282 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700283 final boolean changed;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700284 if (forceHiding && (!winAnimator.isAnimating()
Craig Mautnerf12100e2012-06-25 11:13:24 -0700285 || (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700286 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700287 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700288 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700289 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700290 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700291 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700292 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700293 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700294 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700295 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700296 if (unForceHiding == null) {
297 unForceHiding = new ArrayList<WindowStateAnimator>();
298 }
299 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700300 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700301 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700302 }
303 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700304 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700305 // We are showing on to of the current
306 // focus, so re-evaluate focus to make
307 // sure it is correct.
308 mService.mFocusMayChange = true;
309 }
310 }
311 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700312 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700313 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner764983d2012-03-22 11:37:36 -0700314 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700315 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700316 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
317 mPendingLayoutChanges);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700318 }
Craig Mautner764983d2012-03-22 11:37:36 -0700319 }
320 }
321 }
322
Craig Mautnerbec53f72012-04-05 11:49:05 -0700323 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700324 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
325 if (atoken == null || atoken.allDrawn) {
326 if (winAnimator.performShowLocked()) {
327 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
328 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
329 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
330 mPendingLayoutChanges);
Craig Mautner764983d2012-03-22 11:37:36 -0700331 }
332 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700333 }
Craig Mautner764983d2012-03-22 11:37:36 -0700334 }
Craig Mautner59431632012-04-04 11:56:44 -0700335 final AppWindowAnimator appAnimator =
336 atoken == null ? null : atoken.mAppAnimator;
337 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700338 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
339 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700340 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700341 }
Craig Mautner59431632012-04-04 11:56:44 -0700342 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
343 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700344 }
345 }
Craig Mautner764983d2012-03-22 11:37:36 -0700346 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700347
Craig Mautner078ea0a2012-06-25 11:04:29 -0700348 // If we have windows that are being show due to them no longer
349 // being force-hidden, apply the appropriate animation to them.
350 if (unForceHiding != null) {
351 for (int i=unForceHiding.size()-1; i>=0; i--) {
352 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
353 if (a != null) {
354 final WindowStateAnimator winAnimator = unForceHiding.get(i);
355 winAnimator.setAnimation(a);
356 winAnimator.mAnimationIsEntrance = true;
357 }
358 }
359 }
360 }
361
362 private void updateWallpaperLocked() {
363 WindowStateAnimator windowAnimationBackground = null;
364 int windowAnimationBackgroundColor = 0;
365 WindowState detachedWallpaper = null;
366
367 for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
368 WindowStateAnimator winAnimator = mWinAnimators.get(i);
369 if (winAnimator.mSurface == null) {
370 continue;
371 }
372
373 final int flags = winAnimator.mAttrFlags;
374 final WindowState win = winAnimator.mWin;
375
376 // If this window is animating, make a note that we have
377 // an animating window and take care of a request to run
378 // a detached wallpaper animation.
379 if (winAnimator.mAnimating) {
380 if (winAnimator.mAnimation != null) {
381 if ((flags & FLAG_SHOW_WALLPAPER) != 0
382 && winAnimator.mAnimation.getDetachWallpaper()) {
383 detachedWallpaper = win;
384 }
385 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
386 if (backgroundColor != 0) {
387 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
388 windowAnimationBackground.mAnimLayer)) {
389 windowAnimationBackground = winAnimator;
390 windowAnimationBackgroundColor = backgroundColor;
391 }
392 }
393 }
394 mAnimating = true;
395 }
396
397 // If this window's app token is running a detached wallpaper
398 // animation, make a note so we can ensure the wallpaper is
399 // displayed behind it.
400 final AppWindowAnimator appAnimator =
401 win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
402 if (appAnimator != null && appAnimator.animation != null
403 && appAnimator.animating) {
404 if ((flags & FLAG_SHOW_WALLPAPER) != 0
405 && appAnimator.animation.getDetachWallpaper()) {
406 detachedWallpaper = win;
407 }
408
409 final int backgroundColor = appAnimator.animation.getBackgroundColor();
410 if (backgroundColor != 0) {
411 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
412 windowAnimationBackground.mAnimLayer)) {
413 windowAnimationBackground = winAnimator;
414 windowAnimationBackgroundColor = backgroundColor;
415 }
416 }
417 }
418 } // end forall windows
419
Craig Mautner9e809442012-06-22 17:13:04 -0700420 if (mWindowDetachedWallpaper != detachedWallpaper) {
421 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
422 "Detached wallpaper changed from " + mWindowDetachedWallpaper
423 + " to " + detachedWallpaper);
424 mWindowDetachedWallpaper = detachedWallpaper;
425 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
426 }
427
428 if (windowAnimationBackgroundColor != 0) {
429 // If the window that wants black is the current wallpaper
430 // target, then the black goes *below* the wallpaper so we
431 // don't cause the wallpaper to suddenly disappear.
432 int animLayer = windowAnimationBackground.mAnimLayer;
433 WindowState win = windowAnimationBackground.mWin;
434 if (windowAnimationBackground != null && mService.mWallpaperTarget == win
435 || mService.mLowerWallpaperTarget == win
436 || mService.mUpperWallpaperTarget == win) {
437 final int N = mWinAnimators.size();
438 for (int i = 0; i < N; i++) {
439 WindowStateAnimator winAnimator = mWinAnimators.get(i);
440 if (winAnimator.mWin.mIsWallpaper) {
441 animLayer = winAnimator.mAnimLayer;
442 break;
443 }
444 }
445 }
446
Craig Mautner078ea0a2012-06-25 11:04:29 -0700447 mWindowAnimationBackgroundSurface.show(mDw, mDh,
Craig Mautner9e809442012-06-22 17:13:04 -0700448 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
449 windowAnimationBackgroundColor);
450 } else {
451 mWindowAnimationBackgroundSurface.hide();
452 }
Craig Mautner764983d2012-03-22 11:37:36 -0700453 }
454
455 private void testTokenMayBeDrawnLocked() {
456 // See if any windows have been drawn, so they (and others
457 // associated with them) can now be shown.
Craig Mautneref25d7a2012-05-15 23:01:47 -0700458 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
459 final int NT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700460 for (int i=0; i<NT; i++) {
Craig Mautneref25d7a2012-05-15 23:01:47 -0700461 AppWindowToken wtoken = appTokens.get(i);
Craig Mautner6fbda632012-07-03 09:26:39 -0700462 final boolean allDrawn = wtoken.allDrawn;
463 if (allDrawn != wtoken.mAppAnimator.allDrawn) {
464 wtoken.mAppAnimator.allDrawn = allDrawn;
465 if (allDrawn) {
466 // The token has now changed state to having all
467 // windows shown... what to do, what to do?
468 if (wtoken.mAppAnimator.freezingScreen) {
469 wtoken.mAppAnimator.showAllWindowsLocked();
470 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
471 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
472 "Setting mOrientationChangeComplete=true because wtoken "
473 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
474 + " numDrawn=" + wtoken.numDrawnWindows);
475 // This will set mOrientationChangeComplete and cause a pass through layout.
476 mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
477 } else {
478 mPendingLayoutChanges |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
479 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
480 mService.debugLayoutRepeats("testTokenMayBeDrawnLocked",
481 mPendingLayoutChanges);
482 }
Craig Mautner764983d2012-03-22 11:37:36 -0700483
Craig Mautner6fbda632012-07-03 09:26:39 -0700484 // We can now show all of the drawn windows!
485 if (!mService.mOpeningApps.contains(wtoken)) {
486 mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
487 }
Craig Mautner764983d2012-03-22 11:37:36 -0700488 }
489 }
490 }
491 }
492 }
493
494 private void performAnimationsLocked() {
Craig Mautner078ea0a2012-06-25 11:04:29 -0700495 updateWindowsLocked();
496 updateWallpaperLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700497
Craig Mautner4d7349b2012-04-20 14:52:47 -0700498 if ((mPendingLayoutChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
499 mPendingActions |= WALLPAPER_ACTION_PENDING;
500 }
Craig Mautner764983d2012-03-22 11:37:36 -0700501
Craig Mautner6fbda632012-07-03 09:26:39 -0700502 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700503 }
504
Craig Mautner1caa3992012-06-22 09:46:48 -0700505 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
506 /** Locked on mService.mWindowMap and this. */
507 private void animateLocked() {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700508 mPendingLayoutChanges = 0;
Craig Mautner764983d2012-03-22 11:37:36 -0700509 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700510 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700511 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700512 mAnimating = false;
513 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
514 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
515 }
Craig Mautner764983d2012-03-22 11:37:36 -0700516
517 // Update animations of all applications, including those
518 // associated with exiting/removed apps
519 Surface.openTransaction();
520
521 try {
522 updateWindowsAppsAndRotationAnimationsLocked();
523 performAnimationsLocked();
524
525 // THIRD LOOP: Update the surfaces of all windows.
526
527 if (mScreenRotationAnimation != null) {
528 mScreenRotationAnimation.updateSurfaces();
529 }
530
Craig Mautner7358fbf2012-04-12 21:06:33 -0700531 final int N = mWinAnimators.size();
532 for (int i = 0; i < N; i++) {
Craig Mautner0fa77c12012-06-11 15:57:19 -0700533 mWinAnimators.get(i).prepareSurfaceLocked(true);
Craig Mautner764983d2012-03-22 11:37:36 -0700534 }
535
Craig Mautner6af9b922012-04-05 19:25:51 -0700536 if (mDimParams != null) {
537 mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime);
538 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700539 if (mDimAnimator != null && mDimAnimator.mDimShown) {
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700540 mAnimating |= mDimAnimator.updateSurface(isDimming(), mCurrentTime,
Craig Mautner6af9b922012-04-05 19:25:51 -0700541 !mService.okToDisplay());
Craig Mautner764983d2012-03-22 11:37:36 -0700542 }
543
544 if (mService.mBlackFrame != null) {
545 if (mScreenRotationAnimation != null) {
546 mService.mBlackFrame.setMatrix(
547 mScreenRotationAnimation.getEnterTransformation().getMatrix());
548 } else {
549 mService.mBlackFrame.clearMatrix();
550 }
551 }
Craig Mautner7358fbf2012-04-12 21:06:33 -0700552
553 if (mService.mWatermark != null) {
554 mService.mWatermark.drawIfNeeded();
555 }
Craig Mautner764983d2012-03-22 11:37:36 -0700556 } catch (RuntimeException e) {
557 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
558 } finally {
559 Surface.closeTransaction();
560 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700561
Craig Mautner01cd0e72012-06-18 10:19:11 -0700562 if (mBulkUpdateParams != 0 || mPendingLayoutChanges != 0) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700563 updateAnimToLayoutLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700564 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700565
566 if (mAnimating) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700567 synchronized (mService.mLayoutToAnim) {
568 mService.scheduleAnimationLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -0700569 }
Chet Haase198e5642012-05-10 09:55:15 -0700570 } else if (wasAnimating) {
571 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700572 }
573 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
574 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
575 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
576 + " mPendingLayoutChanges=" + Integer.toHexString(mPendingLayoutChanges));
577 }
Craig Mautner764983d2012-03-22 11:37:36 -0700578 }
579
580 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700581 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700582 mCurrentFocus = currentFocus;
583 }
584
585 void setDisplayDimensions(final int curWidth, final int curHeight,
586 final int appWidth, final int appHeight) {
587 mDw = curWidth;
588 mDh = curHeight;
589 mInnerDw = appWidth;
590 mInnerDh = appHeight;
591 }
592
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700593 boolean isDimming() {
594 return mDimParams != null;
595 }
596
Craig Mautneracafd192012-05-10 10:41:02 -0700597 boolean isDimming(final WindowStateAnimator winAnimator) {
598 return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
599 }
600
Craig Mautnere7ae2502012-03-26 17:11:19 -0700601 public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700602 if (dumpAll) {
603 if (mWindowDetachedWallpaper != null) {
604 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
605 pw.println(mWindowDetachedWallpaper);
606 }
607 pw.print(prefix); pw.print("mAnimTransactionSequence=");
608 pw.println(mAnimTransactionSequence);
609 if (mWindowAnimationBackgroundSurface != null) {
610 pw.print(prefix); pw.print("mWindowAnimationBackgroundSurface:");
611 mWindowAnimationBackgroundSurface.printTo(prefix + " ", pw);
612 }
613 if (mDimAnimator != null) {
614 pw.print(prefix); pw.print("mDimAnimator:");
615 mDimAnimator.printTo(prefix + " ", pw);
616 } else {
617 pw.print(prefix); pw.print("no DimAnimator ");
618 }
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700619 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700620 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700621
622 static class SetAnimationParams {
623 final WindowStateAnimator mWinAnimator;
624 final Animation mAnimation;
625 final int mAnimDw;
626 final int mAnimDh;
627 public SetAnimationParams(final WindowStateAnimator winAnimator,
628 final Animation animation, final int animDw, final int animDh) {
629 mWinAnimator = winAnimator;
630 mAnimation = animation;
631 mAnimDw = animDw;
632 mAnimDh = animDh;
633 }
634 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700635
636 synchronized void clearPendingActions() {
637 mPendingActions = 0;
638 }
Craig Mautner764983d2012-03-22 11:37:36 -0700639}