blob: 9a62482f17c7fef792d5914188fd078928685bff [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;
Craig Mautnera91f9e22012-09-14 16:22:08 -070019import android.util.SparseArray;
Craig Mautner76a71652012-09-03 23:23:58 -070020import android.util.SparseIntArray;
Craig Mautner6881a102012-07-27 13:04:51 -070021import android.view.Display;
Craig Mautner764983d2012-03-22 11:37:36 -070022import android.view.Surface;
Craig Mautner764983d2012-03-22 11:37:36 -070023import android.view.WindowManagerPolicy;
24import android.view.animation.Animation;
Craig Mautner764983d2012-03-22 11:37:36 -070025
Craig Mautner322e4032012-07-13 13:35:20 -070026import com.android.server.wm.WindowManagerService.AppWindowAnimParams;
Craig Mautner711f90a2012-07-03 18:43:52 -070027import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;
Craig Mautner764983d2012-03-22 11:37:36 -070028
Craig Mautnere7ae2502012-03-26 17:11:19 -070029import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070030import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070031
Craig Mautner764983d2012-03-22 11:37:36 -070032/**
Craig Mautner764983d2012-03-22 11:37:36 -070033 * Singleton class that carries out the animations and Surface operations in a separate task
34 * on behalf of WindowManagerService.
35 */
36public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070037 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070038
39 final WindowManagerService mService;
40 final Context mContext;
41 final WindowManagerPolicy mPolicy;
42
43 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
Craig Mautner76a71652012-09-03 23:23:58 -070049 // Layout changes for individual Displays. Indexed by displayId.
50 SparseIntArray mPendingLayoutChanges = new SparseIntArray();
Craig Mautner764983d2012-03-22 11:37:36 -070051
Craig Mautner69b08182012-09-05 13:07:13 -070052 // TODO: Assign these from each iteration through DisplayContent. Only valid between loops.
Craig Mautner764983d2012-03-22 11:37:36 -070053 /** Overall window dimensions */
54 int mDw, mDh;
55
56 /** Interior window dimensions */
57 int mInnerDw, mInnerDh;
58
59 /** Time of current animation step. Reset on each iteration */
60 long mCurrentTime;
61
62 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
63 * 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 -070064 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070065
Craig Mautnere7ae2502012-03-26 17:11:19 -070066 // Window currently running an animation that has requested it be detached
67 // from the wallpaper. This means we need to ensure the wallpaper is
68 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070069 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070070 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070071
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070072 WindowStateAnimator mUniverseBackground = null;
73 int mAboveUniverseLayer = 0;
74
Craig Mautnera608b882012-03-30 13:03:49 -070075 int mBulkUpdateParams = 0;
76
Craig Mautnera91f9e22012-09-14 16:22:08 -070077 SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators =
78 new SparseArray<WindowAnimator.DisplayContentsAnimator>();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070079
Craig Mautner4d7349b2012-04-20 14:52:47 -070080 static final int WALLPAPER_ACTION_PENDING = 1;
81 int mPendingActions;
82
Craig Mautner1caa3992012-06-22 09:46:48 -070083 WindowState mWallpaperTarget = null;
Craig Mautner918b53b2012-07-09 14:15:54 -070084 AppWindowAnimator mWpAppAnimator = null;
85 WindowState mLowerWallpaperTarget = null;
86 WindowState mUpperWallpaperTarget = null;
Craig Mautner1caa3992012-06-22 09:46:48 -070087
Craig Mautner322e4032012-07-13 13:35:20 -070088 ArrayList<AppWindowAnimator> mAppAnimators = new ArrayList<AppWindowAnimator>();
89
Craig Mautner918b53b2012-07-09 14:15:54 -070090 ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
91
92 /** Parameters being passed from this into mService. */
93 static class AnimatorToLayoutParams {
94 boolean mUpdateQueued;
95 int mBulkUpdateParams;
Craig Mautner76a71652012-09-03 23:23:58 -070096 SparseIntArray mPendingLayoutChanges;
Craig Mautner918b53b2012-07-09 14:15:54 -070097 WindowState mWindowDetachedWallpaper;
98 }
99 /** Do not modify unless holding mService.mWindowMap or this and mAnimToLayout in that order */
Craig Mautner711f90a2012-07-03 18:43:52 -0700100 final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();
101
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700102 boolean mInitialized = false;
103
Craig Mautner178af592012-09-17 10:37:29 -0700104 // forceHiding states.
105 static final int KEYGUARD_NOT_SHOWN = 0;
106 static final int KEYGUARD_ANIMATING_IN = 1;
107 static final int KEYGUARD_SHOWN = 2;
108 static final int KEYGUARD_ANIMATING_OUT = 3;
109 int mForceHiding = KEYGUARD_NOT_SHOWN;
110
111 private String forceHidingToString() {
112 switch (mForceHiding) {
113 case KEYGUARD_NOT_SHOWN: return "KEYGUARD_NOT_SHOWN";
114 case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN";
115 case KEYGUARD_SHOWN: return "KEYGUARD_SHOWN";
116 case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT";
117 default: return "KEYGUARD STATE UNKNOWN " + mForceHiding;
118 }
119 }
120
Craig Mautner918b53b2012-07-09 14:15:54 -0700121 WindowAnimator(final WindowManagerService service) {
Craig Mautner764983d2012-03-22 11:37:36 -0700122 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -0700123 mContext = service.mContext;
124 mPolicy = service.mPolicy;
Craig Mautner1caa3992012-06-22 09:46:48 -0700125
126 mAnimationRunnable = new Runnable() {
127 @Override
128 public void run() {
129 // TODO(cmautner): When full isolation is achieved for animation, the first lock
130 // goes away and only the WindowAnimator.this remains.
131 synchronized(mService.mWindowMap) {
132 synchronized(WindowAnimator.this) {
133 copyLayoutToAnimParamsLocked();
134 animateLocked();
135 }
136 }
137 }
138 };
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700139 }
Craig Mautner9e809442012-06-22 17:13:04 -0700140
Craig Mautnera91f9e22012-09-14 16:22:08 -0700141 void addDisplayLocked(final int displayId) {
Craig Mautnerac439e52012-09-21 08:58:34 -0700142 // Create the DisplayContentsAnimator object by retrieving it.
143 getDisplayContentsAnimatorLocked(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700144 if (displayId == Display.DEFAULT_DISPLAY) {
145 mInitialized = true;
146 }
147 }
148
149 void removeDisplayLocked(final int displayId) {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700150 final DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
151 if (displayAnimator != null) {
152 if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
153 displayAnimator.mWindowAnimationBackgroundSurface.kill();
154 displayAnimator.mWindowAnimationBackgroundSurface = null;
155 }
156 if (displayAnimator.mScreenRotationAnimation != null) {
157 displayAnimator.mScreenRotationAnimation.kill();
158 displayAnimator.mScreenRotationAnimation = null;
159 }
160 if (displayAnimator.mDimAnimator != null) {
161 displayAnimator.mDimAnimator.kill();
162 displayAnimator.mDimAnimator = null;
163 }
164 }
165
Craig Mautnera91f9e22012-09-14 16:22:08 -0700166 mDisplayContentsAnimators.delete(displayId);
Craig Mautner1caa3992012-06-22 09:46:48 -0700167 }
168
Craig Mautner711f90a2012-07-03 18:43:52 -0700169 /** Locked on mAnimToLayout */
170 void updateAnimToLayoutLocked() {
171 final AnimatorToLayoutParams animToLayout = mAnimToLayout;
172 synchronized (animToLayout) {
173 animToLayout.mBulkUpdateParams = mBulkUpdateParams;
Craig Mautner76a71652012-09-03 23:23:58 -0700174 animToLayout.mPendingLayoutChanges = mPendingLayoutChanges.clone();
Craig Mautner711f90a2012-07-03 18:43:52 -0700175 animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
176
177 if (!animToLayout.mUpdateQueued) {
178 animToLayout.mUpdateQueued = true;
179 mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
180 }
181 }
182 }
183
Craig Mautner1caa3992012-06-22 09:46:48 -0700184 /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
185 private void copyLayoutToAnimParamsLocked() {
Craig Mautner711f90a2012-07-03 18:43:52 -0700186 final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
Craig Mautner1caa3992012-06-22 09:46:48 -0700187 synchronized(layoutToAnim) {
188 layoutToAnim.mAnimationScheduled = false;
189
Craig Mautner322e4032012-07-13 13:35:20 -0700190 if (!layoutToAnim.mParamsModified) {
191 return;
192 }
193 layoutToAnim.mParamsModified = false;
194
Craig Mautner918b53b2012-07-09 14:15:54 -0700195 if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) {
196 layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED;
197 mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
198 }
199
Craig Mautner1caa3992012-06-22 09:46:48 -0700200 mWallpaperTarget = layoutToAnim.mWallpaperTarget;
Craig Mautner918b53b2012-07-09 14:15:54 -0700201 mWpAppAnimator = mWallpaperTarget == null
202 ? null : mWallpaperTarget.mAppToken == null
203 ? null : mWallpaperTarget.mAppToken.mAppAnimator;
204 mLowerWallpaperTarget = layoutToAnim.mLowerWallpaperTarget;
205 mUpperWallpaperTarget = layoutToAnim.mUpperWallpaperTarget;
Craig Mautnera76fdb72012-07-03 19:03:02 -0700206
207 // Set the new DimAnimator params.
Craig Mautnera91f9e22012-09-14 16:22:08 -0700208 final int numDisplays = mDisplayContentsAnimators.size();
209 for (int i = 0; i < numDisplays; i++) {
210 final int displayId = mDisplayContentsAnimators.keyAt(i);
211 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
Craig Mautnera76fdb72012-07-03 19:03:02 -0700212
Craig Mautnera91f9e22012-09-14 16:22:08 -0700213 displayAnimator.mWinAnimators.clear();
214 final WinAnimatorList winAnimators = layoutToAnim.mWinAnimatorLists.get(displayId);
215 if (winAnimators != null) {
216 displayAnimator.mWinAnimators.addAll(winAnimators);
217 }
218
219 DimAnimator.Parameters dimParams = layoutToAnim.mDimParams.get(displayId);
220 if (dimParams == null) {
221 displayAnimator.mDimParams = null;
222 } else {
223 final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
224
225 // Only set dim params on the highest dimmed layer.
226 final WindowStateAnimator existingDimWinAnimator =
227 displayAnimator.mDimParams == null ?
228 null : displayAnimator.mDimParams.mDimWinAnimator;
229 // Don't turn on for an unshown surface, or for any layer but the highest
230 // dimmed layer.
231 if (newWinAnimator.mSurfaceShown && (existingDimWinAnimator == null
232 || !existingDimWinAnimator.mSurfaceShown
233 || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
234 displayAnimator.mDimParams = new DimAnimator.Parameters(dimParams);
235 }
Craig Mautnera76fdb72012-07-03 19:03:02 -0700236 }
237 }
Craig Mautner322e4032012-07-13 13:35:20 -0700238
239 mAppAnimators.clear();
240 final int N = layoutToAnim.mAppWindowAnimParams.size();
241 for (int i = 0; i < N; i++) {
242 final AppWindowAnimParams params = layoutToAnim.mAppWindowAnimParams.get(i);
243 AppWindowAnimator appAnimator = params.mAppAnimator;
Craig Mautnerbea12bd2012-08-20 10:18:34 -0700244 appAnimator.mAllAppWinAnimators.clear();
245 appAnimator.mAllAppWinAnimators.addAll(params.mWinAnimators);
Craig Mautner322e4032012-07-13 13:35:20 -0700246 mAppAnimators.add(appAnimator);
247 }
Craig Mautner1caa3992012-06-22 09:46:48 -0700248 }
249 }
250
Craig Mautnerb9836b92012-06-11 11:40:09 -0700251 void hideWallpapersLocked(final WindowState w) {
Craig Mautner918b53b2012-07-09 14:15:54 -0700252 if ((mWallpaperTarget == w && mLowerWallpaperTarget == null) || mWallpaperTarget == null) {
253 final int numTokens = mWallpaperTokens.size();
254 for (int i = numTokens - 1; i >= 0; i--) {
255 final WindowToken token = mWallpaperTokens.get(i);
256 final int numWindows = token.windows.size();
257 for (int j = numWindows - 1; j >= 0; j--) {
258 final WindowState wallpaper = token.windows.get(j);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700259 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
260 if (!winAnimator.mLastHidden) {
261 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700262 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautner76a71652012-09-03 23:23:58 -0700263 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
264 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700265 }
266 }
Dianne Hackbornef03a7f2012-10-29 18:46:52 -0700267 if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG,
268 "Hiding wallpaper " + token + " from " + w);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700269 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700270 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700271 }
272 }
273
Craig Mautnera91f9e22012-09-14 16:22:08 -0700274 private void updateAppWindowsLocked() {
Craig Mautner764983d2012-03-22 11:37:36 -0700275 int i;
Craig Mautner322e4032012-07-13 13:35:20 -0700276 final int NAT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700277 for (i=0; i<NAT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700278 final AppWindowAnimator appAnimator = mAppAnimators.get(i);
Craig Mautner59431632012-04-04 11:56:44 -0700279 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700280 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700281 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700282 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700283 } else if (wasAnimating) {
284 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700285 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
286 "appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700287 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
288 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700289 }
290 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700291
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700292 final int NEAT = mService.mExitingAppTokens.size();
293 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700294 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700295 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700296 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner59431632012-04-04 11:56:44 -0700297 if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700298 mAnimating = true;
299 } else if (wasAnimating) {
300 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700301 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
302 "exiting appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700303 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
304 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700305 }
306 }
Craig Mautner764983d2012-03-22 11:37:36 -0700307 }
308
Craig Mautnera91f9e22012-09-14 16:22:08 -0700309 private void updateWindowsLocked(final int displayId) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700310 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700311
Craig Mautnera91f9e22012-09-14 16:22:08 -0700312 final WinAnimatorList winAnimatorList =
313 getDisplayContentsAnimatorLocked(displayId).mWinAnimators;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700314 ArrayList<WindowStateAnimator> unForceHiding = null;
315 boolean wallpaperInUnForceHiding = false;
Craig Mautner178af592012-09-17 10:37:29 -0700316 mForceHiding = KEYGUARD_NOT_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700317
Craig Mautner59c00972012-07-30 12:10:24 -0700318 for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
319 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700320 WindowState win = winAnimator.mWin;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700321 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700322
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700323 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700324 final boolean wasAnimating = winAnimator.mWasAnimating;
325 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700326
327 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700328 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700329 ", nowAnimating=" + nowAnimating);
330 }
331
Craig Mautner918b53b2012-07-09 14:15:54 -0700332 if (wasAnimating && !winAnimator.mAnimating && mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700333 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700334 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
335 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700336 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700337 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
Craig Mautner76a71652012-09-03 23:23:58 -0700338 mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700339 }
Craig Mautner764983d2012-03-22 11:37:36 -0700340 }
341
Craig Mautnerbec53f72012-04-05 11:49:05 -0700342 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700343 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700344 if (WindowManagerService.DEBUG_ANIM ||
345 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
346 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700347 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner76a71652012-09-03 23:23:58 -0700348 setPendingLayoutChanges(displayId,
349 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700350 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700351 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
Craig Mautner76a71652012-09-03 23:23:58 -0700352 mPendingLayoutChanges.get(displayId));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700353 }
Craig Mautner764983d2012-03-22 11:37:36 -0700354 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700355 }
Craig Mautner4bf18a72012-07-10 14:08:16 -0700356 if (win.isReadyForDisplay()) {
357 if (nowAnimating) {
358 if (winAnimator.mAnimationIsEntrance) {
Craig Mautner178af592012-09-17 10:37:29 -0700359 mForceHiding = KEYGUARD_ANIMATING_IN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700360 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700361 mForceHiding = KEYGUARD_ANIMATING_OUT;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700362 }
363 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700364 mForceHiding = KEYGUARD_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700365 }
Craig Mautner764983d2012-03-22 11:37:36 -0700366 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700367 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner178af592012-09-17 10:37:29 -0700368 "Force hide " + mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700369 + " hasSurface=" + win.mHasSurface
370 + " policyVis=" + win.mPolicyVisibility
371 + " destroying=" + win.mDestroying
372 + " attHidden=" + win.mAttachedHidden
373 + " vis=" + win.mViewVisibility
374 + " hidden=" + win.mRootToken.hidden
375 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700376 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautner4bf18a72012-07-10 14:08:16 -0700377 final boolean hideWhenLocked =
378 (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700379 final boolean changed;
Craig Mautner178af592012-09-17 10:37:29 -0700380 if (((mForceHiding == KEYGUARD_ANIMATING_IN)
Craig Mautner4bf18a72012-07-10 14:08:16 -0700381 && (!winAnimator.isAnimating() || hideWhenLocked))
Craig Mautner178af592012-09-17 10:37:29 -0700382 || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700383 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700384 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700385 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700386 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700387 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700388 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700389 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700390 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700391 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700392 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700393 if (unForceHiding == null) {
394 unForceHiding = new ArrayList<WindowStateAnimator>();
395 }
396 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700397 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700398 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700399 }
400 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700401 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700402 // We are showing on to of the current
403 // focus, so re-evaluate focus to make
404 // sure it is correct.
405 mService.mFocusMayChange = true;
406 }
407 }
408 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700409 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700410 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700411 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
412 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700413 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700414 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
Craig Mautner76a71652012-09-03 23:23:58 -0700415 mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700416 }
Craig Mautner764983d2012-03-22 11:37:36 -0700417 }
418 }
419 }
420
Craig Mautnerbec53f72012-04-05 11:49:05 -0700421 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700422 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
423 if (atoken == null || atoken.allDrawn) {
424 if (winAnimator.performShowLocked()) {
Craig Mautner76a71652012-09-03 23:23:58 -0700425 mPendingLayoutChanges.put(displayId,
426 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
Craig Mautner6fbda632012-07-03 09:26:39 -0700427 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
428 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
Craig Mautner76a71652012-09-03 23:23:58 -0700429 mPendingLayoutChanges.get(displayId));
Craig Mautner764983d2012-03-22 11:37:36 -0700430 }
431 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700432 }
Craig Mautner764983d2012-03-22 11:37:36 -0700433 }
Craig Mautner322e4032012-07-13 13:35:20 -0700434 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700435 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700436 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
437 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700438 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700439 }
Craig Mautner59431632012-04-04 11:56:44 -0700440 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
441 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700442 }
443 }
Craig Mautner764983d2012-03-22 11:37:36 -0700444 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700445
Craig Mautner078ea0a2012-06-25 11:04:29 -0700446 // If we have windows that are being show due to them no longer
447 // being force-hidden, apply the appropriate animation to them.
448 if (unForceHiding != null) {
449 for (int i=unForceHiding.size()-1; i>=0; i--) {
450 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
451 if (a != null) {
452 final WindowStateAnimator winAnimator = unForceHiding.get(i);
453 winAnimator.setAnimation(a);
454 winAnimator.mAnimationIsEntrance = true;
455 }
456 }
457 }
458 }
459
Craig Mautnera91f9e22012-09-14 16:22:08 -0700460 private void updateWallpaperLocked(int displayId) {
461 final DisplayContentsAnimator displayAnimator =
462 getDisplayContentsAnimatorLocked(displayId);
463 final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700464 WindowStateAnimator windowAnimationBackground = null;
465 int windowAnimationBackgroundColor = 0;
466 WindowState detachedWallpaper = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700467 final DimSurface windowAnimationBackgroundSurface =
468 displayAnimator.mWindowAnimationBackgroundSurface;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700469
Craig Mautner59c00972012-07-30 12:10:24 -0700470 for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
471 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner078ea0a2012-06-25 11:04:29 -0700472 if (winAnimator.mSurface == null) {
473 continue;
474 }
475
476 final int flags = winAnimator.mAttrFlags;
477 final WindowState win = winAnimator.mWin;
478
479 // If this window is animating, make a note that we have
480 // an animating window and take care of a request to run
481 // a detached wallpaper animation.
482 if (winAnimator.mAnimating) {
483 if (winAnimator.mAnimation != null) {
484 if ((flags & FLAG_SHOW_WALLPAPER) != 0
485 && winAnimator.mAnimation.getDetachWallpaper()) {
486 detachedWallpaper = win;
487 }
488 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
489 if (backgroundColor != 0) {
490 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
491 windowAnimationBackground.mAnimLayer)) {
492 windowAnimationBackground = winAnimator;
493 windowAnimationBackgroundColor = backgroundColor;
494 }
495 }
496 }
497 mAnimating = true;
498 }
499
500 // If this window's app token is running a detached wallpaper
501 // animation, make a note so we can ensure the wallpaper is
502 // displayed behind it.
Craig Mautner322e4032012-07-13 13:35:20 -0700503 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700504 if (appAnimator != null && appAnimator.animation != null
505 && appAnimator.animating) {
506 if ((flags & FLAG_SHOW_WALLPAPER) != 0
507 && appAnimator.animation.getDetachWallpaper()) {
508 detachedWallpaper = win;
509 }
510
511 final int backgroundColor = appAnimator.animation.getBackgroundColor();
512 if (backgroundColor != 0) {
513 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
514 windowAnimationBackground.mAnimLayer)) {
515 windowAnimationBackground = winAnimator;
516 windowAnimationBackgroundColor = backgroundColor;
517 }
518 }
519 }
520 } // end forall windows
521
Craig Mautner9e809442012-06-22 17:13:04 -0700522 if (mWindowDetachedWallpaper != detachedWallpaper) {
523 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
524 "Detached wallpaper changed from " + mWindowDetachedWallpaper
525 + " to " + detachedWallpaper);
526 mWindowDetachedWallpaper = detachedWallpaper;
527 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
528 }
529
530 if (windowAnimationBackgroundColor != 0) {
531 // If the window that wants black is the current wallpaper
532 // target, then the black goes *below* the wallpaper so we
533 // don't cause the wallpaper to suddenly disappear.
534 int animLayer = windowAnimationBackground.mAnimLayer;
535 WindowState win = windowAnimationBackground.mWin;
Craig Mautner59c00972012-07-30 12:10:24 -0700536 if (mWallpaperTarget == win
Craig Mautner918b53b2012-07-09 14:15:54 -0700537 || mLowerWallpaperTarget == win || mUpperWallpaperTarget == win) {
Craig Mautner59c00972012-07-30 12:10:24 -0700538 final int N = winAnimatorList.size();
Craig Mautner9e809442012-06-22 17:13:04 -0700539 for (int i = 0; i < N; i++) {
Craig Mautner59c00972012-07-30 12:10:24 -0700540 WindowStateAnimator winAnimator = winAnimatorList.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700541 if (winAnimator.mIsWallpaper) {
Craig Mautner9e809442012-06-22 17:13:04 -0700542 animLayer = winAnimator.mAnimLayer;
543 break;
544 }
545 }
546 }
547
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700548 if (windowAnimationBackgroundSurface != null) {
549 windowAnimationBackgroundSurface.show(mDw, mDh,
550 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
551 windowAnimationBackgroundColor);
552 }
Craig Mautner9e809442012-06-22 17:13:04 -0700553 } else {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700554 if (windowAnimationBackgroundSurface != null) {
555 windowAnimationBackgroundSurface.hide();
556 }
Craig Mautner9e809442012-06-22 17:13:04 -0700557 }
Craig Mautner764983d2012-03-22 11:37:36 -0700558 }
559
560 private void testTokenMayBeDrawnLocked() {
561 // See if any windows have been drawn, so they (and others
562 // associated with them) can now be shown.
Craig Mautner322e4032012-07-13 13:35:20 -0700563 final int NT = mAppAnimators.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700564 for (int i=0; i<NT; i++) {
Craig Mautner322e4032012-07-13 13:35:20 -0700565 AppWindowAnimator appAnimator = mAppAnimators.get(i);
566 AppWindowToken wtoken = appAnimator.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700567 final boolean allDrawn = wtoken.allDrawn;
Craig Mautner322e4032012-07-13 13:35:20 -0700568 if (allDrawn != appAnimator.allDrawn) {
569 appAnimator.allDrawn = allDrawn;
Craig Mautner6fbda632012-07-03 09:26:39 -0700570 if (allDrawn) {
571 // The token has now changed state to having all
572 // windows shown... what to do, what to do?
Craig Mautner322e4032012-07-13 13:35:20 -0700573 if (appAnimator.freezingScreen) {
574 appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700575 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
576 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
577 "Setting mOrientationChangeComplete=true because wtoken "
578 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
579 + " numDrawn=" + wtoken.numDrawnWindows);
580 // This will set mOrientationChangeComplete and cause a pass through layout.
Craig Mautner76a71652012-09-03 23:23:58 -0700581 setAppLayoutChanges(appAnimator,
582 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
583 "testTokenMayBeDrawnLocked: freezingScreen");
Craig Mautner6fbda632012-07-03 09:26:39 -0700584 } else {
Craig Mautner76a71652012-09-03 23:23:58 -0700585 setAppLayoutChanges(appAnimator,
586 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
587 "testTokenMayBeDrawnLocked");
588
Craig Mautner6fbda632012-07-03 09:26:39 -0700589 // We can now show all of the drawn windows!
590 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautner322e4032012-07-13 13:35:20 -0700591 mAnimating |= appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700592 }
Craig Mautner764983d2012-03-22 11:37:36 -0700593 }
594 }
595 }
596 }
597 }
598
Craig Mautnera91f9e22012-09-14 16:22:08 -0700599 private void performAnimationsLocked(final int displayId) {
600 updateWindowsLocked(displayId);
601 updateWallpaperLocked(displayId);
Craig Mautner764983d2012-03-22 11:37:36 -0700602 }
603
Craig Mautner1caa3992012-06-22 09:46:48 -0700604 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
605 /** Locked on mService.mWindowMap and this. */
606 private void animateLocked() {
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700607 if (!mInitialized) {
608 return;
609 }
Craig Mautner59c00972012-07-30 12:10:24 -0700610
Craig Mautner76a71652012-09-03 23:23:58 -0700611 mPendingLayoutChanges.clear();
Craig Mautner764983d2012-03-22 11:37:36 -0700612 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700613 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700614 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700615 mAnimating = false;
616 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
617 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
618 }
Craig Mautner764983d2012-03-22 11:37:36 -0700619
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700620 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
621 TAG, ">>> OPEN TRANSACTION animateLocked");
Craig Mautner764983d2012-03-22 11:37:36 -0700622 Surface.openTransaction();
Jamie Gennisb6ce6e42012-10-15 19:14:58 -0700623 Surface.setAnimationTransaction();
Craig Mautner764983d2012-03-22 11:37:36 -0700624 try {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700625 updateAppWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700626
Craig Mautnera91f9e22012-09-14 16:22:08 -0700627 final int numDisplays = mDisplayContentsAnimators.size();
628 for (int i = 0; i < numDisplays; i++) {
629 final int displayId = mDisplayContentsAnimators.keyAt(i);
630 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
631
632 final ScreenRotationAnimation screenRotationAnimation =
633 displayAnimator.mScreenRotationAnimation;
634 if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
635 if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
636 mAnimating = true;
637 } else {
638 mBulkUpdateParams |= SET_UPDATE_ROTATION;
639 screenRotationAnimation.kill();
640 displayAnimator.mScreenRotationAnimation = null;
641 }
642 }
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700643
644 // Update animations of all applications, including those
645 // associated with exiting/removed apps
Craig Mautnera91f9e22012-09-14 16:22:08 -0700646 performAnimationsLocked(displayId);
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700647
Craig Mautnera91f9e22012-09-14 16:22:08 -0700648 final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators;
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700649 final int N = winAnimatorList.size();
650 for (int j = 0; j < N; j++) {
651 winAnimatorList.get(j).prepareSurfaceLocked(true);
652 }
653 }
654
655 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700656
Craig Mautnera91f9e22012-09-14 16:22:08 -0700657 for (int i = 0; i < numDisplays; i++) {
658 final int displayId = mDisplayContentsAnimators.keyAt(i);
659 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
Craig Mautner764983d2012-03-22 11:37:36 -0700660
Craig Mautnera91f9e22012-09-14 16:22:08 -0700661 final ScreenRotationAnimation screenRotationAnimation =
662 displayAnimator.mScreenRotationAnimation;
663 if (screenRotationAnimation != null) {
664 screenRotationAnimation.updateSurfacesInTransaction();
665 }
666
667 final DimAnimator.Parameters dimParams = displayAnimator.mDimParams;
668 final DimAnimator dimAnimator = displayAnimator.mDimAnimator;
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700669 if (dimAnimator != null && dimParams != null) {
670 dimAnimator.updateParameters(mContext.getResources(), dimParams, mCurrentTime);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700671 }
672 if (dimAnimator != null && dimAnimator.mDimShown) {
673 mAnimating |= dimAnimator.updateSurface(isDimmingLocked(displayId),
674 mCurrentTime, !mService.okToDisplay());
675 }
Craig Mautner764983d2012-03-22 11:37:36 -0700676 }
677
Craig Mautner7358fbf2012-04-12 21:06:33 -0700678 if (mService.mWatermark != null) {
679 mService.mWatermark.drawIfNeeded();
680 }
Craig Mautner764983d2012-03-22 11:37:36 -0700681 } catch (RuntimeException e) {
682 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
683 } finally {
684 Surface.closeTransaction();
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700685 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
686 TAG, "<<< CLOSE TRANSACTION animateLocked");
687 }
688
689 for (int i = mPendingLayoutChanges.size() - 1; i >= 0; i--) {
690 if ((mPendingLayoutChanges.valueAt(i)
691 & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
692 mPendingActions |= WALLPAPER_ACTION_PENDING;
693 }
Craig Mautner764983d2012-03-22 11:37:36 -0700694 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700695
Craig Mautner76a71652012-09-03 23:23:58 -0700696 if (mBulkUpdateParams != 0 || mPendingLayoutChanges.size() > 0) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700697 updateAnimToLayoutLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700698 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700699
700 if (mAnimating) {
Craig Mautner711f90a2012-07-03 18:43:52 -0700701 synchronized (mService.mLayoutToAnim) {
702 mService.scheduleAnimationLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -0700703 }
Chet Haase198e5642012-05-10 09:55:15 -0700704 } else if (wasAnimating) {
705 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700706 }
707 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
708 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
709 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
Craig Mautner76a71652012-09-03 23:23:58 -0700710 + " mPendingLayoutChanges(DEFAULT_DISPLAY)="
711 + Integer.toHexString(mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY)));
Craig Mautner7d8df392012-04-06 15:26:23 -0700712 }
Craig Mautner764983d2012-03-22 11:37:36 -0700713 }
714
715 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700716 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700717 mCurrentFocus = currentFocus;
718 }
719
720 void setDisplayDimensions(final int curWidth, final int curHeight,
721 final int appWidth, final int appHeight) {
722 mDw = curWidth;
723 mDh = curHeight;
724 mInnerDw = appWidth;
725 mInnerDh = appHeight;
726 }
727
Craig Mautnera91f9e22012-09-14 16:22:08 -0700728 boolean isDimmingLocked(int displayId) {
729 return getDisplayContentsAnimatorLocked(displayId).mDimParams != null;
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700730 }
731
Craig Mautnera91f9e22012-09-14 16:22:08 -0700732 boolean isDimmingLocked(final WindowStateAnimator winAnimator) {
733 DimAnimator.Parameters dimParams =
734 getDisplayContentsAnimatorLocked(winAnimator.mWin.getDisplayId()).mDimParams;
735 return dimParams != null && dimParams.mDimWinAnimator == winAnimator;
Craig Mautneracafd192012-05-10 10:41:02 -0700736 }
737
Craig Mautnera91f9e22012-09-14 16:22:08 -0700738 public void dumpLocked(PrintWriter pw, String prefix, boolean dumpAll) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700739 if (dumpAll) {
740 if (mWindowDetachedWallpaper != null) {
741 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
Craig Mautner178af592012-09-17 10:37:29 -0700742 pw.println(mWindowDetachedWallpaper);
Craig Mautner6fbda632012-07-03 09:26:39 -0700743 }
744 pw.print(prefix); pw.print("mAnimTransactionSequence=");
Craig Mautner178af592012-09-17 10:37:29 -0700745 pw.print(mAnimTransactionSequence);
746 pw.println(" mForceHiding=" + forceHidingToString());
Craig Mautnera91f9e22012-09-14 16:22:08 -0700747 for (int i = 0; i < mDisplayContentsAnimators.size(); i++) {
748 pw.print(prefix); pw.print("DisplayContentsAnimator #");
749 pw.println(mDisplayContentsAnimators.keyAt(i));
750 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
751 final String subPrefix = " " + prefix;
752 final String subSubPrefix = " " + subPrefix;
753 if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
754 pw.println(subPrefix + "mWindowAnimationBackgroundSurface:");
755 displayAnimator.mWindowAnimationBackgroundSurface.printTo(subSubPrefix, pw);
756 }
757 if (displayAnimator.mDimAnimator != null) {
758 pw.println(subPrefix + "mDimAnimator:");
759 displayAnimator.mDimAnimator.printTo(subSubPrefix, pw);
760 } else {
761 pw.println(subPrefix + "no DimAnimator ");
762 }
763 if (displayAnimator.mDimParams != null) {
764 pw.println(subPrefix + "mDimParams:");
765 displayAnimator.mDimParams.printTo(subSubPrefix, pw);
766 } else {
767 pw.println(subPrefix + "no DimParams ");
768 }
769 if (displayAnimator.mScreenRotationAnimation != null) {
770 pw.println(subPrefix + "mScreenRotationAnimation:");
771 displayAnimator.mScreenRotationAnimation.printTo(subSubPrefix, pw);
772 } else {
773 pw.print(subPrefix + "no ScreenRotationAnimation ");
774 }
Craig Mautner6fbda632012-07-03 09:26:39 -0700775 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700776 pw.println();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700777 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700778 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700779
Craig Mautner76a71652012-09-03 23:23:58 -0700780 void clearPendingActions() {
781 synchronized (this) {
782 mPendingActions = 0;
783 }
784 }
785
786 void setPendingLayoutChanges(final int displayId, final int changes) {
787 mPendingLayoutChanges.put(displayId, mPendingLayoutChanges.get(displayId) | changes);
788 }
789
790 void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) {
791 // Used to track which displays layout changes have been done.
792 SparseIntArray displays = new SparseIntArray();
793 for (int i = appAnimator.mAllAppWinAnimators.size() - 1; i >= 0; i--) {
794 WindowStateAnimator winAnimator = appAnimator.mAllAppWinAnimators.get(i);
795 final int displayId = winAnimator.mWin.mDisplayContent.getDisplayId();
796 if (displays.indexOfKey(displayId) < 0) {
797 setPendingLayoutChanges(displayId, changes);
798 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
799 mService.debugLayoutRepeats(s, mPendingLayoutChanges.get(displayId));
800 }
801 // Keep from processing this display again.
802 displays.put(displayId, changes);
803 }
804 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700805 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700806
807 private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
808 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
809 if (displayAnimator == null) {
Craig Mautnerac439e52012-09-21 08:58:34 -0700810 displayAnimator = new DisplayContentsAnimator(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700811 mDisplayContentsAnimators.put(displayId, displayAnimator);
812 }
813 return displayAnimator;
814 }
815
816 void setScreenRotationAnimationLocked(int displayId, ScreenRotationAnimation animation) {
817 getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation = animation;
818 }
819
820 ScreenRotationAnimation getScreenRotationAnimationLocked(int displayId) {
821 return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation;
822 }
823
Craig Mautnerac439e52012-09-21 08:58:34 -0700824 private class DisplayContentsAnimator {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700825 WinAnimatorList mWinAnimators = new WinAnimatorList();
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700826 DimAnimator mDimAnimator = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700827 DimAnimator.Parameters mDimParams = null;
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700828 DimSurface mWindowAnimationBackgroundSurface = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700829 ScreenRotationAnimation mScreenRotationAnimation = null;
Craig Mautnerac439e52012-09-21 08:58:34 -0700830
831 public DisplayContentsAnimator(int displayId) {
832 mDimAnimator = new DimAnimator(mService.mFxSession, displayId);
833 mWindowAnimationBackgroundSurface =
834 new DimSurface(mService.mFxSession, displayId);
835 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700836 }
Craig Mautner764983d2012-03-22 11:37:36 -0700837}