blob: d83f28ccb31c6fb51b2731570b724bb76b39c498 [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.graphics.Rect;
Jorim Jaggifb9d78a2017-01-05 18:57:12 +010022import android.os.Handler;
23import android.os.Looper;
24import android.os.Message;
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080025import android.util.EventLog;
26import android.util.Slog;
Wale Ogunwalec5cc3012017-01-13 13:26:16 -080027import com.android.internal.annotations.VisibleForTesting;
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080028
Wale Ogunwale1666e312016-12-16 11:27:18 -080029import java.lang.ref.WeakReference;
30
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080031import static com.android.server.EventLogTags.WM_TASK_CREATED;
Bryce Leef3c6a472017-11-14 14:53:06 -080032import static com.android.server.wm.ConfigurationContainer.BOUNDS_CHANGE_NONE;
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080033import 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 Ogunwale034a8ec2017-09-02 17:14:40 -070052 StackWindowController stackController, int userId, Rect bounds, int resizeMode,
53 boolean supportsPictureInPicture, boolean toTop, boolean showForAllUsers,
54 TaskDescription taskDescription) {
55 this(taskId, listener, stackController, userId, bounds, 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,
Wale Ogunwale034a8ec2017-09-02 17:14:40 -070061 StackWindowController stackController, int userId, Rect bounds, int resizeMode,
62 boolean supportsPictureInPicture, boolean toTop, boolean showForAllUsers,
63 TaskDescription taskDescription, WindowManagerService service) {
Wale Ogunwale1666e312016-12-16 11:27:18 -080064 super(listener, service);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080065 mTaskId = taskId;
Wale Ogunwale1666e312016-12-16 11:27:18 -080066 mHandler = new H(new WeakReference<>(this), service.mH.getLooper());
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080067
68 synchronized(mWindowMap) {
69 if (DEBUG_STACK) Slog.i(TAG_WM, "TaskWindowContainerController: taskId=" + taskId
Wale Ogunwale1666e312016-12-16 11:27:18 -080070 + " stack=" + stackController + " bounds=" + bounds);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080071
Wale Ogunwale1666e312016-12-16 11:27:18 -080072 final TaskStack stack = stackController.mContainer;
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080073 if (stack == null) {
Wale Ogunwale1666e312016-12-16 11:27:18 -080074 throw new IllegalArgumentException("TaskWindowContainerController: invalid stack="
75 + stackController);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080076 }
Wale Ogunwale1666e312016-12-16 11:27:18 -080077 EventLog.writeEvent(WM_TASK_CREATED, taskId, stack.mStackId);
Bryce Leef3c6a472017-11-14 14:53:06 -080078 final Task task = createTask(taskId, stack, userId, resizeMode,
Wale Ogunwale6fbde9f2017-08-24 07:24:12 -070079 supportsPictureInPicture, taskDescription);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080080 final int position = toTop ? POSITION_TOP : POSITION_BOTTOM;
Wale Ogunwale1f5b92f2017-07-18 06:33:01 -070081 // We only want to move the parents to the parents if we are creating this task at the
82 // top of its stack.
83 stack.addTask(task, position, showForAllUsers, toTop /* moveParents */);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080084 }
85 }
86
Wale Ogunwalec5cc3012017-01-13 13:26:16 -080087 @VisibleForTesting
Bryce Leef3c6a472017-11-14 14:53:06 -080088 Task createTask(int taskId, TaskStack stack, int userId, int resizeMode,
Wale Ogunwale034a8ec2017-09-02 17:14:40 -070089 boolean supportsPictureInPicture, TaskDescription taskDescription) {
Bryce Leef3c6a472017-11-14 14:53:06 -080090 return new Task(taskId, stack, userId, mService, resizeMode, supportsPictureInPicture,
91 taskDescription, this);
Wale Ogunwalec5cc3012017-01-13 13:26:16 -080092 }
93
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -080094 @Override
95 public void removeContainer() {
96 synchronized(mWindowMap) {
97 if (mContainer == null) {
98 if (DEBUG_STACK) Slog.i(TAG_WM, "removeTask: could not find taskId=" + mTaskId);
99 return;
100 }
101 mContainer.removeIfPossible();
102 super.removeContainer();
103 }
104 }
105
Bryce Leed58d7b32017-09-08 15:55:22 -0700106 public void positionChildAtTop(AppWindowContainerController childController) {
107 positionChildAt(childController, POSITION_TOP);
108 }
109
Wale Ogunwalec5cc3012017-01-13 13:26:16 -0800110 public void positionChildAt(AppWindowContainerController childController, int position) {
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800111 synchronized(mService.mWindowMap) {
112 final AppWindowToken aToken = childController.mContainer;
113 if (aToken == null) {
114 Slog.w(TAG_WM,
115 "Attempted to position of non-existing app : " + childController);
116 return;
117 }
118
119 final Task task = mContainer;
120 if (task == null) {
121 throw new IllegalArgumentException("positionChildAt: invalid task=" + this);
122 }
Wale Ogunwalec5cc3012017-01-13 13:26:16 -0800123 task.positionChildAt(position, aToken, false /* includeParents */);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800124 }
125 }
126
Wale Ogunwale2719cc12017-04-14 09:45:27 -0700127 public void reparent(StackWindowController stackController, int position, boolean moveParents) {
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800128 synchronized (mWindowMap) {
129 if (DEBUG_STACK) Slog.i(TAG_WM, "reparent: moving taskId=" + mTaskId
Wale Ogunwale1666e312016-12-16 11:27:18 -0800130 + " to stack=" + stackController + " at " + position);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800131 if (mContainer == null) {
132 if (DEBUG_STACK) Slog.i(TAG_WM,
133 "reparent: could not find taskId=" + mTaskId);
134 return;
135 }
Wale Ogunwale1666e312016-12-16 11:27:18 -0800136 final TaskStack stack = stackController.mContainer;
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800137 if (stack == null) {
Wale Ogunwale1666e312016-12-16 11:27:18 -0800138 throw new IllegalArgumentException("reparent: could not find stack="
139 + stackController);
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800140 }
Wale Ogunwale2719cc12017-04-14 09:45:27 -0700141 mContainer.reparent(stack, position, moveParents);
Wale Ogunwale1666e312016-12-16 11:27:18 -0800142 mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800143 }
144 }
145
146 public void setResizeable(int resizeMode) {
147 synchronized (mWindowMap) {
148 if (mContainer != null) {
149 mContainer.setResizeable(resizeMode);
150 }
151 }
152 }
153
Bryce Leef3c6a472017-11-14 14:53:06 -0800154 public void resize(boolean relayout, boolean forced) {
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800155 synchronized (mWindowMap) {
156 if (mContainer == null) {
157 throw new IllegalArgumentException("resizeTask: taskId " + mTaskId + " not found.");
158 }
159
Bryce Leef3c6a472017-11-14 14:53:06 -0800160 if (mContainer.setBounds(mContainer.getOverrideBounds(), forced) != BOUNDS_CHANGE_NONE
161 && relayout) {
Wale Ogunwale1666e312016-12-16 11:27:18 -0800162 mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded();
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800163 }
164 }
165 }
166
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800167 public void getBounds(Rect bounds) {
168 synchronized (mWindowMap) {
169 if (mContainer != null) {
170 mContainer.getBounds(bounds);
171 return;
172 }
173 bounds.setEmpty();
174 }
175 }
176
177 /**
178 * Puts this task into docked drag resizing mode. See {@link DragResizeMode}.
179 *
180 * @param resizing Whether to put the task into drag resize mode.
181 */
182 public void setTaskDockedResizing(boolean resizing) {
183 synchronized (mWindowMap) {
184 if (mContainer == null) {
185 Slog.w(TAG_WM, "setTaskDockedResizing: taskId " + mTaskId + " not found.");
186 return;
187 }
188 mContainer.setDragResizing(resizing, DRAG_RESIZE_MODE_DOCKED_DIVIDER);
189 }
190 }
191
192 public void cancelWindowTransition() {
193 synchronized (mWindowMap) {
194 if (mContainer == null) {
195 Slog.w(TAG_WM, "cancelWindowTransition: taskId " + mTaskId + " not found.");
196 return;
197 }
198 mContainer.cancelTaskWindowTransition();
199 }
200 }
201
Jorim Jaggi829b9cd2017-01-23 16:20:53 +0100202 public void setTaskDescription(TaskDescription taskDescription) {
203 synchronized (mWindowMap) {
204 if (mContainer == null) {
205 Slog.w(TAG_WM, "setTaskDescription: taskId " + mTaskId + " not found.");
206 return;
207 }
208 mContainer.setTaskDescription(taskDescription);
209 }
210 }
211
Jorim Jaggifb9d78a2017-01-05 18:57:12 +0100212 void reportSnapshotChanged(TaskSnapshot snapshot) {
Wale Ogunwale1666e312016-12-16 11:27:18 -0800213 mHandler.obtainMessage(H.REPORT_SNAPSHOT_CHANGED, snapshot).sendToTarget();
214 }
215
216 void requestResize(Rect bounds, int resizeMode) {
217 mHandler.obtainMessage(H.REQUEST_RESIZE, resizeMode, 0, bounds).sendToTarget();
Jorim Jaggifb9d78a2017-01-05 18:57:12 +0100218 }
219
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800220 @Override
221 public String toString() {
222 return "{TaskWindowContainerController taskId=" + mTaskId + "}";
223 }
Wale Ogunwale1666e312016-12-16 11:27:18 -0800224
225 private static final class H extends Handler {
226
227 static final int REPORT_SNAPSHOT_CHANGED = 0;
228 static final int REQUEST_RESIZE = 1;
229
230 private final WeakReference<TaskWindowContainerController> mController;
231
232 H(WeakReference<TaskWindowContainerController> controller, Looper looper) {
233 super(looper);
234 mController = controller;
235 }
236
237 @Override
238 public void handleMessage(Message msg) {
239 final TaskWindowContainerController controller = mController.get();
240 final TaskWindowContainerListener listener = (controller != null)
241 ? controller.mListener : null;
242 if (listener == null) {
243 return;
244 }
245 switch (msg.what) {
246 case REPORT_SNAPSHOT_CHANGED:
247 listener.onSnapshotChanged((TaskSnapshot) msg.obj);
248 break;
249 case REQUEST_RESIZE:
250 listener.requestResize((Rect) msg.obj, msg.arg1);
251 break;
252 }
253 }
254 }
Wale Ogunwalee1fe7fa22016-12-15 18:27:00 -0800255}