10cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato/*
20cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * Copyright (C) 2010 The Android Open Source Project
30cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato *
40cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
50cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * you may not use this file except in compliance with the License.
60cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * You may obtain a copy of the License at
70cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato *
80cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
90cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato *
100cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * Unless required by applicable law or agreed to in writing, software
110cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
120cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * See the License for the specific language governing permissions and
140cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * limitations under the License.
150cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato */
160cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
1779de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onoratopackage com.android.systemui.statusbar;
180cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
197e53f20c835ae2614c92717a6fc222b345c75036Jason Monkimport android.content.ComponentName;
2086905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggiimport android.graphics.Rect;
21165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggiimport android.os.Bundle;
220cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport android.os.Handler;
23a0c56fe93925d20d9c0b830b9664699ce557e78cJoe Onoratoimport android.os.IBinder;
24b5b0920170916e92b49f693df6e8580a785f81baJason Monkimport android.os.Looper;
250cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport android.os.Message;
26b5b0920170916e92b49f693df6e8580a785f81baJason Monkimport android.support.annotation.VisibleForTesting;
2724bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggiimport android.util.Pair;
28c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson
2986905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggiimport com.android.internal.os.SomeArgs;
300cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBar;
310cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIcon;
32b5b0920170916e92b49f693df6e8580a785f81baJason Monkimport com.android.systemui.SystemUI;
330cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
3449fa016a98cef9940c883b3f620a0e90537a204eJason Monkimport java.util.ArrayList;
3549fa016a98cef9940c883b3f620a0e90537a204eJason Monk
36f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato/**
37f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * This class takes the functions from IStatusBar that come in on
38f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * binder pool threads and posts messages to get them onto the main
39f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * thread, and calls onto Callbacks.  It also takes care of
404762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato * coalescing these calls so they don't stack up.  For the calls
414762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato * are coalesced, note that they are all idempotent.
42f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato */
43808182dc874e93582da38d013a4a790d6bc08fc9Joe Onoratopublic class CommandQueue extends IStatusBar.Stub {
441d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler    private static final int INDEX_MASK = 0xffff;
451d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler    private static final int MSG_SHIFT  = 16;
461d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler    private static final int MSG_MASK   = 0xffff << MSG_SHIFT;
470cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
481d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler    private static final int OP_SET_ICON    = 1;
490cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    private static final int OP_REMOVE_ICON = 2;
500cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
51c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_ICON                          = 1 << MSG_SHIFT;
52c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_DISABLE                       = 2 << MSG_SHIFT;
53c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_EXPAND_NOTIFICATIONS          = 3 << MSG_SHIFT;
54c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_COLLAPSE_PANELS               = 4 << MSG_SHIFT;
55c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_EXPAND_SETTINGS               = 5 << MSG_SHIFT;
56c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_SET_SYSTEMUI_VISIBILITY       = 6 << MSG_SHIFT;
57c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_TOP_APP_WINDOW_CHANGED        = 7 << MSG_SHIFT;
58c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_SHOW_IME_BUTTON               = 8 << MSG_SHIFT;
59c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_TOGGLE_RECENT_APPS            = 9 << MSG_SHIFT;
60c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_PRELOAD_RECENT_APPS           = 10 << MSG_SHIFT;
61c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_CANCEL_PRELOAD_RECENT_APPS    = 11 << MSG_SHIFT;
62c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_SET_WINDOW_STATE              = 12 << MSG_SHIFT;
63c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_SHOW_RECENT_APPS              = 13 << MSG_SHIFT;
64c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_HIDE_RECENT_APPS              = 14 << MSG_SHIFT;
65c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_SHOW_SCREEN_PIN_REQUEST       = 18 << MSG_SHIFT;
66c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_APP_TRANSITION_PENDING        = 19 << MSG_SHIFT;
67c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_APP_TRANSITION_CANCELLED      = 20 << MSG_SHIFT;
68c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_APP_TRANSITION_STARTING       = 21 << MSG_SHIFT;
69c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_ASSIST_DISCLOSURE             = 22 << MSG_SHIFT;
70c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_START_ASSIST                  = 23 << MSG_SHIFT;
71c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_CAMERA_LAUNCH_GESTURE         = 24 << MSG_SHIFT;
72c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    private static final int MSG_TOGGLE_KEYBOARD_SHORTCUTS     = 25 << MSG_SHIFT;
73ac52f2892d5c72c26387d510093ddfc741a8a632Winson Chung    private static final int MSG_SHOW_PICTURE_IN_PICTURE_MENU  = 26 << MSG_SHIFT;
747e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    private static final int MSG_ADD_QS_TILE                   = 27 << MSG_SHIFT;
757e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    private static final int MSG_REMOVE_QS_TILE                = 28 << MSG_SHIFT;
767e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    private static final int MSG_CLICK_QS_TILE                 = 29 << MSG_SHIFT;
77315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver    private static final int MSG_TOGGLE_APP_SPLIT_SCREEN       = 30 << MSG_SHIFT;
782adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi    private static final int MSG_APP_TRANSITION_FINISHED       = 31 << MSG_SHIFT;
790bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu    private static final int MSG_DISMISS_KEYBOARD_SHORTCUTS    = 32 << MSG_SHIFT;
80c3a503d8fd505d3f14b52d4af1c6e2509de7d6b5Philip Quinn    private static final int MSG_HANDLE_SYSTEM_KEY             = 33 << MSG_SHIFT;
81361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk    private static final int MSG_SHOW_GLOBAL_ACTIONS           = 34 << MSG_SHIFT;
829ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen    private static final int MSG_TOGGLE_PANEL                  = 35 << MSG_SHIFT;
830b99402f87ce1d8275dc60d98c2c12ccc0d9acebJason Monk    private static final int MSG_SHOW_SHUTDOWN_UI              = 36 << MSG_SHIFT;
843a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek    private static final int MSG_SET_TOP_APP_HIDES_STATUS_BAR  = 37 << MSG_SHIFT;
85328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler
869a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller    public static final int FLAG_EXCLUDE_NONE = 0;
879a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller    public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
889a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller    public static final int FLAG_EXCLUDE_RECENTS_PANEL = 1 << 1;
899a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller    public static final int FLAG_EXCLUDE_NOTIFICATION_PANEL = 1 << 2;
909a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller    public static final int FLAG_EXCLUDE_INPUT_METHODS_PANEL = 1 << 3;
919a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller    public static final int FLAG_EXCLUDE_COMPAT_MODE_PANEL = 1 << 4;
929a720f5eb6c67b581df22f4ecb498cebb459babeJim Miller
93b605fecd9e4282823af754b3968b21205d64554aJason Monk    private static final String SHOW_IME_SWITCHER_KEY = "showImeSwitcherKey";
94b605fecd9e4282823af754b3968b21205d64554aJason Monk
9507473cea3a6007d5e72b25d3445437a175735fa9Jason Monk    private final Object mLock = new Object();
9649fa016a98cef9940c883b3f620a0e90537a204eJason Monk    private ArrayList<Callbacks> mCallbacks = new ArrayList<>();
97b5b0920170916e92b49f693df6e8580a785f81baJason Monk    private Handler mHandler = new H(Looper.getMainLooper());
98aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk    private int mDisable1;
99aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk    private int mDisable2;
1000cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
1010cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    /**
1020cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato     * These methods are called back on the main thread.
1030cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato     */
1040cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public interface Callbacks {
105b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void setIcon(String slot, StatusBarIcon icon) { }
106b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void removeIcon(String slot) { }
107b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void disable(int state1, int state2, boolean animate) { }
108b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void animateExpandNotificationsPanel() { }
109b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void animateCollapsePanels(int flags) { }
1109ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen        default void togglePanel() { }
111b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void animateExpandSettingsPanel(String obj) { }
112b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void setSystemUiVisibility(int vis, int fullscreenStackVis,
113b5b0920170916e92b49f693df6e8580a785f81baJason Monk                int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds) {
114b5b0920170916e92b49f693df6e8580a785f81baJason Monk        }
115b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void topAppWindowChanged(boolean visible) { }
116b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void setImeWindowStatus(IBinder token, int vis, int backDisposition,
117b5b0920170916e92b49f693df6e8580a785f81baJason Monk                boolean showImeSwitcher) { }
118b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void showRecentApps(boolean triggeredFromAltTab, boolean fromHome) { }
119b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) { }
120b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void toggleRecentApps() { }
121b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void toggleSplitScreen() { }
122b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void preloadRecentApps() { }
123b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void dismissKeyboardShortcutsMenu() { }
124b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void toggleKeyboardShortcutsMenu(int deviceId) { }
125b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void cancelPreloadRecentApps() { }
126b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void setWindowState(int window, int state) { }
127b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void showScreenPinningRequest(int taskId) { }
128aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk        default void appTransitionPending(boolean forced) { }
129b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void appTransitionCancelled() { }
130aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk        default void appTransitionStarting(long startTime, long duration, boolean forced) { }
131b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void appTransitionFinished() { }
132b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void showAssistDisclosure() { }
133b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void startAssist(Bundle args) { }
134b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void onCameraLaunchGestureDetected(int source) { }
135ac52f2892d5c72c26387d510093ddfc741a8a632Winson Chung        default void showPictureInPictureMenu() { }
1363a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek        default void setTopAppHidesStatusBar(boolean topAppHidesStatusBar) { }
137b5b0920170916e92b49f693df6e8580a785f81baJason Monk
138b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void addQsTile(ComponentName tile) { }
139b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void remQsTile(ComponentName tile) { }
140b5b0920170916e92b49f693df6e8580a785f81baJason Monk        default void clickTile(ComponentName tile) { }
141b5b0920170916e92b49f693df6e8580a785f81baJason Monk
142c3a503d8fd505d3f14b52d4af1c6e2509de7d6b5Philip Quinn        default void handleSystemKey(int arg1) { }
143361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk        default void handleShowGlobalActionsMenu() { }
144b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk        default void handleShowShutdownUi(boolean isReboot, String reason) { }
145b5b0920170916e92b49f693df6e8580a785f81baJason Monk    }
146b5b0920170916e92b49f693df6e8580a785f81baJason Monk
147b5b0920170916e92b49f693df6e8580a785f81baJason Monk    @VisibleForTesting
148b5b0920170916e92b49f693df6e8580a785f81baJason Monk    protected CommandQueue() {
149b5b0920170916e92b49f693df6e8580a785f81baJason Monk    }
150b5b0920170916e92b49f693df6e8580a785f81baJason Monk
151b5b0920170916e92b49f693df6e8580a785f81baJason Monk    public void addCallbacks(Callbacks callbacks) {
15249fa016a98cef9940c883b3f620a0e90537a204eJason Monk        mCallbacks.add(callbacks);
153aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk        callbacks.disable(mDisable1, mDisable2, false /* animate */);
15449fa016a98cef9940c883b3f620a0e90537a204eJason Monk    }
15549fa016a98cef9940c883b3f620a0e90537a204eJason Monk
15649fa016a98cef9940c883b3f620a0e90537a204eJason Monk    public void removeCallbacks(Callbacks callbacks) {
15749fa016a98cef9940c883b3f620a0e90537a204eJason Monk        mCallbacks.remove(callbacks);
1580cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    }
1590cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
16007473cea3a6007d5e72b25d3445437a175735fa9Jason Monk    public void setIcon(String slot, StatusBarIcon icon) {
16107473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
16207473cea3a6007d5e72b25d3445437a175735fa9Jason Monk            // don't coalesce these
16307473cea3a6007d5e72b25d3445437a175735fa9Jason Monk            mHandler.obtainMessage(MSG_ICON, OP_SET_ICON, 0,
16407473cea3a6007d5e72b25d3445437a175735fa9Jason Monk                    new Pair<String, StatusBarIcon>(slot, icon)).sendToTarget();
1650cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
1660cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    }
1670cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
16807473cea3a6007d5e72b25d3445437a175735fa9Jason Monk    public void removeIcon(String slot) {
16907473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
17007473cea3a6007d5e72b25d3445437a175735fa9Jason Monk            // don't coalesce these
17107473cea3a6007d5e72b25d3445437a175735fa9Jason Monk            mHandler.obtainMessage(MSG_ICON, OP_REMOVE_ICON, 0, slot).sendToTarget();
1720cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
1730cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    }
1740cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
1751e5ba5d087d8800407134af095aa4303e8721dbfJason Monk    public void disable(int state1, int state2, boolean animate) {
17607473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
177aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk            mDisable1 = state1;
178aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk            mDisable2 = state2;
179f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato            mHandler.removeMessages(MSG_DISABLE);
1803d3e99c465a25ec1a9eed930c2b1dbd745284d84Jason Monk            Message msg = mHandler.obtainMessage(MSG_DISABLE, state1, state2, animate);
1813d3e99c465a25ec1a9eed930c2b1dbd745284d84Jason Monk            if (Looper.myLooper() == mHandler.getLooper()) {
1823d3e99c465a25ec1a9eed930c2b1dbd745284d84Jason Monk                // If its the right looper execute immediately so hides can be handled quickly.
1833d3e99c465a25ec1a9eed930c2b1dbd745284d84Jason Monk                mHandler.handleMessage(msg);
1843d3e99c465a25ec1a9eed930c2b1dbd745284d84Jason Monk                msg.recycle();
1853d3e99c465a25ec1a9eed930c2b1dbd745284d84Jason Monk            } else {
1863d3e99c465a25ec1a9eed930c2b1dbd745284d84Jason Monk                msg.sendToTarget();
1873d3e99c465a25ec1a9eed930c2b1dbd745284d84Jason Monk            }
188f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato        }
189f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    }
190f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato
1911e5ba5d087d8800407134af095aa4303e8721dbfJason Monk    public void disable(int state1, int state2) {
1921e5ba5d087d8800407134af095aa4303e8721dbfJason Monk        disable(state1, state2, true);
1931e5ba5d087d8800407134af095aa4303e8721dbfJason Monk    }
1941e5ba5d087d8800407134af095aa4303e8721dbfJason Monk
19500659bad38874f400297f58bc0d1037615de40fdJason Monk    public void recomputeDisableFlags(boolean animate) {
19600659bad38874f400297f58bc0d1037615de40fdJason Monk        disable(mDisable1, mDisable2, animate);
19700659bad38874f400297f58bc0d1037615de40fdJason Monk    }
19800659bad38874f400297f58bc0d1037615de40fdJason Monk
19911cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler    public void animateExpandNotificationsPanel() {
20007473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
201e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov            mHandler.removeMessages(MSG_EXPAND_NOTIFICATIONS);
202e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov            mHandler.sendEmptyMessage(MSG_EXPAND_NOTIFICATIONS);
203e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov        }
204e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov    }
205e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov
20611cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler    public void animateCollapsePanels() {
20707473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
20811cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler            mHandler.removeMessages(MSG_COLLAPSE_PANELS);
2099c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk            mHandler.obtainMessage(MSG_COLLAPSE_PANELS, 0, 0).sendToTarget();
2109c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk        }
2119c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk    }
2129c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk
2139c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk    public void animateCollapsePanels(int flags) {
2149c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk        synchronized (mLock) {
2159c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk            mHandler.removeMessages(MSG_COLLAPSE_PANELS);
2169c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk            mHandler.obtainMessage(MSG_COLLAPSE_PANELS, flags, 0).sendToTarget();
2174762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato        }
2184762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    }
2194762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato
2209ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen    public void togglePanel() {
2219ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen        synchronized (mLock) {
2229ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen            mHandler.removeMessages(MSG_TOGGLE_PANEL);
2239ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen            mHandler.obtainMessage(MSG_TOGGLE_PANEL, 0, 0).sendToTarget();
2249ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen        }
2259ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen    }
2269ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen
227a9927325eda025504d59bb6594fee8e240d95b01Jason Monk    public void animateExpandSettingsPanel(String subPanel) {
22807473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
22911cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler            mHandler.removeMessages(MSG_EXPAND_SETTINGS);
230a9927325eda025504d59bb6594fee8e240d95b01Jason Monk            mHandler.obtainMessage(MSG_EXPAND_SETTINGS, subPanel).sendToTarget();
2314762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato        }
2324762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    }
2334762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato
23486905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi    public void setSystemUiVisibility(int vis, int fullscreenStackVis, int dockedStackVis,
23586905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi            int mask, Rect fullscreenStackBounds, Rect dockedStackBounds) {
23607473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
2374a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek            // Don't coalesce these, since it might have one time flags set such as
2384a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek            // STATUS_BAR_UNHIDE which might get lost.
23986905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi            SomeArgs args = SomeArgs.obtain();
24086905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi            args.argi1 = vis;
24186905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi            args.argi2 = fullscreenStackVis;
24286905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi            args.argi3 = dockedStackVis;
24386905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi            args.argi4 = mask;
24486905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi            args.arg1 = fullscreenStackBounds;
24586905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi            args.arg2 = dockedStackBounds;
24686905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi            mHandler.obtainMessage(MSG_SET_SYSTEMUI_VISIBILITY, args).sendToTarget();
2479305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato        }
2489305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato    }
2499305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato
2507d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn    public void topAppWindowChanged(boolean menuVisible) {
25107473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
2527d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn            mHandler.removeMessages(MSG_TOP_APP_WINDOW_CHANGED);
2537d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn            mHandler.obtainMessage(MSG_TOP_APP_WINDOW_CHANGED, menuVisible ? 1 : 0, 0,
2547d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn                    null).sendToTarget();
255e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler        }
256e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler    }
257e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler
258b605fecd9e4282823af754b3968b21205d64554aJason Monk    public void setImeWindowStatus(IBinder token, int vis, int backDisposition,
259b605fecd9e4282823af754b3968b21205d64554aJason Monk            boolean showImeSwitcher) {
26007473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
26106487a58be22b100daf3f950b9a1d25c3ea42aa2satok            mHandler.removeMessages(MSG_SHOW_IME_BUTTON);
262b605fecd9e4282823af754b3968b21205d64554aJason Monk            Message m = mHandler.obtainMessage(MSG_SHOW_IME_BUTTON, vis, backDisposition, token);
263b605fecd9e4282823af754b3968b21205d64554aJason Monk            m.getData().putBoolean(SHOW_IME_SWITCHER_KEY, showImeSwitcher);
264b605fecd9e4282823af754b3968b21205d64554aJason Monk            m.sendToTarget();
26506487a58be22b100daf3f950b9a1d25c3ea42aa2satok        }
26606487a58be22b100daf3f950b9a1d25c3ea42aa2satok    }
26706487a58be22b100daf3f950b9a1d25c3ea42aa2satok
268681fc7b2670542aae0f3b9ef8f6c7a88db984ea9Jorim Jaggi    public void showRecentApps(boolean triggeredFromAltTab, boolean fromHome) {
26907473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
2701e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            mHandler.removeMessages(MSG_SHOW_RECENT_APPS);
2711e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            mHandler.obtainMessage(MSG_SHOW_RECENT_APPS,
272681fc7b2670542aae0f3b9ef8f6c7a88db984ea9Jorim Jaggi                    triggeredFromAltTab ? 1 : 0, fromHome ? 1 : 0, null).sendToTarget();
2731e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        }
2741e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    }
2751e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung
276cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung    public void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
27707473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
2781e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung            mHandler.removeMessages(MSG_HIDE_RECENT_APPS);
2796cb485fd2e2f8ace05e1ff281ab0fc824d3652cbWinson Chung            mHandler.obtainMessage(MSG_HIDE_RECENT_APPS,
280cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung                    triggeredFromAltTab ? 1 : 0, triggeredFromHomeKey ? 1 : 0,
281cdcd487abad10f728f0542accc42a31d1f7fedacWinson Chung                    null).sendToTarget();
2821e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung        }
2831e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung    }
2841e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung
285315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver    public void toggleSplitScreen() {
286315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver        synchronized (mLock) {
287315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver            mHandler.removeMessages(MSG_TOGGLE_APP_SPLIT_SCREEN);
288315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver            mHandler.obtainMessage(MSG_TOGGLE_APP_SPLIT_SCREEN, 0, 0, null).sendToTarget();
289315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver        }
290315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver    }
291315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver
2923b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka    public void toggleRecentApps() {
29307473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
2943b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka            mHandler.removeMessages(MSG_TOGGLE_RECENT_APPS);
2956b46038e6a0e4c45cebe655f1c3bcf8986319853Jorim Jaggi            Message msg = mHandler.obtainMessage(MSG_TOGGLE_RECENT_APPS, 0, 0, null);
2966b46038e6a0e4c45cebe655f1c3bcf8986319853Jorim Jaggi            msg.setAsynchronous(true);
2976b46038e6a0e4c45cebe655f1c3bcf8986319853Jorim Jaggi            msg.sendToTarget();
2983b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka        }
2993b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka    }
3003b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka
3017f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka    public void preloadRecentApps() {
30207473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
3037f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka            mHandler.removeMessages(MSG_PRELOAD_RECENT_APPS);
3047f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka            mHandler.obtainMessage(MSG_PRELOAD_RECENT_APPS, 0, 0, null).sendToTarget();
3057f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka        }
3067f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka    }
3077f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka
3087f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka    public void cancelPreloadRecentApps() {
30907473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
3107f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka            mHandler.removeMessages(MSG_CANCEL_PRELOAD_RECENT_APPS);
3117f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka            mHandler.obtainMessage(MSG_CANCEL_PRELOAD_RECENT_APPS, 0, 0, null).sendToTarget();
3127f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka        }
3137f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka    }
3147f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka
315f2debb1f9a8a166e249a456efc0b41d731c275c2Clara Bayarri    @Override
3160bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu    public void dismissKeyboardShortcutsMenu() {
3170bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu        synchronized (mLock) {
3180bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu            mHandler.removeMessages(MSG_DISMISS_KEYBOARD_SHORTCUTS);
3190bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu            mHandler.obtainMessage(MSG_DISMISS_KEYBOARD_SHORTCUTS).sendToTarget();
3200bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu        }
3210bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu    }
3220bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu
3230bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu    @Override
3244e850ffaa757cd6f1e2578c454a7a83a93419e83Clara Bayarri    public void toggleKeyboardShortcutsMenu(int deviceId) {
32507473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
326c22ab7911a3efd7e0183f954f1760475d702ad3eAndrei Stingaceanu            mHandler.removeMessages(MSG_TOGGLE_KEYBOARD_SHORTCUTS);
3274e850ffaa757cd6f1e2578c454a7a83a93419e83Clara Bayarri            mHandler.obtainMessage(MSG_TOGGLE_KEYBOARD_SHORTCUTS, deviceId, 0).sendToTarget();
328f2debb1f9a8a166e249a456efc0b41d731c275c2Clara Bayarri        }
329f2debb1f9a8a166e249a456efc0b41d731c275c2Clara Bayarri    }
330f2debb1f9a8a166e249a456efc0b41d731c275c2Clara Bayarri
331c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    @Override
332ac52f2892d5c72c26387d510093ddfc741a8a632Winson Chung    public void showPictureInPictureMenu() {
333c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim        synchronized (mLock) {
334ac52f2892d5c72c26387d510093ddfc741a8a632Winson Chung            mHandler.removeMessages(MSG_SHOW_PICTURE_IN_PICTURE_MENU);
335ac52f2892d5c72c26387d510093ddfc741a8a632Winson Chung            mHandler.obtainMessage(MSG_SHOW_PICTURE_IN_PICTURE_MENU).sendToTarget();
336c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim        }
337c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim    }
338c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim
3399764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock    public void setWindowState(int window, int state) {
34007473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
3415b9145bf990a9bbf4fdef1739e61ff8c70ec868fJohn Spurlock            // don't coalesce these
3429764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock            mHandler.obtainMessage(MSG_SET_WINDOW_STATE, window, state, null).sendToTarget();
3439764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock        }
3449764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock    }
3459764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock
3460f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian    public void showScreenPinningRequest(int taskId) {
34707473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
3480f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian            mHandler.obtainMessage(MSG_SHOW_SCREEN_PIN_REQUEST, taskId, 0, null)
3490f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian                    .sendToTarget();
3505565cb42f2ac07fcdbe3aab2503de07fbeb39504Jason Monk        }
3515565cb42f2ac07fcdbe3aab2503de07fbeb39504Jason Monk    }
3525565cb42f2ac07fcdbe3aab2503de07fbeb39504Jason Monk
35324bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi    public void appTransitionPending() {
354aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk        appTransitionPending(false /* forced */);
355aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk    }
356aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk
357aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk    public void appTransitionPending(boolean forced) {
35807473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
359aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk            mHandler.obtainMessage(MSG_APP_TRANSITION_PENDING, forced ? 1 : 0, 0).sendToTarget();
36024bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi        }
36124bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi    }
36224bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi
36324bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi    public void appTransitionCancelled() {
36407473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
365b5b0920170916e92b49f693df6e8580a785f81baJason Monk            mHandler.sendEmptyMessage(MSG_APP_TRANSITION_CANCELLED);
36624bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi        }
36724bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi    }
36824bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi
36924bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi    public void appTransitionStarting(long startTime, long duration) {
370aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk        appTransitionStarting(startTime, duration, false /* forced */);
371aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk    }
372aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk
373aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk    public void appTransitionStarting(long startTime, long duration, boolean forced) {
37407473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
375aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk            mHandler.obtainMessage(MSG_APP_TRANSITION_STARTING, forced ? 1 : 0, 0,
376aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk                    Pair.create(startTime, duration)).sendToTarget();
37724bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi        }
37824bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi    }
37924bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi
3802adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi    @Override
3812adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi    public void appTransitionFinished() {
3822adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi        synchronized (mLock) {
3832adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi            mHandler.sendEmptyMessage(MSG_APP_TRANSITION_FINISHED);
3842adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi        }
3852adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi    }
3862adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi
3874f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos    public void showAssistDisclosure() {
38807473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
3894f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos            mHandler.removeMessages(MSG_ASSIST_DISCLOSURE);
3904f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos            mHandler.obtainMessage(MSG_ASSIST_DISCLOSURE).sendToTarget();
3914f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos        }
3924f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos    }
3934f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos
394165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi    public void startAssist(Bundle args) {
39507473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
396165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi            mHandler.removeMessages(MSG_START_ASSIST);
397165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi            mHandler.obtainMessage(MSG_START_ASSIST, args).sendToTarget();
398165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi        }
399165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi    }
400165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi
401372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    @Override
40240aa8811bc817293d7400c14fa60350d2350d29fJorim Jaggi    public void onCameraLaunchGestureDetected(int source) {
40307473cea3a6007d5e72b25d3445437a175735fa9Jason Monk        synchronized (mLock) {
404372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek            mHandler.removeMessages(MSG_CAMERA_LAUNCH_GESTURE);
40540aa8811bc817293d7400c14fa60350d2350d29fJorim Jaggi            mHandler.obtainMessage(MSG_CAMERA_LAUNCH_GESTURE, source, 0).sendToTarget();
406372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek        }
407372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek    }
408372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek
4097e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    @Override
4107e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    public void addQsTile(ComponentName tile) {
4117e53f20c835ae2614c92717a6fc222b345c75036Jason Monk        synchronized (mLock) {
4127e53f20c835ae2614c92717a6fc222b345c75036Jason Monk            mHandler.obtainMessage(MSG_ADD_QS_TILE, tile).sendToTarget();
4137e53f20c835ae2614c92717a6fc222b345c75036Jason Monk        }
4147e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    }
4157e53f20c835ae2614c92717a6fc222b345c75036Jason Monk
4167e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    @Override
4177e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    public void remQsTile(ComponentName tile) {
4187e53f20c835ae2614c92717a6fc222b345c75036Jason Monk        synchronized (mLock) {
4197e53f20c835ae2614c92717a6fc222b345c75036Jason Monk            mHandler.obtainMessage(MSG_REMOVE_QS_TILE, tile).sendToTarget();
4207e53f20c835ae2614c92717a6fc222b345c75036Jason Monk        }
4217e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    }
4227e53f20c835ae2614c92717a6fc222b345c75036Jason Monk
4237e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    @Override
4247e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    public void clickQsTile(ComponentName tile) {
4257e53f20c835ae2614c92717a6fc222b345c75036Jason Monk        synchronized (mLock) {
4267e53f20c835ae2614c92717a6fc222b345c75036Jason Monk            mHandler.obtainMessage(MSG_CLICK_QS_TILE, tile).sendToTarget();
4277e53f20c835ae2614c92717a6fc222b345c75036Jason Monk        }
4287e53f20c835ae2614c92717a6fc222b345c75036Jason Monk    }
4297e53f20c835ae2614c92717a6fc222b345c75036Jason Monk
43007e0384a4e931bc94550c108ddd9b9514100161eJim Miller    @Override
431c3a503d8fd505d3f14b52d4af1c6e2509de7d6b5Philip Quinn    public void handleSystemKey(int key) {
43207e0384a4e931bc94550c108ddd9b9514100161eJim Miller        synchronized (mLock) {
433c3a503d8fd505d3f14b52d4af1c6e2509de7d6b5Philip Quinn            mHandler.obtainMessage(MSG_HANDLE_SYSTEM_KEY, key, 0).sendToTarget();
43407e0384a4e931bc94550c108ddd9b9514100161eJim Miller        }
43507e0384a4e931bc94550c108ddd9b9514100161eJim Miller    }
43607e0384a4e931bc94550c108ddd9b9514100161eJim Miller
437361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk    @Override
438361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk    public void showGlobalActionsMenu() {
439361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk        synchronized (mLock) {
440361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk            mHandler.removeMessages(MSG_SHOW_GLOBAL_ACTIONS);
441361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk            mHandler.obtainMessage(MSG_SHOW_GLOBAL_ACTIONS).sendToTarget();
442361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk        }
443361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk    }
444361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk
445b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk    @Override
4463a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek    public void setTopAppHidesStatusBar(boolean hidesStatusBar) {
4473a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek        mHandler.removeMessages(MSG_SET_TOP_APP_HIDES_STATUS_BAR);
4483a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek        mHandler.obtainMessage(MSG_SET_TOP_APP_HIDES_STATUS_BAR, hidesStatusBar ? 1 : 0, 0)
4493a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek                .sendToTarget();
4503a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek    }
4513a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek
4523a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek    @Override
453b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk    public void showShutdownUi(boolean isReboot, String reason) {
454b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk        synchronized (mLock) {
455b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk            mHandler.removeMessages(MSG_SHOW_SHUTDOWN_UI);
456b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk            mHandler.obtainMessage(MSG_SHOW_SHUTDOWN_UI, isReboot ? 1 : 0, 0, reason)
457b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk                    .sendToTarget();
458b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk        }
459b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk    }
460b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk
4610cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    private final class H extends Handler {
462b5b0920170916e92b49f693df6e8580a785f81baJason Monk        private H(Looper l) {
463b5b0920170916e92b49f693df6e8580a785f81baJason Monk            super(l);
464b5b0920170916e92b49f693df6e8580a785f81baJason Monk        }
465b5b0920170916e92b49f693df6e8580a785f81baJason Monk
4660cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        public void handleMessage(Message msg) {
467f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato            final int what = msg.what & MSG_MASK;
46866d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato            switch (what) {
4690cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                case MSG_ICON: {
4700cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    switch (msg.arg1) {
4710cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                        case OP_SET_ICON: {
47207473cea3a6007d5e72b25d3445437a175735fa9Jason Monk                            Pair<String, StatusBarIcon> p = (Pair<String, StatusBarIcon>) msg.obj;
47349fa016a98cef9940c883b3f620a0e90537a204eJason Monk                            for (int i = 0; i < mCallbacks.size(); i++) {
47449fa016a98cef9940c883b3f620a0e90537a204eJason Monk                                mCallbacks.get(i).setIcon(p.first, p.second);
475b5b0920170916e92b49f693df6e8580a785f81baJason Monk                            }
4760cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                            break;
4770cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                        }
4780cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                        case OP_REMOVE_ICON:
47949fa016a98cef9940c883b3f620a0e90537a204eJason Monk                            for (int i = 0; i < mCallbacks.size(); i++) {
48049fa016a98cef9940c883b3f620a0e90537a204eJason Monk                                mCallbacks.get(i).removeIcon((String) msg.obj);
481b5b0920170916e92b49f693df6e8580a785f81baJason Monk                            }
4820cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                            break;
4830cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    }
4840cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    break;
485a0c56fe93925d20d9c0b830b9664699ce557e78cJoe Onorato                }
486f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                case MSG_DISABLE:
48749fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
4881e5ba5d087d8800407134af095aa4303e8721dbfJason Monk                        mCallbacks.get(i).disable(msg.arg1, msg.arg2, (Boolean) msg.obj);
489b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
490f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                    break;
491e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov                case MSG_EXPAND_NOTIFICATIONS:
49249fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
49349fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).animateExpandNotificationsPanel();
494b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
495e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov                    break;
49611cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                case MSG_COLLAPSE_PANELS:
49749fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
4989c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk                        mCallbacks.get(i).animateCollapsePanels(msg.arg1);
499b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
500e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov                    break;
5019ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen                case MSG_TOGGLE_PANEL:
5029ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen                    for (int i = 0; i < mCallbacks.size(); i++) {
5039ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen                        mCallbacks.get(i).togglePanel();
5049ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen                    }
5059ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen                    break;
50611cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler                case MSG_EXPAND_SETTINGS:
50749fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
50849fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).animateExpandSettingsPanel((String) msg.obj);
509b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
5109305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato                    break;
51160ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler                case MSG_SET_SYSTEMUI_VISIBILITY:
51286905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi                    SomeArgs args = (SomeArgs) msg.obj;
51349fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
51449fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).setSystemUiVisibility(args.argi1, args.argi2, args.argi3,
515b5b0920170916e92b49f693df6e8580a785f81baJason Monk                                args.argi4, (Rect) args.arg1, (Rect) args.arg2);
516b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
51786905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi                    args.recycle();
5189305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato                    break;
5197d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn                case MSG_TOP_APP_WINDOW_CHANGED:
52049fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
52149fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).topAppWindowChanged(msg.arg1 != 0);
522b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
523e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                    break;
52406487a58be22b100daf3f950b9a1d25c3ea42aa2satok                case MSG_SHOW_IME_BUTTON:
52549fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
52649fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).setImeWindowStatus((IBinder) msg.obj, msg.arg1, msg.arg2,
527b5b0920170916e92b49f693df6e8580a785f81baJason Monk                                msg.getData().getBoolean(SHOW_IME_SWITCHER_KEY, false));
528b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
52906487a58be22b100daf3f950b9a1d25c3ea42aa2satok                    break;
5301e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung                case MSG_SHOW_RECENT_APPS:
53149fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
53249fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).showRecentApps(msg.arg1 != 0, msg.arg2 != 0);
533b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
5341e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung                    break;
5351e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung                case MSG_HIDE_RECENT_APPS:
53649fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
53749fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).hideRecentApps(msg.arg1 != 0, msg.arg2 != 0);
538b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
5391e8d71b605b4872e93200706a80a88a3ff25498cWinson Chung                    break;
5403b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka                case MSG_TOGGLE_RECENT_APPS:
54149fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
54249fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).toggleRecentApps();
543b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
5443b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka                    break;
5457f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka                case MSG_PRELOAD_RECENT_APPS:
54649fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
54749fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).preloadRecentApps();
548b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
5497f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka                    break;
5507f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka                case MSG_CANCEL_PRELOAD_RECENT_APPS:
55149fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
55249fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).cancelPreloadRecentApps();
553b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
5547f2668c8469934ce83a5647977f6e74ab782cf07Michael Jurka                    break;
5550bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu                case MSG_DISMISS_KEYBOARD_SHORTCUTS:
55649fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
55749fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).dismissKeyboardShortcutsMenu();
558b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
5590bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu                    break;
560c22ab7911a3efd7e0183f954f1760475d702ad3eAndrei Stingaceanu                case MSG_TOGGLE_KEYBOARD_SHORTCUTS:
56149fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
56249fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).toggleKeyboardShortcutsMenu(msg.arg1);
563b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
564f2debb1f9a8a166e249a456efc0b41d731c275c2Clara Bayarri                    break;
5659764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock                case MSG_SET_WINDOW_STATE:
56649fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
56749fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).setWindowState(msg.arg1, msg.arg2);
568b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
5699764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock                    break;
5705565cb42f2ac07fcdbe3aab2503de07fbeb39504Jason Monk                case MSG_SHOW_SCREEN_PIN_REQUEST:
57149fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
57249fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).showScreenPinningRequest(msg.arg1);
573b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
5745565cb42f2ac07fcdbe3aab2503de07fbeb39504Jason Monk                    break;
57524bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi                case MSG_APP_TRANSITION_PENDING:
57649fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
577aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk                        mCallbacks.get(i).appTransitionPending(msg.arg1 != 0);
578b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
57924bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi                    break;
58024bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi                case MSG_APP_TRANSITION_CANCELLED:
58149fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
58249fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).appTransitionCancelled();
583b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
58424bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi                    break;
58524bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi                case MSG_APP_TRANSITION_STARTING:
58649fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
587b5b0920170916e92b49f693df6e8580a785f81baJason Monk                        Pair<Long, Long> data = (Pair<Long, Long>) msg.obj;
588aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk                        mCallbacks.get(i).appTransitionStarting(data.first, data.second,
589aa573e9e8632552d1fa8bdd6b0ee408ff9a93a6bJason Monk                                msg.arg1 != 0);
590b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
59124bec7ce7adc3c0d693cfadcb4b28f5fc41555aeJorim Jaggi                    break;
5922adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi                case MSG_APP_TRANSITION_FINISHED:
59349fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
59449fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).appTransitionFinished();
595b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
5962adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi                    break;
5974f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos                case MSG_ASSIST_DISCLOSURE:
59849fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
59949fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).showAssistDisclosure();
600b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
6014f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos                    break;
602165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi                case MSG_START_ASSIST:
60349fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
60449fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).startAssist((Bundle) msg.obj);
605b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
606165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi                    break;
607372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek                case MSG_CAMERA_LAUNCH_GESTURE:
60849fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
60949fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).onCameraLaunchGestureDetected(msg.arg1);
610b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
611372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek                    break;
612ac52f2892d5c72c26387d510093ddfc741a8a632Winson Chung                case MSG_SHOW_PICTURE_IN_PICTURE_MENU:
61349fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
614ac52f2892d5c72c26387d510093ddfc741a8a632Winson Chung                        mCallbacks.get(i).showPictureInPictureMenu();
615b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
616c552b04cb4aac9d31dbaf9744f32ddc14886e222Jaewan Kim                    break;
6177e53f20c835ae2614c92717a6fc222b345c75036Jason Monk                case MSG_ADD_QS_TILE:
61849fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
61949fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).addQsTile((ComponentName) msg.obj);
620b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
6217e53f20c835ae2614c92717a6fc222b345c75036Jason Monk                    break;
6227e53f20c835ae2614c92717a6fc222b345c75036Jason Monk                case MSG_REMOVE_QS_TILE:
62349fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
62449fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).remQsTile((ComponentName) msg.obj);
625b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
6267e53f20c835ae2614c92717a6fc222b345c75036Jason Monk                    break;
6277e53f20c835ae2614c92717a6fc222b345c75036Jason Monk                case MSG_CLICK_QS_TILE:
62849fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
62949fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).clickTile((ComponentName) msg.obj);
630b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
6317e53f20c835ae2614c92717a6fc222b345c75036Jason Monk                    break;
632315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver                case MSG_TOGGLE_APP_SPLIT_SCREEN:
63349fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
63449fa016a98cef9940c883b3f620a0e90537a204eJason Monk                        mCallbacks.get(i).toggleSplitScreen();
635b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
636315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver                    break;
637c3a503d8fd505d3f14b52d4af1c6e2509de7d6b5Philip Quinn                case MSG_HANDLE_SYSTEM_KEY:
63849fa016a98cef9940c883b3f620a0e90537a204eJason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
639c3a503d8fd505d3f14b52d4af1c6e2509de7d6b5Philip Quinn                        mCallbacks.get(i).handleSystemKey(msg.arg1);
640b5b0920170916e92b49f693df6e8580a785f81baJason Monk                    }
64107e0384a4e931bc94550c108ddd9b9514100161eJim Miller                    break;
642361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk                case MSG_SHOW_GLOBAL_ACTIONS:
643361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
644361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk                        mCallbacks.get(i).handleShowGlobalActionsMenu();
645361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk                    }
646361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk                    break;
647b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk                case MSG_SHOW_SHUTDOWN_UI:
648b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk                    for (int i = 0; i < mCallbacks.size(); i++) {
649b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk                        mCallbacks.get(i).handleShowShutdownUi(msg.arg1 != 0, (String) msg.obj);
650b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk                    }
651b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk                    break;
6523a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek                case MSG_SET_TOP_APP_HIDES_STATUS_BAR:
6533a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek                    for (int i = 0; i < mCallbacks.size(); i++) {
6543a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek                        mCallbacks.get(i).setTopAppHidesStatusBar(msg.arg1 != 0);
6553a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek                    }
6563a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek                    break;
6570cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            }
6580cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
6590cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    }
660b5b0920170916e92b49f693df6e8580a785f81baJason Monk
661b5b0920170916e92b49f693df6e8580a785f81baJason Monk    // Need this class since CommandQueue already extends IStatusBar.Stub, so CommandQueueStart
662b5b0920170916e92b49f693df6e8580a785f81baJason Monk    // is needed so it can extend SystemUI.
663b5b0920170916e92b49f693df6e8580a785f81baJason Monk    public static class CommandQueueStart extends SystemUI {
664b5b0920170916e92b49f693df6e8580a785f81baJason Monk        @Override
665b5b0920170916e92b49f693df6e8580a785f81baJason Monk        public void start() {
666b5b0920170916e92b49f693df6e8580a785f81baJason Monk            putComponent(CommandQueue.class, new CommandQueue());
667b5b0920170916e92b49f693df6e8580a785f81baJason Monk        }
668b5b0920170916e92b49f693df6e8580a785f81baJason Monk    }
6690cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato}
6700cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
671