blob: 74f51d7dc423e7082181294647d34e7d7e60530a [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
Craig Mautner66f78d72012-12-04 16:46:50 -080027import com.android.server.wm.WindowManagerService.DisplayContentsIterator;
Dianne Hackborn529e7442012-11-01 14:22:28 -070028import com.android.server.wm.WindowManagerService.LayoutFields;
Craig Mautner764983d2012-03-22 11:37:36 -070029
Craig Mautnere7ae2502012-03-26 17:11:19 -070030import java.io.PrintWriter;
Dianne Hackborn0c2acff2012-04-12 15:17:07 -070031import java.util.ArrayList;
Craig Mautnere7ae2502012-03-26 17:11:19 -070032
Craig Mautner764983d2012-03-22 11:37:36 -070033/**
Craig Mautner764983d2012-03-22 11:37:36 -070034 * Singleton class that carries out the animations and Surface operations in a separate task
35 * on behalf of WindowManagerService.
36 */
37public class WindowAnimator {
Craig Mautnerbb1449b2012-03-23 16:11:14 -070038 private static final String TAG = "WindowAnimator";
Craig Mautner764983d2012-03-22 11:37:36 -070039
40 final WindowManagerService mService;
41 final Context mContext;
42 final WindowManagerPolicy mPolicy;
43
44 boolean mAnimating;
Craig Mautner01cd0e72012-06-18 10:19:11 -070045
Craig Mautner1caa3992012-06-22 09:46:48 -070046 final Runnable mAnimationRunnable;
47
Craig Mautner764983d2012-03-22 11:37:36 -070048 int mAdjResult;
49
Craig Mautner764983d2012-03-22 11:37:36 -070050 /** Time of current animation step. Reset on each iteration */
51 long mCurrentTime;
52
53 /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
54 * 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 -070055 private int mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -070056
Craig Mautnerae446592012-12-06 19:05:05 -080057 /** Window currently running an animation that has requested it be detached
58 * from the wallpaper. This means we need to ensure the wallpaper is
59 * visible behind it in case it animates in a way that would allow it to be
60 * seen. If multiple windows satisfy this, use the lowest window. */
Craig Mautnere7ae2502012-03-26 17:11:19 -070061 WindowState mWindowDetachedWallpaper = null;
Craig Mautner01cd0e72012-06-18 10:19:11 -070062
Dianne Hackborna4b7f2f2012-05-21 11:28:41 -070063 WindowStateAnimator mUniverseBackground = null;
64 int mAboveUniverseLayer = 0;
65
Craig Mautnera608b882012-03-30 13:03:49 -070066 int mBulkUpdateParams = 0;
67
Craig Mautnera91f9e22012-09-14 16:22:08 -070068 SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators =
69 new SparseArray<WindowAnimator.DisplayContentsAnimator>();
Craig Mautnerd09cc4b2012-04-04 10:23:31 -070070
Craig Mautnerb47bbc32012-08-22 17:41:48 -070071 boolean mInitialized = false;
72
Craig Mautner178af592012-09-17 10:37:29 -070073 // forceHiding states.
74 static final int KEYGUARD_NOT_SHOWN = 0;
75 static final int KEYGUARD_ANIMATING_IN = 1;
76 static final int KEYGUARD_SHOWN = 2;
77 static final int KEYGUARD_ANIMATING_OUT = 3;
78 int mForceHiding = KEYGUARD_NOT_SHOWN;
79
80 private String forceHidingToString() {
81 switch (mForceHiding) {
82 case KEYGUARD_NOT_SHOWN: return "KEYGUARD_NOT_SHOWN";
83 case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN";
84 case KEYGUARD_SHOWN: return "KEYGUARD_SHOWN";
85 case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT";
86 default: return "KEYGUARD STATE UNKNOWN " + mForceHiding;
87 }
88 }
89
Craig Mautner918b53b2012-07-09 14:15:54 -070090 WindowAnimator(final WindowManagerService service) {
Craig Mautner764983d2012-03-22 11:37:36 -070091 mService = service;
Craig Mautner918b53b2012-07-09 14:15:54 -070092 mContext = service.mContext;
93 mPolicy = service.mPolicy;
Craig Mautner1caa3992012-06-22 09:46:48 -070094
95 mAnimationRunnable = new Runnable() {
96 @Override
97 public void run() {
Craig Mautner96868332012-12-04 14:29:11 -080098 synchronized (mService.mWindowMap) {
99 mService.mAnimationScheduled = false;
100 animateLocked();
Craig Mautner1caa3992012-06-22 09:46:48 -0700101 }
102 }
103 };
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700104 }
Craig Mautner9e809442012-06-22 17:13:04 -0700105
Craig Mautnera91f9e22012-09-14 16:22:08 -0700106 void addDisplayLocked(final int displayId) {
Craig Mautnerac439e52012-09-21 08:58:34 -0700107 // Create the DisplayContentsAnimator object by retrieving it.
108 getDisplayContentsAnimatorLocked(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700109 if (displayId == Display.DEFAULT_DISPLAY) {
110 mInitialized = true;
111 }
112 }
113
114 void removeDisplayLocked(final int displayId) {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700115 final DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
116 if (displayAnimator != null) {
117 if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
118 displayAnimator.mWindowAnimationBackgroundSurface.kill();
119 displayAnimator.mWindowAnimationBackgroundSurface = null;
120 }
121 if (displayAnimator.mScreenRotationAnimation != null) {
122 displayAnimator.mScreenRotationAnimation.kill();
123 displayAnimator.mScreenRotationAnimation = null;
124 }
125 if (displayAnimator.mDimAnimator != null) {
126 displayAnimator.mDimAnimator.kill();
127 displayAnimator.mDimAnimator = null;
128 }
129 }
130
Craig Mautnera91f9e22012-09-14 16:22:08 -0700131 mDisplayContentsAnimators.delete(displayId);
Craig Mautner1caa3992012-06-22 09:46:48 -0700132 }
133
Craig Mautner96868332012-12-04 14:29:11 -0800134 AppWindowAnimator getWallpaperAppAnimator() {
135 return mService.mWallpaperTarget == null
136 ? null : mService.mWallpaperTarget.mAppToken == null
137 ? null : mService.mWallpaperTarget.mAppToken.mAppAnimator;
Craig Mautner711f90a2012-07-03 18:43:52 -0700138 }
139
Craig Mautner96868332012-12-04 14:29:11 -0800140 void hideWallpapersLocked(final WindowState w) {
141 final WindowState wallpaperTarget = mService.mWallpaperTarget;
142 final WindowState lowerWallpaperTarget = mService.mLowerWallpaperTarget;
143 final ArrayList<WindowToken> wallpaperTokens = mService.mWallpaperTokens;
Craig Mautner66f78d72012-12-04 16:46:50 -0800144
Dianne Hackborn98129732012-11-01 16:28:16 -0700145 if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) {
146 final int numTokens = wallpaperTokens.size();
Craig Mautner918b53b2012-07-09 14:15:54 -0700147 for (int i = numTokens - 1; i >= 0; i--) {
Dianne Hackborn98129732012-11-01 16:28:16 -0700148 final WindowToken token = wallpaperTokens.get(i);
Craig Mautner918b53b2012-07-09 14:15:54 -0700149 final int numWindows = token.windows.size();
150 for (int j = numWindows - 1; j >= 0; j--) {
151 final WindowState wallpaper = token.windows.get(j);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700152 final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
153 if (!winAnimator.mLastHidden) {
154 winAnimator.hide();
Craig Mautner507a2ee2012-06-13 08:39:38 -0700155 mService.dispatchWallpaperVisibility(wallpaper, false);
Craig Mautner76a71652012-09-03 23:23:58 -0700156 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
157 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnerb9836b92012-06-11 11:40:09 -0700158 }
159 }
Dianne Hackbornef03a7f2012-10-29 18:46:52 -0700160 if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG,
Dianne Hackborn2ea9bae2012-11-02 18:43:48 -0700161 "Hiding wallpaper " + token + " from " + w
162 + " target=" + wallpaperTarget + " lower=" + lowerWallpaperTarget
163 + "\n" + Debug.getCallers(5, " "));
Craig Mautnerb9836b92012-06-11 11:40:09 -0700164 token.hidden = true;
Craig Mautner0afddcb2012-05-08 15:38:00 -0700165 }
Craig Mautner0afddcb2012-05-08 15:38:00 -0700166 }
167 }
168
Craig Mautnera91f9e22012-09-14 16:22:08 -0700169 private void updateAppWindowsLocked() {
Craig Mautner764983d2012-03-22 11:37:36 -0700170 int i;
Craig Mautner96868332012-12-04 14:29:11 -0800171 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
172 final int NAT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700173 for (i=0; i<NAT; i++) {
Craig Mautner96868332012-12-04 14:29:11 -0800174 final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700175 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700176 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner9339c402012-11-30 11:23:56 -0800177 if (appAnimator.stepAnimationLocked(mCurrentTime)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700178 mAnimating = true;
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700179 } else if (wasAnimating) {
180 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700181 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
182 "appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700183 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
184 "updateWindowsApps...: done animating " + appAnimator.mAppToken);
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700185 }
186 }
Craig Mautnera2c77052012-03-26 12:14:43 -0700187
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700188 final int NEAT = mService.mExitingAppTokens.size();
189 for (i=0; i<NEAT; i++) {
Craig Mautnere4d8a5d2012-04-05 13:10:37 -0700190 final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700191 final boolean wasAnimating = appAnimator.animation != null
Craig Mautnerfbf378c2012-04-23 17:24:21 -0700192 && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
Craig Mautner9339c402012-11-30 11:23:56 -0800193 if (appAnimator.stepAnimationLocked(mCurrentTime)) {
Craig Mautnerbb1449b2012-03-23 16:11:14 -0700194 mAnimating = true;
195 } else if (wasAnimating) {
196 // stopped animating, do one more pass through the layout
Craig Mautner76a71652012-09-03 23:23:58 -0700197 setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
198 "exiting appToken " + appAnimator.mAppToken + " done");
Craig Mautner83339b42012-05-01 22:13:23 -0700199 if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
200 "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
Craig Mautner764983d2012-03-22 11:37:36 -0700201 }
202 }
Craig Mautner764983d2012-03-22 11:37:36 -0700203 }
204
Craig Mautnera91f9e22012-09-14 16:22:08 -0700205 private void updateWindowsLocked(final int displayId) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700206 ++mAnimTransactionSequence;
Craig Mautner764983d2012-03-22 11:37:36 -0700207
Craig Mautner96868332012-12-04 14:29:11 -0800208 final WindowList windows = mService.getWindowListLocked(displayId);
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700209 ArrayList<WindowStateAnimator> unForceHiding = null;
210 boolean wallpaperInUnForceHiding = false;
Craig Mautner178af592012-09-17 10:37:29 -0700211 mForceHiding = KEYGUARD_NOT_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700212
Craig Mautner96868332012-12-04 14:29:11 -0800213 for (int i = windows.size() - 1; i >= 0; i--) {
214 WindowState win = windows.get(i);
215 WindowStateAnimator winAnimator = win.mWinAnimator;
Craig Mautnerbec53f72012-04-05 11:49:05 -0700216 final int flags = winAnimator.mAttrFlags;
Craig Mautner764983d2012-03-22 11:37:36 -0700217
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700218 if (winAnimator.mSurface != null) {
Craig Mautnera2c77052012-03-26 12:14:43 -0700219 final boolean wasAnimating = winAnimator.mWasAnimating;
220 final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
Craig Mautner764983d2012-03-22 11:37:36 -0700221
222 if (WindowManagerService.DEBUG_WALLPAPER) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700223 Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
Craig Mautner764983d2012-03-22 11:37:36 -0700224 ", nowAnimating=" + nowAnimating);
225 }
226
Craig Mautner96868332012-12-04 14:29:11 -0800227 if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
Craig Mautnera608b882012-03-30 13:03:49 -0700228 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700229 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
230 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700231 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700232 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
Craig Mautner66f78d72012-12-04 16:46:50 -0800233 getPendingLayoutChanges(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700234 }
Craig Mautner764983d2012-03-22 11:37:36 -0700235 }
236
Craig Mautnerbec53f72012-04-05 11:49:05 -0700237 if (mPolicy.doesForceHide(win, win.mAttrs)) {
Craig Mautner764983d2012-03-22 11:37:36 -0700238 if (!wasAnimating && nowAnimating) {
Craig Mautner83339b42012-05-01 22:13:23 -0700239 if (WindowManagerService.DEBUG_ANIM ||
240 WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
241 "Animation started that could impact force hide: " + win);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700242 mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
Craig Mautner76a71652012-09-03 23:23:58 -0700243 setPendingLayoutChanges(displayId,
244 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700245 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700246 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
Craig Mautner66f78d72012-12-04 16:46:50 -0800247 getPendingLayoutChanges(displayId));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700248 }
Craig Mautner764983d2012-03-22 11:37:36 -0700249 mService.mFocusMayChange = true;
Dianne Hackbornac920872012-05-22 11:49:49 -0700250 }
Craig Mautner4bf18a72012-07-10 14:08:16 -0700251 if (win.isReadyForDisplay()) {
252 if (nowAnimating) {
253 if (winAnimator.mAnimationIsEntrance) {
Craig Mautner178af592012-09-17 10:37:29 -0700254 mForceHiding = KEYGUARD_ANIMATING_IN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700255 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700256 mForceHiding = KEYGUARD_ANIMATING_OUT;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700257 }
258 } else {
Craig Mautner178af592012-09-17 10:37:29 -0700259 mForceHiding = KEYGUARD_SHOWN;
Craig Mautner4bf18a72012-07-10 14:08:16 -0700260 }
Craig Mautner764983d2012-03-22 11:37:36 -0700261 }
Dianne Hackbornac920872012-05-22 11:49:49 -0700262 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
Craig Mautner178af592012-09-17 10:37:29 -0700263 "Force hide " + mForceHiding
Dianne Hackbornac920872012-05-22 11:49:49 -0700264 + " hasSurface=" + win.mHasSurface
265 + " policyVis=" + win.mPolicyVisibility
266 + " destroying=" + win.mDestroying
267 + " attHidden=" + win.mAttachedHidden
268 + " vis=" + win.mViewVisibility
269 + " hidden=" + win.mRootToken.hidden
270 + " anim=" + win.mWinAnimator.mAnimation);
Craig Mautnerbec53f72012-04-05 11:49:05 -0700271 } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
Craig Mautner4bf18a72012-07-10 14:08:16 -0700272 final boolean hideWhenLocked =
273 (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700274 final boolean changed;
Craig Mautner178af592012-09-17 10:37:29 -0700275 if (((mForceHiding == KEYGUARD_ANIMATING_IN)
Craig Mautner4bf18a72012-07-10 14:08:16 -0700276 && (!winAnimator.isAnimating() || hideWhenLocked))
Craig Mautner178af592012-09-17 10:37:29 -0700277 || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700278 changed = win.hideLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700279 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700280 "Now policy hidden: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700281 } else {
Craig Mautnerbec53f72012-04-05 11:49:05 -0700282 changed = win.showLw(false, false);
Craig Mautner764983d2012-03-22 11:37:36 -0700283 if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
Craig Mautnerbec53f72012-04-05 11:49:05 -0700284 "Now policy shown: " + win);
Craig Mautner764983d2012-03-22 11:37:36 -0700285 if (changed) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700286 if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
Craig Mautnerbec53f72012-04-05 11:49:05 -0700287 && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700288 if (unForceHiding == null) {
289 unForceHiding = new ArrayList<WindowStateAnimator>();
290 }
291 unForceHiding.add(winAnimator);
Craig Mautner01cd0e72012-06-18 10:19:11 -0700292 if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700293 wallpaperInUnForceHiding = true;
Craig Mautner764983d2012-03-22 11:37:36 -0700294 }
295 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700296 if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
Craig Mautner764983d2012-03-22 11:37:36 -0700297 // We are showing on to of the current
298 // focus, so re-evaluate focus to make
299 // sure it is correct.
300 mService.mFocusMayChange = true;
301 }
302 }
303 }
Craig Mautner01cd0e72012-06-18 10:19:11 -0700304 if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
Craig Mautnera608b882012-03-30 13:03:49 -0700305 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
Craig Mautner76a71652012-09-03 23:23:58 -0700306 setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
307 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700308 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700309 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
Craig Mautner66f78d72012-12-04 16:46:50 -0800310 getPendingLayoutChanges(Display.DEFAULT_DISPLAY));
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700311 }
Craig Mautner764983d2012-03-22 11:37:36 -0700312 }
313 }
314 }
315
Craig Mautnerbec53f72012-04-05 11:49:05 -0700316 final AppWindowToken atoken = win.mAppToken;
Craig Mautner6fbda632012-07-03 09:26:39 -0700317 if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
318 if (atoken == null || atoken.allDrawn) {
319 if (winAnimator.performShowLocked()) {
Craig Mautner66f78d72012-12-04 16:46:50 -0800320 setPendingLayoutChanges(displayId,
Craig Mautner76a71652012-09-03 23:23:58 -0700321 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
Craig Mautner6fbda632012-07-03 09:26:39 -0700322 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
323 mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
Craig Mautner66f78d72012-12-04 16:46:50 -0800324 getPendingLayoutChanges(displayId));
Craig Mautner764983d2012-03-22 11:37:36 -0700325 }
326 }
Craig Mautnercf8cbbe2012-03-25 21:54:36 -0700327 }
Craig Mautner764983d2012-03-22 11:37:36 -0700328 }
Craig Mautner322e4032012-07-13 13:35:20 -0700329 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner59431632012-04-04 11:56:44 -0700330 if (appAnimator != null && appAnimator.thumbnail != null) {
Craig Mautner6fbda632012-07-03 09:26:39 -0700331 if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
332 appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
Craig Mautner59431632012-04-04 11:56:44 -0700333 appAnimator.thumbnailLayer = 0;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700334 }
Craig Mautner59431632012-04-04 11:56:44 -0700335 if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
336 appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
Dianne Hackborn8078d8c2012-03-20 11:11:26 -0700337 }
338 }
Craig Mautner764983d2012-03-22 11:37:36 -0700339 } // end forall windows
Dianne Hackborn0c2acff2012-04-12 15:17:07 -0700340
Craig Mautner078ea0a2012-06-25 11:04:29 -0700341 // If we have windows that are being show due to them no longer
342 // being force-hidden, apply the appropriate animation to them.
343 if (unForceHiding != null) {
344 for (int i=unForceHiding.size()-1; i>=0; i--) {
345 Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
346 if (a != null) {
347 final WindowStateAnimator winAnimator = unForceHiding.get(i);
348 winAnimator.setAnimation(a);
349 winAnimator.mAnimationIsEntrance = true;
350 }
351 }
352 }
353 }
354
Craig Mautnera91f9e22012-09-14 16:22:08 -0700355 private void updateWallpaperLocked(int displayId) {
356 final DisplayContentsAnimator displayAnimator =
357 getDisplayContentsAnimatorLocked(displayId);
Craig Mautner96868332012-12-04 14:29:11 -0800358 final WindowList windows = mService.getWindowListLocked(displayId);
Craig Mautner078ea0a2012-06-25 11:04:29 -0700359 WindowStateAnimator windowAnimationBackground = null;
360 int windowAnimationBackgroundColor = 0;
361 WindowState detachedWallpaper = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700362 final DimSurface windowAnimationBackgroundSurface =
363 displayAnimator.mWindowAnimationBackgroundSurface;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700364
Craig Mautner96868332012-12-04 14:29:11 -0800365 for (int i = windows.size() - 1; i >= 0; i--) {
366 final WindowState win = windows.get(i);
367 WindowStateAnimator winAnimator = win.mWinAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700368 if (winAnimator.mSurface == null) {
369 continue;
370 }
371
372 final int flags = winAnimator.mAttrFlags;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700373
374 // If this window is animating, make a note that we have
375 // an animating window and take care of a request to run
376 // a detached wallpaper animation.
377 if (winAnimator.mAnimating) {
378 if (winAnimator.mAnimation != null) {
379 if ((flags & FLAG_SHOW_WALLPAPER) != 0
380 && winAnimator.mAnimation.getDetachWallpaper()) {
381 detachedWallpaper = win;
382 }
383 final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
384 if (backgroundColor != 0) {
385 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
386 windowAnimationBackground.mAnimLayer)) {
387 windowAnimationBackground = winAnimator;
388 windowAnimationBackgroundColor = backgroundColor;
389 }
390 }
391 }
392 mAnimating = true;
393 }
394
395 // If this window's app token is running a detached wallpaper
396 // animation, make a note so we can ensure the wallpaper is
397 // displayed behind it.
Craig Mautner322e4032012-07-13 13:35:20 -0700398 final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
Craig Mautner078ea0a2012-06-25 11:04:29 -0700399 if (appAnimator != null && appAnimator.animation != null
400 && appAnimator.animating) {
401 if ((flags & FLAG_SHOW_WALLPAPER) != 0
402 && appAnimator.animation.getDetachWallpaper()) {
403 detachedWallpaper = win;
404 }
405
406 final int backgroundColor = appAnimator.animation.getBackgroundColor();
407 if (backgroundColor != 0) {
408 if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
409 windowAnimationBackground.mAnimLayer)) {
410 windowAnimationBackground = winAnimator;
411 windowAnimationBackgroundColor = backgroundColor;
412 }
413 }
414 }
415 } // end forall windows
416
Craig Mautner9e809442012-06-22 17:13:04 -0700417 if (mWindowDetachedWallpaper != detachedWallpaper) {
418 if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
419 "Detached wallpaper changed from " + mWindowDetachedWallpaper
420 + " to " + detachedWallpaper);
421 mWindowDetachedWallpaper = detachedWallpaper;
422 mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
423 }
424
425 if (windowAnimationBackgroundColor != 0) {
426 // If the window that wants black is the current wallpaper
427 // target, then the black goes *below* the wallpaper so we
428 // don't cause the wallpaper to suddenly disappear.
429 int animLayer = windowAnimationBackground.mAnimLayer;
430 WindowState win = windowAnimationBackground.mWin;
Craig Mautner96868332012-12-04 14:29:11 -0800431 if (mService.mWallpaperTarget == win || mService.mLowerWallpaperTarget == win
432 || mService.mUpperWallpaperTarget == win) {
433 final int N = windows.size();
Craig Mautner9e809442012-06-22 17:13:04 -0700434 for (int i = 0; i < N; i++) {
Craig Mautner96868332012-12-04 14:29:11 -0800435 WindowStateAnimator winAnimator = windows.get(i).mWinAnimator;
Craig Mautner918b53b2012-07-09 14:15:54 -0700436 if (winAnimator.mIsWallpaper) {
Craig Mautner9e809442012-06-22 17:13:04 -0700437 animLayer = winAnimator.mAnimLayer;
438 break;
439 }
440 }
441 }
442
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700443 if (windowAnimationBackgroundSurface != null) {
Craig Mautner9339c402012-11-30 11:23:56 -0800444 windowAnimationBackgroundSurface.show(
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700445 animLayer - WindowManagerService.LAYER_OFFSET_DIM,
446 windowAnimationBackgroundColor);
447 }
Craig Mautner9e809442012-06-22 17:13:04 -0700448 } else {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700449 if (windowAnimationBackgroundSurface != null) {
450 windowAnimationBackgroundSurface.hide();
451 }
Craig Mautner9e809442012-06-22 17:13:04 -0700452 }
Craig Mautner764983d2012-03-22 11:37:36 -0700453 }
454
Craig Mautner9339c402012-11-30 11:23:56 -0800455 /** See if any windows have been drawn, so they (and others associated with them) can now be
456 * shown. */
Craig Mautner764983d2012-03-22 11:37:36 -0700457 private void testTokenMayBeDrawnLocked() {
Craig Mautner96868332012-12-04 14:29:11 -0800458 // See if any windows have been drawn, so they (and others
459 // associated with them) can now be shown.
460 final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
461 final int NT = appTokens.size();
Craig Mautner764983d2012-03-22 11:37:36 -0700462 for (int i=0; i<NT; i++) {
Craig Mautner96868332012-12-04 14:29:11 -0800463 AppWindowToken wtoken = appTokens.get(i);
464 AppWindowAnimator appAnimator = wtoken.mAppAnimator;
Craig Mautner6fbda632012-07-03 09:26:39 -0700465 final boolean allDrawn = wtoken.allDrawn;
Craig Mautner322e4032012-07-13 13:35:20 -0700466 if (allDrawn != appAnimator.allDrawn) {
467 appAnimator.allDrawn = allDrawn;
Craig Mautner6fbda632012-07-03 09:26:39 -0700468 if (allDrawn) {
469 // The token has now changed state to having all
470 // windows shown... what to do, what to do?
Craig Mautner322e4032012-07-13 13:35:20 -0700471 if (appAnimator.freezingScreen) {
472 appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700473 mService.unsetAppFreezingScreenLocked(wtoken, false, true);
474 if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
475 "Setting mOrientationChangeComplete=true because wtoken "
476 + wtoken + " numInteresting=" + wtoken.numInterestingWindows
477 + " numDrawn=" + wtoken.numDrawnWindows);
478 // This will set mOrientationChangeComplete and cause a pass through layout.
Craig Mautner76a71652012-09-03 23:23:58 -0700479 setAppLayoutChanges(appAnimator,
480 WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
481 "testTokenMayBeDrawnLocked: freezingScreen");
Craig Mautner6fbda632012-07-03 09:26:39 -0700482 } else {
Craig Mautner76a71652012-09-03 23:23:58 -0700483 setAppLayoutChanges(appAnimator,
484 WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
485 "testTokenMayBeDrawnLocked");
Craig Mautner66f78d72012-12-04 16:46:50 -0800486
Craig Mautner6fbda632012-07-03 09:26:39 -0700487 // We can now show all of the drawn windows!
488 if (!mService.mOpeningApps.contains(wtoken)) {
Craig Mautner322e4032012-07-13 13:35:20 -0700489 mAnimating |= appAnimator.showAllWindowsLocked();
Craig Mautner6fbda632012-07-03 09:26:39 -0700490 }
Craig Mautner764983d2012-03-22 11:37:36 -0700491 }
492 }
493 }
494 }
495 }
496
Craig Mautnera91f9e22012-09-14 16:22:08 -0700497 private void performAnimationsLocked(final int displayId) {
498 updateWindowsLocked(displayId);
499 updateWallpaperLocked(displayId);
Craig Mautner764983d2012-03-22 11:37:36 -0700500 }
501
Craig Mautner1caa3992012-06-22 09:46:48 -0700502 // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
503 /** Locked on mService.mWindowMap and this. */
504 private void animateLocked() {
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700505 if (!mInitialized) {
506 return;
507 }
Craig Mautner59c00972012-07-30 12:10:24 -0700508
Craig Mautner764983d2012-03-22 11:37:36 -0700509 mCurrentTime = SystemClock.uptimeMillis();
Craig Mautner2639da52012-07-09 09:39:06 -0700510 mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
Chet Haase198e5642012-05-10 09:55:15 -0700511 boolean wasAnimating = mAnimating;
Craig Mautner7d8df392012-04-06 15:26:23 -0700512 mAnimating = false;
513 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
514 Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
515 }
Craig Mautner764983d2012-03-22 11:37:36 -0700516
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700517 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
518 TAG, ">>> OPEN TRANSACTION animateLocked");
Craig Mautner764983d2012-03-22 11:37:36 -0700519 Surface.openTransaction();
Jamie Gennisb6ce6e42012-10-15 19:14:58 -0700520 Surface.setAnimationTransaction();
Craig Mautner764983d2012-03-22 11:37:36 -0700521 try {
Craig Mautnera91f9e22012-09-14 16:22:08 -0700522 updateAppWindowsLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700523
Craig Mautnera91f9e22012-09-14 16:22:08 -0700524 final int numDisplays = mDisplayContentsAnimators.size();
525 for (int i = 0; i < numDisplays; i++) {
526 final int displayId = mDisplayContentsAnimators.keyAt(i);
527 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
528
529 final ScreenRotationAnimation screenRotationAnimation =
530 displayAnimator.mScreenRotationAnimation;
531 if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
532 if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
533 mAnimating = true;
534 } else {
535 mBulkUpdateParams |= SET_UPDATE_ROTATION;
536 screenRotationAnimation.kill();
537 displayAnimator.mScreenRotationAnimation = null;
538 }
539 }
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700540
541 // Update animations of all applications, including those
542 // associated with exiting/removed apps
Craig Mautnera91f9e22012-09-14 16:22:08 -0700543 performAnimationsLocked(displayId);
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700544
Craig Mautner96868332012-12-04 14:29:11 -0800545 final WindowList windows = mService.getWindowListLocked(displayId);
546 final int N = windows.size();
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700547 for (int j = 0; j < N; j++) {
Craig Mautner96868332012-12-04 14:29:11 -0800548 windows.get(j).mWinAnimator.prepareSurfaceLocked(true);
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700549 }
550 }
551
552 testTokenMayBeDrawnLocked();
Craig Mautner764983d2012-03-22 11:37:36 -0700553
Craig Mautnera91f9e22012-09-14 16:22:08 -0700554 for (int i = 0; i < numDisplays; i++) {
555 final int displayId = mDisplayContentsAnimators.keyAt(i);
556 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
Craig Mautner764983d2012-03-22 11:37:36 -0700557
Craig Mautnera91f9e22012-09-14 16:22:08 -0700558 final ScreenRotationAnimation screenRotationAnimation =
559 displayAnimator.mScreenRotationAnimation;
560 if (screenRotationAnimation != null) {
561 screenRotationAnimation.updateSurfacesInTransaction();
562 }
563
564 final DimAnimator.Parameters dimParams = displayAnimator.mDimParams;
565 final DimAnimator dimAnimator = displayAnimator.mDimAnimator;
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700566 if (dimAnimator != null && dimParams != null) {
567 dimAnimator.updateParameters(mContext.getResources(), dimParams, mCurrentTime);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700568 }
569 if (dimAnimator != null && dimAnimator.mDimShown) {
570 mAnimating |= dimAnimator.updateSurface(isDimmingLocked(displayId),
571 mCurrentTime, !mService.okToDisplay());
572 }
Craig Mautner764983d2012-03-22 11:37:36 -0700573 }
574
Craig Mautner7358fbf2012-04-12 21:06:33 -0700575 if (mService.mWatermark != null) {
576 mService.mWatermark.drawIfNeeded();
577 }
Craig Mautner764983d2012-03-22 11:37:36 -0700578 } catch (RuntimeException e) {
579 Log.wtf(TAG, "Unhandled exception in Window Manager", e);
580 } finally {
581 Surface.closeTransaction();
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700582 if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
583 TAG, "<<< CLOSE TRANSACTION animateLocked");
584 }
585
Craig Mautner66f78d72012-12-04 16:46:50 -0800586 boolean hasPendingLayoutChanges = false;
587 DisplayContentsIterator iterator = mService.new DisplayContentsIterator();
588 while (iterator.hasNext()) {
589 final DisplayContent displayContent = iterator.next();
590 final int pendingChanges = getPendingLayoutChanges(displayContent.getDisplayId());
591 if ((pendingChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
Craig Mautner96868332012-12-04 14:29:11 -0800592 mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING;
Craig Mautnerea3a09a2012-09-04 09:49:35 -0700593 }
Craig Mautner66f78d72012-12-04 16:46:50 -0800594 if (pendingChanges != 0) {
595 hasPendingLayoutChanges = true;
596 }
Craig Mautner764983d2012-03-22 11:37:36 -0700597 }
Craig Mautnerc2f9be02012-03-27 17:32:29 -0700598
Craig Mautner66f78d72012-12-04 16:46:50 -0800599 boolean doRequest = false;
600 if (mBulkUpdateParams != 0) {
601 doRequest = mService.copyAnimToLayoutParamsLocked();
602 }
603
604 if (hasPendingLayoutChanges || doRequest) {
605 mService.requestTraversalLocked();
Craig Mautner01cd0e72012-06-18 10:19:11 -0700606 }
Craig Mautner7d8df392012-04-06 15:26:23 -0700607
608 if (mAnimating) {
Craig Mautner96868332012-12-04 14:29:11 -0800609 mService.scheduleAnimationLocked();
Chet Haase198e5642012-05-10 09:55:15 -0700610 } else if (wasAnimating) {
611 mService.requestTraversalLocked();
Craig Mautner7d8df392012-04-06 15:26:23 -0700612 }
613 if (WindowManagerService.DEBUG_WINDOW_TRACE) {
614 Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
615 + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
Craig Mautner76a71652012-09-03 23:23:58 -0700616 + " mPendingLayoutChanges(DEFAULT_DISPLAY)="
Craig Mautner66f78d72012-12-04 16:46:50 -0800617 + Integer.toHexString(getPendingLayoutChanges(Display.DEFAULT_DISPLAY)));
Craig Mautner7d8df392012-04-06 15:26:23 -0700618 }
Craig Mautner764983d2012-03-22 11:37:36 -0700619 }
620
621 WindowState mCurrentFocus;
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700622 void setCurrentFocus(final WindowState currentFocus) {
Craig Mautner764983d2012-03-22 11:37:36 -0700623 mCurrentFocus = currentFocus;
624 }
625
Craig Mautnera91f9e22012-09-14 16:22:08 -0700626 boolean isDimmingLocked(int displayId) {
627 return getDisplayContentsAnimatorLocked(displayId).mDimParams != null;
Craig Mautnerf8d4fbb2012-04-11 09:25:53 -0700628 }
629
Craig Mautnera91f9e22012-09-14 16:22:08 -0700630 boolean isDimmingLocked(final WindowStateAnimator winAnimator) {
631 DimAnimator.Parameters dimParams =
632 getDisplayContentsAnimatorLocked(winAnimator.mWin.getDisplayId()).mDimParams;
633 return dimParams != null && dimParams.mDimWinAnimator == winAnimator;
Craig Mautneracafd192012-05-10 10:41:02 -0700634 }
635
Dianne Hackborn529e7442012-11-01 14:22:28 -0700636 static String bulkUpdateParamsToString(int bulkUpdateParams) {
637 StringBuilder builder = new StringBuilder(128);
638 if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
639 builder.append(" UPDATE_ROTATION");
640 }
641 if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
642 builder.append(" WALLPAPER_MAY_CHANGE");
643 }
644 if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
645 builder.append(" FORCE_HIDING_CHANGED");
646 }
647 if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) != 0) {
648 builder.append(" ORIENTATION_CHANGE_COMPLETE");
649 }
650 if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
651 builder.append(" TURN_ON_SCREEN");
652 }
653 return builder.toString();
654 }
655
Craig Mautnera91f9e22012-09-14 16:22:08 -0700656 public void dumpLocked(PrintWriter pw, String prefix, boolean dumpAll) {
Dianne Hackborn529e7442012-11-01 14:22:28 -0700657 final String subPrefix = " " + prefix;
658 final String subSubPrefix = " " + subPrefix;
659
Dianne Hackborn529e7442012-11-01 14:22:28 -0700660 for (int i = 0; i < mDisplayContentsAnimators.size(); i++) {
661 pw.print(prefix); pw.print("DisplayContentsAnimator #");
662 pw.print(mDisplayContentsAnimators.keyAt(i));
663 pw.println(":");
664 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
Craig Mautner96868332012-12-04 14:29:11 -0800665 final WindowList windows =
666 mService.getWindowListLocked(mDisplayContentsAnimators.keyAt(i));
667 final int N = windows.size();
668 for (int j = 0; j < N; j++) {
669 WindowStateAnimator wanim = windows.get(j).mWinAnimator;
Dianne Hackborn529e7442012-11-01 14:22:28 -0700670 pw.print(subPrefix); pw.print("Window #"); pw.print(j);
671 pw.print(": "); pw.println(wanim);
672 }
673 if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
674 if (dumpAll || displayAnimator.mWindowAnimationBackgroundSurface.mDimShown) {
675 pw.print(subPrefix); pw.println("mWindowAnimationBackgroundSurface:");
Craig Mautnera91f9e22012-09-14 16:22:08 -0700676 displayAnimator.mWindowAnimationBackgroundSurface.printTo(subSubPrefix, pw);
677 }
Craig Mautner6fbda632012-07-03 09:26:39 -0700678 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700679 if (displayAnimator.mDimAnimator != null) {
680 if (dumpAll || displayAnimator.mDimAnimator.mDimShown) {
681 pw.print(subPrefix); pw.println("mDimAnimator:");
682 displayAnimator.mDimAnimator.printTo(subSubPrefix, pw);
683 }
684 } else if (dumpAll) {
685 pw.print(subPrefix); pw.println("no DimAnimator ");
686 }
687 if (displayAnimator.mDimParams != null) {
688 pw.print(subPrefix); pw.println("mDimParams:");
689 displayAnimator.mDimParams.printTo(subSubPrefix, pw);
690 } else if (dumpAll) {
691 pw.print(subPrefix); pw.println("no DimParams ");
692 }
693 if (displayAnimator.mScreenRotationAnimation != null) {
694 pw.print(subPrefix); pw.println("mScreenRotationAnimation:");
695 displayAnimator.mScreenRotationAnimation.printTo(subSubPrefix, pw);
696 } else if (dumpAll) {
697 pw.print(subPrefix); pw.println("no ScreenRotationAnimation ");
698 }
699 }
700
701 pw.println();
702
703 if (dumpAll) {
704 pw.print(prefix); pw.print("mAnimTransactionSequence=");
705 pw.print(mAnimTransactionSequence);
706 pw.print(" mForceHiding="); pw.println(forceHidingToString());
707 pw.print(prefix); pw.print("mCurrentTime=");
708 pw.println(TimeUtils.formatUptime(mCurrentTime));
Dianne Hackborn529e7442012-11-01 14:22:28 -0700709 }
710 if (mBulkUpdateParams != 0) {
711 pw.print(prefix); pw.print("mBulkUpdateParams=0x");
712 pw.print(Integer.toHexString(mBulkUpdateParams));
713 pw.println(bulkUpdateParamsToString(mBulkUpdateParams));
714 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700715 if (mWindowDetachedWallpaper != null) {
716 pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
717 pw.println(mWindowDetachedWallpaper);
718 }
Dianne Hackborn529e7442012-11-01 14:22:28 -0700719 if (mUniverseBackground != null) {
720 pw.print(prefix); pw.print("mUniverseBackground="); pw.print(mUniverseBackground);
721 pw.print(" mAboveUniverseLayer="); pw.println(mAboveUniverseLayer);
Craig Mautnerd09cc4b2012-04-04 10:23:31 -0700722 }
Craig Mautnere7ae2502012-03-26 17:11:19 -0700723 }
Craig Mautnerbec53f72012-04-05 11:49:05 -0700724
Craig Mautner66f78d72012-12-04 16:46:50 -0800725 int getPendingLayoutChanges(final int displayId) {
726 return mService.getDisplayContentLocked(displayId).pendingLayoutChanges;
727 }
728
Craig Mautner76a71652012-09-03 23:23:58 -0700729 void setPendingLayoutChanges(final int displayId, final int changes) {
Craig Mautner66f78d72012-12-04 16:46:50 -0800730 mService.getDisplayContentLocked(displayId).pendingLayoutChanges |= changes;
Craig Mautner76a71652012-09-03 23:23:58 -0700731 }
732
733 void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) {
734 // Used to track which displays layout changes have been done.
735 SparseIntArray displays = new SparseIntArray();
Craig Mautner96868332012-12-04 14:29:11 -0800736 WindowList windows = appAnimator.mAppToken.allAppWindows;
737 for (int i = windows.size() - 1; i >= 0; i--) {
738 final int displayId = windows.get(i).getDisplayId();
Craig Mautner76a71652012-09-03 23:23:58 -0700739 if (displays.indexOfKey(displayId) < 0) {
740 setPendingLayoutChanges(displayId, changes);
741 if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
Craig Mautner66f78d72012-12-04 16:46:50 -0800742 mService.debugLayoutRepeats(s, getPendingLayoutChanges(displayId));
Craig Mautner76a71652012-09-03 23:23:58 -0700743 }
744 // Keep from processing this display again.
745 displays.put(displayId, changes);
746 }
747 }
Craig Mautner4d7349b2012-04-20 14:52:47 -0700748 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700749
Craig Mautner96868332012-12-04 14:29:11 -0800750 void setDimParamsLocked(int displayId, DimAnimator.Parameters dimParams) {
751 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
752 if (dimParams == null) {
753 displayAnimator.mDimParams = null;
754 } else {
755 final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
756
757 // Only set dim params on the highest dimmed layer.
758 final WindowStateAnimator existingDimWinAnimator =
759 displayAnimator.mDimParams == null ?
760 null : displayAnimator.mDimParams.mDimWinAnimator;
761 // Don't turn on for an unshown surface, or for any layer but the highest
762 // dimmed layer.
763 if (newWinAnimator.mSurfaceShown && (existingDimWinAnimator == null
764 || !existingDimWinAnimator.mSurfaceShown
765 || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
766 displayAnimator.mDimParams = new DimAnimator.Parameters(dimParams);
767 }
768 }
769 }
770
Craig Mautnera91f9e22012-09-14 16:22:08 -0700771 private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
772 DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
773 if (displayAnimator == null) {
Craig Mautnerac439e52012-09-21 08:58:34 -0700774 displayAnimator = new DisplayContentsAnimator(displayId);
Craig Mautnera91f9e22012-09-14 16:22:08 -0700775 mDisplayContentsAnimators.put(displayId, displayAnimator);
776 }
777 return displayAnimator;
778 }
779
780 void setScreenRotationAnimationLocked(int displayId, ScreenRotationAnimation animation) {
781 getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation = animation;
782 }
783
784 ScreenRotationAnimation getScreenRotationAnimationLocked(int displayId) {
785 return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation;
786 }
787
Craig Mautnerac439e52012-09-21 08:58:34 -0700788 private class DisplayContentsAnimator {
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700789 DimAnimator mDimAnimator = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700790 DimAnimator.Parameters mDimParams = null;
Craig Mautnerd5523dc2012-10-02 13:49:22 -0700791 DimSurface mWindowAnimationBackgroundSurface = null;
Craig Mautnera91f9e22012-09-14 16:22:08 -0700792 ScreenRotationAnimation mScreenRotationAnimation = null;
Craig Mautnerac439e52012-09-21 08:58:34 -0700793
794 public DisplayContentsAnimator(int displayId) {
795 mDimAnimator = new DimAnimator(mService.mFxSession, displayId);
Craig Mautner9339c402012-11-30 11:23:56 -0800796 mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession,
797 mService.getDisplayContentLocked(displayId));
Craig Mautnerac439e52012-09-21 08:58:34 -0700798 }
Craig Mautnera91f9e22012-09-14 16:22:08 -0700799 }
Craig Mautner764983d2012-03-22 11:37:36 -0700800}