blob: e845f833eab24983552942341fed9c44ad08630b [file] [log] [blame]
Craig Mautnerc00204b2013-03-05 15:02:14 -08001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.wm;
18
Craig Mautnerf0ac5c82013-06-24 11:21:57 -070019import static com.android.server.wm.WindowManagerService.DEBUG_TASK_MOVEMENT;
20import static com.android.server.wm.WindowManagerService.TAG;
21
Wale Ogunwale60454db2015-01-23 16:05:07 -080022import android.content.res.Configuration;
Craig Mautner05d29032013-05-03 13:40:13 -070023import android.graphics.Rect;
Craig Mautnerf0ac5c82013-06-24 11:21:57 -070024import android.os.Debug;
Wale Ogunwale60454db2015-01-23 16:05:07 -080025import android.util.DisplayMetrics;
Craig Mautner2c2549c2013-11-12 08:31:15 -080026import android.util.EventLog;
Craig Mautnerf0ac5c82013-06-24 11:21:57 -070027import android.util.Slog;
Craig Mautner05d29032013-05-03 13:40:13 -070028import android.util.TypedValue;
Wale Ogunwale4a02d812015-02-12 23:01:38 -080029import android.view.Surface;
Todd Kennedyaab56db2015-01-30 09:39:53 -080030
Craig Mautner2c2549c2013-11-12 08:31:15 -080031import com.android.server.EventLogTags;
Craig Mautner05d29032013-05-03 13:40:13 -070032
Craig Mautner00af9fe2013-03-25 09:13:41 -070033import java.io.PrintWriter;
Craig Mautnerc00204b2013-03-05 15:02:14 -080034import java.util.ArrayList;
35
36public class TaskStack {
Craig Mautner05d29032013-05-03 13:40:13 -070037 /** Amount of time in milliseconds to animate the dim surface from one value to another,
38 * when no window animation is driving it. */
39 private static final int DEFAULT_DIM_DURATION = 200;
40
Craig Mautner00af9fe2013-03-25 09:13:41 -070041 /** Unique identifier */
Craig Mautnerc00204b2013-03-05 15:02:14 -080042 final int mStackId;
Craig Mautner00af9fe2013-03-25 09:13:41 -070043
Craig Mautner05d29032013-05-03 13:40:13 -070044 /** The service */
45 private final WindowManagerService mService;
46
Craig Mautner00af9fe2013-03-25 09:13:41 -070047 /** The display this stack sits under. */
Craig Mautnerdf88d732014-01-27 09:21:32 -080048 private DisplayContent mDisplayContent;
Craig Mautner00af9fe2013-03-25 09:13:41 -070049
50 /** The Tasks that define this stack. Oldest Tasks are at the bottom. The ordering must match
51 * mTaskHistory in the ActivityStack with the same mStackId */
Craig Mautner2c2549c2013-11-12 08:31:15 -080052 private final ArrayList<Task> mTasks = new ArrayList<Task>();
Craig Mautner00af9fe2013-03-25 09:13:41 -070053
Craig Mautnerb660b9d2014-02-13 10:59:16 -080054 /** For comparison with DisplayContent bounds. */
55 private Rect mTmpRect = new Rect();
Wale Ogunwale4a02d812015-02-12 23:01:38 -080056 /** For handling display rotations. */
57 private Rect mTmpRect2 = new Rect();
Craig Mautnerb660b9d2014-02-13 10:59:16 -080058
59 /** Content limits relative to the DisplayContent this sits in. */
60 private Rect mBounds = new Rect();
61
62 /** Whether mBounds is fullscreen */
63 private boolean mFullscreen = true;
Craig Mautnerc00204b2013-03-05 15:02:14 -080064
Craig Mautner05d29032013-05-03 13:40:13 -070065 /** Used to support {@link android.view.WindowManager.LayoutParams#FLAG_DIM_BEHIND} */
Craig Mautnerb660b9d2014-02-13 10:59:16 -080066 private DimLayer mDimLayer;
Craig Mautner05d29032013-05-03 13:40:13 -070067
68 /** The particular window with FLAG_DIM_BEHIND set. If null, hide mDimLayer. */
69 WindowStateAnimator mDimWinAnimator;
70
71 /** Support for non-zero {@link android.view.animation.Animation#getBackgroundColor()} */
Craig Mautnerdf88d732014-01-27 09:21:32 -080072 DimLayer mAnimationBackgroundSurface;
Craig Mautner05d29032013-05-03 13:40:13 -070073
74 /** The particular window with an Animation with non-zero background color. */
75 WindowStateAnimator mAnimationBackgroundAnimator;
76
77 /** Set to false at the start of performLayoutAndPlaceSurfaces. If it is still false by the end
78 * then stop any dimming. */
79 boolean mDimmingTag;
80
Craig Mautnerdc548482014-02-05 13:35:24 -080081 /** Application tokens that are exiting, but still on screen for animations. */
82 final AppTokenList mExitingAppTokens = new AppTokenList();
83
Craig Mautner95da1082014-02-24 17:54:35 -080084 /** Detach this stack from its display when animation completes. */
85 boolean mDeferDetach;
86
Wale Ogunwale60454db2015-01-23 16:05:07 -080087 // Contains configurations settings that are different from the global configuration due to
88 // stack specific operations. E.g. {@link #setBounds}.
89 Configuration mOverrideConfig;
Wale Ogunwale9d3de4c2015-02-01 16:49:44 -080090 // True if the stack was forced to fullscreen disregarding the override configuration.
91 private boolean mForceFullscreen;
92 // The {@link #mBounds} before the stack was forced to fullscreen. Will be restored as the
93 // stack bounds once the stack is no longer forced to fullscreen.
94 final private Rect mPreForceFullscreenBounds;
Wale Ogunwale60454db2015-01-23 16:05:07 -080095
Wale Ogunwale4a02d812015-02-12 23:01:38 -080096 // Device rotation as of the last time {@link #mBounds} was set.
97 int mRotation;
98
Craig Mautnerdf88d732014-01-27 09:21:32 -080099 TaskStack(WindowManagerService service, int stackId) {
Craig Mautner05d29032013-05-03 13:40:13 -0700100 mService = service;
Craig Mautnerc00204b2013-03-05 15:02:14 -0800101 mStackId = stackId;
Wale Ogunwale60454db2015-01-23 16:05:07 -0800102 mOverrideConfig = Configuration.EMPTY;
Wale Ogunwale9d3de4c2015-02-01 16:49:44 -0800103 mForceFullscreen = false;
104 mPreForceFullscreenBounds = new Rect();
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800105 // TODO: remove bounds from log, they are always 0.
106 EventLog.writeEvent(EventLogTags.WM_STACK_CREATED, stackId, mBounds.left, mBounds.top,
107 mBounds.right, mBounds.bottom);
Craig Mautnerc00204b2013-03-05 15:02:14 -0800108 }
109
110 DisplayContent getDisplayContent() {
111 return mDisplayContent;
112 }
113
Craig Mautnerd9a22882013-03-16 15:00:36 -0700114 ArrayList<Task> getTasks() {
115 return mTasks;
116 }
117
Craig Mautnerb660b9d2014-02-13 10:59:16 -0800118 void resizeWindows() {
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800119 final ArrayList<WindowState> resizingWindows = mService.mResizingWindows;
120 for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) {
121 final ArrayList<AppWindowToken> activities = mTasks.get(taskNdx).mAppTokens;
122 for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
123 final ArrayList<WindowState> windows = activities.get(activityNdx).allAppWindows;
124 for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
125 final WindowState win = windows.get(winNdx);
126 if (!resizingWindows.contains(win)) {
127 if (WindowManagerService.DEBUG_RESIZE) Slog.d(TAG,
128 "setBounds: Resizing " + win);
129 resizingWindows.add(win);
130 }
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800131 }
132 }
133 }
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -0700134 }
135
Wale Ogunwale9d3de4c2015-02-01 16:49:44 -0800136 /** Set the stack bounds. Passing in null sets the bounds to fullscreen. */
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800137 boolean setBounds(Rect bounds) {
Craig Mautnerb660b9d2014-02-13 10:59:16 -0800138 boolean oldFullscreen = mFullscreen;
Wale Ogunwale4a02d812015-02-12 23:01:38 -0800139 int rotation = Surface.ROTATION_0;
Craig Mautnerb660b9d2014-02-13 10:59:16 -0800140 if (mDisplayContent != null) {
141 mDisplayContent.getLogicalDisplayRect(mTmpRect);
Wale Ogunwale4a02d812015-02-12 23:01:38 -0800142 rotation = mDisplayContent.getDisplayInfo().rotation;
Wale Ogunwale9d3de4c2015-02-01 16:49:44 -0800143 if (bounds == null) {
144 bounds = mTmpRect;
145 mFullscreen = true;
146 } else {
147 bounds.intersect(mTmpRect); // ensure bounds are entirely within the display rect
148 mFullscreen = mTmpRect.equals(bounds);
149 }
Craig Mautnerb660b9d2014-02-13 10:59:16 -0800150 }
151
Wale Ogunwale9d3de4c2015-02-01 16:49:44 -0800152 if (bounds == null) {
Wale Ogunwale4a02d812015-02-12 23:01:38 -0800153 // Can't set to fullscreen if we don't have a display to get bounds from...
Wale Ogunwale9d3de4c2015-02-01 16:49:44 -0800154 return false;
155 }
Wale Ogunwale4a02d812015-02-12 23:01:38 -0800156 if (mBounds.equals(bounds) && oldFullscreen == mFullscreen && mRotation == rotation) {
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800157 return false;
158 }
159
Wale Ogunwale0ade61b2015-03-24 10:40:32 -0700160 mDimLayer.setBounds(bounds);
161 mAnimationBackgroundSurface.setBounds(bounds);
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800162 mBounds.set(bounds);
Wale Ogunwale4a02d812015-02-12 23:01:38 -0800163 mRotation = rotation;
Wale Ogunwale60454db2015-01-23 16:05:07 -0800164 updateOverrideConfiguration();
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800165 return true;
166 }
167
168 void getBounds(Rect out) {
Craig Mautnerb660b9d2014-02-13 10:59:16 -0800169 out.set(mBounds);
170 }
171
Wale Ogunwale9d3de4c2015-02-01 16:49:44 -0800172 private void updateOverrideConfiguration() {
Wale Ogunwale60454db2015-01-23 16:05:07 -0800173 final Configuration serviceConfig = mService.mCurConfiguration;
174 if (mFullscreen) {
175 mOverrideConfig = Configuration.EMPTY;
176 return;
177 }
178
179 if (mOverrideConfig == Configuration.EMPTY) {
180 mOverrideConfig = new Configuration();
181 }
182
183 // TODO(multidisplay): Update Dp to that of display stack is on.
184 final float density = serviceConfig.densityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE;
185 mOverrideConfig.screenWidthDp =
186 Math.min((int)(mBounds.width() / density), serviceConfig.screenWidthDp);
187 mOverrideConfig.screenHeightDp =
188 Math.min((int)(mBounds.height() / density), serviceConfig.screenHeightDp);
189 mOverrideConfig.smallestScreenWidthDp =
190 Math.min(mOverrideConfig.screenWidthDp, mOverrideConfig.screenHeightDp);
Wale Ogunwalea9281272015-02-07 14:04:19 -0800191 mOverrideConfig.orientation =
192 (mOverrideConfig.screenWidthDp <= mOverrideConfig.screenHeightDp)
193 ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
Wale Ogunwale60454db2015-01-23 16:05:07 -0800194 }
195
Craig Mautnerb660b9d2014-02-13 10:59:16 -0800196 void updateDisplayInfo() {
Wale Ogunwale4a02d812015-02-12 23:01:38 -0800197 if (mFullscreen) {
198 setBounds(null);
199 } else if (mDisplayContent != null) {
200 final int newRotation = mDisplayContent.getDisplayInfo().rotation;
201 if (mRotation == newRotation) {
202 return;
203 }
204
205 // Device rotation changed. We don't want the stack to move around on the screen when
206 // this happens, so update the stack bounds so it stays in the same place.
207 final int rotationDelta = DisplayContent.deltaRotation(mRotation, newRotation);
Craig Mautnerb660b9d2014-02-13 10:59:16 -0800208 mDisplayContent.getLogicalDisplayRect(mTmpRect);
Wale Ogunwale4a02d812015-02-12 23:01:38 -0800209 switch (rotationDelta) {
210 case Surface.ROTATION_0:
211 mTmpRect2.set(mBounds);
212 break;
213 case Surface.ROTATION_90:
214 mTmpRect2.top = mTmpRect.bottom - mBounds.right;
215 mTmpRect2.left = mBounds.top;
216 mTmpRect2.right = mTmpRect2.left + mBounds.height();
217 mTmpRect2.bottom = mTmpRect2.top + mBounds.width();
218 break;
219 case Surface.ROTATION_180:
220 mTmpRect2.top = mTmpRect.bottom - mBounds.bottom;
221 mTmpRect2.left = mTmpRect.right - mBounds.right;
222 mTmpRect2.right = mTmpRect2.left + mBounds.width();
223 mTmpRect2.bottom = mTmpRect2.top + mBounds.height();
224 break;
225 case Surface.ROTATION_270:
226 mTmpRect2.top = mBounds.left;
227 mTmpRect2.left = mTmpRect.right - mBounds.bottom;
228 mTmpRect2.right = mTmpRect2.left + mBounds.height();
229 mTmpRect2.bottom = mTmpRect2.top + mBounds.width();
230 break;
231 }
232 setBounds(mTmpRect2);
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800233 }
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800234 }
235
236 boolean isFullscreen() {
Craig Mautnerb660b9d2014-02-13 10:59:16 -0800237 return mFullscreen;
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800238 }
239
Wale Ogunwale9d3de4c2015-02-01 16:49:44 -0800240 /** Forces the stack to fullscreen if input is true, else un-forces the stack from fullscreen.
241 * Returns true if something happened.
242 */
243 boolean forceFullscreen(boolean forceFullscreen) {
244 if (mForceFullscreen == forceFullscreen) {
245 return false;
246 }
247 mForceFullscreen = forceFullscreen;
248 if (forceFullscreen) {
249 if (mFullscreen) {
250 return false;
251 }
252 mPreForceFullscreenBounds.set(mBounds);
253 return setBounds(null);
254 } else {
255 if (!mFullscreen || mPreForceFullscreenBounds.isEmpty()) {
256 return false;
257 }
258 return setBounds(mPreForceFullscreenBounds);
259 }
260 }
261
Craig Mautner1bf2b872014-02-05 15:37:40 -0800262 boolean isAnimating() {
263 for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) {
264 final ArrayList<AppWindowToken> activities = mTasks.get(taskNdx).mAppTokens;
265 for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
266 final ArrayList<WindowState> windows = activities.get(activityNdx).allAppWindows;
267 for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
Craig Mautnerbc2a6df2014-06-13 15:08:48 -0700268 final WindowStateAnimator winAnimator = windows.get(winNdx).mWinAnimator;
Craig Mautner7c9ee192014-08-14 16:08:26 -0700269 if (winAnimator.isAnimating() || winAnimator.mWin.mExiting) {
Craig Mautner1bf2b872014-02-05 15:37:40 -0800270 return true;
271 }
272 }
273 }
274 }
275 return false;
276 }
277
Wale Ogunwale3fcb4a82015-04-06 14:00:13 -0700278 void addTask(Task task, boolean toTop) {
279 addTask(task, toTop, task.showWhenLocked());
280 }
281
Craig Mautner00af9fe2013-03-25 09:13:41 -0700282 /**
283 * Put a Task in this stack. Used for adding and moving.
284 * @param task The task to add.
285 * @param toTop Whether to add it to the top or bottom.
Wale Ogunwale3fcb4a82015-04-06 14:00:13 -0700286 * @param showWhenLocked Whether to show the task when the device is locked
287 * regardless of the current user.
Craig Mautner00af9fe2013-03-25 09:13:41 -0700288 */
Wale Ogunwale3fcb4a82015-04-06 14:00:13 -0700289 void addTask(Task task, boolean toTop, boolean showWhenLocked) {
Craig Mautnerac6f8432013-07-17 13:24:59 -0700290 int stackNdx;
291 if (!toTop) {
292 stackNdx = 0;
293 } else {
294 stackNdx = mTasks.size();
Wale Ogunwale3fcb4a82015-04-06 14:00:13 -0700295 if (!showWhenLocked && !mService.isCurrentProfileLocked(task.mUserId)) {
Craig Mautnerac6f8432013-07-17 13:24:59 -0700296 // Place the task below all current user tasks.
297 while (--stackNdx >= 0) {
Wale Ogunwale3fcb4a82015-04-06 14:00:13 -0700298 final Task tmpTask = mTasks.get(stackNdx);
299 if (!tmpTask.showWhenLocked()
300 || !mService.isCurrentProfileLocked(tmpTask.mUserId)) {
Craig Mautnerac6f8432013-07-17 13:24:59 -0700301 break;
302 }
303 }
Craig Mautnere0d50cc2014-06-02 10:11:53 -0700304 // Put it above first non-current user task.
Craig Mautnerac6f8432013-07-17 13:24:59 -0700305 ++stackNdx;
306 }
307 }
308 if (DEBUG_TASK_MOVEMENT) Slog.d(TAG, "addTask: task=" + task + " toTop=" + toTop
309 + " pos=" + stackNdx);
310 mTasks.add(stackNdx, task);
311
Craig Mautner967212c2013-04-13 21:10:58 -0700312 task.mStack = this;
raysb.kim00a27252014-11-11 08:38:21 +0900313 if (toTop) {
314 mDisplayContent.moveStack(this, true);
315 }
Craig Mautner83162a92015-01-26 14:43:30 -0800316 EventLog.writeEvent(EventLogTags.WM_TASK_MOVED, task.mTaskId, toTop ? 1 : 0, stackNdx);
Craig Mautnerc00204b2013-03-05 15:02:14 -0800317 }
318
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800319 void moveTaskToTop(Task task) {
Craig Mautnerf0ac5c82013-06-24 11:21:57 -0700320 if (DEBUG_TASK_MOVEMENT) Slog.d(TAG, "moveTaskToTop: task=" + task + " Callers="
321 + Debug.getCallers(6));
Craig Mautnerd9a22882013-03-16 15:00:36 -0700322 mTasks.remove(task);
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800323 addTask(task, true);
Craig Mautnerd9a22882013-03-16 15:00:36 -0700324 }
325
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800326 void moveTaskToBottom(Task task) {
Craig Mautnerf0ac5c82013-06-24 11:21:57 -0700327 if (DEBUG_TASK_MOVEMENT) Slog.d(TAG, "moveTaskToBottom: task=" + task);
Craig Mautnerd9a22882013-03-16 15:00:36 -0700328 mTasks.remove(task);
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800329 addTask(task, false);
Craig Mautnerd9a22882013-03-16 15:00:36 -0700330 }
331
Craig Mautner00af9fe2013-03-25 09:13:41 -0700332 /**
Craig Mautner04a0ea62014-01-13 12:51:26 -0800333 * Delete a Task from this stack. If it is the last Task in the stack, move this stack to the
334 * back.
Craig Mautner00af9fe2013-03-25 09:13:41 -0700335 * @param task The Task to delete.
Craig Mautner00af9fe2013-03-25 09:13:41 -0700336 */
Craig Mautnerde4ef022013-04-07 19:01:33 -0700337 void removeTask(Task task) {
Craig Mautnerf0ac5c82013-06-24 11:21:57 -0700338 if (DEBUG_TASK_MOVEMENT) Slog.d(TAG, "removeTask: task=" + task);
Craig Mautnerde4ef022013-04-07 19:01:33 -0700339 mTasks.remove(task);
Craig Mautnerdf88d732014-01-27 09:21:32 -0800340 if (mDisplayContent != null) {
Craig Mautnerdf88d732014-01-27 09:21:32 -0800341 if (mTasks.isEmpty()) {
342 mDisplayContent.moveStack(this, false);
343 }
344 mDisplayContent.layoutNeeded = true;
Craig Mautner04a0ea62014-01-13 12:51:26 -0800345 }
Craig Mautnere3119b72015-01-20 15:02:36 -0800346 for (int appNdx = mExitingAppTokens.size() - 1; appNdx >= 0; --appNdx) {
347 final AppWindowToken wtoken = mExitingAppTokens.get(appNdx);
Craig Mautner83162a92015-01-26 14:43:30 -0800348 if (wtoken.mTask == task) {
Craig Mautnere3119b72015-01-20 15:02:36 -0800349 wtoken.mIsExiting = false;
350 mExitingAppTokens.remove(appNdx);
351 }
352 }
Craig Mautnerc00204b2013-03-05 15:02:14 -0800353 }
354
Craig Mautnerdf88d732014-01-27 09:21:32 -0800355 void attachDisplayContent(DisplayContent displayContent) {
356 if (mDisplayContent != null) {
357 throw new IllegalStateException("attachDisplayContent: Already attached");
Craig Mautner4a1cb222013-12-04 16:14:06 -0800358 }
Craig Mautnerdf88d732014-01-27 09:21:32 -0800359
360 mDisplayContent = displayContent;
361 mDimLayer = new DimLayer(mService, this, displayContent);
362 mAnimationBackgroundSurface = new DimLayer(mService, this, displayContent);
Craig Mautnerb660b9d2014-02-13 10:59:16 -0800363 updateDisplayInfo();
Craig Mautnerdf88d732014-01-27 09:21:32 -0800364 }
365
Craig Mautnerdc548482014-02-05 13:35:24 -0800366 void detachDisplay() {
Craig Mautnerdf88d732014-01-27 09:21:32 -0800367 EventLog.writeEvent(EventLogTags.WM_STACK_REMOVED, mStackId);
Craig Mautnerbc2a6df2014-06-13 15:08:48 -0700368
369 boolean doAnotherLayoutPass = false;
Craig Mautnerdc548482014-02-05 13:35:24 -0800370 for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) {
Craig Mautnerbc2a6df2014-06-13 15:08:48 -0700371 final AppTokenList appWindowTokens = mTasks.get(taskNdx).mAppTokens;
372 for (int appNdx = appWindowTokens.size() - 1; appNdx >= 0; --appNdx) {
373 final WindowList appWindows = appWindowTokens.get(appNdx).allAppWindows;
374 for (int winNdx = appWindows.size() - 1; winNdx >= 0; --winNdx) {
Craig Mautnerb605f4a2015-02-18 13:08:42 -0800375 mService.removeWindowInnerLocked(appWindows.get(winNdx));
Craig Mautnerbc2a6df2014-06-13 15:08:48 -0700376 doAnotherLayoutPass = true;
377 }
378 }
Craig Mautnerdc548482014-02-05 13:35:24 -0800379 }
Craig Mautnerbc2a6df2014-06-13 15:08:48 -0700380 if (doAnotherLayoutPass) {
381 mService.requestTraversalLocked();
382 }
383
Craig Mautner00a66752015-03-23 14:00:47 -0700384 close();
385
Craig Mautnerdf88d732014-01-27 09:21:32 -0800386 mDisplayContent = null;
Craig Mautner00af9fe2013-03-25 09:13:41 -0700387 }
388
Craig Mautner05d29032013-05-03 13:40:13 -0700389 void resetAnimationBackgroundAnimator() {
390 mAnimationBackgroundAnimator = null;
391 mAnimationBackgroundSurface.hide();
392 }
393
394 private long getDimBehindFadeDuration(long duration) {
395 TypedValue tv = new TypedValue();
396 mService.mContext.getResources().getValue(
397 com.android.internal.R.fraction.config_dimBehindFadeDuration, tv, true);
398 if (tv.type == TypedValue.TYPE_FRACTION) {
399 duration = (long)tv.getFraction(duration, duration);
400 } else if (tv.type >= TypedValue.TYPE_FIRST_INT && tv.type <= TypedValue.TYPE_LAST_INT) {
401 duration = tv.data;
Craig Mautnerc00204b2013-03-05 15:02:14 -0800402 }
Craig Mautner05d29032013-05-03 13:40:13 -0700403 return duration;
404 }
405
406 boolean animateDimLayers() {
407 final int dimLayer;
408 final float dimAmount;
409 if (mDimWinAnimator == null) {
410 dimLayer = mDimLayer.getLayer();
411 dimAmount = 0;
412 } else {
413 dimLayer = mDimWinAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM;
414 dimAmount = mDimWinAnimator.mWin.mAttrs.dimAmount;
415 }
416 final float targetAlpha = mDimLayer.getTargetAlpha();
417 if (targetAlpha != dimAmount) {
418 if (mDimWinAnimator == null) {
419 mDimLayer.hide(DEFAULT_DIM_DURATION);
420 } else {
421 long duration = (mDimWinAnimator.mAnimating && mDimWinAnimator.mAnimation != null)
422 ? mDimWinAnimator.mAnimation.computeDurationHint()
423 : DEFAULT_DIM_DURATION;
424 if (targetAlpha > dimAmount) {
425 duration = getDimBehindFadeDuration(duration);
426 }
427 mDimLayer.show(dimLayer, dimAmount, duration);
428 }
429 } else if (mDimLayer.getLayer() != dimLayer) {
430 mDimLayer.setLayer(dimLayer);
431 }
432 if (mDimLayer.isAnimating()) {
433 if (!mService.okToDisplay()) {
434 // Jump to the end of the animation.
435 mDimLayer.show();
436 } else {
437 return mDimLayer.stepAnimation();
438 }
439 }
440 return false;
441 }
442
443 void resetDimmingTag() {
444 mDimmingTag = false;
445 }
446
447 void setDimmingTag() {
448 mDimmingTag = true;
449 }
450
451 boolean testDimmingTag() {
452 return mDimmingTag;
453 }
454
455 boolean isDimming() {
456 return mDimLayer.isDimming();
457 }
458
459 boolean isDimming(WindowStateAnimator winAnimator) {
460 return mDimWinAnimator == winAnimator && mDimLayer.isDimming();
461 }
462
463 void startDimmingIfNeeded(WindowStateAnimator newWinAnimator) {
464 // Only set dim params on the highest dimmed layer.
Craig Mautner05d29032013-05-03 13:40:13 -0700465 // Don't turn on for an unshown surface, or for any layer but the highest dimmed layer.
Wale Ogunwale498e8c92015-02-13 09:42:46 -0800466 if (newWinAnimator.mSurfaceShown && (mDimWinAnimator == null
467 || !mDimWinAnimator.mSurfaceShown
468 || mDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
Craig Mautner05d29032013-05-03 13:40:13 -0700469 mDimWinAnimator = newWinAnimator;
Wale Ogunwale498e8c92015-02-13 09:42:46 -0800470 if (mDimWinAnimator.mWin.mAppToken == null
471 && !mFullscreen && mDisplayContent != null) {
472 // Dim should cover the entire screen for system windows.
473 mDisplayContent.getLogicalDisplayRect(mTmpRect);
474 mDimLayer.setBounds(mTmpRect);
475 }
Craig Mautner05d29032013-05-03 13:40:13 -0700476 }
477 }
478
479 void stopDimmingIfNeeded() {
480 if (!mDimmingTag && isDimming()) {
481 mDimWinAnimator = null;
Wale Ogunwale498e8c92015-02-13 09:42:46 -0800482 mDimLayer.setBounds(mBounds);
Craig Mautner05d29032013-05-03 13:40:13 -0700483 }
484 }
485
486 void setAnimationBackground(WindowStateAnimator winAnimator, int color) {
487 int animLayer = winAnimator.mAnimLayer;
488 if (mAnimationBackgroundAnimator == null
489 || animLayer < mAnimationBackgroundAnimator.mAnimLayer) {
490 mAnimationBackgroundAnimator = winAnimator;
491 animLayer = mService.adjustAnimationBackground(winAnimator);
492 mAnimationBackgroundSurface.show(animLayer - WindowManagerService.LAYER_OFFSET_DIM,
493 ((color >> 24) & 0xff) / 255f, 0);
494 }
495 }
496
Wale Ogunwale498e8c92015-02-13 09:42:46 -0800497 void switchUser() {
Craig Mautnerac6f8432013-07-17 13:24:59 -0700498 int top = mTasks.size();
499 for (int taskNdx = 0; taskNdx < top; ++taskNdx) {
500 Task task = mTasks.get(taskNdx);
Wale Ogunwale3fcb4a82015-04-06 14:00:13 -0700501 if (mService.isCurrentProfileLocked(task.mUserId) || task.showWhenLocked()) {
Craig Mautnerac6f8432013-07-17 13:24:59 -0700502 mTasks.remove(taskNdx);
503 mTasks.add(task);
504 --top;
505 }
506 }
507 }
508
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800509 void close() {
Craig Mautner00a66752015-03-23 14:00:47 -0700510 if (mAnimationBackgroundSurface != null) {
511 mAnimationBackgroundSurface.destroySurface();
512 mAnimationBackgroundSurface = null;
513 }
514 if (mDimLayer != null) {
515 mDimLayer.destroySurface();
516 mDimLayer = null;
517 }
Craig Mautnerbdc748af2013-12-02 14:08:25 -0800518 }
519
Craig Mautner00af9fe2013-03-25 09:13:41 -0700520 public void dump(String prefix, PrintWriter pw) {
521 pw.print(prefix); pw.print("mStackId="); pw.println(mStackId);
Craig Mautner95da1082014-02-24 17:54:35 -0800522 pw.print(prefix); pw.print("mDeferDetach="); pw.println(mDeferDetach);
Craig Mautner00af9fe2013-03-25 09:13:41 -0700523 for (int taskNdx = 0; taskNdx < mTasks.size(); ++taskNdx) {
524 pw.print(prefix); pw.println(mTasks.get(taskNdx));
525 }
Craig Mautner05d29032013-05-03 13:40:13 -0700526 if (mAnimationBackgroundSurface.isDimming()) {
527 pw.print(prefix); pw.println("mWindowAnimationBackgroundSurface:");
528 mAnimationBackgroundSurface.printTo(prefix + " ", pw);
529 }
530 if (mDimLayer.isDimming()) {
531 pw.print(prefix); pw.println("mDimLayer:");
Wale Ogunwale498e8c92015-02-13 09:42:46 -0800532 mDimLayer.printTo(prefix + " ", pw);
Craig Mautner05d29032013-05-03 13:40:13 -0700533 pw.print(prefix); pw.print("mDimWinAnimator="); pw.println(mDimWinAnimator);
534 }
Craig Mautnerdc548482014-02-05 13:35:24 -0800535 if (!mExitingAppTokens.isEmpty()) {
536 pw.println();
537 pw.println(" Exiting application tokens:");
538 for (int i=mExitingAppTokens.size()-1; i>=0; i--) {
539 WindowToken token = mExitingAppTokens.get(i);
540 pw.print(" Exiting App #"); pw.print(i);
541 pw.print(' '); pw.print(token);
542 pw.println(':');
543 token.dump(pw, " ");
544 }
545 }
Craig Mautner00af9fe2013-03-25 09:13:41 -0700546 }
Craig Mautner4cd0c13f2013-04-16 15:55:52 -0700547
548 @Override
549 public String toString() {
550 return "{stackId=" + mStackId + " tasks=" + mTasks + "}";
551 }
Craig Mautnerc00204b2013-03-05 15:02:14 -0800552}