blob: fed28e32b0bb6119745fd347d8266ea28ca5c044 [file] [log] [blame]
Joe Onorato0cbda992010-05-02 16:28:15 -07001/*
2 * Copyright (C) 2010 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
Joe Onorato79de0c52010-05-26 17:03:26 -040017package com.android.systemui.statusbar;
Joe Onorato0cbda992010-05-02 16:28:15 -070018
Jason Monk7e53f202016-01-28 10:40:20 -050019import android.content.ComponentName;
Jorim Jaggi86905582016-02-09 21:36:09 -080020import android.graphics.Rect;
Jorim Jaggi165ce062015-07-06 16:18:11 -070021import android.os.Bundle;
Joe Onorato0cbda992010-05-02 16:28:15 -070022import android.os.Handler;
Joe Onoratoa0c56fe2010-05-20 10:21:52 -070023import android.os.IBinder;
Jason Monkb5b092012017-01-05 11:35:34 -050024import android.os.Looper;
Joe Onorato0cbda992010-05-02 16:28:15 -070025import android.os.Message;
Jason Monkb5b092012017-01-05 11:35:34 -050026import android.support.annotation.VisibleForTesting;
Jorim Jaggi24bec7c2015-02-04 12:40:14 +010027import android.util.Pair;
Jim Miller07e03842016-06-22 15:18:13 -070028import android.view.KeyEvent;
Winsonc0d70582016-01-29 10:24:39 -080029
Jorim Jaggi86905582016-02-09 21:36:09 -080030import com.android.internal.os.SomeArgs;
Joe Onorato0cbda992010-05-02 16:28:15 -070031import com.android.internal.statusbar.IStatusBar;
32import com.android.internal.statusbar.StatusBarIcon;
Jason Monkb5b092012017-01-05 11:35:34 -050033import com.android.systemui.SystemUI;
Joe Onorato0cbda992010-05-02 16:28:15 -070034
Jason Monk49fa0162017-01-11 09:21:56 -050035import java.util.ArrayList;
36
Joe Onoratof3f0e052010-05-14 18:49:29 -070037/**
38 * This class takes the functions from IStatusBar that come in on
39 * binder pool threads and posts messages to get them onto the main
40 * thread, and calls onto Callbacks. It also takes care of
Joe Onorato4762c2d2010-05-17 15:42:59 -070041 * coalescing these calls so they don't stack up. For the calls
42 * are coalesced, note that they are all idempotent.
Joe Onoratof3f0e052010-05-14 18:49:29 -070043 */
Joe Onorato808182d2010-07-09 18:52:06 -040044public class CommandQueue extends IStatusBar.Stub {
Daniel Sandler1d4d30a2011-04-28 12:35:29 -040045 private static final int INDEX_MASK = 0xffff;
46 private static final int MSG_SHIFT = 16;
47 private static final int MSG_MASK = 0xffff << MSG_SHIFT;
Joe Onorato0cbda992010-05-02 16:28:15 -070048
Daniel Sandler1d4d30a2011-04-28 12:35:29 -040049 private static final int OP_SET_ICON = 1;
Joe Onorato0cbda992010-05-02 16:28:15 -070050 private static final int OP_REMOVE_ICON = 2;
51
Jaewan Kimc552b042016-01-18 16:08:45 +090052 private static final int MSG_ICON = 1 << MSG_SHIFT;
53 private static final int MSG_DISABLE = 2 << MSG_SHIFT;
54 private static final int MSG_EXPAND_NOTIFICATIONS = 3 << MSG_SHIFT;
55 private static final int MSG_COLLAPSE_PANELS = 4 << MSG_SHIFT;
56 private static final int MSG_EXPAND_SETTINGS = 5 << MSG_SHIFT;
57 private static final int MSG_SET_SYSTEMUI_VISIBILITY = 6 << MSG_SHIFT;
58 private static final int MSG_TOP_APP_WINDOW_CHANGED = 7 << MSG_SHIFT;
59 private static final int MSG_SHOW_IME_BUTTON = 8 << MSG_SHIFT;
60 private static final int MSG_TOGGLE_RECENT_APPS = 9 << MSG_SHIFT;
61 private static final int MSG_PRELOAD_RECENT_APPS = 10 << MSG_SHIFT;
62 private static final int MSG_CANCEL_PRELOAD_RECENT_APPS = 11 << MSG_SHIFT;
63 private static final int MSG_SET_WINDOW_STATE = 12 << MSG_SHIFT;
64 private static final int MSG_SHOW_RECENT_APPS = 13 << MSG_SHIFT;
65 private static final int MSG_HIDE_RECENT_APPS = 14 << MSG_SHIFT;
66 private static final int MSG_BUZZ_BEEP_BLINKED = 15 << MSG_SHIFT;
67 private static final int MSG_NOTIFICATION_LIGHT_OFF = 16 << MSG_SHIFT;
68 private static final int MSG_NOTIFICATION_LIGHT_PULSE = 17 << MSG_SHIFT;
69 private static final int MSG_SHOW_SCREEN_PIN_REQUEST = 18 << MSG_SHIFT;
70 private static final int MSG_APP_TRANSITION_PENDING = 19 << MSG_SHIFT;
71 private static final int MSG_APP_TRANSITION_CANCELLED = 20 << MSG_SHIFT;
72 private static final int MSG_APP_TRANSITION_STARTING = 21 << MSG_SHIFT;
73 private static final int MSG_ASSIST_DISCLOSURE = 22 << MSG_SHIFT;
74 private static final int MSG_START_ASSIST = 23 << MSG_SHIFT;
75 private static final int MSG_CAMERA_LAUNCH_GESTURE = 24 << MSG_SHIFT;
76 private static final int MSG_TOGGLE_KEYBOARD_SHORTCUTS = 25 << MSG_SHIFT;
Jaewan Kimf0fd2182016-04-20 21:17:58 +090077 private static final int MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU = 26 << MSG_SHIFT;
Jason Monk7e53f202016-01-28 10:40:20 -050078 private static final int MSG_ADD_QS_TILE = 27 << MSG_SHIFT;
79 private static final int MSG_REMOVE_QS_TILE = 28 << MSG_SHIFT;
80 private static final int MSG_CLICK_QS_TILE = 29 << MSG_SHIFT;
Phil Weaver315c34e2016-02-19 15:12:29 -080081 private static final int MSG_TOGGLE_APP_SPLIT_SCREEN = 30 << MSG_SHIFT;
Jorim Jaggi2adba072016-03-03 13:43:39 +010082 private static final int MSG_APP_TRANSITION_FINISHED = 31 << MSG_SHIFT;
Andrei Stingaceanu0bf096f2016-04-14 18:11:57 +010083 private static final int MSG_DISMISS_KEYBOARD_SHORTCUTS = 32 << MSG_SHIFT;
Jim Miller07e03842016-06-22 15:18:13 -070084 private static final int MSG_HANDLE_SYSNAV_KEY = 33 << MSG_SHIFT;
Daniel Sandler328310c2011-09-23 15:56:52 -040085
Jim Miller9a720f52012-05-30 03:19:43 -070086 public static final int FLAG_EXCLUDE_NONE = 0;
87 public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
88 public static final int FLAG_EXCLUDE_RECENTS_PANEL = 1 << 1;
89 public static final int FLAG_EXCLUDE_NOTIFICATION_PANEL = 1 << 2;
90 public static final int FLAG_EXCLUDE_INPUT_METHODS_PANEL = 1 << 3;
91 public static final int FLAG_EXCLUDE_COMPAT_MODE_PANEL = 1 << 4;
92
Jason Monkb605fec2014-05-02 17:04:10 -040093 private static final String SHOW_IME_SWITCHER_KEY = "showImeSwitcherKey";
94
Jason Monk07473ce2016-01-05 14:59:19 -050095 private final Object mLock = new Object();
Jason Monk49fa0162017-01-11 09:21:56 -050096 private ArrayList<Callbacks> mCallbacks = new ArrayList<>();
Jason Monkb5b092012017-01-05 11:35:34 -050097 private Handler mHandler = new H(Looper.getMainLooper());
Joe Onorato0cbda992010-05-02 16:28:15 -070098
99 /**
100 * These methods are called back on the main thread.
101 */
102 public interface Callbacks {
Jason Monkb5b092012017-01-05 11:35:34 -0500103 default void setIcon(String slot, StatusBarIcon icon) { }
104 default void removeIcon(String slot) { }
105 default void disable(int state1, int state2, boolean animate) { }
106 default void animateExpandNotificationsPanel() { }
107 default void animateCollapsePanels(int flags) { }
108 default void animateExpandSettingsPanel(String obj) { }
109 default void setSystemUiVisibility(int vis, int fullscreenStackVis,
110 int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds) {
111 }
112 default void topAppWindowChanged(boolean visible) { }
113 default void setImeWindowStatus(IBinder token, int vis, int backDisposition,
114 boolean showImeSwitcher) { }
115 default void showRecentApps(boolean triggeredFromAltTab, boolean fromHome) { }
116 default void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) { }
117 default void toggleRecentApps() { }
118 default void toggleSplitScreen() { }
119 default void preloadRecentApps() { }
120 default void dismissKeyboardShortcutsMenu() { }
121 default void toggleKeyboardShortcutsMenu(int deviceId) { }
122 default void cancelPreloadRecentApps() { }
123 default void setWindowState(int window, int state) { }
124 default void buzzBeepBlinked() { }
125 default void notificationLightOff() { }
126 default void notificationLightPulse(int argb, int onMillis, int offMillis) { }
127 default void showScreenPinningRequest(int taskId) { }
128 default void appTransitionPending() { }
129 default void appTransitionCancelled() { }
130 default void appTransitionStarting(long startTime, long duration) { }
131 default void appTransitionFinished() { }
132 default void showAssistDisclosure() { }
133 default void startAssist(Bundle args) { }
134 default void onCameraLaunchGestureDetected(int source) { }
135 default void showTvPictureInPictureMenu() { }
Jason Monk7e53f202016-01-28 10:40:20 -0500136
Jason Monkb5b092012017-01-05 11:35:34 -0500137 default void addQsTile(ComponentName tile) { }
138 default void remQsTile(ComponentName tile) { }
139 default void clickTile(ComponentName tile) { }
Jim Miller07e03842016-06-22 15:18:13 -0700140
Jason Monkb5b092012017-01-05 11:35:34 -0500141 default void handleSystemNavigationKey(int arg1) { }
Joe Onorato0cbda992010-05-02 16:28:15 -0700142 }
143
Jason Monkb5b092012017-01-05 11:35:34 -0500144 @VisibleForTesting
145 protected CommandQueue() {
146 }
147
148 public void addCallbacks(Callbacks callbacks) {
Jason Monk49fa0162017-01-11 09:21:56 -0500149 mCallbacks.add(callbacks);
150 }
151
152 public void removeCallbacks(Callbacks callbacks) {
153 mCallbacks.remove(callbacks);
Joe Onorato0cbda992010-05-02 16:28:15 -0700154 }
155
Jason Monk07473ce2016-01-05 14:59:19 -0500156 public void setIcon(String slot, StatusBarIcon icon) {
157 synchronized (mLock) {
158 // don't coalesce these
159 mHandler.obtainMessage(MSG_ICON, OP_SET_ICON, 0,
160 new Pair<String, StatusBarIcon>(slot, icon)).sendToTarget();
Joe Onorato0cbda992010-05-02 16:28:15 -0700161 }
162 }
163
Jason Monk07473ce2016-01-05 14:59:19 -0500164 public void removeIcon(String slot) {
165 synchronized (mLock) {
166 // don't coalesce these
167 mHandler.obtainMessage(MSG_ICON, OP_REMOVE_ICON, 0, slot).sendToTarget();
Joe Onorato0cbda992010-05-02 16:28:15 -0700168 }
169 }
170
Benjamin Franzcde0a2a2015-04-23 17:19:48 +0100171 public void disable(int state1, int state2) {
Jason Monk07473ce2016-01-05 14:59:19 -0500172 synchronized (mLock) {
Joe Onoratof3f0e052010-05-14 18:49:29 -0700173 mHandler.removeMessages(MSG_DISABLE);
Benjamin Franzcde0a2a2015-04-23 17:19:48 +0100174 mHandler.obtainMessage(MSG_DISABLE, state1, state2, null).sendToTarget();
Joe Onoratof3f0e052010-05-14 18:49:29 -0700175 }
176 }
177
Daniel Sandler11cf1782012-09-27 14:03:08 -0400178 public void animateExpandNotificationsPanel() {
Jason Monk07473ce2016-01-05 14:59:19 -0500179 synchronized (mLock) {
Svetoslav Ganove20a1772012-09-25 16:07:46 -0700180 mHandler.removeMessages(MSG_EXPAND_NOTIFICATIONS);
181 mHandler.sendEmptyMessage(MSG_EXPAND_NOTIFICATIONS);
Joe Onorato4762c2d2010-05-17 15:42:59 -0700182 }
183 }
184
Daniel Sandler11cf1782012-09-27 14:03:08 -0400185 public void animateCollapsePanels() {
Jason Monk07473ce2016-01-05 14:59:19 -0500186 synchronized (mLock) {
Daniel Sandler11cf1782012-09-27 14:03:08 -0400187 mHandler.removeMessages(MSG_COLLAPSE_PANELS);
188 mHandler.sendEmptyMessage(MSG_COLLAPSE_PANELS);
Svetoslav Ganove20a1772012-09-25 16:07:46 -0700189 }
Jim Miller9a720f52012-05-30 03:19:43 -0700190 }
191
Jason Monka9927322015-12-13 16:22:37 -0500192 public void animateExpandSettingsPanel(String subPanel) {
Jason Monk07473ce2016-01-05 14:59:19 -0500193 synchronized (mLock) {
Daniel Sandler11cf1782012-09-27 14:03:08 -0400194 mHandler.removeMessages(MSG_EXPAND_SETTINGS);
Jason Monka9927322015-12-13 16:22:37 -0500195 mHandler.obtainMessage(MSG_EXPAND_SETTINGS, subPanel).sendToTarget();
Joe Onorato4762c2d2010-05-17 15:42:59 -0700196 }
197 }
198
Jorim Jaggi86905582016-02-09 21:36:09 -0800199 public void setSystemUiVisibility(int vis, int fullscreenStackVis, int dockedStackVis,
200 int mask, Rect fullscreenStackBounds, Rect dockedStackBounds) {
Jason Monk07473ce2016-01-05 14:59:19 -0500201 synchronized (mLock) {
Selim Cinek4a4a2bddc2015-05-07 12:50:19 -0700202 // Don't coalesce these, since it might have one time flags set such as
203 // STATUS_BAR_UNHIDE which might get lost.
Jorim Jaggi86905582016-02-09 21:36:09 -0800204 SomeArgs args = SomeArgs.obtain();
205 args.argi1 = vis;
206 args.argi2 = fullscreenStackVis;
207 args.argi3 = dockedStackVis;
208 args.argi4 = mask;
209 args.arg1 = fullscreenStackBounds;
210 args.arg2 = dockedStackBounds;
211 mHandler.obtainMessage(MSG_SET_SYSTEMUI_VISIBILITY, args).sendToTarget();
Joe Onorato93056472010-09-10 10:30:46 -0400212 }
213 }
214
Dianne Hackborn7d049322011-06-14 15:00:32 -0700215 public void topAppWindowChanged(boolean menuVisible) {
Jason Monk07473ce2016-01-05 14:59:19 -0500216 synchronized (mLock) {
Dianne Hackborn7d049322011-06-14 15:00:32 -0700217 mHandler.removeMessages(MSG_TOP_APP_WINDOW_CHANGED);
218 mHandler.obtainMessage(MSG_TOP_APP_WINDOW_CHANGED, menuVisible ? 1 : 0, 0,
219 null).sendToTarget();
Daniel Sandlere02d8082010-10-08 15:13:22 -0400220 }
221 }
222
Jason Monkb605fec2014-05-02 17:04:10 -0400223 public void setImeWindowStatus(IBinder token, int vis, int backDisposition,
224 boolean showImeSwitcher) {
Jason Monk07473ce2016-01-05 14:59:19 -0500225 synchronized (mLock) {
satok06487a52010-10-29 11:37:18 +0900226 mHandler.removeMessages(MSG_SHOW_IME_BUTTON);
Jason Monkb605fec2014-05-02 17:04:10 -0400227 Message m = mHandler.obtainMessage(MSG_SHOW_IME_BUTTON, vis, backDisposition, token);
228 m.getData().putBoolean(SHOW_IME_SWITCHER_KEY, showImeSwitcher);
229 m.sendToTarget();
satok06487a52010-10-29 11:37:18 +0900230 }
231 }
232
Jorim Jaggi681fc7b2016-04-14 22:02:39 -0700233 public void showRecentApps(boolean triggeredFromAltTab, boolean fromHome) {
Jason Monk07473ce2016-01-05 14:59:19 -0500234 synchronized (mLock) {
Winson Chung1e8d71b2014-05-16 17:05:22 -0700235 mHandler.removeMessages(MSG_SHOW_RECENT_APPS);
236 mHandler.obtainMessage(MSG_SHOW_RECENT_APPS,
Jorim Jaggi681fc7b2016-04-14 22:02:39 -0700237 triggeredFromAltTab ? 1 : 0, fromHome ? 1 : 0, null).sendToTarget();
Winson Chung1e8d71b2014-05-16 17:05:22 -0700238 }
239 }
240
Winson Chungcdcd4872014-08-05 18:00:13 -0700241 public void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
Jason Monk07473ce2016-01-05 14:59:19 -0500242 synchronized (mLock) {
Winson Chung1e8d71b2014-05-16 17:05:22 -0700243 mHandler.removeMessages(MSG_HIDE_RECENT_APPS);
Winson Chung6cb485f2014-05-19 10:30:43 -0700244 mHandler.obtainMessage(MSG_HIDE_RECENT_APPS,
Winson Chungcdcd4872014-08-05 18:00:13 -0700245 triggeredFromAltTab ? 1 : 0, triggeredFromHomeKey ? 1 : 0,
246 null).sendToTarget();
Winson Chung1e8d71b2014-05-16 17:05:22 -0700247 }
248 }
249
Phil Weaver315c34e2016-02-19 15:12:29 -0800250 public void toggleSplitScreen() {
251 synchronized (mLock) {
252 mHandler.removeMessages(MSG_TOGGLE_APP_SPLIT_SCREEN);
253 mHandler.obtainMessage(MSG_TOGGLE_APP_SPLIT_SCREEN, 0, 0, null).sendToTarget();
254 }
255 }
256
Michael Jurka3b1fc472011-06-13 10:54:40 -0700257 public void toggleRecentApps() {
Jason Monk07473ce2016-01-05 14:59:19 -0500258 synchronized (mLock) {
Michael Jurka3b1fc472011-06-13 10:54:40 -0700259 mHandler.removeMessages(MSG_TOGGLE_RECENT_APPS);
260 mHandler.obtainMessage(MSG_TOGGLE_RECENT_APPS, 0, 0, null).sendToTarget();
261 }
262 }
263
Michael Jurka7f2668c2012-03-27 07:49:52 -0700264 public void preloadRecentApps() {
Jason Monk07473ce2016-01-05 14:59:19 -0500265 synchronized (mLock) {
Michael Jurka7f2668c2012-03-27 07:49:52 -0700266 mHandler.removeMessages(MSG_PRELOAD_RECENT_APPS);
267 mHandler.obtainMessage(MSG_PRELOAD_RECENT_APPS, 0, 0, null).sendToTarget();
268 }
269 }
270
271 public void cancelPreloadRecentApps() {
Jason Monk07473ce2016-01-05 14:59:19 -0500272 synchronized (mLock) {
Michael Jurka7f2668c2012-03-27 07:49:52 -0700273 mHandler.removeMessages(MSG_CANCEL_PRELOAD_RECENT_APPS);
274 mHandler.obtainMessage(MSG_CANCEL_PRELOAD_RECENT_APPS, 0, 0, null).sendToTarget();
275 }
276 }
277
Clara Bayarrif2debb12015-07-10 14:47:17 +0100278 @Override
Andrei Stingaceanu0bf096f2016-04-14 18:11:57 +0100279 public void dismissKeyboardShortcutsMenu() {
280 synchronized (mLock) {
281 mHandler.removeMessages(MSG_DISMISS_KEYBOARD_SHORTCUTS);
282 mHandler.obtainMessage(MSG_DISMISS_KEYBOARD_SHORTCUTS).sendToTarget();
283 }
284 }
285
286 @Override
Clara Bayarri4e850ff2016-03-02 11:12:32 -0800287 public void toggleKeyboardShortcutsMenu(int deviceId) {
Jason Monk07473ce2016-01-05 14:59:19 -0500288 synchronized (mLock) {
Andrei Stingaceanuc22ab792016-01-07 12:39:38 +0000289 mHandler.removeMessages(MSG_TOGGLE_KEYBOARD_SHORTCUTS);
Clara Bayarri4e850ff2016-03-02 11:12:32 -0800290 mHandler.obtainMessage(MSG_TOGGLE_KEYBOARD_SHORTCUTS, deviceId, 0).sendToTarget();
Clara Bayarrif2debb12015-07-10 14:47:17 +0100291 }
292 }
293
Jaewan Kimc552b042016-01-18 16:08:45 +0900294 @Override
Jaewan Kimf0fd2182016-04-20 21:17:58 +0900295 public void showTvPictureInPictureMenu() {
Jaewan Kimc552b042016-01-18 16:08:45 +0900296 synchronized (mLock) {
Jaewan Kimf0fd2182016-04-20 21:17:58 +0900297 mHandler.removeMessages(MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU);
298 mHandler.obtainMessage(MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU).sendToTarget();
Jaewan Kimc552b042016-01-18 16:08:45 +0900299 }
300 }
301
John Spurlock97642182013-07-29 17:58:39 -0400302 public void setWindowState(int window, int state) {
Jason Monk07473ce2016-01-05 14:59:19 -0500303 synchronized (mLock) {
John Spurlock5b9145b2013-08-20 15:13:47 -0400304 // don't coalesce these
John Spurlock97642182013-07-29 17:58:39 -0400305 mHandler.obtainMessage(MSG_SET_WINDOW_STATE, window, state, null).sendToTarget();
306 }
307 }
308
John Spurlockcad57682014-07-26 17:09:56 -0400309 public void buzzBeepBlinked() {
Jason Monk07473ce2016-01-05 14:59:19 -0500310 synchronized (mLock) {
John Spurlockcad57682014-07-26 17:09:56 -0400311 mHandler.removeMessages(MSG_BUZZ_BEEP_BLINKED);
312 mHandler.sendEmptyMessage(MSG_BUZZ_BEEP_BLINKED);
313 }
314 }
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100315
John Spurlockcb566aa2014-08-03 22:58:28 -0400316 public void notificationLightOff() {
Jason Monk07473ce2016-01-05 14:59:19 -0500317 synchronized (mLock) {
John Spurlockcb566aa2014-08-03 22:58:28 -0400318 mHandler.sendEmptyMessage(MSG_NOTIFICATION_LIGHT_OFF);
319 }
320 }
321
322 public void notificationLightPulse(int argb, int onMillis, int offMillis) {
Jason Monk07473ce2016-01-05 14:59:19 -0500323 synchronized (mLock) {
John Spurlockcb566aa2014-08-03 22:58:28 -0400324 mHandler.obtainMessage(MSG_NOTIFICATION_LIGHT_PULSE, onMillis, offMillis, argb)
325 .sendToTarget();
326 }
327 }
328
Andrii Kulian0f051f52016-04-14 00:41:51 -0700329 public void showScreenPinningRequest(int taskId) {
Jason Monk07473ce2016-01-05 14:59:19 -0500330 synchronized (mLock) {
Andrii Kulian0f051f52016-04-14 00:41:51 -0700331 mHandler.obtainMessage(MSG_SHOW_SCREEN_PIN_REQUEST, taskId, 0, null)
332 .sendToTarget();
Jason Monk5565cb42014-09-12 10:59:21 -0400333 }
334 }
335
Jorim Jaggi24bec7c2015-02-04 12:40:14 +0100336 public void appTransitionPending() {
Jason Monk07473ce2016-01-05 14:59:19 -0500337 synchronized (mLock) {
Jorim Jaggi24bec7c2015-02-04 12:40:14 +0100338 mHandler.removeMessages(MSG_APP_TRANSITION_PENDING);
339 mHandler.sendEmptyMessage(MSG_APP_TRANSITION_PENDING);
340 }
341 }
342
343 public void appTransitionCancelled() {
Jason Monk07473ce2016-01-05 14:59:19 -0500344 synchronized (mLock) {
Jason Monkb5b092012017-01-05 11:35:34 -0500345 mHandler.removeMessages(MSG_APP_TRANSITION_CANCELLED);
346 mHandler.sendEmptyMessage(MSG_APP_TRANSITION_CANCELLED);
Jorim Jaggi24bec7c2015-02-04 12:40:14 +0100347 }
348 }
349
350 public void appTransitionStarting(long startTime, long duration) {
Jason Monk07473ce2016-01-05 14:59:19 -0500351 synchronized (mLock) {
Jorim Jaggi24bec7c2015-02-04 12:40:14 +0100352 mHandler.removeMessages(MSG_APP_TRANSITION_STARTING);
353 mHandler.obtainMessage(MSG_APP_TRANSITION_STARTING, Pair.create(startTime, duration))
354 .sendToTarget();
355 }
356 }
357
Jorim Jaggi2adba072016-03-03 13:43:39 +0100358 @Override
359 public void appTransitionFinished() {
360 synchronized (mLock) {
361 mHandler.removeMessages(MSG_APP_TRANSITION_FINISHED);
362 mHandler.sendEmptyMessage(MSG_APP_TRANSITION_FINISHED);
363 }
364 }
365
Adrian Roos4f43dc02015-06-17 16:43:38 -0700366 public void showAssistDisclosure() {
Jason Monk07473ce2016-01-05 14:59:19 -0500367 synchronized (mLock) {
Adrian Roos4f43dc02015-06-17 16:43:38 -0700368 mHandler.removeMessages(MSG_ASSIST_DISCLOSURE);
369 mHandler.obtainMessage(MSG_ASSIST_DISCLOSURE).sendToTarget();
370 }
371 }
372
Jorim Jaggi165ce062015-07-06 16:18:11 -0700373 public void startAssist(Bundle args) {
Jason Monk07473ce2016-01-05 14:59:19 -0500374 synchronized (mLock) {
Jorim Jaggi165ce062015-07-06 16:18:11 -0700375 mHandler.removeMessages(MSG_START_ASSIST);
376 mHandler.obtainMessage(MSG_START_ASSIST, args).sendToTarget();
377 }
378 }
379
Selim Cinek372d1bd2015-08-14 13:19:37 -0700380 @Override
Jorim Jaggi40aa8812015-09-23 12:59:22 -0700381 public void onCameraLaunchGestureDetected(int source) {
Jason Monk07473ce2016-01-05 14:59:19 -0500382 synchronized (mLock) {
Selim Cinek372d1bd2015-08-14 13:19:37 -0700383 mHandler.removeMessages(MSG_CAMERA_LAUNCH_GESTURE);
Jorim Jaggi40aa8812015-09-23 12:59:22 -0700384 mHandler.obtainMessage(MSG_CAMERA_LAUNCH_GESTURE, source, 0).sendToTarget();
Selim Cinek372d1bd2015-08-14 13:19:37 -0700385 }
386 }
387
Jason Monk7e53f202016-01-28 10:40:20 -0500388 @Override
389 public void addQsTile(ComponentName tile) {
390 synchronized (mLock) {
391 mHandler.obtainMessage(MSG_ADD_QS_TILE, tile).sendToTarget();
392 }
393 }
394
395 @Override
396 public void remQsTile(ComponentName tile) {
397 synchronized (mLock) {
398 mHandler.obtainMessage(MSG_REMOVE_QS_TILE, tile).sendToTarget();
399 }
400 }
401
402 @Override
403 public void clickQsTile(ComponentName tile) {
404 synchronized (mLock) {
405 mHandler.obtainMessage(MSG_CLICK_QS_TILE, tile).sendToTarget();
406 }
407 }
408
Jim Miller07e03842016-06-22 15:18:13 -0700409 @Override
410 public void handleSystemNavigationKey(int key) {
411 synchronized (mLock) {
412 mHandler.obtainMessage(MSG_HANDLE_SYSNAV_KEY, key, 0).sendToTarget();
413 }
414 }
415
Joe Onorato0cbda992010-05-02 16:28:15 -0700416 private final class H extends Handler {
Jason Monkb5b092012017-01-05 11:35:34 -0500417 private H(Looper l) {
418 super(l);
419 }
420
Joe Onorato0cbda992010-05-02 16:28:15 -0700421 public void handleMessage(Message msg) {
Joe Onoratof3f0e052010-05-14 18:49:29 -0700422 final int what = msg.what & MSG_MASK;
Joe Onorato66d7d012010-05-14 10:05:10 -0700423 switch (what) {
Joe Onorato0cbda992010-05-02 16:28:15 -0700424 case MSG_ICON: {
Joe Onorato0cbda992010-05-02 16:28:15 -0700425 switch (msg.arg1) {
426 case OP_SET_ICON: {
Jason Monk07473ce2016-01-05 14:59:19 -0500427 Pair<String, StatusBarIcon> p = (Pair<String, StatusBarIcon>) msg.obj;
Jason Monk49fa0162017-01-11 09:21:56 -0500428 for (int i = 0; i < mCallbacks.size(); i++) {
429 mCallbacks.get(i).setIcon(p.first, p.second);
Jason Monkb5b092012017-01-05 11:35:34 -0500430 }
Joe Onorato0cbda992010-05-02 16:28:15 -0700431 break;
432 }
433 case OP_REMOVE_ICON:
Jason Monk49fa0162017-01-11 09:21:56 -0500434 for (int i = 0; i < mCallbacks.size(); i++) {
435 mCallbacks.get(i).removeIcon((String) msg.obj);
Jason Monkb5b092012017-01-05 11:35:34 -0500436 }
Joe Onorato0cbda992010-05-02 16:28:15 -0700437 break;
438 }
439 break;
Joe Onoratof3f0e052010-05-14 18:49:29 -0700440 }
441 case MSG_DISABLE:
Jason Monk49fa0162017-01-11 09:21:56 -0500442 for (int i = 0; i < mCallbacks.size(); i++) {
443 mCallbacks.get(i).disable(msg.arg1, msg.arg2, true /* animate */);
Jason Monkb5b092012017-01-05 11:35:34 -0500444 }
Joe Onoratof3f0e052010-05-14 18:49:29 -0700445 break;
Svetoslav Ganove20a1772012-09-25 16:07:46 -0700446 case MSG_EXPAND_NOTIFICATIONS:
Jason Monk49fa0162017-01-11 09:21:56 -0500447 for (int i = 0; i < mCallbacks.size(); i++) {
448 mCallbacks.get(i).animateExpandNotificationsPanel();
Jason Monkb5b092012017-01-05 11:35:34 -0500449 }
Svetoslav Ganove20a1772012-09-25 16:07:46 -0700450 break;
Daniel Sandler11cf1782012-09-27 14:03:08 -0400451 case MSG_COLLAPSE_PANELS:
Jason Monk49fa0162017-01-11 09:21:56 -0500452 for (int i = 0; i < mCallbacks.size(); i++) {
453 mCallbacks.get(i).animateCollapsePanels(0);
Jason Monkb5b092012017-01-05 11:35:34 -0500454 }
Svetoslav Ganove20a1772012-09-25 16:07:46 -0700455 break;
Daniel Sandler11cf1782012-09-27 14:03:08 -0400456 case MSG_EXPAND_SETTINGS:
Jason Monk49fa0162017-01-11 09:21:56 -0500457 for (int i = 0; i < mCallbacks.size(); i++) {
458 mCallbacks.get(i).animateExpandSettingsPanel((String) msg.obj);
Jason Monkb5b092012017-01-05 11:35:34 -0500459 }
Joe Onorato93056472010-09-10 10:30:46 -0400460 break;
Daniel Sandler60ee2562011-07-22 12:34:33 -0400461 case MSG_SET_SYSTEMUI_VISIBILITY:
Jorim Jaggi86905582016-02-09 21:36:09 -0800462 SomeArgs args = (SomeArgs) msg.obj;
Jason Monk49fa0162017-01-11 09:21:56 -0500463 for (int i = 0; i < mCallbacks.size(); i++) {
464 mCallbacks.get(i).setSystemUiVisibility(args.argi1, args.argi2, args.argi3,
Jason Monkb5b092012017-01-05 11:35:34 -0500465 args.argi4, (Rect) args.arg1, (Rect) args.arg2);
466 }
Jorim Jaggi86905582016-02-09 21:36:09 -0800467 args.recycle();
Joe Onorato93056472010-09-10 10:30:46 -0400468 break;
Dianne Hackborn7d049322011-06-14 15:00:32 -0700469 case MSG_TOP_APP_WINDOW_CHANGED:
Jason Monk49fa0162017-01-11 09:21:56 -0500470 for (int i = 0; i < mCallbacks.size(); i++) {
471 mCallbacks.get(i).topAppWindowChanged(msg.arg1 != 0);
Jason Monkb5b092012017-01-05 11:35:34 -0500472 }
Daniel Sandlere02d8082010-10-08 15:13:22 -0400473 break;
satok06487a52010-10-29 11:37:18 +0900474 case MSG_SHOW_IME_BUTTON:
Jason Monk49fa0162017-01-11 09:21:56 -0500475 for (int i = 0; i < mCallbacks.size(); i++) {
476 mCallbacks.get(i).setImeWindowStatus((IBinder) msg.obj, msg.arg1, msg.arg2,
Jason Monkb5b092012017-01-05 11:35:34 -0500477 msg.getData().getBoolean(SHOW_IME_SWITCHER_KEY, false));
478 }
satok06487a52010-10-29 11:37:18 +0900479 break;
Winson Chung1e8d71b2014-05-16 17:05:22 -0700480 case MSG_SHOW_RECENT_APPS:
Jason Monk49fa0162017-01-11 09:21:56 -0500481 for (int i = 0; i < mCallbacks.size(); i++) {
482 mCallbacks.get(i).showRecentApps(msg.arg1 != 0, msg.arg2 != 0);
Jason Monkb5b092012017-01-05 11:35:34 -0500483 }
Winson Chung1e8d71b2014-05-16 17:05:22 -0700484 break;
485 case MSG_HIDE_RECENT_APPS:
Jason Monk49fa0162017-01-11 09:21:56 -0500486 for (int i = 0; i < mCallbacks.size(); i++) {
487 mCallbacks.get(i).hideRecentApps(msg.arg1 != 0, msg.arg2 != 0);
Jason Monkb5b092012017-01-05 11:35:34 -0500488 }
Winson Chung1e8d71b2014-05-16 17:05:22 -0700489 break;
Michael Jurka3b1fc472011-06-13 10:54:40 -0700490 case MSG_TOGGLE_RECENT_APPS:
Jason Monk49fa0162017-01-11 09:21:56 -0500491 for (int i = 0; i < mCallbacks.size(); i++) {
492 mCallbacks.get(i).toggleRecentApps();
Jason Monkb5b092012017-01-05 11:35:34 -0500493 }
Michael Jurka3b1fc472011-06-13 10:54:40 -0700494 break;
Michael Jurka7f2668c2012-03-27 07:49:52 -0700495 case MSG_PRELOAD_RECENT_APPS:
Jason Monk49fa0162017-01-11 09:21:56 -0500496 for (int i = 0; i < mCallbacks.size(); i++) {
497 mCallbacks.get(i).preloadRecentApps();
Jason Monkb5b092012017-01-05 11:35:34 -0500498 }
Michael Jurka7f2668c2012-03-27 07:49:52 -0700499 break;
500 case MSG_CANCEL_PRELOAD_RECENT_APPS:
Jason Monk49fa0162017-01-11 09:21:56 -0500501 for (int i = 0; i < mCallbacks.size(); i++) {
502 mCallbacks.get(i).cancelPreloadRecentApps();
Jason Monkb5b092012017-01-05 11:35:34 -0500503 }
Michael Jurka7f2668c2012-03-27 07:49:52 -0700504 break;
Andrei Stingaceanu0bf096f2016-04-14 18:11:57 +0100505 case MSG_DISMISS_KEYBOARD_SHORTCUTS:
Jason Monk49fa0162017-01-11 09:21:56 -0500506 for (int i = 0; i < mCallbacks.size(); i++) {
507 mCallbacks.get(i).dismissKeyboardShortcutsMenu();
Jason Monkb5b092012017-01-05 11:35:34 -0500508 }
Andrei Stingaceanu0bf096f2016-04-14 18:11:57 +0100509 break;
Andrei Stingaceanuc22ab792016-01-07 12:39:38 +0000510 case MSG_TOGGLE_KEYBOARD_SHORTCUTS:
Jason Monk49fa0162017-01-11 09:21:56 -0500511 for (int i = 0; i < mCallbacks.size(); i++) {
512 mCallbacks.get(i).toggleKeyboardShortcutsMenu(msg.arg1);
Jason Monkb5b092012017-01-05 11:35:34 -0500513 }
Clara Bayarrif2debb12015-07-10 14:47:17 +0100514 break;
John Spurlock97642182013-07-29 17:58:39 -0400515 case MSG_SET_WINDOW_STATE:
Jason Monk49fa0162017-01-11 09:21:56 -0500516 for (int i = 0; i < mCallbacks.size(); i++) {
517 mCallbacks.get(i).setWindowState(msg.arg1, msg.arg2);
Jason Monkb5b092012017-01-05 11:35:34 -0500518 }
John Spurlock97642182013-07-29 17:58:39 -0400519 break;
John Spurlockcad57682014-07-26 17:09:56 -0400520 case MSG_BUZZ_BEEP_BLINKED:
Jason Monk49fa0162017-01-11 09:21:56 -0500521 for (int i = 0; i < mCallbacks.size(); i++) {
522 mCallbacks.get(i).buzzBeepBlinked();
Jason Monkb5b092012017-01-05 11:35:34 -0500523 }
John Spurlockcad57682014-07-26 17:09:56 -0400524 break;
John Spurlockcb566aa2014-08-03 22:58:28 -0400525 case MSG_NOTIFICATION_LIGHT_OFF:
Jason Monk49fa0162017-01-11 09:21:56 -0500526 for (int i = 0; i < mCallbacks.size(); i++) {
527 mCallbacks.get(i).notificationLightOff();
Jason Monkb5b092012017-01-05 11:35:34 -0500528 }
John Spurlockcb566aa2014-08-03 22:58:28 -0400529 break;
530 case MSG_NOTIFICATION_LIGHT_PULSE:
Jason Monk49fa0162017-01-11 09:21:56 -0500531 for (int i = 0; i < mCallbacks.size(); i++) {
532 mCallbacks.get(i).notificationLightPulse((Integer) msg.obj, msg.arg1, msg.arg2);
Jason Monkb5b092012017-01-05 11:35:34 -0500533 }
John Spurlockcb566aa2014-08-03 22:58:28 -0400534 break;
Jason Monk5565cb42014-09-12 10:59:21 -0400535 case MSG_SHOW_SCREEN_PIN_REQUEST:
Jason Monk49fa0162017-01-11 09:21:56 -0500536 for (int i = 0; i < mCallbacks.size(); i++) {
537 mCallbacks.get(i).showScreenPinningRequest(msg.arg1);
Jason Monkb5b092012017-01-05 11:35:34 -0500538 }
Jason Monk5565cb42014-09-12 10:59:21 -0400539 break;
Jorim Jaggi24bec7c2015-02-04 12:40:14 +0100540 case MSG_APP_TRANSITION_PENDING:
Jason Monk49fa0162017-01-11 09:21:56 -0500541 for (int i = 0; i < mCallbacks.size(); i++) {
542 mCallbacks.get(i).appTransitionPending();
Jason Monkb5b092012017-01-05 11:35:34 -0500543 }
Jorim Jaggi24bec7c2015-02-04 12:40:14 +0100544 break;
545 case MSG_APP_TRANSITION_CANCELLED:
Jason Monk49fa0162017-01-11 09:21:56 -0500546 for (int i = 0; i < mCallbacks.size(); i++) {
547 mCallbacks.get(i).appTransitionCancelled();
Jason Monkb5b092012017-01-05 11:35:34 -0500548 }
Jorim Jaggi24bec7c2015-02-04 12:40:14 +0100549 break;
550 case MSG_APP_TRANSITION_STARTING:
Jason Monk49fa0162017-01-11 09:21:56 -0500551 for (int i = 0; i < mCallbacks.size(); i++) {
Jason Monkb5b092012017-01-05 11:35:34 -0500552 Pair<Long, Long> data = (Pair<Long, Long>) msg.obj;
Jason Monk49fa0162017-01-11 09:21:56 -0500553 mCallbacks.get(i).appTransitionStarting(data.first, data.second);
Jason Monkb5b092012017-01-05 11:35:34 -0500554 }
Jorim Jaggi24bec7c2015-02-04 12:40:14 +0100555 break;
Jorim Jaggi2adba072016-03-03 13:43:39 +0100556 case MSG_APP_TRANSITION_FINISHED:
Jason Monk49fa0162017-01-11 09:21:56 -0500557 for (int i = 0; i < mCallbacks.size(); i++) {
558 mCallbacks.get(i).appTransitionFinished();
Jason Monkb5b092012017-01-05 11:35:34 -0500559 }
Jorim Jaggi2adba072016-03-03 13:43:39 +0100560 break;
Adrian Roos4f43dc02015-06-17 16:43:38 -0700561 case MSG_ASSIST_DISCLOSURE:
Jason Monk49fa0162017-01-11 09:21:56 -0500562 for (int i = 0; i < mCallbacks.size(); i++) {
563 mCallbacks.get(i).showAssistDisclosure();
Jason Monkb5b092012017-01-05 11:35:34 -0500564 }
Adrian Roos4f43dc02015-06-17 16:43:38 -0700565 break;
Jorim Jaggi165ce062015-07-06 16:18:11 -0700566 case MSG_START_ASSIST:
Jason Monk49fa0162017-01-11 09:21:56 -0500567 for (int i = 0; i < mCallbacks.size(); i++) {
568 mCallbacks.get(i).startAssist((Bundle) msg.obj);
Jason Monkb5b092012017-01-05 11:35:34 -0500569 }
Jorim Jaggi165ce062015-07-06 16:18:11 -0700570 break;
Selim Cinek372d1bd2015-08-14 13:19:37 -0700571 case MSG_CAMERA_LAUNCH_GESTURE:
Jason Monk49fa0162017-01-11 09:21:56 -0500572 for (int i = 0; i < mCallbacks.size(); i++) {
573 mCallbacks.get(i).onCameraLaunchGestureDetected(msg.arg1);
Jason Monkb5b092012017-01-05 11:35:34 -0500574 }
Selim Cinek372d1bd2015-08-14 13:19:37 -0700575 break;
Jaewan Kimf0fd2182016-04-20 21:17:58 +0900576 case MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU:
Jason Monk49fa0162017-01-11 09:21:56 -0500577 for (int i = 0; i < mCallbacks.size(); i++) {
578 mCallbacks.get(i).showTvPictureInPictureMenu();
Jason Monkb5b092012017-01-05 11:35:34 -0500579 }
Jaewan Kimc552b042016-01-18 16:08:45 +0900580 break;
Jason Monk7e53f202016-01-28 10:40:20 -0500581 case MSG_ADD_QS_TILE:
Jason Monk49fa0162017-01-11 09:21:56 -0500582 for (int i = 0; i < mCallbacks.size(); i++) {
583 mCallbacks.get(i).addQsTile((ComponentName) msg.obj);
Jason Monkb5b092012017-01-05 11:35:34 -0500584 }
Jason Monk7e53f202016-01-28 10:40:20 -0500585 break;
586 case MSG_REMOVE_QS_TILE:
Jason Monk49fa0162017-01-11 09:21:56 -0500587 for (int i = 0; i < mCallbacks.size(); i++) {
588 mCallbacks.get(i).remQsTile((ComponentName) msg.obj);
Jason Monkb5b092012017-01-05 11:35:34 -0500589 }
Jason Monk7e53f202016-01-28 10:40:20 -0500590 break;
591 case MSG_CLICK_QS_TILE:
Jason Monk49fa0162017-01-11 09:21:56 -0500592 for (int i = 0; i < mCallbacks.size(); i++) {
593 mCallbacks.get(i).clickTile((ComponentName) msg.obj);
Jason Monkb5b092012017-01-05 11:35:34 -0500594 }
Jason Monk7e53f202016-01-28 10:40:20 -0500595 break;
Phil Weaver315c34e2016-02-19 15:12:29 -0800596 case MSG_TOGGLE_APP_SPLIT_SCREEN:
Jason Monk49fa0162017-01-11 09:21:56 -0500597 for (int i = 0; i < mCallbacks.size(); i++) {
598 mCallbacks.get(i).toggleSplitScreen();
Jason Monkb5b092012017-01-05 11:35:34 -0500599 }
Phil Weaver315c34e2016-02-19 15:12:29 -0800600 break;
Jim Miller07e03842016-06-22 15:18:13 -0700601 case MSG_HANDLE_SYSNAV_KEY:
Jason Monk49fa0162017-01-11 09:21:56 -0500602 for (int i = 0; i < mCallbacks.size(); i++) {
603 mCallbacks.get(i).handleSystemNavigationKey(msg.arg1);
Jason Monkb5b092012017-01-05 11:35:34 -0500604 }
Jim Miller07e03842016-06-22 15:18:13 -0700605 break;
Joe Onorato0cbda992010-05-02 16:28:15 -0700606 }
607 }
608 }
Jason Monkb5b092012017-01-05 11:35:34 -0500609
610 // Need this class since CommandQueue already extends IStatusBar.Stub, so CommandQueueStart
611 // is needed so it can extend SystemUI.
612 public static class CommandQueueStart extends SystemUI {
613 @Override
614 public void start() {
615 putComponent(CommandQueue.class, new CommandQueue());
616 }
617 }
Joe Onorato0cbda992010-05-02 16:28:15 -0700618}
619