blob: f84c7f876bb073d839583e68b3db81b6dedd8fce [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 Mautner96868332012-12-04 14:29:11 -080012import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_ACTION_PENDING;
Craig Mautnera608b882012-03-30 13:03:49 -070013
Craig Mautner764983d2012-03-22 11:37:36 -070014import android.content.Context;
Dianne Hackborn98129732012-11-01 16:28:16 -070015import android.os.Debug;
Craig Mautner764983d2012-03-22 11:37:36 -070016import 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;
Dianne Hackborn529e7442012-11-01 14:22:28 -070021import android.util.TimeUtils;
Craig Mautner6881a102012-07-27 13:04:51 -070022import android.view.Display;
Craig Mautner764983d2012-03-22 11:37:36 -070023import android.view.Surface;
Craig Mautner764983d2012-03-22 11:37:36 -070024import android.view.WindowManagerPolicy;
25import android.view.animation.Animation;
Craig Mautner764983d2012-03-22 11:37:36 -070026
Dianne Hackborn529e7442012-11-01 14:22:28 -070027import com.android.server.wm.WindowManagerService.LayoutFields;
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 Mautner764983d2012-03-22 11:37:36 -070052 /** Time of current animation step. Reset on each iteration */
53 long mCurrentTime;
54
55 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
56 * 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 -070057 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070058
Craig Mautnere7ae2502012-03-26 17:11:19 -070059 // Window currently running an animation that has requested it be detached
60 // from the wallpaper. This means we need to ensure the wallpaper is
61 // visible behind it in case it animates in a way that would allow it to be
Craig Mautner01cd0e72012-06-18 10:19:11 -070062 // seen. If multiple windows satisfy this, use the lowest window.
Craig Mautnere7ae2502012-03-26 17:11:19 -070063 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070064
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070065 WindowStateAnimator mUniverseBackground = null;
66 int mAboveUniverseLayer = 0;
67
Craig Mautnera608b882012-03-30 13:03:49 -070068 int mBulkUpdateParams = 0;
69
Craig Mautnera91f9e22012-09-14 16:22:08 -070070 SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators =
71 new SparseArray<WindowAnimator.DisplayContentsAnimator>();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070072
Craig Mautnerb47bbc32012-08-22 17:41:48 -070073 boolean mInitialized = false;
74
Craig Mautner178af592012-09-17 10:37:29 -070075 // forceHiding states.
76 static final int KEYGUARD_NOT_SHOWN = 0;
77 static final int KEYGUARD_ANIMATING_IN = 1;
78 static final int KEYGUARD_SHOWN = 2;
79 static final int KEYGUARD_ANIMATING_OUT = 3;
80 int mForceHiding = KEYGUARD_NOT_SHOWN;
81
82 private String forceHidingToString() {
83 switch (mForceHiding) {
84 case KEYGUARD_NOT_SHOWN: return "KEYGUARD_NOT_SHOWN";
85 case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN";
86 case KEYGUARD_SHOWN: return "KEYGUARD_SHOWN";
87 case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT";
88 default: return "KEYGUARD STATE UNKNOWN " + mForceHiding;
89 }
90 }
91
Craig Mautner918b53b2012-07-09 14:15:54 -070092 WindowAnimator(final WindowManagerService service) {
Craig Mautner764983d2012-03-22 11:37:36 -070093 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -070094 mContext = service.mContext;
95 mPolicy = service.mPolicy;
Craig Mautner1caa3992012-06-22 09:46:48 -070096
97 mAnimationRunnable = new Runnable() {
98 @Override
99 public void run() {
Craig Mautner96868332012-12-04 14:29:11 -0800100 synchronized (mService.mWindowMap) {
101 mService.mAnimationScheduled = false;
102 animateLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -0700103 }
104 }
105 };
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700106 }
Craig Mautner9e809442012-06-22 17:13:04 -0700107
Craig Mautnera91f9e22012-09-14 16:22:08 -0700108 void addDisplayLocked(final int displayId) {
Craig Mautnerac439e52012-09-21 08:58:34 -0700109 // Create the DisplayContentsAnimator object by retrieving it.
110 getDisplayContentsAnimatorLocked(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700111 if (displayId == Display.DEFAULT_DISPLAY) {
112 mInitialized = true;
113 }
114 }
115
116 void removeDisplayLocked(final int displayId) {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700117 final DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
118 if (displayAnimator != null) {
119 if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
120 displayAnimator.mWindowAnimationBackgroundSurface.kill();
121 displayAnimator.mWindowAnimationBackgroundSurface = null;
122 }
123 if (displayAnimator.mScreenRotationAnimation != null) {
124 displayAnimator.mScreenRotationAnimation.kill();
125 displayAnimator.mScreenRotationAnimation = null;
126 }
127 if (displayAnimator.mDimAnimator != null) {
128 displayAnimator.mDimAnimator.kill();
129 displayAnimator.mDimAnimator = null;
130 }
131 }
132
Craig Mautnera91f9e22012-09-14 16:22:08 -0700133 mDisplayContentsAnimators.delete(displayId);
Craig Mautner96868332012-12-04 14:29:11 -0800134 mPendingLayoutChanges.delete(displayId);
Craig Mautner1caa3992012-06-22 09:46:48 -0700135 }
136
Craig Mautner96868332012-12-04 14:29:11 -0800137 AppWindowAnimator getWallpaperAppAnimator() {
138 return mService.mWallpaperTarget == null
139 ? null : mService.mWallpaperTarget.mAppToken == null
140 ? null : mService.mWallpaperTarget.mAppToken.mAppAnimator;
Craig Mautner711f90a2012-07-03 18:43:52 -0700141 }
142
Craig Mautner96868332012-12-04 14:29:11 -0800143 void hideWallpapersLocked(final WindowState w) {
144 final WindowState wallpaperTarget = mService.mWallpaperTarget;
145 final WindowState lowerWallpaperTarget = mService.mLowerWallpaperTarget;
146 final ArrayList<WindowToken> wallpaperTokens = mService.mWallpaperTokens;
147
Dianne Hackborn98129732012-11-01 16:28:16 -0700148 if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) {
149 final int numTokens = wallpaperTokens.size();
Craig Mautner918b53b2012-07-09 14:15:54 -0700150 for (int i = numTokens - 1; i >= 0; i--) {
Dianne Hackborn98129732012-11-01 16:28:16 -0700151 final WindowToken token = wallpaperTokens.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700152 final int numWindows = token.windows.size();
153 for (int j = numWindows - 1; j >= 0; j--) {
154 final WindowState wallpaper = token.windows.get(j);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700155 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
156 if (!winAnimator.mLastHidden) {
157 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700158 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautner76a71652012-09-03 23:23:58 -0700159 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
160 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700161 }
162 }
Dianne Hackbornef03a7f2012-10-29 18:46:52 -0700163 if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG,
Dianne Hackborn2ea9bae2012-11-02 18:43:48 -0700164 "Hiding wallpaper " + token + " from " + w
165 + " target=" + wallpaperTarget + " lower=" + lowerWallpaperTarget
166 + "\n" + Debug.getCallers(5, " "));
Craig Mautnerb9836b92012-06-11 11:40:09 -0700167 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700168 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700169 }
170 }
171
Craig Mautnera91f9e22012-09-14 16:22:08 -0700172 private void updateAppWindowsLocked() {
Craig Mautner764983d2012-03-22 11:37:36 -0700173 int i;
Craig Mautner96868332012-12-04 14:29:11 -0800174 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
175 final int NAT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700176 for (i=0; i<NAT; i++) {
Craig Mautner96868332012-12-04 14:29:11 -0800177 final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700178 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700179 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner9339c402012-11-30 11:23:56 -0800180 if (appAnimator.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700181 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700182 } else if (wasAnimating) {
183 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700184 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
185 "appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700186 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
187 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700188 }
189 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700190
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700191 final int NEAT = mService.mExitingAppTokens.size();
192 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700193 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700194 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700195 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner9339c402012-11-30 11:23:56 -0800196 if (appAnimator.stepAnimationLocked(mCurrentTime)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700197 mAnimating = true;
198 } else if (wasAnimating) {
199 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700200 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
201 "exiting appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700202 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
203 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700204 }
205 }
Craig Mautner764983d2012-03-22 11:37:36 -0700206 }
207
Craig Mautnera91f9e22012-09-14 16:22:08 -0700208 private void updateWindowsLocked(final int displayId) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700209 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700210
Craig Mautner96868332012-12-04 14:29:11 -0800211 final WindowList windows = mService.getWindowListLocked(displayId);
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700212 ArrayList<WindowStateAnimator> unForceHiding = null;
213 boolean wallpaperInUnForceHiding = false;
Craig Mautner178af592012-09-17 10:37:29 -0700214 mForceHiding = KEYGUARD_NOT_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700215
Craig Mautner96868332012-12-04 14:29:11 -0800216 for (int i = windows.size() - 1; i >= 0; i--) {
217 WindowState win = windows.get(i);
218 WindowStateAnimator winAnimator = win.mWinAnimator;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700219 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700220
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700221 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700222 final boolean wasAnimating = winAnimator.mWasAnimating;
223 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700224
225 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700226 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700227 ", nowAnimating=" + nowAnimating);
228 }
229
Craig Mautner96868332012-12-04 14:29:11 -0800230 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700231 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700232 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
233 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700234 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700235 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
Craig Mautner76a71652012-09-03 23:23:58 -0700236 mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700237 }
Craig Mautner764983d2012-03-22 11:37:36 -0700238 }
239
Craig Mautnerbec53f72012-04-05 11:49:05 -0700240 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700241 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700242 if (WindowManagerService.DEBUG_ANIM ||
243 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
244 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700245 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner76a71652012-09-03 23:23:58 -0700246 setPendingLayoutChanges(displayId,
247 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700248 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700249 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
Craig Mautner76a71652012-09-03 23:23:58 -0700250 mPendingLayoutChanges.get(displayId));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700251 }
Craig Mautner764983d2012-03-22 11:37:36 -0700252 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700253 }
Craig Mautner4bf18a72012-07-10 14:08:16 -0700254 if (win.isReadyForDisplay()) {
255 if (nowAnimating) {
256 if (winAnimator.mAnimationIsEntrance) {
Craig Mautner178af592012-09-17 10:37:29 -0700257 mForceHiding = KEYGUARD_ANIMATING_IN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700258 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700259 mForceHiding = KEYGUARD_ANIMATING_OUT;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700260 }
261 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700262 mForceHiding = KEYGUARD_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700263 }
Craig Mautner764983d2012-03-22 11:37:36 -0700264 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700265 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner178af592012-09-17 10:37:29 -0700266 "Force hide " + mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700267 + " hasSurface=" + win.mHasSurface
268 + " policyVis=" + win.mPolicyVisibility
269 + " destroying=" + win.mDestroying
270 + " attHidden=" + win.mAttachedHidden
271 + " vis=" + win.mViewVisibility
272 + " hidden=" + win.mRootToken.hidden
273 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700274 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautner4bf18a72012-07-10 14:08:16 -0700275 final boolean hideWhenLocked =
276 (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700277 final boolean changed;
Craig Mautner178af592012-09-17 10:37:29 -0700278 if (((mForceHiding == KEYGUARD_ANIMATING_IN)
Craig Mautner4bf18a72012-07-10 14:08:16 -0700279 && (!winAnimator.isAnimating() || hideWhenLocked))
Craig Mautner178af592012-09-17 10:37:29 -0700280 || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700281 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700282 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700283 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700284 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700285 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700286 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700287 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700288 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700289 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700290 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700291 if (unForceHiding == null) {
292 unForceHiding = new ArrayList<WindowStateAnimator>();
293 }
294 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700295 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700296 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700297 }
298 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700299 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700300 // We are showing on to of the current
301 // focus, so re-evaluate focus to make
302 // sure it is correct.
303 mService.mFocusMayChange = true;
304 }
305 }
306 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700307 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700308 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700309 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
310 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700311 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700312 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
Craig Mautner76a71652012-09-03 23:23:58 -0700313 mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700314 }
Craig Mautner764983d2012-03-22 11:37:36 -0700315 }
316 }
317 }
318
Craig Mautnerbec53f72012-04-05 11:49:05 -0700319 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700320 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
321 if (atoken == null || atoken.allDrawn) {
322 if (winAnimator.performShowLocked()) {
Craig Mautner76a71652012-09-03 23:23:58 -0700323 mPendingLayoutChanges.put(displayId,
324 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
Craig Mautner6fbda632012-07-03 09:26:39 -0700325 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
326 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
Craig Mautner76a71652012-09-03 23:23:58 -0700327 mPendingLayoutChanges.get(displayId));
Craig Mautner764983d2012-03-22 11:37:36 -0700328 }
329 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700330 }
Craig Mautner764983d2012-03-22 11:37:36 -0700331 }
Craig Mautner322e4032012-07-13 13:35:20 -0700332 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700333 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700334 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
335 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700336 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700337 }
Craig Mautner59431632012-04-04 11:56:44 -0700338 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
339 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700340 }
341 }
Craig Mautner764983d2012-03-22 11:37:36 -0700342 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700343
Craig Mautner078ea0a2012-06-25 11:04:29 -0700344 // If we have windows that are being show due to them no longer
345 // being force-hidden, apply the appropriate animation to them.
346 if (unForceHiding != null) {
347 for (int i=unForceHiding.size()-1; i>=0; i--) {
348 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
349 if (a != null) {
350 final WindowStateAnimator winAnimator = unForceHiding.get(i);
351 winAnimator.setAnimation(a);
352 winAnimator.mAnimationIsEntrance = true;
353 }
354 }
355 }
356 }
357
Craig Mautnera91f9e22012-09-14 16:22:08 -0700358 private void updateWallpaperLocked(int displayId) {
359 final DisplayContentsAnimator displayAnimator =
360 getDisplayContentsAnimatorLocked(displayId);
Craig Mautner96868332012-12-04 14:29:11 -0800361 final WindowList windows = mService.getWindowListLocked(displayId);
Craig Mautner078ea0a2012-06-25 11:04:29 -0700362 WindowStateAnimator windowAnimationBackground = null;
363 int windowAnimationBackgroundColor = 0;
364 WindowState detachedWallpaper = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700365 final DimSurface windowAnimationBackgroundSurface =
366 displayAnimator.mWindowAnimationBackgroundSurface;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700367
Craig Mautner96868332012-12-04 14:29:11 -0800368 for (int i = windows.size() - 1; i >= 0; i--) {
369 final WindowState win = windows.get(i);
370 WindowStateAnimator winAnimator = win.mWinAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700371 if (winAnimator.mSurface == null) {
372 continue;
373 }
374
375 final int flags = winAnimator.mAttrFlags;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700376
377 // If this window is animating, make a note that we have
378 // an animating window and take care of a request to run
379 // a detached wallpaper animation.
380 if (winAnimator.mAnimating) {
381 if (winAnimator.mAnimation != null) {
382 if ((flags & FLAG_SHOW_WALLPAPER) != 0
383 && winAnimator.mAnimation.getDetachWallpaper()) {
384 detachedWallpaper = win;
385 }
386 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
387 if (backgroundColor != 0) {
388 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
389 windowAnimationBackground.mAnimLayer)) {
390 windowAnimationBackground = winAnimator;
391 windowAnimationBackgroundColor = backgroundColor;
392 }
393 }
394 }
395 mAnimating = true;
396 }
397
398 // If this window's app token is running a detached wallpaper
399 // animation, make a note so we can ensure the wallpaper is
400 // displayed behind it.
Craig Mautner322e4032012-07-13 13:35:20 -0700401 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700402 if (appAnimator != null && appAnimator.animation != null
403 && appAnimator.animating) {
404 if ((flags & FLAG_SHOW_WALLPAPER) != 0
405 && appAnimator.animation.getDetachWallpaper()) {
406 detachedWallpaper = win;
407 }
408
409 final int backgroundColor = appAnimator.animation.getBackgroundColor();
410 if (backgroundColor != 0) {
411 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
412 windowAnimationBackground.mAnimLayer)) {
413 windowAnimationBackground = winAnimator;
414 windowAnimationBackgroundColor = backgroundColor;
415 }
416 }
417 }
418 } // end forall windows
419
Craig Mautner9e809442012-06-22 17:13:04 -0700420 if (mWindowDetachedWallpaper != detachedWallpaper) {
421 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
422 "Detached wallpaper changed from " + mWindowDetachedWallpaper
423 + " to " + detachedWallpaper);
424 mWindowDetachedWallpaper = detachedWallpaper;
425 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
426 }
427
428 if (windowAnimationBackgroundColor != 0) {
429 // If the window that wants black is the current wallpaper
430 // target, then the black goes *below* the wallpaper so we
431 // don't cause the wallpaper to suddenly disappear.
432 int animLayer = windowAnimationBackground.mAnimLayer;
433 WindowState win = windowAnimationBackground.mWin;
Craig Mautner96868332012-12-04 14:29:11 -0800434 if (mService.mWallpaperTarget == win || mService.mLowerWallpaperTarget == win
435 || mService.mUpperWallpaperTarget == win) {
436 final int N = windows.size();
Craig Mautner9e809442012-06-22 17:13:04 -0700437 for (int i = 0; i < N; i++) {
Craig Mautner96868332012-12-04 14:29:11 -0800438 WindowStateAnimator winAnimator = windows.get(i).mWinAnimator;
Craig Mautner918b53b2012-07-09 14:15:54 -0700439 if (winAnimator.mIsWallpaper) {
Craig Mautner9e809442012-06-22 17:13:04 -0700440 animLayer = winAnimator.mAnimLayer;
441 break;
442 }
443 }
444 }
445
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700446 if (windowAnimationBackgroundSurface != null) {
Craig Mautner9339c402012-11-30 11:23:56 -0800447 windowAnimationBackgroundSurface.show(
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700448 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
449 windowAnimationBackgroundColor);
450 }
Craig Mautner9e809442012-06-22 17:13:04 -0700451 } else {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700452 if (windowAnimationBackgroundSurface != null) {
453 windowAnimationBackgroundSurface.hide();
454 }
Craig Mautner9e809442012-06-22 17:13:04 -0700455 }
Craig Mautner764983d2012-03-22 11:37:36 -0700456 }
457
Craig Mautner9339c402012-11-30 11:23:56 -0800458 /** See if any windows have been drawn, so they (and others associated with them) can now be
459 * shown. */
Craig Mautner764983d2012-03-22 11:37:36 -0700460 private void testTokenMayBeDrawnLocked() {
Craig Mautner96868332012-12-04 14:29:11 -0800461 // See if any windows have been drawn, so they (and others
462 // associated with them) can now be shown.
463 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
464 final int NT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700465 for (int i=0; i<NT; i++) {
Craig Mautner96868332012-12-04 14:29:11 -0800466 AppWindowToken wtoken = appTokens.get(i);
467 AppWindowAnimator appAnimator = wtoken.mAppAnimator;
Craig Mautner6fbda632012-07-03 09:26:39 -0700468 final boolean allDrawn = wtoken.allDrawn;
Craig Mautner322e4032012-07-13 13:35:20 -0700469 if (allDrawn != appAnimator.allDrawn) {
470 appAnimator.allDrawn = allDrawn;
Craig Mautner6fbda632012-07-03 09:26:39 -0700471 if (allDrawn) {
472 // The token has now changed state to having all
473 // windows shown... what to do, what to do?
Craig Mautner322e4032012-07-13 13:35:20 -0700474 if (appAnimator.freezingScreen) {
475 appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700476 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
477 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
478 "Setting mOrientationChangeComplete=true because wtoken "
479 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
480 + " numDrawn=" + wtoken.numDrawnWindows);
481 // This will set mOrientationChangeComplete and cause a pass through layout.
Craig Mautner76a71652012-09-03 23:23:58 -0700482 setAppLayoutChanges(appAnimator,
483 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
484 "testTokenMayBeDrawnLocked: freezingScreen");
Craig Mautner6fbda632012-07-03 09:26:39 -0700485 } else {
Craig Mautner76a71652012-09-03 23:23:58 -0700486 setAppLayoutChanges(appAnimator,
487 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
488 "testTokenMayBeDrawnLocked");
489
Craig Mautner6fbda632012-07-03 09:26:39 -0700490 // We can now show all of the drawn windows!
491 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautner322e4032012-07-13 13:35:20 -0700492 mAnimating |= appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700493 }
Craig Mautner764983d2012-03-22 11:37:36 -0700494 }
495 }
496 }
497 }
498 }
499
Craig Mautnera91f9e22012-09-14 16:22:08 -0700500 private void performAnimationsLocked(final int displayId) {
501 updateWindowsLocked(displayId);
502 updateWallpaperLocked(displayId);
Craig Mautner764983d2012-03-22 11:37:36 -0700503 }
504
Craig Mautner1caa3992012-06-22 09:46:48 -0700505 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
506 /** Locked on mService.mWindowMap and this. */
507 private void animateLocked() {
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700508 if (!mInitialized) {
509 return;
510 }
Craig Mautner59c00972012-07-30 12:10:24 -0700511
Craig Mautner76a71652012-09-03 23:23:58 -0700512 mPendingLayoutChanges.clear();
Craig Mautner764983d2012-03-22 11:37:36 -0700513 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700514 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700515 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700516 mAnimating = false;
517 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
518 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
519 }
Craig Mautner764983d2012-03-22 11:37:36 -0700520
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700521 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
522 TAG, ">>> OPEN TRANSACTION animateLocked");
Craig Mautner764983d2012-03-22 11:37:36 -0700523 Surface.openTransaction();
Jamie Gennisb6ce6e42012-10-15 19:14:58 -0700524 Surface.setAnimationTransaction();
Craig Mautner764983d2012-03-22 11:37:36 -0700525 try {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700526 updateAppWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700527
Craig Mautnera91f9e22012-09-14 16:22:08 -0700528 final int numDisplays = mDisplayContentsAnimators.size();
529 for (int i = 0; i < numDisplays; i++) {
530 final int displayId = mDisplayContentsAnimators.keyAt(i);
531 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
532
533 final ScreenRotationAnimation screenRotationAnimation =
534 displayAnimator.mScreenRotationAnimation;
535 if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
536 if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
537 mAnimating = true;
538 } else {
539 mBulkUpdateParams |= SET_UPDATE_ROTATION;
540 screenRotationAnimation.kill();
541 displayAnimator.mScreenRotationAnimation = null;
542 }
543 }
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700544
545 // Update animations of all applications, including those
546 // associated with exiting/removed apps
Craig Mautnera91f9e22012-09-14 16:22:08 -0700547 performAnimationsLocked(displayId);
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700548
Craig Mautner96868332012-12-04 14:29:11 -0800549 final WindowList windows = mService.getWindowListLocked(displayId);
550 final int N = windows.size();
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700551 for (int j = 0; j < N; j++) {
Craig Mautner96868332012-12-04 14:29:11 -0800552 windows.get(j).mWinAnimator.prepareSurfaceLocked(true);
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700553 }
554 }
555
556 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700557
Craig Mautnera91f9e22012-09-14 16:22:08 -0700558 for (int i = 0; i < numDisplays; i++) {
559 final int displayId = mDisplayContentsAnimators.keyAt(i);
560 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
Craig Mautner764983d2012-03-22 11:37:36 -0700561
Craig Mautnera91f9e22012-09-14 16:22:08 -0700562 final ScreenRotationAnimation screenRotationAnimation =
563 displayAnimator.mScreenRotationAnimation;
564 if (screenRotationAnimation != null) {
565 screenRotationAnimation.updateSurfacesInTransaction();
566 }
567
568 final DimAnimator.Parameters dimParams = displayAnimator.mDimParams;
569 final DimAnimator dimAnimator = displayAnimator.mDimAnimator;
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700570 if (dimAnimator != null && dimParams != null) {
571 dimAnimator.updateParameters(mContext.getResources(), dimParams, mCurrentTime);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700572 }
573 if (dimAnimator != null && dimAnimator.mDimShown) {
574 mAnimating |= dimAnimator.updateSurface(isDimmingLocked(displayId),
575 mCurrentTime, !mService.okToDisplay());
576 }
Craig Mautner764983d2012-03-22 11:37:36 -0700577 }
578
Craig Mautner7358fbf2012-04-12 21:06:33 -0700579 if (mService.mWatermark != null) {
580 mService.mWatermark.drawIfNeeded();
581 }
Craig Mautner764983d2012-03-22 11:37:36 -0700582 } catch (RuntimeException e) {
583 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
584 } finally {
585 Surface.closeTransaction();
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700586 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
587 TAG, "<<< CLOSE TRANSACTION animateLocked");
588 }
589
590 for (int i = mPendingLayoutChanges.size() - 1; i >= 0; i--) {
591 if ((mPendingLayoutChanges.valueAt(i)
592 & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
Craig Mautner96868332012-12-04 14:29:11 -0800593 mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING;
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700594 }
Craig Mautner764983d2012-03-22 11:37:36 -0700595 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700596
Craig Mautner76a71652012-09-03 23:23:58 -0700597 if (mBulkUpdateParams != 0 || mPendingLayoutChanges.size() > 0) {
Craig Mautner96868332012-12-04 14:29:11 -0800598 if (mService.copyAnimToLayoutParamsLocked()) {
599 mService.requestTraversalLocked();
600 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700601 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700602
603 if (mAnimating) {
Craig Mautner96868332012-12-04 14:29:11 -0800604 mService.scheduleAnimationLocked();
Chet Haase198e5642012-05-10 09:55:15 -0700605 } else if (wasAnimating) {
606 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700607 }
608 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
609 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
610 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
Craig Mautner76a71652012-09-03 23:23:58 -0700611 + " mPendingLayoutChanges(DEFAULT_DISPLAY)="
612 + Integer.toHexString(mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY)));
Craig Mautner7d8df392012-04-06 15:26:23 -0700613 }
Craig Mautner764983d2012-03-22 11:37:36 -0700614 }
615
616 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700617 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700618 mCurrentFocus = currentFocus;
619 }
620
Craig Mautnera91f9e22012-09-14 16:22:08 -0700621 boolean isDimmingLocked(int displayId) {
622 return getDisplayContentsAnimatorLocked(displayId).mDimParams != null;
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700623 }
624
Craig Mautnera91f9e22012-09-14 16:22:08 -0700625 boolean isDimmingLocked(final WindowStateAnimator winAnimator) {
626 DimAnimator.Parameters dimParams =
627 getDisplayContentsAnimatorLocked(winAnimator.mWin.getDisplayId()).mDimParams;
628 return dimParams != null && dimParams.mDimWinAnimator == winAnimator;
Craig Mautneracafd192012-05-10 10:41:02 -0700629 }
630
Dianne Hackborn529e7442012-11-01 14:22:28 -0700631 static String bulkUpdateParamsToString(int bulkUpdateParams) {
632 StringBuilder builder = new StringBuilder(128);
633 if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
634 builder.append(" UPDATE_ROTATION");
635 }
636 if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
637 builder.append(" WALLPAPER_MAY_CHANGE");
638 }
639 if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
640 builder.append(" FORCE_HIDING_CHANGED");
641 }
642 if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) != 0) {
643 builder.append(" ORIENTATION_CHANGE_COMPLETE");
644 }
645 if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
646 builder.append(" TURN_ON_SCREEN");
647 }
648 return builder.toString();
649 }
650
Craig Mautnera91f9e22012-09-14 16:22:08 -0700651 public void dumpLocked(PrintWriter pw, String prefix, boolean dumpAll) {
Dianne Hackborn529e7442012-11-01 14:22:28 -0700652 final String subPrefix = " " + prefix;
653 final String subSubPrefix = " " + subPrefix;
654
Dianne Hackborn529e7442012-11-01 14:22:28 -0700655 for (int i = 0; i < mDisplayContentsAnimators.size(); i++) {
656 pw.print(prefix); pw.print("DisplayContentsAnimator #");
657 pw.print(mDisplayContentsAnimators.keyAt(i));
658 pw.println(":");
659 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
Craig Mautner96868332012-12-04 14:29:11 -0800660 final WindowList windows =
661 mService.getWindowListLocked(mDisplayContentsAnimators.keyAt(i));
662 final int N = windows.size();
663 for (int j = 0; j < N; j++) {
664 WindowStateAnimator wanim = windows.get(j).mWinAnimator;
Dianne Hackborn529e7442012-11-01 14:22:28 -0700665 pw.print(subPrefix); pw.print("Window #"); pw.print(j);
666 pw.print(": "); pw.println(wanim);
667 }
668 if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
669 if (dumpAll || displayAnimator.mWindowAnimationBackgroundSurface.mDimShown) {
670 pw.print(subPrefix); pw.println("mWindowAnimationBackgroundSurface:");
Craig Mautnera91f9e22012-09-14 16:22:08 -0700671 displayAnimator.mWindowAnimationBackgroundSurface.printTo(subSubPrefix, pw);
672 }
Craig Mautner6fbda632012-07-03 09:26:39 -0700673 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700674 if (displayAnimator.mDimAnimator != null) {
675 if (dumpAll || displayAnimator.mDimAnimator.mDimShown) {
676 pw.print(subPrefix); pw.println("mDimAnimator:");
677 displayAnimator.mDimAnimator.printTo(subSubPrefix, pw);
678 }
679 } else if (dumpAll) {
680 pw.print(subPrefix); pw.println("no DimAnimator ");
681 }
682 if (displayAnimator.mDimParams != null) {
683 pw.print(subPrefix); pw.println("mDimParams:");
684 displayAnimator.mDimParams.printTo(subSubPrefix, pw);
685 } else if (dumpAll) {
686 pw.print(subPrefix); pw.println("no DimParams ");
687 }
688 if (displayAnimator.mScreenRotationAnimation != null) {
689 pw.print(subPrefix); pw.println("mScreenRotationAnimation:");
690 displayAnimator.mScreenRotationAnimation.printTo(subSubPrefix, pw);
691 } else if (dumpAll) {
692 pw.print(subPrefix); pw.println("no ScreenRotationAnimation ");
693 }
694 }
695
696 pw.println();
697
698 if (dumpAll) {
699 pw.print(prefix); pw.print("mAnimTransactionSequence=");
700 pw.print(mAnimTransactionSequence);
701 pw.print(" mForceHiding="); pw.println(forceHidingToString());
702 pw.print(prefix); pw.print("mCurrentTime=");
703 pw.println(TimeUtils.formatUptime(mCurrentTime));
Dianne Hackborn529e7442012-11-01 14:22:28 -0700704 }
705 if (mBulkUpdateParams != 0) {
706 pw.print(prefix); pw.print("mBulkUpdateParams=0x");
707 pw.print(Integer.toHexString(mBulkUpdateParams));
708 pw.println(bulkUpdateParamsToString(mBulkUpdateParams));
709 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700710 if (mWindowDetachedWallpaper != null) {
711 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
712 pw.println(mWindowDetachedWallpaper);
713 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700714 if (mUniverseBackground != null) {
715 pw.print(prefix); pw.print("mUniverseBackground="); pw.print(mUniverseBackground);
716 pw.print(" mAboveUniverseLayer="); pw.println(mAboveUniverseLayer);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700717 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700718 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700719
Craig Mautner76a71652012-09-03 23:23:58 -0700720 void setPendingLayoutChanges(final int displayId, final int changes) {
721 mPendingLayoutChanges.put(displayId, mPendingLayoutChanges.get(displayId) | changes);
722 }
723
724 void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) {
725 // Used to track which displays layout changes have been done.
726 SparseIntArray displays = new SparseIntArray();
Craig Mautner96868332012-12-04 14:29:11 -0800727 WindowList windows = appAnimator.mAppToken.allAppWindows;
728 for (int i = windows.size() - 1; i >= 0; i--) {
729 final int displayId = windows.get(i).getDisplayId();
Craig Mautner76a71652012-09-03 23:23:58 -0700730 if (displays.indexOfKey(displayId) < 0) {
731 setPendingLayoutChanges(displayId, changes);
732 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
733 mService.debugLayoutRepeats(s, mPendingLayoutChanges.get(displayId));
734 }
735 // Keep from processing this display again.
736 displays.put(displayId, changes);
737 }
738 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700739 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700740
Craig Mautner96868332012-12-04 14:29:11 -0800741 void setDimParamsLocked(int displayId, DimAnimator.Parameters dimParams) {
742 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
743 if (dimParams == null) {
744 displayAnimator.mDimParams = null;
745 } else {
746 final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
747
748 // Only set dim params on the highest dimmed layer.
749 final WindowStateAnimator existingDimWinAnimator =
750 displayAnimator.mDimParams == null ?
751 null : displayAnimator.mDimParams.mDimWinAnimator;
752 // Don't turn on for an unshown surface, or for any layer but the highest
753 // dimmed layer.
754 if (newWinAnimator.mSurfaceShown && (existingDimWinAnimator == null
755 || !existingDimWinAnimator.mSurfaceShown
756 || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
757 displayAnimator.mDimParams = new DimAnimator.Parameters(dimParams);
758 }
759 }
760 }
761
Craig Mautnera91f9e22012-09-14 16:22:08 -0700762 private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
763 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
764 if (displayAnimator == null) {
Craig Mautnerac439e52012-09-21 08:58:34 -0700765 displayAnimator = new DisplayContentsAnimator(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700766 mDisplayContentsAnimators.put(displayId, displayAnimator);
767 }
768 return displayAnimator;
769 }
770
771 void setScreenRotationAnimationLocked(int displayId, ScreenRotationAnimation animation) {
772 getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation = animation;
773 }
774
775 ScreenRotationAnimation getScreenRotationAnimationLocked(int displayId) {
776 return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation;
777 }
778
Craig Mautnerac439e52012-09-21 08:58:34 -0700779 private class DisplayContentsAnimator {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700780 DimAnimator mDimAnimator = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700781 DimAnimator.Parameters mDimParams = null;
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700782 DimSurface mWindowAnimationBackgroundSurface = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700783 ScreenRotationAnimation mScreenRotationAnimation = null;
Craig Mautnerac439e52012-09-21 08:58:34 -0700784
785 public DisplayContentsAnimator(int displayId) {
786 mDimAnimator = new DimAnimator(mService.mFxSession, displayId);
Craig Mautner9339c402012-11-30 11:23:56 -0800787 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession,
788 mService.getDisplayContentLocked(displayId));
Craig Mautnerac439e52012-09-21 08:58:34 -0700789 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700790 }
Craig Mautner764983d2012-03-22 11:37:36 -0700791}