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