blob: d8929c9d80c2ecbc9d5f51094e6c3f58b5d29fa4 [file] [log] [blame]
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -08001/*
2 * Copyright (C) 2016 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
Jorim Jaggi829b9cd2017-01-23 16:20:53 +010019import android.app.ActivityManager.TaskDescription;
Jorim Jaggie2c77f92016-12-29 14:57:22 +010020import android.app.ActivityManager.TaskSnapshot;
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080021import android.content.res.Configuration;
22import android.graphics.Rect;
Jorim Jaggifb9d78a2017-01-05 18:57:12 +010023import android.os.Handler;
24import android.os.Looper;
25import android.os.Message;
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080026import android.util.EventLog;
27import android.util.Slog;
Wale Ogunwalec5cc3012017-01-13 13:26:16 -080028import com.android.internal.annotations.VisibleForTesting;
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080029
Wale Ogunwale1666e312016-12-16 11:27:18 -080030import java.lang.ref.WeakReference;
31
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080032import static com.android.server.EventLogTags.WM_TASK_CREATED;
33import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
34import static com.android.server.wm.WindowContainer.POSITION_BOTTOM;
35import static com.android.server.wm.WindowContainer.POSITION_TOP;
36import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK;
37import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
38
39/**
40 * Controller for the task container. This is created by activity manager to link task records to
41 * the task container they use in window manager.
42 *
43 * Test class: {@link TaskWindowContainerControllerTests}
44 */
45public class TaskWindowContainerController
Jorim Jaggifb9d78a2017-01-05 18:57:12 +010046 extends WindowContainerController<Task, TaskWindowContainerListener> {
47
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080048 private final int mTaskId;
Wale Ogunwale1666e312016-12-16 11:27:18 -080049 private final H mHandler;
Jorim Jaggifb9d78a2017-01-05 18:57:12 +010050
51 public TaskWindowContainerController(int taskId, TaskWindowContainerListener listener,
Wale Ogunwale1666e312016-12-16 11:27:18 -080052 StackWindowController stackController, int userId, Rect bounds,
53 Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
Wale Ogunwale6fbde9f2017-08-24 07:24:12 -070054 boolean toTop, boolean showForAllUsers, TaskDescription taskDescription) {
Wale Ogunwale1666e312016-12-16 11:27:18 -080055 this(taskId, listener, stackController, userId, bounds, overrideConfig, resizeMode,
Wale Ogunwale6fbde9f2017-08-24 07:24:12 -070056 supportsPictureInPicture, toTop, showForAllUsers, taskDescription,
Wale Ogunwale069bbd32017-02-03 07:58:14 -080057 WindowManagerService.getInstance());
Wale Ogunwale1666e312016-12-16 11:27:18 -080058 }
59
60 public TaskWindowContainerController(int taskId, TaskWindowContainerListener listener,
61 StackWindowController stackController, int userId, Rect bounds,
62 Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
Wale Ogunwale6fbde9f2017-08-24 07:24:12 -070063 boolean toTop, boolean showForAllUsers, TaskDescription taskDescription,
64 WindowManagerService service) {
Wale Ogunwale1666e312016-12-16 11:27:18 -080065 super(listener, service);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080066 mTaskId = taskId;
Wale Ogunwale1666e312016-12-16 11:27:18 -080067 mHandler = new H(new WeakReference<>(this), service.mH.getLooper());
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080068
69 synchronized(mWindowMap) {
70 if (DEBUG_STACK) Slog.i(TAG_WM, "TaskWindowContainerController: taskId=" + taskId
Wale Ogunwale1666e312016-12-16 11:27:18 -080071 + " stack=" + stackController + " bounds=" + bounds);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080072
Wale Ogunwale1666e312016-12-16 11:27:18 -080073 final TaskStack stack = stackController.mContainer;
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080074 if (stack == null) {
Wale Ogunwale1666e312016-12-16 11:27:18 -080075 throw new IllegalArgumentException("TaskWindowContainerController: invalid stack="
76 + stackController);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080077 }
Wale Ogunwale1666e312016-12-16 11:27:18 -080078 EventLog.writeEvent(WM_TASK_CREATED, taskId, stack.mStackId);
Wale Ogunwalec5cc3012017-01-13 13:26:16 -080079 final Task task = createTask(taskId, stack, userId, bounds, overrideConfig, resizeMode,
Wale Ogunwale6fbde9f2017-08-24 07:24:12 -070080 supportsPictureInPicture, taskDescription);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080081 final int position = toTop ? POSITION_TOP : POSITION_BOTTOM;
Wale Ogunwale1f5b92f2017-07-18 06:33:01 -070082 // We only want to move the parents to the parents if we are creating this task at the
83 // top of its stack.
84 stack.addTask(task, position, showForAllUsers, toTop /* moveParents */);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080085 }
86 }
87
Wale Ogunwalec5cc3012017-01-13 13:26:16 -080088 @VisibleForTesting
89 Task createTask(int taskId, TaskStack stack, int userId, Rect bounds,
Winson Chungd3395382016-12-13 11:49:09 -080090 Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
Wale Ogunwale6fbde9f2017-08-24 07:24:12 -070091 TaskDescription taskDescription) {
Wale Ogunwale069bbd32017-02-03 07:58:14 -080092 return new Task(taskId, stack, userId, mService, bounds, overrideConfig, resizeMode,
Wale Ogunwale6fbde9f2017-08-24 07:24:12 -070093 supportsPictureInPicture, taskDescription, this);
Wale Ogunwalec5cc3012017-01-13 13:26:16 -080094 }
95
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080096 @Override
97 public void removeContainer() {
98 synchronized(mWindowMap) {
99 if (mContainer == null) {
100 if (DEBUG_STACK) Slog.i(TAG_WM, "removeTask: could not find taskId=" + mTaskId);
101 return;
102 }
103 mContainer.removeIfPossible();
104 super.removeContainer();
105 }
106 }
107
Wale Ogunwalec5cc3012017-01-13 13:26:16 -0800108 public void positionChildAt(AppWindowContainerController childController, int position) {
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800109 synchronized(mService.mWindowMap) {
110 final AppWindowToken aToken = childController.mContainer;
111 if (aToken == null) {
112 Slog.w(TAG_WM,
113 "Attempted to position of non-existing app : " + childController);
114 return;
115 }
116
117 final Task task = mContainer;
118 if (task == null) {
119 throw new IllegalArgumentException("positionChildAt: invalid task=" + this);
120 }
Wale Ogunwalec5cc3012017-01-13 13:26:16 -0800121 task.positionChildAt(position, aToken, false /* includeParents */);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800122 }
123 }
124
Wale Ogunwale2719cc12017-04-14 09:45:27 -0700125 public void reparent(StackWindowController stackController, int position, boolean moveParents) {
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800126 synchronized (mWindowMap) {
127 if (DEBUG_STACK) Slog.i(TAG_WM, "reparent: moving taskId=" + mTaskId
Wale Ogunwale1666e312016-12-16 11:27:18 -0800128 + " to stack=" + stackController + " at " + position);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800129 if (mContainer == null) {
130 if (DEBUG_STACK) Slog.i(TAG_WM,
131 "reparent: could not find taskId=" + mTaskId);
132 return;
133 }
Wale Ogunwale1666e312016-12-16 11:27:18 -0800134 final TaskStack stack = stackController.mContainer;
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800135 if (stack == null) {
Wale Ogunwale1666e312016-12-16 11:27:18 -0800136 throw new IllegalArgumentException("reparent: could not find stack="
137 + stackController);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800138 }
Wale Ogunwale2719cc12017-04-14 09:45:27 -0700139 mContainer.reparent(stack, position, moveParents);
Wale Ogunwale1666e312016-12-16 11:27:18 -0800140 mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800141 }
142 }
143
144 public void setResizeable(int resizeMode) {
145 synchronized (mWindowMap) {
146 if (mContainer != null) {
147 mContainer.setResizeable(resizeMode);
148 }
149 }
150 }
151
152 public void resize(Rect bounds, Configuration overrideConfig, boolean relayout,
153 boolean forced) {
154 synchronized (mWindowMap) {
155 if (mContainer == null) {
156 throw new IllegalArgumentException("resizeTask: taskId " + mTaskId + " not found.");
157 }
158
159 if (mContainer.resizeLocked(bounds, overrideConfig, forced) && relayout) {
Wale Ogunwale1666e312016-12-16 11:27:18 -0800160 mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800161 }
162 }
163 }
164
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800165 public void getBounds(Rect bounds) {
166 synchronized (mWindowMap) {
167 if (mContainer != null) {
168 mContainer.getBounds(bounds);
169 return;
170 }
171 bounds.setEmpty();
172 }
173 }
174
175 /**
176 * Puts this task into docked drag resizing mode. See {@link DragResizeMode}.
177 *
178 * @param resizing Whether to put the task into drag resize mode.
179 */
180 public void setTaskDockedResizing(boolean resizing) {
181 synchronized (mWindowMap) {
182 if (mContainer == null) {
183 Slog.w(TAG_WM, "setTaskDockedResizing: taskId " + mTaskId + " not found.");
184 return;
185 }
186 mContainer.setDragResizing(resizing, DRAG_RESIZE_MODE_DOCKED_DIVIDER);
187 }
188 }
189
190 public void cancelWindowTransition() {
191 synchronized (mWindowMap) {
192 if (mContainer == null) {
193 Slog.w(TAG_WM, "cancelWindowTransition: taskId " + mTaskId + " not found.");
194 return;
195 }
196 mContainer.cancelTaskWindowTransition();
197 }
198 }
199
200 public void cancelThumbnailTransition() {
201 synchronized (mWindowMap) {
202 if (mContainer == null) {
203 Slog.w(TAG_WM, "cancelThumbnailTransition: taskId " + mTaskId + " not found.");
204 return;
205 }
206 mContainer.cancelTaskThumbnailTransition();
207 }
208 }
209
Jorim Jaggi829b9cd2017-01-23 16:20:53 +0100210 public void setTaskDescription(TaskDescription taskDescription) {
211 synchronized (mWindowMap) {
212 if (mContainer == null) {
213 Slog.w(TAG_WM, "setTaskDescription: taskId " + mTaskId + " not found.");
214 return;
215 }
216 mContainer.setTaskDescription(taskDescription);
217 }
218 }
219
Jorim Jaggifb9d78a2017-01-05 18:57:12 +0100220 void reportSnapshotChanged(TaskSnapshot snapshot) {
Wale Ogunwale1666e312016-12-16 11:27:18 -0800221 mHandler.obtainMessage(H.REPORT_SNAPSHOT_CHANGED, snapshot).sendToTarget();
222 }
223
224 void requestResize(Rect bounds, int resizeMode) {
225 mHandler.obtainMessage(H.REQUEST_RESIZE, resizeMode, 0, bounds).sendToTarget();
Jorim Jaggifb9d78a2017-01-05 18:57:12 +0100226 }
227
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800228 @Override
229 public String toString() {
230 return "{TaskWindowContainerController taskId=" + mTaskId + "}";
231 }
Wale Ogunwale1666e312016-12-16 11:27:18 -0800232
233 private static final class H extends Handler {
234
235 static final int REPORT_SNAPSHOT_CHANGED = 0;
236 static final int REQUEST_RESIZE = 1;
237
238 private final WeakReference<TaskWindowContainerController> mController;
239
240 H(WeakReference<TaskWindowContainerController> controller, Looper looper) {
241 super(looper);
242 mController = controller;
243 }
244
245 @Override
246 public void handleMessage(Message msg) {
247 final TaskWindowContainerController controller = mController.get();
248 final TaskWindowContainerListener listener = (controller != null)
249 ? controller.mListener : null;
250 if (listener == null) {
251 return;
252 }
253 switch (msg.what) {
254 case REPORT_SNAPSHOT_CHANGED:
255 listener.onSnapshotChanged((TaskSnapshot) msg.obj);
256 break;
257 case REQUEST_RESIZE:
258 listener.requestResize((Rect) msg.obj, msg.arg1);
259 break;
260 }
261 }
262 }
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800263}