blob: 54914c2f00d185c813f24672b8f5d198ad3b1855 [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;
Dianne Hackborn98129732012-11-01 16:28:16 -070016import android.os.Debug;
Craig Mautner764983d2012-03-22 11:37:36 -070017import android.os.SystemClock;
18import android.util.Log;
19import android.util.Slog;
Craig Mautnera91f9e22012-09-14 16:22:08 -070020import android.util.SparseArray;
Craig Mautner76a71652012-09-03 23:23:58 -070021import android.util.SparseIntArray;
Dianne Hackborn529e7442012-11-01 14:22:28 -070022import android.util.TimeUtils;
Craig Mautner6881a102012-07-27 13:04:51 -070023import android.view.Display;
Craig Mautner764983d2012-03-22 11:37:36 -070024import android.view.Surface;
Craig Mautner764983d2012-03-22 11:37:36 -070025import android.view.WindowManagerPolicy;
26import android.view.animation.Animation;
Craig Mautner764983d2012-03-22 11:37:36 -070027
Craig Mautner322e4032012-07-13 13:35:20 -070028import com.android.server.wm.WindowManagerService.AppWindowAnimParams;
Dianne Hackborn529e7442012-11-01 14:22:28 -070029import com.android.server.wm.WindowManagerService.LayoutFields;
Craig Mautner711f90a2012-07-03 18:43:52 -070030import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;
Craig Mautner764983d2012-03-22 11:37:36 -070031
Craig Mautnere7ae2502012-03-26 17:11:19 -070032import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070033import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070034
Craig Mautner764983d2012-03-22 11:37:36 -070035/**
Craig Mautner764983d2012-03-22 11:37:36 -070036 * Singleton class that carries out the animations and Surface operations in a separate task
37 * on behalf of WindowManagerService.
38 */
39public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070040 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070041
42 final WindowManagerService mService;
43 final Context mContext;
44 final WindowManagerPolicy mPolicy;
45
46 boolean mAnimating;
Craig Mautner01cd0e72012-06-18 10:19:11 -070047
Craig Mautner1caa3992012-06-22 09:46:48 -070048 final Runnable mAnimationRunnable;
49
Craig Mautner764983d2012-03-22 11:37:36 -070050 int mAdjResult;
51
Craig Mautner76a71652012-09-03 23:23:58 -070052 // Layout changes for individual Displays. Indexed by displayId.
53 SparseIntArray mPendingLayoutChanges = new SparseIntArray();
Craig Mautner764983d2012-03-22 11:37:36 -070054
Craig Mautner69b08182012-09-05 13:07:13 -070055 // TODO: Assign these from each iteration through DisplayContent. Only valid between loops.
Craig Mautner764983d2012-03-22 11:37:36 -070056 /** Overall window dimensions */
57 int mDw, mDh;
58
59 /** Interior window dimensions */
60 int mInnerDw, mInnerDh;
61
62 /** Time of current animation step. Reset on each iteration */
63 long mCurrentTime;
64
65 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
66 * 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 -070067 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070068
Craig Mautnere7ae2502012-03-26 17:11:19 -070069 // Window currently running an animation that has requested it be detached
70 // from the wallpaper. This means we need to ensure the wallpaper is
71 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070072 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070073 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070074
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 Mautnera91f9e22012-09-14 16:22:08 -070080 SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators =
81 new SparseArray<WindowAnimator.DisplayContentsAnimator>();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070082
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;
Craig Mautner918b53b2012-07-09 14:15:54 -070087 AppWindowAnimator mWpAppAnimator = null;
88 WindowState mLowerWallpaperTarget = null;
89 WindowState mUpperWallpaperTarget = null;
Craig Mautner1caa3992012-06-22 09:46:48 -070090
Craig Mautner322e4032012-07-13 13:35:20 -070091 ArrayList<AppWindowAnimator> mAppAnimators = new ArrayList<AppWindowAnimator>();
92
Craig Mautner918b53b2012-07-09 14:15:54 -070093 ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
94
95 /** Parameters being passed from this into mService. */
96 static class AnimatorToLayoutParams {
97 boolean mUpdateQueued;
98 int mBulkUpdateParams;
Craig Mautner76a71652012-09-03 23:23:58 -070099 SparseIntArray mPendingLayoutChanges;
Craig Mautner918b53b2012-07-09 14:15:54 -0700100 WindowState mWindowDetachedWallpaper;
101 }
102 /** Do not modify unless holding mService.mWindowMap or this and mAnimToLayout in that order */
Craig Mautner711f90a2012-07-03 18:43:52 -0700103 final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();
104
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700105 boolean mInitialized = false;
106
Craig Mautner178af592012-09-17 10:37:29 -0700107 // forceHiding states.
108 static final int KEYGUARD_NOT_SHOWN = 0;
109 static final int KEYGUARD_ANIMATING_IN = 1;
110 static final int KEYGUARD_SHOWN = 2;
111 static final int KEYGUARD_ANIMATING_OUT = 3;
112 int mForceHiding = KEYGUARD_NOT_SHOWN;
113
114 private String forceHidingToString() {
115 switch (mForceHiding) {
116 case KEYGUARD_NOT_SHOWN: return "KEYGUARD_NOT_SHOWN";
117 case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN";
118 case KEYGUARD_SHOWN: return "KEYGUARD_SHOWN";
119 case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT";
120 default: return "KEYGUARD STATE UNKNOWN " + mForceHiding;
121 }
122 }
123
Craig Mautner918b53b2012-07-09 14:15:54 -0700124 WindowAnimator(final WindowManagerService service) {
Craig Mautner764983d2012-03-22 11:37:36 -0700125 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -0700126 mContext = service.mContext;
127 mPolicy = service.mPolicy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700128
129 mAnimationRunnable = new Runnable() {
130 @Override
131 public void run() {
132 // TODO(cmautner): When full isolation is achieved for animation, the first lock
133 // goes away and only the WindowAnimator.this remains.
134 synchronized(mService.mWindowMap) {
135 synchronized(WindowAnimator.this) {
136 copyLayoutToAnimParamsLocked();
137 animateLocked();
138 }
139 }
140 }
141 };
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700142 }
Craig Mautner9e809442012-06-22 17:13:04 -0700143
Craig Mautnera91f9e22012-09-14 16:22:08 -0700144 void addDisplayLocked(final int displayId) {
Craig Mautnerac439e52012-09-21 08:58:34 -0700145 // Create the DisplayContentsAnimator object by retrieving it.
146 getDisplayContentsAnimatorLocked(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700147 if (displayId == Display.DEFAULT_DISPLAY) {
148 mInitialized = true;
149 }
150 }
151
152 void removeDisplayLocked(final int displayId) {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700153 final DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
154 if (displayAnimator != null) {
155 if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
156 displayAnimator.mWindowAnimationBackgroundSurface.kill();
157 displayAnimator.mWindowAnimationBackgroundSurface = null;
158 }
159 if (displayAnimator.mScreenRotationAnimation != null) {
160 displayAnimator.mScreenRotationAnimation.kill();
161 displayAnimator.mScreenRotationAnimation = null;
162 }
163 if (displayAnimator.mDimAnimator != null) {
164 displayAnimator.mDimAnimator.kill();
165 displayAnimator.mDimAnimator = null;
166 }
167 }
168
Craig Mautnera91f9e22012-09-14 16:22:08 -0700169 mDisplayContentsAnimators.delete(displayId);
Craig Mautner1caa3992012-06-22 09:46:48 -0700170 }
171
Craig Mautner711f90a2012-07-03 18:43:52 -0700172 /** Locked on mAnimToLayout */
173 void updateAnimToLayoutLocked() {
174 final AnimatorToLayoutParams animToLayout = mAnimToLayout;
175 synchronized (animToLayout) {
176 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
Craig Mautner76a71652012-09-03 23:23:58 -0700177 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges.clone();
Craig Mautner711f90a2012-07-03 18:43:52 -0700178 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
179
180 if (!animToLayout.mUpdateQueued) {
181 animToLayout.mUpdateQueued = true;
182 mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
183 }
184 }
185 }
186
Craig Mautner1caa3992012-06-22 09:46:48 -0700187 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
188 private void copyLayoutToAnimParamsLocked() {
Craig Mautner711f90a2012-07-03 18:43:52 -0700189 final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
Craig Mautner1caa3992012-06-22 09:46:48 -0700190 synchronized(layoutToAnim) {
191 layoutToAnim.mAnimationScheduled = false;
192
Craig Mautner322e4032012-07-13 13:35:20 -0700193 if (!layoutToAnim.mParamsModified) {
194 return;
195 }
196 layoutToAnim.mParamsModified = false;
197
Craig Mautner918b53b2012-07-09 14:15:54 -0700198 if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) {
199 layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED;
200 mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
201 }
202
Dianne Hackborn529e7442012-11-01 14:22:28 -0700203 if (WindowManagerService.DEBUG_WALLPAPER_LIGHT) {
204 if (mWallpaperTarget != layoutToAnim.mWallpaperTarget
205 || mLowerWallpaperTarget != layoutToAnim.mLowerWallpaperTarget
206 || mUpperWallpaperTarget != layoutToAnim.mUpperWallpaperTarget) {
Dianne Hackborn98129732012-11-01 16:28:16 -0700207 Slog.d(TAG, "Pulling anim wallpaper: target=" + layoutToAnim.mWallpaperTarget
208 + " lower=" + layoutToAnim.mLowerWallpaperTarget + " upper="
209 + layoutToAnim.mUpperWallpaperTarget);
Dianne Hackborn529e7442012-11-01 14:22:28 -0700210 }
211 }
Craig Mautner1caa3992012-06-22 09:46:48 -0700212 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
Craig Mautner918b53b2012-07-09 14:15:54 -0700213 mWpAppAnimator = mWallpaperTarget == null
214 ? null : mWallpaperTarget.mAppToken == null
215 ? null : mWallpaperTarget.mAppToken.mAppAnimator;
216 mLowerWallpaperTarget = layoutToAnim.mLowerWallpaperTarget;
217 mUpperWallpaperTarget = layoutToAnim.mUpperWallpaperTarget;
Craig Mautnera76fdb72012-07-03 19:03:02 -0700218
219 // Set the new DimAnimator params.
Craig Mautnera91f9e22012-09-14 16:22:08 -0700220 final int numDisplays = mDisplayContentsAnimators.size();
221 for (int i = 0; i < numDisplays; i++) {
222 final int displayId = mDisplayContentsAnimators.keyAt(i);
223 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
Craig Mautnera76fdb72012-07-03 19:03:02 -0700224
Craig Mautnera91f9e22012-09-14 16:22:08 -0700225 displayAnimator.mWinAnimators.clear();
226 final WinAnimatorList winAnimators = layoutToAnim.mWinAnimatorLists.get(displayId);
227 if (winAnimators != null) {
228 displayAnimator.mWinAnimators.addAll(winAnimators);
229 }
230
231 DimAnimator.Parameters dimParams = layoutToAnim.mDimParams.get(displayId);
232 if (dimParams == null) {
233 displayAnimator.mDimParams = null;
234 } else {
235 final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
236
237 // Only set dim params on the highest dimmed layer.
238 final WindowStateAnimator existingDimWinAnimator =
239 displayAnimator.mDimParams == null ?
240 null : displayAnimator.mDimParams.mDimWinAnimator;
241 // Don't turn on for an unshown surface, or for any layer but the highest
242 // dimmed layer.
243 if (newWinAnimator.mSurfaceShown && (existingDimWinAnimator == null
244 || !existingDimWinAnimator.mSurfaceShown
245 || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
246 displayAnimator.mDimParams = new DimAnimator.Parameters(dimParams);
247 }
Craig Mautnera76fdb72012-07-03 19:03:02 -0700248 }
249 }
Craig Mautner322e4032012-07-13 13:35:20 -0700250
251 mAppAnimators.clear();
252 final int N = layoutToAnim.mAppWindowAnimParams.size();
253 for (int i = 0; i < N; i++) {
254 final AppWindowAnimParams params = layoutToAnim.mAppWindowAnimParams.get(i);
255 AppWindowAnimator appAnimator = params.mAppAnimator;
Craig Mautnerbea12bd2012-08-20 10:18:34 -0700256 appAnimator.mAllAppWinAnimators.clear();
257 appAnimator.mAllAppWinAnimators.addAll(params.mWinAnimators);
Craig Mautner322e4032012-07-13 13:35:20 -0700258 mAppAnimators.add(appAnimator);
259 }
Craig Mautner1caa3992012-06-22 09:46:48 -0700260 }
261 }
262
Dianne Hackborn98129732012-11-01 16:28:16 -0700263 void hideWallpapersLocked(final WindowState w, boolean fromAnimator) {
264 // There is an issue where this function can be called either from
265 // the animation or the layout side of the window manager. The problem
266 // is that if it is called from the layout side, we may not yet have
267 // propagated the current layout wallpaper state over into the animation
268 // state. If that is the case, we can do bad things like hide the
269 // wallpaper when we had just made it shown because the animation side
270 // doesn't yet see that there is now a wallpaper target. As a temporary
271 // work-around, we tell the function here which side of the window manager
272 // is calling so it can use the right state.
273 if (fromAnimator) {
274 hideWallpapersLocked(w, mWallpaperTarget, mLowerWallpaperTarget, mWallpaperTokens);
275 } else {
276 hideWallpapersLocked(w, mService.mWallpaperTarget,
277 mService.mLowerWallpaperTarget, mService.mWallpaperTokens);
278 }
279 }
280
281 void hideWallpapersLocked(final WindowState w, final WindowState wallpaperTarget,
282 final WindowState lowerWallpaperTarget, final ArrayList<WindowToken> wallpaperTokens) {
283 if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) {
284 final int numTokens = wallpaperTokens.size();
Craig Mautner918b53b2012-07-09 14:15:54 -0700285 for (int i = numTokens - 1; i >= 0; i--) {
Dianne Hackborn98129732012-11-01 16:28:16 -0700286 final WindowToken token = wallpaperTokens.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700287 final int numWindows = token.windows.size();
288 for (int j = numWindows - 1; j >= 0; j--) {
289 final WindowState wallpaper = token.windows.get(j);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700290 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
291 if (!winAnimator.mLastHidden) {
292 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700293 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautner76a71652012-09-03 23:23:58 -0700294 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
295 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700296 }
297 }
Dianne Hackbornef03a7f2012-10-29 18:46:52 -0700298 if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG,
Dianne Hackborn2ea9bae2012-11-02 18:43:48 -0700299 "Hiding wallpaper " + token + " from " + w
300 + " target=" + wallpaperTarget + " lower=" + lowerWallpaperTarget
301 + "\n" + Debug.getCallers(5, " "));
Craig Mautnerb9836b92012-06-11 11:40:09 -0700302 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700303 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700304 }
305 }
306
Craig Mautnera91f9e22012-09-14 16:22:08 -0700307 private void updateAppWindowsLocked() {
Craig Mautner764983d2012-03-22 11:37:36 -0700308 int i;
Craig Mautner322e4032012-07-13 13:35:20 -0700309 final int NAT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700310 for (i=0; i<NAT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700311 final AppWindowAnimator appAnimator = mAppAnimators.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700312 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700313 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700314 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700315 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700316 } else if (wasAnimating) {
317 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700318 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
319 "appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700320 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
321 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700322 }
323 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700324
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700325 final int NEAT = mService.mExitingAppTokens.size();
326 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700327 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700328 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700329 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700330 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700331 mAnimating = true;
332 } else if (wasAnimating) {
333 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700334 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
335 "exiting appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700336 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
337 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700338 }
339 }
Craig Mautner764983d2012-03-22 11:37:36 -0700340 }
341
Craig Mautnera91f9e22012-09-14 16:22:08 -0700342 private void updateWindowsLocked(final int displayId) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700343 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700344
Craig Mautnera91f9e22012-09-14 16:22:08 -0700345 final WinAnimatorList winAnimatorList =
346 getDisplayContentsAnimatorLocked(displayId).mWinAnimators;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700347 ArrayList<WindowStateAnimator> unForceHiding = null;
348 boolean wallpaperInUnForceHiding = false;
Craig Mautner178af592012-09-17 10:37:29 -0700349 mForceHiding = KEYGUARD_NOT_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700350
Craig Mautner59c00972012-07-30 12:10:24 -0700351 for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
352 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700353 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700354 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700355
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700356 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700357 final boolean wasAnimating = winAnimator.mWasAnimating;
358 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700359
360 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700361 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700362 ", nowAnimating=" + nowAnimating);
363 }
364
Craig Mautner918b53b2012-07-09 14:15:54 -0700365 if (wasAnimating && !winAnimator.mAnimating && mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700366 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700367 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
368 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700369 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700370 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
Craig Mautner76a71652012-09-03 23:23:58 -0700371 mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700372 }
Craig Mautner764983d2012-03-22 11:37:36 -0700373 }
374
Craig Mautnerbec53f72012-04-05 11:49:05 -0700375 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700376 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700377 if (WindowManagerService.DEBUG_ANIM ||
378 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
379 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700380 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner76a71652012-09-03 23:23:58 -0700381 setPendingLayoutChanges(displayId,
382 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700383 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700384 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
Craig Mautner76a71652012-09-03 23:23:58 -0700385 mPendingLayoutChanges.get(displayId));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700386 }
Craig Mautner764983d2012-03-22 11:37:36 -0700387 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700388 }
Craig Mautner4bf18a72012-07-10 14:08:16 -0700389 if (win.isReadyForDisplay()) {
390 if (nowAnimating) {
391 if (winAnimator.mAnimationIsEntrance) {
Craig Mautner178af592012-09-17 10:37:29 -0700392 mForceHiding = KEYGUARD_ANIMATING_IN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700393 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700394 mForceHiding = KEYGUARD_ANIMATING_OUT;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700395 }
396 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700397 mForceHiding = KEYGUARD_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700398 }
Craig Mautner764983d2012-03-22 11:37:36 -0700399 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700400 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner178af592012-09-17 10:37:29 -0700401 "Force hide " + mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700402 + " hasSurface=" + win.mHasSurface
403 + " policyVis=" + win.mPolicyVisibility
404 + " destroying=" + win.mDestroying
405 + " attHidden=" + win.mAttachedHidden
406 + " vis=" + win.mViewVisibility
407 + " hidden=" + win.mRootToken.hidden
408 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700409 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautner4bf18a72012-07-10 14:08:16 -0700410 final boolean hideWhenLocked =
411 (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700412 final boolean changed;
Craig Mautner178af592012-09-17 10:37:29 -0700413 if (((mForceHiding == KEYGUARD_ANIMATING_IN)
Craig Mautner4bf18a72012-07-10 14:08:16 -0700414 && (!winAnimator.isAnimating() || hideWhenLocked))
Craig Mautner178af592012-09-17 10:37:29 -0700415 || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700416 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700417 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700418 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700419 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700420 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700421 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700422 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700423 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700424 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700425 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700426 if (unForceHiding == null) {
427 unForceHiding = new ArrayList<WindowStateAnimator>();
428 }
429 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700430 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700431 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700432 }
433 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700434 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700435 // We are showing on to of the current
436 // focus, so re-evaluate focus to make
437 // sure it is correct.
438 mService.mFocusMayChange = true;
439 }
440 }
441 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700442 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700443 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700444 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
445 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700446 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700447 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
Craig Mautner76a71652012-09-03 23:23:58 -0700448 mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700449 }
Craig Mautner764983d2012-03-22 11:37:36 -0700450 }
451 }
452 }
453
Craig Mautnerbec53f72012-04-05 11:49:05 -0700454 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700455 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
456 if (atoken == null || atoken.allDrawn) {
457 if (winAnimator.performShowLocked()) {
Craig Mautner76a71652012-09-03 23:23:58 -0700458 mPendingLayoutChanges.put(displayId,
459 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
Craig Mautner6fbda632012-07-03 09:26:39 -0700460 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
461 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
Craig Mautner76a71652012-09-03 23:23:58 -0700462 mPendingLayoutChanges.get(displayId));
Craig Mautner764983d2012-03-22 11:37:36 -0700463 }
464 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700465 }
Craig Mautner764983d2012-03-22 11:37:36 -0700466 }
Craig Mautner322e4032012-07-13 13:35:20 -0700467 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700468 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700469 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
470 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700471 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700472 }
Craig Mautner59431632012-04-04 11:56:44 -0700473 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
474 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700475 }
476 }
Craig Mautner764983d2012-03-22 11:37:36 -0700477 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700478
Craig Mautner078ea0a2012-06-25 11:04:29 -0700479 // If we have windows that are being show due to them no longer
480 // being force-hidden, apply the appropriate animation to them.
481 if (unForceHiding != null) {
482 for (int i=unForceHiding.size()-1; i>=0; i--) {
483 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
484 if (a != null) {
485 final WindowStateAnimator winAnimator = unForceHiding.get(i);
486 winAnimator.setAnimation(a);
487 winAnimator.mAnimationIsEntrance = true;
488 }
489 }
490 }
491 }
492
Craig Mautnera91f9e22012-09-14 16:22:08 -0700493 private void updateWallpaperLocked(int displayId) {
494 final DisplayContentsAnimator displayAnimator =
495 getDisplayContentsAnimatorLocked(displayId);
496 final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700497 WindowStateAnimator windowAnimationBackground = null;
498 int windowAnimationBackgroundColor = 0;
499 WindowState detachedWallpaper = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700500 final DimSurface windowAnimationBackgroundSurface =
501 displayAnimator.mWindowAnimationBackgroundSurface;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700502
Craig Mautner59c00972012-07-30 12:10:24 -0700503 for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
504 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner078ea0a2012-06-25 11:04:29 -0700505 if (winAnimator.mSurface == null) {
506 continue;
507 }
508
509 final int flags = winAnimator.mAttrFlags;
510 final WindowState win = winAnimator.mWin;
511
512 // If this window is animating, make a note that we have
513 // an animating window and take care of a request to run
514 // a detached wallpaper animation.
515 if (winAnimator.mAnimating) {
516 if (winAnimator.mAnimation != null) {
517 if ((flags & FLAG_SHOW_WALLPAPER) != 0
518 && winAnimator.mAnimation.getDetachWallpaper()) {
519 detachedWallpaper = win;
520 }
521 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
522 if (backgroundColor != 0) {
523 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
524 windowAnimationBackground.mAnimLayer)) {
525 windowAnimationBackground = winAnimator;
526 windowAnimationBackgroundColor = backgroundColor;
527 }
528 }
529 }
530 mAnimating = true;
531 }
532
533 // If this window's app token is running a detached wallpaper
534 // animation, make a note so we can ensure the wallpaper is
535 // displayed behind it.
Craig Mautner322e4032012-07-13 13:35:20 -0700536 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700537 if (appAnimator != null && appAnimator.animation != null
538 && appAnimator.animating) {
539 if ((flags & FLAG_SHOW_WALLPAPER) != 0
540 && appAnimator.animation.getDetachWallpaper()) {
541 detachedWallpaper = win;
542 }
543
544 final int backgroundColor = appAnimator.animation.getBackgroundColor();
545 if (backgroundColor != 0) {
546 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
547 windowAnimationBackground.mAnimLayer)) {
548 windowAnimationBackground = winAnimator;
549 windowAnimationBackgroundColor = backgroundColor;
550 }
551 }
552 }
553 } // end forall windows
554
Craig Mautner9e809442012-06-22 17:13:04 -0700555 if (mWindowDetachedWallpaper != detachedWallpaper) {
556 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
557 "Detached wallpaper changed from " + mWindowDetachedWallpaper
558 + " to " + detachedWallpaper);
559 mWindowDetachedWallpaper = detachedWallpaper;
560 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
561 }
562
563 if (windowAnimationBackgroundColor != 0) {
564 // If the window that wants black is the current wallpaper
565 // target, then the black goes *below* the wallpaper so we
566 // don't cause the wallpaper to suddenly disappear.
567 int animLayer = windowAnimationBackground.mAnimLayer;
568 WindowState win = windowAnimationBackground.mWin;
Craig Mautner59c00972012-07-30 12:10:24 -0700569 if (mWallpaperTarget == win
Craig Mautner918b53b2012-07-09 14:15:54 -0700570 || mLowerWallpaperTarget == win || mUpperWallpaperTarget == win) {
Craig Mautner59c00972012-07-30 12:10:24 -0700571 final int N = winAnimatorList.size();
Craig Mautner9e809442012-06-22 17:13:04 -0700572 for (int i = 0; i < N; i++) {
Craig Mautner59c00972012-07-30 12:10:24 -0700573 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700574 if (winAnimator.mIsWallpaper) {
Craig Mautner9e809442012-06-22 17:13:04 -0700575 animLayer = winAnimator.mAnimLayer;
576 break;
577 }
578 }
579 }
580
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700581 if (windowAnimationBackgroundSurface != null) {
582 windowAnimationBackgroundSurface.show(mDw, mDh,
583 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
584 windowAnimationBackgroundColor);
585 }
Craig Mautner9e809442012-06-22 17:13:04 -0700586 } else {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700587 if (windowAnimationBackgroundSurface != null) {
588 windowAnimationBackgroundSurface.hide();
589 }
Craig Mautner9e809442012-06-22 17:13:04 -0700590 }
Craig Mautner764983d2012-03-22 11:37:36 -0700591 }
592
593 private void testTokenMayBeDrawnLocked() {
594 // See if any windows have been drawn, so they (and others
595 // associated with them) can now be shown.
Craig Mautner322e4032012-07-13 13:35:20 -0700596 final int NT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700597 for (int i=0; i<NT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700598 AppWindowAnimator appAnimator = mAppAnimators.get(i);
599 AppWindowToken wtoken = appAnimator.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700600 final boolean allDrawn = wtoken.allDrawn;
Craig Mautner322e4032012-07-13 13:35:20 -0700601 if (allDrawn != appAnimator.allDrawn) {
602 appAnimator.allDrawn = allDrawn;
Craig Mautner6fbda632012-07-03 09:26:39 -0700603 if (allDrawn) {
604 // The token has now changed state to having all
605 // windows shown... what to do, what to do?
Craig Mautner322e4032012-07-13 13:35:20 -0700606 if (appAnimator.freezingScreen) {
607 appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700608 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
609 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
610 "Setting mOrientationChangeComplete=true because wtoken "
611 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
612 + " numDrawn=" + wtoken.numDrawnWindows);
613 // This will set mOrientationChangeComplete and cause a pass through layout.
Craig Mautner76a71652012-09-03 23:23:58 -0700614 setAppLayoutChanges(appAnimator,
615 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
616 "testTokenMayBeDrawnLocked: freezingScreen");
Craig Mautner6fbda632012-07-03 09:26:39 -0700617 } else {
Craig Mautner76a71652012-09-03 23:23:58 -0700618 setAppLayoutChanges(appAnimator,
619 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
620 "testTokenMayBeDrawnLocked");
621
Craig Mautner6fbda632012-07-03 09:26:39 -0700622 // We can now show all of the drawn windows!
623 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautner322e4032012-07-13 13:35:20 -0700624 mAnimating |= appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700625 }
Craig Mautner764983d2012-03-22 11:37:36 -0700626 }
627 }
628 }
629 }
630 }
631
Craig Mautnera91f9e22012-09-14 16:22:08 -0700632 private void performAnimationsLocked(final int displayId) {
633 updateWindowsLocked(displayId);
634 updateWallpaperLocked(displayId);
Craig Mautner764983d2012-03-22 11:37:36 -0700635 }
636
Craig Mautner1caa3992012-06-22 09:46:48 -0700637 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
638 /** Locked on mService.mWindowMap and this. */
639 private void animateLocked() {
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700640 if (!mInitialized) {
641 return;
642 }
Craig Mautner59c00972012-07-30 12:10:24 -0700643
Craig Mautner76a71652012-09-03 23:23:58 -0700644 mPendingLayoutChanges.clear();
Craig Mautner764983d2012-03-22 11:37:36 -0700645 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700646 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700647 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700648 mAnimating = false;
649 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
650 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
651 }
Craig Mautner764983d2012-03-22 11:37:36 -0700652
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700653 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
654 TAG, ">>> OPEN TRANSACTION animateLocked");
Craig Mautner764983d2012-03-22 11:37:36 -0700655 Surface.openTransaction();
Jamie Gennisb6ce6e42012-10-15 19:14:58 -0700656 Surface.setAnimationTransaction();
Craig Mautner764983d2012-03-22 11:37:36 -0700657 try {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700658 updateAppWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700659
Craig Mautnera91f9e22012-09-14 16:22:08 -0700660 final int numDisplays = mDisplayContentsAnimators.size();
661 for (int i = 0; i < numDisplays; i++) {
662 final int displayId = mDisplayContentsAnimators.keyAt(i);
663 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
664
665 final ScreenRotationAnimation screenRotationAnimation =
666 displayAnimator.mScreenRotationAnimation;
667 if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
668 if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
669 mAnimating = true;
670 } else {
671 mBulkUpdateParams |= SET_UPDATE_ROTATION;
672 screenRotationAnimation.kill();
673 displayAnimator.mScreenRotationAnimation = null;
674 }
675 }
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700676
677 // Update animations of all applications, including those
678 // associated with exiting/removed apps
Craig Mautnera91f9e22012-09-14 16:22:08 -0700679 performAnimationsLocked(displayId);
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700680
Craig Mautnera91f9e22012-09-14 16:22:08 -0700681 final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators;
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700682 final int N = winAnimatorList.size();
683 for (int j = 0; j < N; j++) {
684 winAnimatorList.get(j).prepareSurfaceLocked(true);
685 }
686 }
687
688 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700689
Craig Mautnera91f9e22012-09-14 16:22:08 -0700690 for (int i = 0; i < numDisplays; i++) {
691 final int displayId = mDisplayContentsAnimators.keyAt(i);
692 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
Craig Mautner764983d2012-03-22 11:37:36 -0700693
Craig Mautnera91f9e22012-09-14 16:22:08 -0700694 final ScreenRotationAnimation screenRotationAnimation =
695 displayAnimator.mScreenRotationAnimation;
696 if (screenRotationAnimation != null) {
697 screenRotationAnimation.updateSurfacesInTransaction();
698 }
699
700 final DimAnimator.Parameters dimParams = displayAnimator.mDimParams;
701 final DimAnimator dimAnimator = displayAnimator.mDimAnimator;
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700702 if (dimAnimator != null && dimParams != null) {
703 dimAnimator.updateParameters(mContext.getResources(), dimParams, mCurrentTime);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700704 }
705 if (dimAnimator != null && dimAnimator.mDimShown) {
706 mAnimating |= dimAnimator.updateSurface(isDimmingLocked(displayId),
707 mCurrentTime, !mService.okToDisplay());
708 }
Craig Mautner764983d2012-03-22 11:37:36 -0700709 }
710
Craig Mautner7358fbf2012-04-12 21:06:33 -0700711 if (mService.mWatermark != null) {
712 mService.mWatermark.drawIfNeeded();
713 }
Craig Mautner764983d2012-03-22 11:37:36 -0700714 } catch (RuntimeException e) {
715 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
716 } finally {
717 Surface.closeTransaction();
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700718 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
719 TAG, "<<< CLOSE TRANSACTION animateLocked");
720 }
721
722 for (int i = mPendingLayoutChanges.size() - 1; i >= 0; i--) {
723 if ((mPendingLayoutChanges.valueAt(i)
724 & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
725 mPendingActions |= WALLPAPER_ACTION_PENDING;
726 }
Craig Mautner764983d2012-03-22 11:37:36 -0700727 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700728
Craig Mautner76a71652012-09-03 23:23:58 -0700729 if (mBulkUpdateParams != 0 || mPendingLayoutChanges.size() > 0) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700730 updateAnimToLayoutLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700731 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700732
733 if (mAnimating) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700734 synchronized (mService.mLayoutToAnim) {
735 mService.scheduleAnimationLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -0700736 }
Chet Haase198e5642012-05-10 09:55:15 -0700737 } else if (wasAnimating) {
738 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700739 }
740 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
741 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
742 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
Craig Mautner76a71652012-09-03 23:23:58 -0700743 + " mPendingLayoutChanges(DEFAULT_DISPLAY)="
744 + Integer.toHexString(mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY)));
Craig Mautner7d8df392012-04-06 15:26:23 -0700745 }
Craig Mautner764983d2012-03-22 11:37:36 -0700746 }
747
748 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700749 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700750 mCurrentFocus = currentFocus;
751 }
752
753 void setDisplayDimensions(final int curWidth, final int curHeight,
754 final int appWidth, final int appHeight) {
755 mDw = curWidth;
756 mDh = curHeight;
757 mInnerDw = appWidth;
758 mInnerDh = appHeight;
759 }
760
Craig Mautnera91f9e22012-09-14 16:22:08 -0700761 boolean isDimmingLocked(int displayId) {
762 return getDisplayContentsAnimatorLocked(displayId).mDimParams != null;
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700763 }
764
Craig Mautnera91f9e22012-09-14 16:22:08 -0700765 boolean isDimmingLocked(final WindowStateAnimator winAnimator) {
766 DimAnimator.Parameters dimParams =
767 getDisplayContentsAnimatorLocked(winAnimator.mWin.getDisplayId()).mDimParams;
768 return dimParams != null && dimParams.mDimWinAnimator == winAnimator;
Craig Mautneracafd192012-05-10 10:41:02 -0700769 }
770
Dianne Hackborn529e7442012-11-01 14:22:28 -0700771 static String bulkUpdateParamsToString(int bulkUpdateParams) {
772 StringBuilder builder = new StringBuilder(128);
773 if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
774 builder.append(" UPDATE_ROTATION");
775 }
776 if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
777 builder.append(" WALLPAPER_MAY_CHANGE");
778 }
779 if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
780 builder.append(" FORCE_HIDING_CHANGED");
781 }
782 if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) != 0) {
783 builder.append(" ORIENTATION_CHANGE_COMPLETE");
784 }
785 if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
786 builder.append(" TURN_ON_SCREEN");
787 }
788 return builder.toString();
789 }
790
Craig Mautnera91f9e22012-09-14 16:22:08 -0700791 public void dumpLocked(PrintWriter pw, String prefix, boolean dumpAll) {
Dianne Hackborn529e7442012-11-01 14:22:28 -0700792 final String subPrefix = " " + prefix;
793 final String subSubPrefix = " " + subPrefix;
794
795 boolean needSep = false;
796 if (mAppAnimators.size() > 0) {
797 needSep = true;
798 pw.println(" App Animators:");
799 for (int i=mAppAnimators.size()-1; i>=0; i--) {
800 AppWindowAnimator anim = mAppAnimators.get(i);
801 pw.print(prefix); pw.print("App Animator #"); pw.print(i);
802 pw.print(' '); pw.print(anim);
803 if (dumpAll) {
804 pw.println(':');
805 anim.dump(pw, subPrefix, dumpAll);
806 } else {
807 pw.println();
808 }
Craig Mautner6fbda632012-07-03 09:26:39 -0700809 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700810 }
811 if (mWallpaperTokens.size() > 0) {
812 if (needSep) {
813 pw.println();
814 }
815 needSep = true;
816 pw.print(prefix); pw.println("Wallpaper tokens:");
817 for (int i=mWallpaperTokens.size()-1; i>=0; i--) {
818 WindowToken token = mWallpaperTokens.get(i);
819 pw.print(prefix); pw.print("Wallpaper #"); pw.print(i);
820 pw.print(' '); pw.print(token);
821 if (dumpAll) {
822 pw.println(':');
823 token.dump(pw, subPrefix);
824 } else {
825 pw.println();
826 }
827 }
828 }
829
830 if (needSep) {
831 pw.println();
832 }
833 for (int i = 0; i < mDisplayContentsAnimators.size(); i++) {
834 pw.print(prefix); pw.print("DisplayContentsAnimator #");
835 pw.print(mDisplayContentsAnimators.keyAt(i));
836 pw.println(":");
837 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
838 for (int j=0; j<displayAnimator.mWinAnimators.size(); j++) {
839 WindowStateAnimator wanim = displayAnimator.mWinAnimators.get(j);
840 pw.print(subPrefix); pw.print("Window #"); pw.print(j);
841 pw.print(": "); pw.println(wanim);
842 }
843 if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
844 if (dumpAll || displayAnimator.mWindowAnimationBackgroundSurface.mDimShown) {
845 pw.print(subPrefix); pw.println("mWindowAnimationBackgroundSurface:");
Craig Mautnera91f9e22012-09-14 16:22:08 -0700846 displayAnimator.mWindowAnimationBackgroundSurface.printTo(subSubPrefix, pw);
847 }
Craig Mautner6fbda632012-07-03 09:26:39 -0700848 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700849 if (displayAnimator.mDimAnimator != null) {
850 if (dumpAll || displayAnimator.mDimAnimator.mDimShown) {
851 pw.print(subPrefix); pw.println("mDimAnimator:");
852 displayAnimator.mDimAnimator.printTo(subSubPrefix, pw);
853 }
854 } else if (dumpAll) {
855 pw.print(subPrefix); pw.println("no DimAnimator ");
856 }
857 if (displayAnimator.mDimParams != null) {
858 pw.print(subPrefix); pw.println("mDimParams:");
859 displayAnimator.mDimParams.printTo(subSubPrefix, pw);
860 } else if (dumpAll) {
861 pw.print(subPrefix); pw.println("no DimParams ");
862 }
863 if (displayAnimator.mScreenRotationAnimation != null) {
864 pw.print(subPrefix); pw.println("mScreenRotationAnimation:");
865 displayAnimator.mScreenRotationAnimation.printTo(subSubPrefix, pw);
866 } else if (dumpAll) {
867 pw.print(subPrefix); pw.println("no ScreenRotationAnimation ");
868 }
869 }
870
871 pw.println();
872
873 if (dumpAll) {
874 pw.print(prefix); pw.print("mAnimTransactionSequence=");
875 pw.print(mAnimTransactionSequence);
876 pw.print(" mForceHiding="); pw.println(forceHidingToString());
877 pw.print(prefix); pw.print("mCurrentTime=");
878 pw.println(TimeUtils.formatUptime(mCurrentTime));
879 pw.print(prefix); pw.print("mDw=");
880 pw.print(mDw); pw.print(" mDh="); pw.print(mDh);
881 pw.print(" mInnerDw="); pw.print(mInnerDw);
882 pw.print(" mInnerDh="); pw.println(mInnerDh);
883 }
884 if (mBulkUpdateParams != 0) {
885 pw.print(prefix); pw.print("mBulkUpdateParams=0x");
886 pw.print(Integer.toHexString(mBulkUpdateParams));
887 pw.println(bulkUpdateParamsToString(mBulkUpdateParams));
888 }
889 if (mPendingActions != 0) {
890 pw.print(prefix); pw.print("mPendingActions=0x");
891 pw.println(Integer.toHexString(mPendingActions));
892 }
893 if (mWindowDetachedWallpaper != null) {
894 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
895 pw.println(mWindowDetachedWallpaper);
896 }
897 pw.print(prefix); pw.print("mWallpaperTarget="); pw.println(mWallpaperTarget);
898 pw.print(prefix); pw.print("mWpAppAnimator="); pw.println(mWpAppAnimator);
899 if (mLowerWallpaperTarget != null || mUpperWallpaperTarget != null) {
900 pw.print(prefix); pw.print("mLowerWallpaperTarget=");
901 pw.println(mLowerWallpaperTarget);
902 pw.print(prefix); pw.print("mUpperWallpaperTarget=");
903 pw.println(mUpperWallpaperTarget);
904 }
905 if (mUniverseBackground != null) {
906 pw.print(prefix); pw.print("mUniverseBackground="); pw.print(mUniverseBackground);
907 pw.print(" mAboveUniverseLayer="); pw.println(mAboveUniverseLayer);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700908 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700909 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700910
Craig Mautner76a71652012-09-03 23:23:58 -0700911 void clearPendingActions() {
912 synchronized (this) {
913 mPendingActions = 0;
914 }
915 }
916
917 void setPendingLayoutChanges(final int displayId, final int changes) {
918 mPendingLayoutChanges.put(displayId, mPendingLayoutChanges.get(displayId) | changes);
919 }
920
921 void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) {
922 // Used to track which displays layout changes have been done.
923 SparseIntArray displays = new SparseIntArray();
924 for (int i = appAnimator.mAllAppWinAnimators.size() - 1; i >= 0; i--) {
925 WindowStateAnimator winAnimator = appAnimator.mAllAppWinAnimators.get(i);
926 final int displayId = winAnimator.mWin.mDisplayContent.getDisplayId();
927 if (displays.indexOfKey(displayId) < 0) {
928 setPendingLayoutChanges(displayId, changes);
929 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
930 mService.debugLayoutRepeats(s, mPendingLayoutChanges.get(displayId));
931 }
932 // Keep from processing this display again.
933 displays.put(displayId, changes);
934 }
935 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700936 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700937
938 private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
939 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
940 if (displayAnimator == null) {
Craig Mautnerac439e52012-09-21 08:58:34 -0700941 displayAnimator = new DisplayContentsAnimator(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700942 mDisplayContentsAnimators.put(displayId, displayAnimator);
943 }
944 return displayAnimator;
945 }
946
947 void setScreenRotationAnimationLocked(int displayId, ScreenRotationAnimation animation) {
948 getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation = animation;
949 }
950
951 ScreenRotationAnimation getScreenRotationAnimationLocked(int displayId) {
952 return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation;
953 }
954
Craig Mautnerac439e52012-09-21 08:58:34 -0700955 private class DisplayContentsAnimator {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700956 WinAnimatorList mWinAnimators = new WinAnimatorList();
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700957 DimAnimator mDimAnimator = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700958 DimAnimator.Parameters mDimParams = null;
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700959 DimSurface mWindowAnimationBackgroundSurface = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700960 ScreenRotationAnimation mScreenRotationAnimation = null;
Craig Mautnerac439e52012-09-21 08:58:34 -0700961
962 public DisplayContentsAnimator(int displayId) {
963 mDimAnimator = new DimAnimator(mService.mFxSession, displayId);
964 mWindowAnimationBackgroundSurface =
965 new DimSurface(mService.mFxSession, displayId);
966 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700967 }
Craig Mautner764983d2012-03-22 11:37:36 -0700968}