1e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale/* 2e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * Copyright (C) 2016 The Android Open Source Project 3e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * 4e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * Licensed under the Apache License, Version 2.0 (the "License"); 5e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * you may not use this file except in compliance with the License. 6e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * You may obtain a copy of the License at 7e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * 8e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * http://www.apache.org/licenses/LICENSE-2.0 9e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * 10e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * Unless required by applicable law or agreed to in writing, software 11e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * distributed under the License is distributed on an "AS IS" BASIS, 12e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * See the License for the specific language governing permissions and 14e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * limitations under the License 15e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale */ 16e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 17e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwalepackage com.android.server.wm; 18e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 19829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggiimport android.app.ActivityManager.TaskDescription; 20e2c77f903504766102fe545af40c3e4ebcb3adc7Jorim Jaggiimport android.app.ActivityManager.TaskSnapshot; 21e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwaleimport android.content.res.Configuration; 22e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwaleimport android.graphics.Rect; 23fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggiimport android.os.Handler; 24fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggiimport android.os.Looper; 25fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggiimport android.os.Message; 26e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwaleimport android.util.EventLog; 27e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwaleimport android.util.Slog; 28c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwaleimport com.android.internal.annotations.VisibleForTesting; 29e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 301666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwaleimport java.lang.ref.WeakReference; 311666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale 32e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwaleimport static com.android.server.EventLogTags.WM_TASK_CREATED; 33e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwaleimport static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER; 34e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwaleimport static com.android.server.wm.WindowContainer.POSITION_BOTTOM; 35e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwaleimport static com.android.server.wm.WindowContainer.POSITION_TOP; 36e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwaleimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; 37e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwaleimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; 38e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 39e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale/** 40e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * Controller for the task container. This is created by activity manager to link task records to 41e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * the task container they use in window manager. 42e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * 43e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * Test class: {@link TaskWindowContainerControllerTests} 44e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale */ 45e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwalepublic class TaskWindowContainerController 46fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggi extends WindowContainerController<Task, TaskWindowContainerListener> { 47fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggi 48e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale private final int mTaskId; 491666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale private final H mHandler; 50e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 511666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale public TaskWindowContainerController(int taskId, TaskWindowContainerListener listener, 521666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale StackWindowController stackController, int userId, Rect bounds, 531666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture, 54069bbd382898d3330d284912b3a472495045c363Wale Ogunwale boolean homeTask, boolean toTop, boolean showForAllUsers, 551666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale TaskDescription taskDescription) { 561666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale this(taskId, listener, stackController, userId, bounds, overrideConfig, resizeMode, 57069bbd382898d3330d284912b3a472495045c363Wale Ogunwale supportsPictureInPicture, homeTask, toTop, showForAllUsers, taskDescription, 58069bbd382898d3330d284912b3a472495045c363Wale Ogunwale WindowManagerService.getInstance()); 591666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale } 60fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggi 61fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggi public TaskWindowContainerController(int taskId, TaskWindowContainerListener listener, 621666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale StackWindowController stackController, int userId, Rect bounds, 631666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture, 64069bbd382898d3330d284912b3a472495045c363Wale Ogunwale boolean homeTask, boolean toTop, boolean showForAllUsers, 651666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale TaskDescription taskDescription, WindowManagerService service) { 661666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale super(listener, service); 67e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale mTaskId = taskId; 681666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale mHandler = new H(new WeakReference<>(this), service.mH.getLooper()); 69e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 70e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale synchronized(mWindowMap) { 71e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (DEBUG_STACK) Slog.i(TAG_WM, "TaskWindowContainerController: taskId=" + taskId 721666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale + " stack=" + stackController + " bounds=" + bounds); 73e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 741666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale final TaskStack stack = stackController.mContainer; 75e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (stack == null) { 761666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale throw new IllegalArgumentException("TaskWindowContainerController: invalid stack=" 771666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale + stackController); 78e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 791666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale EventLog.writeEvent(WM_TASK_CREATED, taskId, stack.mStackId); 80c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale final Task task = createTask(taskId, stack, userId, bounds, overrideConfig, resizeMode, 81069bbd382898d3330d284912b3a472495045c363Wale Ogunwale supportsPictureInPicture, homeTask, taskDescription); 82e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale final int position = toTop ? POSITION_TOP : POSITION_BOTTOM; 83e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale stack.addTask(task, position, showForAllUsers, true /* moveParents */); 84e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 85e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 86e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 87c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale @VisibleForTesting 88c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale Task createTask(int taskId, TaskStack stack, int userId, Rect bounds, 89d339538a67b7d6bb3d7ad73f31ad20ffc932f891Winson Chung Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture, 90069bbd382898d3330d284912b3a472495045c363Wale Ogunwale boolean homeTask, TaskDescription taskDescription) { 91069bbd382898d3330d284912b3a472495045c363Wale Ogunwale return new Task(taskId, stack, userId, mService, bounds, overrideConfig, resizeMode, 92069bbd382898d3330d284912b3a472495045c363Wale Ogunwale supportsPictureInPicture, homeTask, taskDescription, this); 93c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale } 94c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale 95e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale @Override 96e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale public void removeContainer() { 97e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale synchronized(mWindowMap) { 98e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (mContainer == null) { 99e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (DEBUG_STACK) Slog.i(TAG_WM, "removeTask: could not find taskId=" + mTaskId); 100e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale return; 101e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 102e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale mContainer.removeIfPossible(); 103e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale super.removeContainer(); 104e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 105e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 106e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 107c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale public void positionChildAt(AppWindowContainerController childController, int position) { 108e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale synchronized(mService.mWindowMap) { 109e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale final AppWindowToken aToken = childController.mContainer; 110e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (aToken == null) { 111e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale Slog.w(TAG_WM, 112e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale "Attempted to position of non-existing app : " + childController); 113e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale return; 114e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 115e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 116e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale final Task task = mContainer; 117e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (task == null) { 118e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale throw new IllegalArgumentException("positionChildAt: invalid task=" + this); 119e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 120c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale task.positionChildAt(position, aToken, false /* includeParents */); 121e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 122e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 123e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 1242719cc134e68e4c8f0def68fdc1d68dc3de9c1d8Wale Ogunwale public void reparent(StackWindowController stackController, int position, boolean moveParents) { 125e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale synchronized (mWindowMap) { 126e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (DEBUG_STACK) Slog.i(TAG_WM, "reparent: moving taskId=" + mTaskId 1271666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale + " to stack=" + stackController + " at " + position); 128e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (mContainer == null) { 129e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (DEBUG_STACK) Slog.i(TAG_WM, 130e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale "reparent: could not find taskId=" + mTaskId); 131e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale return; 132e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 1331666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale final TaskStack stack = stackController.mContainer; 134e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (stack == null) { 1351666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale throw new IllegalArgumentException("reparent: could not find stack=" 1361666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale + stackController); 137e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 1382719cc134e68e4c8f0def68fdc1d68dc3de9c1d8Wale Ogunwale mContainer.reparent(stack, position, moveParents); 1391666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded(); 140e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 141e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 142e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 143e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale public void setResizeable(int resizeMode) { 144e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale synchronized (mWindowMap) { 145e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (mContainer != null) { 146e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale mContainer.setResizeable(resizeMode); 147e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 148e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 149e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 150e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 151e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale public void resize(Rect bounds, Configuration overrideConfig, boolean relayout, 152e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale boolean forced) { 153e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale synchronized (mWindowMap) { 154e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (mContainer == null) { 155e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale throw new IllegalArgumentException("resizeTask: taskId " + mTaskId + " not found."); 156e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 157e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 158e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (mContainer.resizeLocked(bounds, overrideConfig, forced) && relayout) { 1591666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale mContainer.getDisplayContent().layoutAndAssignWindowLayersIfNeeded(); 160e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 161e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 162e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 163e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 164e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale public void getBounds(Rect bounds) { 165e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale synchronized (mWindowMap) { 166e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (mContainer != null) { 167e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale mContainer.getBounds(bounds); 168e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale return; 169e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 170e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale bounds.setEmpty(); 171e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 172e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 173e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 174e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale /** 175e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * Puts this task into docked drag resizing mode. See {@link DragResizeMode}. 176e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * 177e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale * @param resizing Whether to put the task into drag resize mode. 178e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale */ 179e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale public void setTaskDockedResizing(boolean resizing) { 180e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale synchronized (mWindowMap) { 181e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (mContainer == null) { 182e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale Slog.w(TAG_WM, "setTaskDockedResizing: taskId " + mTaskId + " not found."); 183e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale return; 184e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 185e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale mContainer.setDragResizing(resizing, DRAG_RESIZE_MODE_DOCKED_DIVIDER); 186e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 187e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 188e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 189e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale public void cancelWindowTransition() { 190e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale synchronized (mWindowMap) { 191e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (mContainer == null) { 192e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale Slog.w(TAG_WM, "cancelWindowTransition: taskId " + mTaskId + " not found."); 193e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale return; 194e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 195e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale mContainer.cancelTaskWindowTransition(); 196e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 197e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 198e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 199e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale public void cancelThumbnailTransition() { 200e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale synchronized (mWindowMap) { 201e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (mContainer == null) { 202e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale Slog.w(TAG_WM, "cancelThumbnailTransition: taskId " + mTaskId + " not found."); 203e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale return; 204e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 205e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale mContainer.cancelTaskThumbnailTransition(); 206e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 207e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 208e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale 209829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi public void setTaskDescription(TaskDescription taskDescription) { 210829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi synchronized (mWindowMap) { 211829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi if (mContainer == null) { 212829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi Slog.w(TAG_WM, "setTaskDescription: taskId " + mTaskId + " not found."); 213829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi return; 214829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi } 215829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi mContainer.setTaskDescription(taskDescription); 216829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi } 217829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi } 218829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi 219fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggi void reportSnapshotChanged(TaskSnapshot snapshot) { 2201666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale mHandler.obtainMessage(H.REPORT_SNAPSHOT_CHANGED, snapshot).sendToTarget(); 2211666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale } 2221666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale 2231666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale void requestResize(Rect bounds, int resizeMode) { 2241666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale mHandler.obtainMessage(H.REQUEST_RESIZE, resizeMode, 0, bounds).sendToTarget(); 225fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggi } 226fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggi 227e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale @Override 228e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale public String toString() { 229e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale return "{TaskWindowContainerController taskId=" + mTaskId + "}"; 230e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale } 2311666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale 2321666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale private static final class H extends Handler { 2331666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale 2341666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale static final int REPORT_SNAPSHOT_CHANGED = 0; 2351666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale static final int REQUEST_RESIZE = 1; 2361666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale 2371666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale private final WeakReference<TaskWindowContainerController> mController; 2381666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale 2391666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale H(WeakReference<TaskWindowContainerController> controller, Looper looper) { 2401666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale super(looper); 2411666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale mController = controller; 2421666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale } 2431666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale 2441666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale @Override 2451666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale public void handleMessage(Message msg) { 2461666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale final TaskWindowContainerController controller = mController.get(); 2471666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale final TaskWindowContainerListener listener = (controller != null) 2481666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale ? controller.mListener : null; 2491666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale if (listener == null) { 2501666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale return; 2511666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale } 2521666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale switch (msg.what) { 2531666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale case REPORT_SNAPSHOT_CHANGED: 2541666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale listener.onSnapshotChanged((TaskSnapshot) msg.obj); 2551666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale break; 2561666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale case REQUEST_RESIZE: 2571666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale listener.requestResize((Rect) msg.obj, msg.arg1); 2581666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale break; 2591666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale } 2601666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale } 2611666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale } 262e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale} 263