• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
17 package com.android.systemui.statusbar;
18 
19 import static android.app.StatusBarManager.DISABLE2_NONE;
20 import static android.app.StatusBarManager.DISABLE_NONE;
21 import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT;
22 import static android.view.Display.INVALID_DISPLAY;
23 
24 import android.annotation.Nullable;
25 import android.app.ITransientNotificationCallback;
26 import android.app.StatusBarManager;
27 import android.app.StatusBarManager.Disable2Flags;
28 import android.app.StatusBarManager.DisableFlags;
29 import android.app.StatusBarManager.WindowType;
30 import android.app.StatusBarManager.WindowVisibleState;
31 import android.content.ComponentName;
32 import android.content.Context;
33 import android.graphics.drawable.Icon;
34 import android.hardware.biometrics.BiometricAuthenticator.Modality;
35 import android.hardware.biometrics.IBiometricContextListener;
36 import android.hardware.biometrics.IBiometricSysuiReceiver;
37 import android.hardware.biometrics.PromptInfo;
38 import android.hardware.fingerprint.IUdfpsRefreshRateRequestCallback;
39 import android.inputmethodservice.InputMethodService.BackDispositionMode;
40 import android.inputmethodservice.InputMethodService.ImeWindowVisibility;
41 import android.media.INearbyMediaDevicesProvider;
42 import android.media.MediaRoute2Info;
43 import android.os.Binder;
44 import android.os.Bundle;
45 import android.os.Handler;
46 import android.os.HandlerExecutor;
47 import android.os.IBinder;
48 import android.os.Looper;
49 import android.os.Message;
50 import android.os.ParcelFileDescriptor;
51 import android.os.Process;
52 import android.os.RemoteException;
53 import android.os.UserHandle;
54 import android.os.UserManager;
55 import android.util.Pair;
56 import android.util.SparseArray;
57 import android.view.KeyEvent;
58 import android.view.WindowInsets.Type.InsetsType;
59 import android.view.WindowInsetsController.Appearance;
60 import android.view.WindowInsetsController.Behavior;
61 
62 import androidx.annotation.NonNull;
63 import androidx.annotation.VisibleForTesting;
64 
65 import com.android.internal.annotations.KeepForWeakReference;
66 import com.android.internal.os.SomeArgs;
67 import com.android.internal.statusbar.DisableStates;
68 import com.android.internal.statusbar.IAddTileResultCallback;
69 import com.android.internal.statusbar.IStatusBar;
70 import com.android.internal.statusbar.IUndoMediaTransferCallback;
71 import com.android.internal.statusbar.LetterboxDetails;
72 import com.android.internal.statusbar.StatusBarIcon;
73 import com.android.internal.util.GcUtils;
74 import com.android.internal.view.AppearanceRegion;
75 import com.android.systemui.dump.DumpHandler;
76 import com.android.systemui.power.domain.interactor.PowerInteractor;
77 import com.android.systemui.settings.DisplayTracker;
78 import com.android.systemui.statusbar.CommandQueue.Callbacks;
79 import com.android.systemui.statusbar.commandline.CommandRegistry;
80 import com.android.systemui.statusbar.policy.CallbackController;
81 
82 import dagger.Lazy;
83 
84 import java.io.FileDescriptor;
85 import java.io.FileOutputStream;
86 import java.io.OutputStream;
87 import java.io.PrintWriter;
88 import java.util.ArrayList;
89 import java.util.Map;
90 
91 /**
92  * This class takes the functions from IStatusBar that come in on
93  * binder pool threads and posts messages to get them onto the main
94  * thread, and calls onto Callbacks.  It also takes care of
95  * coalescing these calls so they don't stack up.  For the calls
96  * are coalesced, note that they are all idempotent.
97  */
98 public class CommandQueue extends IStatusBar.Stub implements
99         CallbackController<Callbacks> {
100     private static final String TAG = CommandQueue.class.getSimpleName();
101 
102     private static final int INDEX_MASK = 0xffff;
103     private static final int MSG_SHIFT  = 16;
104     private static final int MSG_MASK   = 0xffff << MSG_SHIFT;
105 
106     private static final int OP_SET_ICON    = 1;
107     private static final int OP_REMOVE_ICON = 2;
108 
109     private static final int MSG_ICON                              = 1 << MSG_SHIFT;
110     private static final int MSG_DISABLE                           = 2 << MSG_SHIFT;
111     private static final int MSG_EXPAND_NOTIFICATIONS              = 3 << MSG_SHIFT;
112     private static final int MSG_COLLAPSE_PANELS                   = 4 << MSG_SHIFT;
113     private static final int MSG_EXPAND_SETTINGS                   = 5 << MSG_SHIFT;
114     private static final int MSG_SYSTEM_BAR_CHANGED                = 6 << MSG_SHIFT;
115     private static final int MSG_DISPLAY_ADD_SYSTEM_DECORATIONS    = 7 << MSG_SHIFT;
116     private static final int MSG_SHOW_IME_BUTTON                   = 8 << MSG_SHIFT;
117     private static final int MSG_TOGGLE_RECENT_APPS                = 9 << MSG_SHIFT;
118     private static final int MSG_PRELOAD_RECENT_APPS               = 10 << MSG_SHIFT;
119     private static final int MSG_CANCEL_PRELOAD_RECENT_APPS        = 11 << MSG_SHIFT;
120     private static final int MSG_SET_WINDOW_STATE                  = 12 << MSG_SHIFT;
121     private static final int MSG_SHOW_RECENT_APPS                  = 13 << MSG_SHIFT;
122     private static final int MSG_HIDE_RECENT_APPS                  = 14 << MSG_SHIFT;
123     private static final int MSG_SHOW_SCREEN_PIN_REQUEST           = 18 << MSG_SHIFT;
124     private static final int MSG_APP_TRANSITION_PENDING            = 19 << MSG_SHIFT;
125     private static final int MSG_APP_TRANSITION_CANCELLED          = 20 << MSG_SHIFT;
126     private static final int MSG_APP_TRANSITION_STARTING           = 21 << MSG_SHIFT;
127     private static final int MSG_ASSIST_DISCLOSURE                 = 22 << MSG_SHIFT;
128     private static final int MSG_START_ASSIST                      = 23 << MSG_SHIFT;
129     private static final int MSG_CAMERA_LAUNCH_GESTURE             = 24 << MSG_SHIFT;
130     private static final int MSG_TOGGLE_KEYBOARD_SHORTCUTS         = 25 << MSG_SHIFT;
131     private static final int MSG_SHOW_PICTURE_IN_PICTURE_MENU      = 26 << MSG_SHIFT;
132     private static final int MSG_ADD_QS_TILE                       = 27 << MSG_SHIFT;
133     private static final int MSG_REMOVE_QS_TILE                    = 28 << MSG_SHIFT;
134     private static final int MSG_CLICK_QS_TILE                     = 29 << MSG_SHIFT;
135     private static final int MSG_TOGGLE_APP_SPLIT_SCREEN           = 30 << MSG_SHIFT;
136     private static final int MSG_APP_TRANSITION_FINISHED           = 31 << MSG_SHIFT;
137     private static final int MSG_DISMISS_KEYBOARD_SHORTCUTS        = 32 << MSG_SHIFT;
138     private static final int MSG_HANDLE_SYSTEM_KEY                 = 33 << MSG_SHIFT;
139     private static final int MSG_SHOW_GLOBAL_ACTIONS               = 34 << MSG_SHIFT;
140     private static final int MSG_TOGGLE_NOTIFICATION_PANEL         = 35 << MSG_SHIFT;
141     private static final int MSG_SHOW_SHUTDOWN_UI                  = 36 << MSG_SHIFT;
142     private static final int MSG_SET_TOP_APP_HIDES_STATUS_BAR      = 37 << MSG_SHIFT;
143     private static final int MSG_ROTATION_PROPOSAL                 = 38 << MSG_SHIFT;
144     private static final int MSG_BIOMETRIC_SHOW                    = 39 << MSG_SHIFT;
145     private static final int MSG_BIOMETRIC_AUTHENTICATED           = 40 << MSG_SHIFT;
146     private static final int MSG_BIOMETRIC_HELP                    = 41 << MSG_SHIFT;
147     private static final int MSG_BIOMETRIC_ERROR                   = 42 << MSG_SHIFT;
148     private static final int MSG_BIOMETRIC_HIDE                    = 43 << MSG_SHIFT;
149     private static final int MSG_SHOW_CHARGING_ANIMATION           = 44 << MSG_SHIFT;
150     private static final int MSG_SHOW_PINNING_TOAST_ENTER_EXIT     = 45 << MSG_SHIFT;
151     private static final int MSG_SHOW_PINNING_TOAST_ESCAPE         = 46 << MSG_SHIFT;
152     private static final int MSG_RECENTS_ANIMATION_STATE_CHANGED   = 47 << MSG_SHIFT;
153     private static final int MSG_SHOW_TRANSIENT                    = 48 << MSG_SHIFT;
154     private static final int MSG_ABORT_TRANSIENT                   = 49 << MSG_SHIFT;
155     private static final int MSG_SHOW_INATTENTIVE_SLEEP_WARNING    = 50 << MSG_SHIFT;
156     private static final int MSG_DISMISS_INATTENTIVE_SLEEP_WARNING = 51 << MSG_SHIFT;
157     private static final int MSG_SHOW_TOAST                        = 52 << MSG_SHIFT;
158     private static final int MSG_HIDE_TOAST                        = 53 << MSG_SHIFT;
159     private static final int MSG_TRACING_STATE_CHANGED             = 54 << MSG_SHIFT;
160     private static final int MSG_SUPPRESS_AMBIENT_DISPLAY          = 55 << MSG_SHIFT;
161     private static final int MSG_REQUEST_MAGNIFICATION_CONNECTION = 56 << MSG_SHIFT;
162     //TODO(b/169175022) Update name and when feature name is locked.
163     private static final int MSG_EMERGENCY_ACTION_LAUNCH_GESTURE      = 58 << MSG_SHIFT;
164     private static final int MSG_SET_NAVIGATION_BAR_LUMA_SAMPLING_ENABLED = 59 << MSG_SHIFT;
165     private static final int MSG_SET_UDFPS_REFRESH_RATE_CALLBACK = 60 << MSG_SHIFT;
166     private static final int MSG_TILE_SERVICE_REQUEST_ADD = 61 << MSG_SHIFT;
167     private static final int MSG_TILE_SERVICE_REQUEST_CANCEL = 62 << MSG_SHIFT;
168     private static final int MSG_SET_BIOMETRICS_LISTENER = 63 << MSG_SHIFT;
169     private static final int MSG_MEDIA_TRANSFER_SENDER_STATE = 64 << MSG_SHIFT;
170     private static final int MSG_MEDIA_TRANSFER_RECEIVER_STATE = 65 << MSG_SHIFT;
171     private static final int MSG_REGISTER_NEARBY_MEDIA_DEVICE_PROVIDER = 66 << MSG_SHIFT;
172     private static final int MSG_UNREGISTER_NEARBY_MEDIA_DEVICE_PROVIDER = 67 << MSG_SHIFT;
173     private static final int MSG_TILE_SERVICE_REQUEST_LISTENING_STATE = 68 << MSG_SHIFT;
174     private static final int MSG_SHOW_REAR_DISPLAY_DIALOG = 69 << MSG_SHIFT;
175     private static final int MSG_MOVE_FOCUSED_TASK_TO_FULLSCREEN = 70 << MSG_SHIFT;
176     private static final int MSG_MOVE_FOCUSED_TASK_TO_STAGE_SPLIT = 71 << MSG_SHIFT;
177     private static final int MSG_SHOW_MEDIA_OUTPUT_SWITCHER = 72 << MSG_SHIFT;
178     private static final int MSG_TOGGLE_TASKBAR = 73 << MSG_SHIFT;
179     private static final int MSG_SETTING_CHANGED = 74 << MSG_SHIFT;
180     private static final int MSG_LOCK_TASK_MODE_CHANGED = 75 << MSG_SHIFT;
181     private static final int MSG_CONFIRM_IMMERSIVE_PROMPT = 77 << MSG_SHIFT;
182     private static final int MSG_IMMERSIVE_CHANGED = 78 << MSG_SHIFT;
183     private static final int MSG_SET_QS_TILES = 79 << MSG_SHIFT;
184     private static final int MSG_ENTER_DESKTOP = 80 << MSG_SHIFT;
185     private static final int MSG_SET_SPLITSCREEN_FOCUS = 81 << MSG_SHIFT;
186     private static final int MSG_TOGGLE_QUICK_SETTINGS_PANEL = 82 << MSG_SHIFT;
187     private static final int MSG_WALLET_ACTION_LAUNCH_GESTURE = 83 << MSG_SHIFT;
188     private static final int MSG_DISPLAY_REMOVE_SYSTEM_DECORATIONS = 85 << MSG_SHIFT;
189     private static final int MSG_DISABLE_ALL  = 86 << MSG_SHIFT;
190 
191     public static final int FLAG_EXCLUDE_NONE = 0;
192     public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
193     public static final int FLAG_EXCLUDE_RECENTS_PANEL = 1 << 1;
194     public static final int FLAG_EXCLUDE_NOTIFICATION_PANEL = 1 << 2;
195     public static final int FLAG_EXCLUDE_INPUT_METHODS_PANEL = 1 << 3;
196     public static final int FLAG_EXCLUDE_COMPAT_MODE_PANEL = 1 << 4;
197 
198     private static final String SHOW_IME_SWITCHER_KEY = "showImeSwitcherKey";
199 
200     private final Object mLock = new Object();
201     private final ArrayList<Callbacks> mCallbacks = new ArrayList<>();
202     private final Handler mHandler = new H(Looper.getMainLooper());
203     /** A map of display id - disable flag pair */
204     private final SparseArray<Pair<Integer, Integer>> mDisplayDisabled = new SparseArray<>();
205     /**
206      * The last ID of the display where IME window for which we received setImeWindowStatus
207      * event.
208      */
209     private int mLastUpdatedImeDisplayId = INVALID_DISPLAY;
210     private final Context mContext;
211     private final DisplayTracker mDisplayTracker;
212     private final @Nullable CommandRegistry mRegistry;
213     private final @Nullable DumpHandler mDumpHandler;
214     private final @Nullable Lazy<PowerInteractor> mPowerInteractor;
215 
216     @KeepForWeakReference
217     private final DisplayTracker.Callback mDisplayTrackerCallback = new DisplayTracker.Callback() {
218         @Override
219         public void onDisplayRemoved(int displayId) {
220             synchronized (mLock) {
221                 mDisplayDisabled.remove(displayId);
222             }
223             // This callback is registered with {@link #mHandler} that already posts to run on
224             // main thread, so it is safe to dispatch directly.
225             for (int i = mCallbacks.size() - 1; i >= 0; i--) {
226                 mCallbacks.get(i).onDisplayRemoved(displayId);
227             }
228         }
229     };
230 
231     /**
232      * These methods are called back on the main thread.
233      */
234     public interface Callbacks {
setIcon(String slot, StatusBarIcon icon)235         default void setIcon(String slot, StatusBarIcon icon) { }
removeIcon(String slot)236         default void removeIcon(String slot) { }
237 
238         /**
239          * Called to notify that disable flags are updated.
240          * @see IStatusBar#disable(int, int, int).
241          *
242          * @param displayId The id of the display to notify.
243          * @param state1 The combination of following DISABLE_* flags:
244          * @param state2 The combination of following DISABLE2_* flags:
245          * @param animate {@code true} to show animations.
246          */
disable(int displayId, @DisableFlags int state1, @Disable2Flags int state2, boolean animate)247         default void disable(int displayId, @DisableFlags int state1, @Disable2Flags int state2,
248                 boolean animate) { }
249 
250         /**
251          * Called to expand Notifications panel with animation.
252          */
animateExpandNotificationsPanel()253         default void animateExpandNotificationsPanel() { }
254         /**
255          * Called to collapse Notifications panel with animation.
256          * @param flags Exclusion flags. See {@link FLAG_EXCLUDE_NONE}.
257          * @param force True to force the operation.
258          */
animateCollapsePanels(int flags, boolean force)259         default void animateCollapsePanels(int flags, boolean force) { }
260 
261         /**
262          * Called to toggle Notifications panel.
263          */
toggleNotificationsPanel()264         default void toggleNotificationsPanel() { }
265 
266         /**
267          * Called to expand Quick Settings panel with animation.
268          * @param subPanel subPanel one wish to expand.
269          */
animateExpandSettingsPanel(String subPanel)270         default void animateExpandSettingsPanel(String subPanel) { }
271 
272         /**
273          * Called to toggle Quick Settings panel.
274          */
toggleQuickSettingsPanel()275         default void toggleQuickSettingsPanel() { }
276 
277         /**
278          * Sets the new IME window status.
279          *
280          * @param displayId The id of the display to which the IME is bound.
281          * @param vis The IME window visibility.
282          * @param backDisposition The IME back disposition mode.
283          * @param showImeSwitcher Whether the IME Switcher button should be shown.
284          */
setImeWindowStatus(int displayId, @ImeWindowVisibility int vis, @BackDispositionMode int backDisposition, boolean showImeSwitcher)285         default void setImeWindowStatus(int displayId, @ImeWindowVisibility int vis,
286                 @BackDispositionMode int backDisposition, boolean showImeSwitcher) { }
showRecentApps(boolean triggeredFromAltTab)287         default void showRecentApps(boolean triggeredFromAltTab) { }
hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey)288         default void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) { }
toggleTaskbar()289         default void toggleTaskbar() { }
toggleRecentApps()290         default void toggleRecentApps() { }
toggleSplitScreen()291         default void toggleSplitScreen() { }
preloadRecentApps()292         default void preloadRecentApps() { }
dismissKeyboardShortcutsMenu()293         default void dismissKeyboardShortcutsMenu() { }
toggleKeyboardShortcutsMenu(int deviceId)294         default void toggleKeyboardShortcutsMenu(int deviceId) { }
cancelPreloadRecentApps()295         default void cancelPreloadRecentApps() { }
296 
297         /**
298          * Called to notify window state changes.
299          * @see IStatusBar#setWindowState(int, int, int)
300          *
301          * @param displayId The id of the display to notify.
302          * @param window Window type. It should be one of {@link StatusBarManager#WINDOW_STATUS_BAR}
303          *               or {@link StatusBarManager#WINDOW_NAVIGATION_BAR}
304          * @param state Window visible state.
305          */
setWindowState(int displayId, @WindowType int window, @WindowVisibleState int state)306         default void setWindowState(int displayId, @WindowType int window,
307                 @WindowVisibleState int state) { }
showScreenPinningRequest(int taskId)308         default void showScreenPinningRequest(int taskId) { }
309 
310         /**
311          * Called to notify System UI that an application transition is pending.
312          * @see IStatusBar#appTransitionPending(int).
313          *
314          * @param displayId The id of the display to notify.
315          * @param forced {@code true} to force transition pending.
316          */
appTransitionPending(int displayId, boolean forced)317         default void appTransitionPending(int displayId, boolean forced) { }
318 
319         /**
320          * Called to notify System UI that an application transition is canceled.
321          * @see IStatusBar#appTransitionCancelled(int).
322          *
323          * @param displayId The id of the display to notify.
324          */
appTransitionCancelled(int displayId)325         default void appTransitionCancelled(int displayId) { }
326 
327         /**
328          * Called to notify System UI that an application transition is starting.
329          * @see IStatusBar#appTransitionStarting(int, long, long).
330          *
331          * @param displayId The id of the display to notify.
332          * @param startTime Transition start time.
333          * @param duration Transition duration.
334          * @param forced {@code true} to force transition pending.
335          */
appTransitionStarting( int displayId, long startTime, long duration, boolean forced)336         default void appTransitionStarting(
337                 int displayId, long startTime, long duration, boolean forced) { }
338 
339         /**
340          * Called to notify System UI that an application transition is finished.
341          * @see IStatusBar#appTransitionFinished(int)
342          *
343          * @param displayId The id of the display to notify.
344          */
appTransitionFinished(int displayId)345         default void appTransitionFinished(int displayId) { }
showAssistDisclosure()346         default void showAssistDisclosure() { }
startAssist(Bundle args)347         default void startAssist(Bundle args) { }
onCameraLaunchGestureDetected(int source)348         default void onCameraLaunchGestureDetected(int source) { }
349 
350         /**
351          * Notifies SysUI that the wallet launch gesture was detected.
352          */
onWalletLaunchGestureDetected()353         default void onWalletLaunchGestureDetected() {}
354 
355         /**
356          * Notifies SysUI that the emergency action gesture was detected.
357          */
onEmergencyActionLaunchGestureDetected()358         default void onEmergencyActionLaunchGestureDetected() { }
showPictureInPictureMenu()359         default void showPictureInPictureMenu() { }
setTopAppHidesStatusBar(boolean topAppHidesStatusBar)360         default void setTopAppHidesStatusBar(boolean topAppHidesStatusBar) { }
361 
addQsTile(ComponentName tile)362         default void addQsTile(ComponentName tile) { }
363 
364         /**
365          * Add a tile to the Quick Settings Panel
366          * @param tile the ComponentName of the {@link android.service.quicksettings.TileService}
367          * @param end if true, the tile will be added at the end. If false, at the beginning.
368          */
addQsTileToFrontOrEnd(ComponentName tile, boolean end)369         default void addQsTileToFrontOrEnd(ComponentName tile, boolean end) { }
remQsTile(ComponentName tile)370         default void remQsTile(ComponentName tile) { }
371 
setQsTiles(String[] tiles)372         default void setQsTiles(String[] tiles) {}
clickTile(ComponentName tile)373         default void clickTile(ComponentName tile) { }
374 
handleSystemKey(KeyEvent arg1)375         default void handleSystemKey(KeyEvent arg1) { }
showPinningEnterExitToast(boolean entering)376         default void showPinningEnterExitToast(boolean entering) { }
showPinningEscapeToast()377         default void showPinningEscapeToast() { }
handleShowGlobalActionsMenu()378         default void handleShowGlobalActionsMenu() { }
handleShowShutdownUi(boolean isReboot, String reason)379         default void handleShowShutdownUi(boolean isReboot, String reason) { }
380 
showWirelessChargingAnimation(int batteryLevel)381         default void showWirelessChargingAnimation(int batteryLevel) {  }
382 
onRotationProposal(int rotation, boolean isValid)383         default void onRotationProposal(int rotation, boolean isValid) { }
384 
showAuthenticationDialog(PromptInfo promptInfo, IBiometricSysuiReceiver receiver, int[] sensorIds, boolean credentialAllowed, boolean requireConfirmation, int userId, long operationId, String opPackageName, long requestId)385         default void showAuthenticationDialog(PromptInfo promptInfo,
386                 IBiometricSysuiReceiver receiver,
387                 int[] sensorIds, boolean credentialAllowed,
388                 boolean requireConfirmation, int userId, long operationId, String opPackageName,
389                 long requestId) {
390         }
391 
392         /** @see IStatusBar#onBiometricAuthenticated(int) */
onBiometricAuthenticated(@odality int modality)393         default void onBiometricAuthenticated(@Modality int modality) {
394         }
395 
396         /** @see IStatusBar#onBiometricHelp(int, String) */
onBiometricHelp(@odality int modality, String message)397         default void onBiometricHelp(@Modality int modality, String message) {
398         }
399 
400         /** @see IStatusBar#onBiometricError(int, int, int) */
onBiometricError(@odality int modality, int error, int vendorCode)401         default void onBiometricError(@Modality int modality, int error, int vendorCode) {
402         }
403 
hideAuthenticationDialog(long requestId)404         default void hideAuthenticationDialog(long requestId) {
405         }
406 
407         /**
408          * @see IStatusBar#setBiometicContextListener(IBiometricContextListener)
409          */
setBiometricContextListener(IBiometricContextListener listener)410         default void setBiometricContextListener(IBiometricContextListener listener) {
411         }
412 
413         /**
414          * @see IStatusBar#setUdfpsRefreshRateCallback(IUdfpsRefreshRateRequestCallback)
415          */
setUdfpsRefreshRateCallback(IUdfpsRefreshRateRequestCallback callback)416         default void setUdfpsRefreshRateCallback(IUdfpsRefreshRateRequestCallback callback) {
417         }
418 
419         /**
420          * @see IStatusBar#onDisplayAddSystemDecorations(int)
421          */
onDisplayAddSystemDecorations(int displayId)422         default void onDisplayAddSystemDecorations(int displayId) {
423         }
424 
425         /**
426          * @see IStatusBar#onDisplayRemoveSystemDecorations(int)
427          */
onDisplayRemoveSystemDecorations(int displayId)428         default void onDisplayRemoveSystemDecorations(int displayId) {
429         }
430 
431         /**
432          * @see DisplayTracker.Callback#onDisplayRemoved(int)
433          */
onDisplayRemoved(int displayId)434         default void onDisplayRemoved(int displayId) {
435         }
436 
437         /**
438          * @see IStatusBar#onRecentsAnimationStateChanged(boolean)
439          */
onRecentsAnimationStateChanged(boolean running)440         default void onRecentsAnimationStateChanged(boolean running) { }
441 
442         /**
443          * @see IStatusBar#onSystemBarAttributesChanged
444          */
onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, @Behavior int behavior, @InsetsType int requestedVisibleTypes, String packageName, LetterboxDetails[] letterboxDetails)445         default void onSystemBarAttributesChanged(int displayId, @Appearance int appearance,
446                 AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme,
447                 @Behavior int behavior, @InsetsType int requestedVisibleTypes,
448                 String packageName, LetterboxDetails[] letterboxDetails) { }
449 
450         /**
451          * @see IStatusBar#showTransient(int, int, boolean).
452          */
showTransient(int displayId, @InsetsType int types, boolean isGestureOnSystemBar)453         default void showTransient(int displayId, @InsetsType int types,
454                 boolean isGestureOnSystemBar) {}
455 
456         /**
457          * @see IStatusBar#abortTransient(int, int).
458          */
abortTransient(int displayId, @InsetsType int types)459         default void abortTransient(int displayId, @InsetsType int types) { }
460 
461         /**
462          * Called to notify System UI that a warning about the device going to sleep
463          * due to prolonged user inactivity should be shown.
464          */
showInattentiveSleepWarning()465         default void showInattentiveSleepWarning() { }
466 
467         /**
468          * Called to notify System UI that the warning about the device going to sleep
469          * due to prolonged user inactivity should be dismissed.
470          */
dismissInattentiveSleepWarning(boolean animated)471         default void dismissInattentiveSleepWarning(boolean animated) { }
472 
473         /** Called to suppress ambient display. */
suppressAmbientDisplay(boolean suppress)474         default void suppressAmbientDisplay(boolean suppress) { }
475 
476         /**
477          * @see IStatusBar#showToast(int, String, IBinder, CharSequence, IBinder, int,
478          * ITransientNotificationCallback, int)
479          */
showToast(int uid, String packageName, IBinder token, CharSequence text, IBinder windowToken, int duration, @Nullable ITransientNotificationCallback callback, int displayId)480         default void showToast(int uid, String packageName, IBinder token, CharSequence text,
481                 IBinder windowToken, int duration,
482                 @Nullable ITransientNotificationCallback callback, int displayId) { }
483 
484         /**
485          * @see IStatusBar#hideToast(String, IBinder) (String, IBinder)
486          */
hideToast(String packageName, IBinder token)487         default void hideToast(String packageName, IBinder token) { }
488 
489         /**
490          * @param enabled
491          */
onTracingStateChanged(boolean enabled)492         default void onTracingStateChanged(boolean enabled) { }
493 
494         /**
495          * Requests {@link com.android.systemui.accessibility.Magnification} to invoke
496          * {@code android.view.accessibility.AccessibilityManager#
497          * setMagnificationConnection(IMagnificationConnection)}
498          *
499          * @param connect {@code true} if needs connection, otherwise set the connection to null.
500          */
requestMagnificationConnection(boolean connect)501         default void requestMagnificationConnection(boolean connect) { }
502 
503         /**
504          * @see IStatusBar#setNavigationBarLumaSamplingEnabled(int, boolean)
505          */
setNavigationBarLumaSamplingEnabled(int displayId, boolean enable)506         default void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable) {}
507 
508         /**
509          * @see IStatusBar#requestTileServiceListeningState
510          */
requestTileServiceListeningState(@onNull ComponentName componentName)511         default void requestTileServiceListeningState(@NonNull ComponentName componentName) {}
512 
513         /**
514          * @see IStatusBar#requestAddTile
515          */
requestAddTile( int callingUid, @NonNull ComponentName componentName, @NonNull CharSequence appName, @NonNull CharSequence label, @NonNull Icon icon, @NonNull IAddTileResultCallback callback)516         default void requestAddTile(
517                 int callingUid,
518                 @NonNull ComponentName componentName,
519                 @NonNull CharSequence appName,
520                 @NonNull CharSequence label,
521                 @NonNull Icon icon,
522                 @NonNull IAddTileResultCallback callback) {}
523 
524         /**
525          * @see IStatusBar#cancelRequestAddTile
526          */
cancelRequestAddTile(@onNull String packageName)527         default void cancelRequestAddTile(@NonNull String packageName) {}
528 
529         /** @see IStatusBar#updateMediaTapToTransferSenderDisplay */
updateMediaTapToTransferSenderDisplay( @tatusBarManager.MediaTransferSenderState int displayState, @NonNull MediaRoute2Info routeInfo, @Nullable IUndoMediaTransferCallback undoCallback)530         default void updateMediaTapToTransferSenderDisplay(
531                 @StatusBarManager.MediaTransferSenderState int displayState,
532                 @NonNull MediaRoute2Info routeInfo,
533                 @Nullable IUndoMediaTransferCallback undoCallback) {}
534 
535         /** @see IStatusBar#updateMediaTapToTransferReceiverDisplay */
updateMediaTapToTransferReceiverDisplay( @tatusBarManager.MediaTransferReceiverState int displayState, @NonNull MediaRoute2Info routeInfo, @Nullable Icon appIcon, @Nullable CharSequence appName)536         default void updateMediaTapToTransferReceiverDisplay(
537                 @StatusBarManager.MediaTransferReceiverState int displayState,
538                 @NonNull MediaRoute2Info routeInfo,
539                 @Nullable Icon appIcon,
540                 @Nullable CharSequence appName) {}
541 
542         /**
543          * @see IStatusBar#registerNearbyMediaDevicesProvider
544          */
registerNearbyMediaDevicesProvider( @onNull INearbyMediaDevicesProvider provider)545         default void registerNearbyMediaDevicesProvider(
546                 @NonNull INearbyMediaDevicesProvider provider) {}
547 
548         /**
549          * @see IStatusBar#unregisterNearbyMediaDevicesProvider
550          */
unregisterNearbyMediaDevicesProvider( @onNull INearbyMediaDevicesProvider provider)551         default void unregisterNearbyMediaDevicesProvider(
552                 @NonNull INearbyMediaDevicesProvider provider) {}
553 
554         /**
555          * @see IStatusBar#showRearDisplayDialog
556          */
showRearDisplayDialog(int currentBaseState)557         default void showRearDisplayDialog(int currentBaseState) {}
558 
559         /**
560          * @see IStatusBar#moveFocusedTaskToFullscreen
561          */
moveFocusedTaskToFullscreen(int displayId)562         default void moveFocusedTaskToFullscreen(int displayId) {}
563 
564         /**
565          * @see IStatusBar#moveFocusedTaskToStageSplit
566          */
moveFocusedTaskToStageSplit(int displayId, boolean leftOrTop)567         default void moveFocusedTaskToStageSplit(int displayId, boolean leftOrTop) {}
568 
569         /**
570          * @see IStatusBar#setSplitscreenFocus
571          */
setSplitscreenFocus(boolean leftOrTop)572         default void setSplitscreenFocus(boolean leftOrTop) {}
573 
574         /**
575          * @see IStatusBar#showMediaOutputSwitcher
576          */
showMediaOutputSwitcher(String packageName, UserHandle userHandle)577         default void showMediaOutputSwitcher(String packageName, UserHandle userHandle) {}
578 
579         /**
580          * @see IStatusBar#confirmImmersivePrompt
581          */
confirmImmersivePrompt()582         default void confirmImmersivePrompt() {}
583 
584         /**
585          * @see IStatusBar#immersiveModeChanged
586          */
immersiveModeChanged(int rootDisplayAreaId, boolean isImmersiveMode, int windowType)587         default void immersiveModeChanged(int rootDisplayAreaId, boolean isImmersiveMode,
588                 int windowType) {}
589 
590         /**
591          * @see IStatusBar#moveFocusedTaskToDesktop(int)
592          */
moveFocusedTaskToDesktop(int displayId)593         default void moveFocusedTaskToDesktop(int displayId) {}
594     }
595 
596     @VisibleForTesting
CommandQueue(Context context, DisplayTracker displayTracker)597     public CommandQueue(Context context, DisplayTracker displayTracker) {
598         this(context, displayTracker, null, null, null);
599     }
600 
CommandQueue( Context context, DisplayTracker displayTracker, CommandRegistry registry, DumpHandler dumpHandler, Lazy<PowerInteractor> powerInteractor )601     public CommandQueue(
602             Context context,
603             DisplayTracker displayTracker,
604             CommandRegistry registry,
605             DumpHandler dumpHandler,
606             Lazy<PowerInteractor> powerInteractor
607     ) {
608         mContext = context;
609         mDisplayTracker = displayTracker;
610         mRegistry = registry;
611         mDumpHandler = dumpHandler;
612         mDisplayTracker.addDisplayChangeCallback(mDisplayTrackerCallback,
613                 new HandlerExecutor(mHandler));
614         // We always have default display.
615         setDisabled(mDisplayTracker.getDefaultDisplayId(), DISABLE_NONE, DISABLE2_NONE);
616         mPowerInteractor = powerInteractor;
617     }
618 
619     // TODO(b/118592525): add multi-display support if needed.
panelsEnabled()620     public boolean panelsEnabled() {
621         final int disabled1 = getDisabled1(mDisplayTracker.getDefaultDisplayId());
622         final int disabled2 = getDisabled2(mDisplayTracker.getDefaultDisplayId());
623         return (disabled1 & StatusBarManager.DISABLE_EXPAND) == 0
624                 && (disabled2 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) == 0;
625     }
626 
627     @Override
addCallback(@onNull Callbacks callbacks)628     public void addCallback(@NonNull Callbacks callbacks) {
629         mCallbacks.add(callbacks);
630         // TODO(b/117478341): find a better way to pass disable flags by display.
631         for (int i = 0; i < mDisplayDisabled.size(); i++) {
632             int displayId = mDisplayDisabled.keyAt(i);
633             int disabled1 = getDisabled1(displayId);
634             int disabled2 = getDisabled2(displayId);
635             callbacks.disable(displayId, disabled1, disabled2, false /* animate */);
636         }
637     }
638 
639     @Override
removeCallback(@onNull Callbacks callbacks)640     public void removeCallback(@NonNull Callbacks callbacks) {
641         mCallbacks.remove(callbacks);
642     }
643 
setIcon(String slot, StatusBarIcon icon)644     public void setIcon(String slot, StatusBarIcon icon) {
645         synchronized (mLock) {
646             // don't coalesce these
647             mHandler.obtainMessage(MSG_ICON, OP_SET_ICON, 0,
648                     new Pair<String, StatusBarIcon>(slot, icon)).sendToTarget();
649         }
650     }
651 
removeIcon(String slot)652     public void removeIcon(String slot) {
653         synchronized (mLock) {
654             // don't coalesce these
655             mHandler.obtainMessage(MSG_ICON, OP_REMOVE_ICON, 0, slot).sendToTarget();
656         }
657     }
658 
659     /**
660      * Called to notify that disable flags are updated.
661      * @see Callbacks#disable(int, int, int, boolean)
662      * @see Callbacks#disableForAllDisplays(DisableStates)
663      */
disable(int displayId, @DisableFlags int state1, @Disable2Flags int state2, boolean animate)664     public void disable(int displayId, @DisableFlags int state1, @Disable2Flags int state2,
665             boolean animate) {
666         synchronized (mLock) {
667             setDisabled(displayId, state1, state2);
668             mHandler.removeMessages(MSG_DISABLE);
669             final SomeArgs args = SomeArgs.obtain();
670             args.argi1 = displayId;
671             args.argi2 = state1;
672             args.argi3 = state2;
673             args.argi4 = animate ? 1 : 0;
674             Message msg = mHandler.obtainMessage(MSG_DISABLE, args);
675             if (Looper.myLooper() == mHandler.getLooper()) {
676                 // If its the right looper execute immediately so hides can be handled quickly.
677                 mHandler.handleMessage(msg);
678                 msg.recycle();
679             } else {
680                 msg.sendToTarget();
681             }
682         }
683     }
684 
685     @Override
disable(int displayId, @DisableFlags int state1, @Disable2Flags int state2)686     public void disable(int displayId, @DisableFlags int state1, @Disable2Flags int state2) {
687         disable(displayId, state1, state2, true);
688     }
689 
690     @Override
disableForAllDisplays(DisableStates disableStates)691     public void disableForAllDisplays(DisableStates disableStates) throws RemoteException {
692         synchronized (mLock) {
693             for (Map.Entry<Integer, Pair<Integer, Integer>> displaysWithStates :
694                     disableStates.displaysWithStates.entrySet()) {
695                 int displayId = displaysWithStates.getKey();
696                 Pair<Integer, Integer> states = displaysWithStates.getValue();
697                 setDisabled(displayId, states.first, states.second);
698             }
699             mHandler.removeMessages(MSG_DISABLE_ALL);
700             Message msg = mHandler.obtainMessage(MSG_DISABLE_ALL, disableStates);
701             if (Looper.myLooper() == mHandler.getLooper()) {
702                 // If its the right looper execute immediately so hides can be handled quickly.
703                 mHandler.handleMessage(msg);
704                 msg.recycle();
705             } else {
706                 msg.sendToTarget();
707             }
708         }
709     }
710 
711     /**
712      * Apply current disable flags by {@link CommandQueue#disable(int, int, int, boolean)}.
713      *
714      * @param displayId The id of the display to notify.
715      * @param animate {@code true} to show animations.
716      */
recomputeDisableFlags(int displayId, boolean animate)717     public void recomputeDisableFlags(int displayId, boolean animate) {
718         // This must update holding the lock otherwise it can clobber the disabled flags set on the
719         // binder thread from the disable() call
720         synchronized (mLock) {
721             int disabled1 = getDisabled1(displayId);
722             int disabled2 = getDisabled2(displayId);
723             disable(displayId, disabled1, disabled2, animate);
724         }
725     }
726 
setDisabled(int displayId, int disabled1, int disabled2)727     private void setDisabled(int displayId, int disabled1, int disabled2) {
728         mDisplayDisabled.put(displayId, new Pair<>(disabled1, disabled2));
729     }
730 
getDisabled1(int displayId)731     private int getDisabled1(int displayId) {
732         return getDisabled(displayId).first;
733     }
734 
getDisabled2(int displayId)735     private int getDisabled2(int displayId) {
736         return getDisabled(displayId).second;
737     }
738 
getDisabled(int displayId)739     private Pair<Integer, Integer> getDisabled(int displayId) {
740         Pair<Integer, Integer> disablePair = mDisplayDisabled.get(displayId);
741         if (disablePair == null) {
742             disablePair = new Pair<>(DISABLE_NONE, DISABLE2_NONE);
743             mDisplayDisabled.put(displayId, disablePair);
744         }
745         return disablePair;
746     }
747 
animateExpandNotificationsPanel()748     public void animateExpandNotificationsPanel() {
749         synchronized (mLock) {
750             mHandler.removeMessages(MSG_EXPAND_NOTIFICATIONS);
751             mHandler.sendEmptyMessage(MSG_EXPAND_NOTIFICATIONS);
752         }
753     }
754 
animateCollapsePanels()755     public void animateCollapsePanels() {
756         synchronized (mLock) {
757             mHandler.removeMessages(MSG_COLLAPSE_PANELS);
758             mHandler.obtainMessage(MSG_COLLAPSE_PANELS, 0, 0).sendToTarget();
759         }
760     }
761 
animateCollapsePanels(int flags, boolean force)762     public void animateCollapsePanels(int flags, boolean force) {
763         synchronized (mLock) {
764             mHandler.removeMessages(MSG_COLLAPSE_PANELS);
765             mHandler.obtainMessage(MSG_COLLAPSE_PANELS, flags, force ? 1 : 0).sendToTarget();
766         }
767     }
768 
toggleNotificationsPanel()769     public void toggleNotificationsPanel() {
770         synchronized (mLock) {
771             mHandler.removeMessages(MSG_TOGGLE_NOTIFICATION_PANEL);
772             mHandler.obtainMessage(MSG_TOGGLE_NOTIFICATION_PANEL, 0, 0).sendToTarget();
773         }
774     }
775 
animateExpandSettingsPanel(String subPanel)776     public void animateExpandSettingsPanel(String subPanel) {
777         synchronized (mLock) {
778             mHandler.removeMessages(MSG_EXPAND_SETTINGS);
779             mHandler.obtainMessage(MSG_EXPAND_SETTINGS, subPanel).sendToTarget();
780         }
781     }
782 
toggleQuickSettingsPanel()783     public void toggleQuickSettingsPanel() {
784         synchronized (mLock) {
785             mHandler.removeMessages(MSG_TOGGLE_QUICK_SETTINGS_PANEL);
786             mHandler.obtainMessage(MSG_TOGGLE_QUICK_SETTINGS_PANEL, 0, 0).sendToTarget();
787         }
788     }
789 
790     @Override
setImeWindowStatus(int displayId, @ImeWindowVisibility int vis, @BackDispositionMode int backDisposition, boolean showImeSwitcher)791     public void setImeWindowStatus(int displayId, @ImeWindowVisibility int vis,
792             @BackDispositionMode int backDisposition, boolean showImeSwitcher) {
793         synchronized (mLock) {
794             mHandler.removeMessages(MSG_SHOW_IME_BUTTON);
795             SomeArgs args = SomeArgs.obtain();
796             args.argi1 = displayId;
797             args.argi2 = vis;
798             args.argi3 = backDisposition;
799             args.argi4 = showImeSwitcher ? 1 : 0;
800             Message m = mHandler.obtainMessage(MSG_SHOW_IME_BUTTON, args);
801             m.sendToTarget();
802         }
803     }
804 
showRecentApps(boolean triggeredFromAltTab)805     public void showRecentApps(boolean triggeredFromAltTab) {
806         synchronized (mLock) {
807             mHandler.removeMessages(MSG_SHOW_RECENT_APPS);
808             mHandler.obtainMessage(MSG_SHOW_RECENT_APPS, triggeredFromAltTab ? 1 : 0, 0,
809                     null).sendToTarget();
810         }
811     }
812 
hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey)813     public void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
814         synchronized (mLock) {
815             mHandler.removeMessages(MSG_HIDE_RECENT_APPS);
816             mHandler.obtainMessage(MSG_HIDE_RECENT_APPS,
817                     triggeredFromAltTab ? 1 : 0, triggeredFromHomeKey ? 1 : 0,
818                     null).sendToTarget();
819         }
820     }
821 
toggleSplitScreen()822     public void toggleSplitScreen() {
823         synchronized (mLock) {
824             mHandler.removeMessages(MSG_TOGGLE_APP_SPLIT_SCREEN);
825             mHandler.obtainMessage(MSG_TOGGLE_APP_SPLIT_SCREEN, 0, 0, null).sendToTarget();
826         }
827     }
828 
toggleTaskbar()829     public void toggleTaskbar() {
830         synchronized (mLock) {
831             mHandler.removeMessages(MSG_TOGGLE_TASKBAR);
832             mHandler.obtainMessage(MSG_TOGGLE_TASKBAR, 0, 0, null).sendToTarget();
833         }
834     }
835 
toggleRecentApps()836     public void toggleRecentApps() {
837         synchronized (mLock) {
838             mHandler.removeMessages(MSG_TOGGLE_RECENT_APPS);
839             Message msg = mHandler.obtainMessage(MSG_TOGGLE_RECENT_APPS, 0, 0, null);
840             msg.setAsynchronous(true);
841             msg.sendToTarget();
842         }
843     }
844 
preloadRecentApps()845     public void preloadRecentApps() {
846         synchronized (mLock) {
847             mHandler.removeMessages(MSG_PRELOAD_RECENT_APPS);
848             mHandler.obtainMessage(MSG_PRELOAD_RECENT_APPS, 0, 0, null).sendToTarget();
849         }
850     }
851 
cancelPreloadRecentApps()852     public void cancelPreloadRecentApps() {
853         synchronized (mLock) {
854             mHandler.removeMessages(MSG_CANCEL_PRELOAD_RECENT_APPS);
855             mHandler.obtainMessage(MSG_CANCEL_PRELOAD_RECENT_APPS, 0, 0, null).sendToTarget();
856         }
857     }
858 
859     @Override
dismissKeyboardShortcutsMenu()860     public void dismissKeyboardShortcutsMenu() {
861         synchronized (mLock) {
862             mHandler.removeMessages(MSG_DISMISS_KEYBOARD_SHORTCUTS);
863             mHandler.obtainMessage(MSG_DISMISS_KEYBOARD_SHORTCUTS).sendToTarget();
864         }
865     }
866 
867     @Override
toggleKeyboardShortcutsMenu(int deviceId)868     public void toggleKeyboardShortcutsMenu(int deviceId) {
869         synchronized (mLock) {
870             mHandler.removeMessages(MSG_TOGGLE_KEYBOARD_SHORTCUTS);
871             mHandler.obtainMessage(MSG_TOGGLE_KEYBOARD_SHORTCUTS, deviceId, 0).sendToTarget();
872         }
873     }
874 
875     @Override
showPictureInPictureMenu()876     public void showPictureInPictureMenu() {
877         synchronized (mLock) {
878             mHandler.removeMessages(MSG_SHOW_PICTURE_IN_PICTURE_MENU);
879             mHandler.obtainMessage(MSG_SHOW_PICTURE_IN_PICTURE_MENU).sendToTarget();
880         }
881     }
882 
883     @Override
setWindowState(int displayId, int window, int state)884     public void setWindowState(int displayId, int window, int state) {
885         synchronized (mLock) {
886             // don't coalesce these
887             mHandler.obtainMessage(MSG_SET_WINDOW_STATE, displayId, window, state).sendToTarget();
888         }
889     }
890 
showScreenPinningRequest(int taskId)891     public void showScreenPinningRequest(int taskId) {
892         synchronized (mLock) {
893             mHandler.obtainMessage(MSG_SHOW_SCREEN_PIN_REQUEST, taskId, 0, null)
894                     .sendToTarget();
895         }
896     }
897 
898     @Override
confirmImmersivePrompt()899     public void confirmImmersivePrompt() {
900         synchronized (mLock) {
901             mHandler.obtainMessage(MSG_CONFIRM_IMMERSIVE_PROMPT).sendToTarget();
902         }
903     }
904 
905     @Override
immersiveModeChanged(int rootDisplayAreaId, boolean isImmersiveMode, int windowType)906     public void immersiveModeChanged(int rootDisplayAreaId, boolean isImmersiveMode,
907             int windowType) {
908         synchronized (mLock) {
909             final SomeArgs args = SomeArgs.obtain();
910             args.argi1 = rootDisplayAreaId;
911             args.argi2 = isImmersiveMode ? 1 : 0;
912             args.argi3 = windowType;
913             mHandler.obtainMessage(MSG_IMMERSIVE_CHANGED, args).sendToTarget();
914         }
915     }
916 
917     @Override
appTransitionPending(int displayId)918     public void appTransitionPending(int displayId) {
919         appTransitionPending(displayId, false /* forced */);
920     }
921 
922     /**
923      * Called to notify System UI that an application transition is pending.
924      * @see Callbacks#appTransitionPending(int, boolean)
925      */
appTransitionPending(int displayId, boolean forced)926     public void appTransitionPending(int displayId, boolean forced) {
927         synchronized (mLock) {
928             mHandler.obtainMessage(MSG_APP_TRANSITION_PENDING, displayId, forced ? 1 : 0)
929                     .sendToTarget();
930         }
931     }
932 
933     @Override
appTransitionCancelled(int displayId)934     public void appTransitionCancelled(int displayId) {
935         synchronized (mLock) {
936             mHandler.obtainMessage(MSG_APP_TRANSITION_CANCELLED, displayId, 0 /* unused */)
937                     .sendToTarget();
938         }
939     }
940 
941     @Override
appTransitionStarting(int displayId, long startTime, long duration)942     public void appTransitionStarting(int displayId, long startTime, long duration) {
943         appTransitionStarting(displayId, startTime, duration, false /* forced */);
944     }
945 
946     /**
947      * Called to notify System UI that an application transition is starting.
948      * @see Callbacks#appTransitionStarting(int, long, long, boolean).
949      */
appTransitionStarting(int displayId, long startTime, long duration, boolean forced)950     public void appTransitionStarting(int displayId, long startTime, long duration,
951             boolean forced) {
952         synchronized (mLock) {
953             final SomeArgs args = SomeArgs.obtain();
954             args.argi1 = displayId;
955             args.argi2 = forced ? 1 : 0;
956             args.arg1 = startTime;
957             args.arg2 = duration;
958             mHandler.obtainMessage(MSG_APP_TRANSITION_STARTING, args).sendToTarget();
959         }
960     }
961 
962     @Override
appTransitionFinished(int displayId)963     public void appTransitionFinished(int displayId) {
964         synchronized (mLock) {
965             mHandler.obtainMessage(MSG_APP_TRANSITION_FINISHED, displayId, 0 /* unused */)
966                     .sendToTarget();
967         }
968     }
969 
showAssistDisclosure()970     public void showAssistDisclosure() {
971         synchronized (mLock) {
972             mHandler.removeMessages(MSG_ASSIST_DISCLOSURE);
973             mHandler.obtainMessage(MSG_ASSIST_DISCLOSURE).sendToTarget();
974         }
975     }
976 
startAssist(Bundle args)977     public void startAssist(Bundle args) {
978         synchronized (mLock) {
979             mHandler.removeMessages(MSG_START_ASSIST);
980             mHandler.obtainMessage(MSG_START_ASSIST, args).sendToTarget();
981         }
982     }
983 
984     @Override
onCameraLaunchGestureDetected(int source)985     public void onCameraLaunchGestureDetected(int source) {
986         synchronized (mLock) {
987             if (mPowerInteractor != null) {
988                 mPowerInteractor.get().onCameraLaunchGestureDetected();
989             }
990 
991             mHandler.removeMessages(MSG_CAMERA_LAUNCH_GESTURE);
992             mHandler.obtainMessage(MSG_CAMERA_LAUNCH_GESTURE, source, 0).sendToTarget();
993         }
994     }
995 
996     @Override
onWalletLaunchGestureDetected()997     public void onWalletLaunchGestureDetected() {
998         synchronized (mLock) {
999             if (mPowerInteractor != null) {
1000                 mPowerInteractor.get().onWalletLaunchGestureDetected();
1001             }
1002 
1003             mHandler.removeMessages(MSG_WALLET_ACTION_LAUNCH_GESTURE);
1004             mHandler.obtainMessage(MSG_WALLET_ACTION_LAUNCH_GESTURE).sendToTarget();
1005         }
1006     }
1007 
1008     @Override
onEmergencyActionLaunchGestureDetected()1009     public void onEmergencyActionLaunchGestureDetected() {
1010         synchronized (mLock) {
1011             mHandler.removeMessages(MSG_EMERGENCY_ACTION_LAUNCH_GESTURE);
1012             mHandler.obtainMessage(MSG_EMERGENCY_ACTION_LAUNCH_GESTURE).sendToTarget();
1013         }
1014     }
1015 
1016     @Override
addQsTile(ComponentName tile)1017     public void addQsTile(ComponentName tile) {
1018         addQsTileToFrontOrEnd(tile, false);
1019     }
1020 
1021     /**
1022      * Add a tile to the Quick Settings Panel
1023      * @param tile the ComponentName of the {@link android.service.quicksettings.TileService}
1024      * @param end if true, the tile will be added at the end. If false, at the beginning.
1025      */
1026     @Override
addQsTileToFrontOrEnd(ComponentName tile, boolean end)1027     public void addQsTileToFrontOrEnd(ComponentName tile, boolean end) {
1028         synchronized (mLock) {
1029             SomeArgs args = SomeArgs.obtain();
1030             args.arg1 = tile;
1031             args.arg2 = end;
1032             mHandler.obtainMessage(MSG_ADD_QS_TILE, args).sendToTarget();
1033         }
1034     }
1035 
1036     @Override
remQsTile(ComponentName tile)1037     public void remQsTile(ComponentName tile) {
1038         synchronized (mLock) {
1039             mHandler.obtainMessage(MSG_REMOVE_QS_TILE, tile).sendToTarget();
1040         }
1041     }
1042 
1043     @Override
setQsTiles(String[] tiles)1044     public void setQsTiles(String[] tiles) {
1045         synchronized (mLock) {
1046             mHandler.obtainMessage(MSG_SET_QS_TILES, tiles).sendToTarget();
1047         }
1048     }
1049 
1050     @Override
clickQsTile(ComponentName tile)1051     public void clickQsTile(ComponentName tile) {
1052         synchronized (mLock) {
1053             mHandler.obtainMessage(MSG_CLICK_QS_TILE, tile).sendToTarget();
1054         }
1055     }
1056 
1057     @Override
handleSystemKey(KeyEvent key)1058     public void handleSystemKey(KeyEvent key) {
1059         synchronized (mLock) {
1060             mHandler.obtainMessage(MSG_HANDLE_SYSTEM_KEY, key).sendToTarget();
1061         }
1062     }
1063 
1064     @Override
showPinningEnterExitToast(boolean entering)1065     public void showPinningEnterExitToast(boolean entering) {
1066         synchronized (mLock) {
1067             mHandler.obtainMessage(MSG_SHOW_PINNING_TOAST_ENTER_EXIT, entering).sendToTarget();
1068         }
1069     }
1070 
1071     @Override
showPinningEscapeToast()1072     public void showPinningEscapeToast() {
1073         synchronized (mLock) {
1074             mHandler.obtainMessage(MSG_SHOW_PINNING_TOAST_ESCAPE).sendToTarget();
1075         }
1076     }
1077 
1078 
1079     @Override
showGlobalActionsMenu()1080     public void showGlobalActionsMenu() {
1081         synchronized (mLock) {
1082             mHandler.removeMessages(MSG_SHOW_GLOBAL_ACTIONS);
1083             mHandler.obtainMessage(MSG_SHOW_GLOBAL_ACTIONS).sendToTarget();
1084         }
1085     }
1086 
1087     @Override
setTopAppHidesStatusBar(boolean hidesStatusBar)1088     public void setTopAppHidesStatusBar(boolean hidesStatusBar) {
1089         mHandler.removeMessages(MSG_SET_TOP_APP_HIDES_STATUS_BAR);
1090         mHandler.obtainMessage(MSG_SET_TOP_APP_HIDES_STATUS_BAR, hidesStatusBar ? 1 : 0, 0)
1091                 .sendToTarget();
1092     }
1093 
1094     @Override
showShutdownUi(boolean isReboot, String reason)1095     public void showShutdownUi(boolean isReboot, String reason) {
1096         synchronized (mLock) {
1097             mHandler.removeMessages(MSG_SHOW_SHUTDOWN_UI);
1098             mHandler.obtainMessage(MSG_SHOW_SHUTDOWN_UI, isReboot ? 1 : 0, 0, reason)
1099                     .sendToTarget();
1100         }
1101     }
1102 
1103     @Override
showWirelessChargingAnimation(int batteryLevel)1104     public void showWirelessChargingAnimation(int batteryLevel) {
1105         mHandler.removeMessages(MSG_SHOW_CHARGING_ANIMATION);
1106         mHandler.obtainMessage(MSG_SHOW_CHARGING_ANIMATION, batteryLevel, 0)
1107                 .sendToTarget();
1108     }
1109 
1110     @Override
onProposedRotationChanged(int rotation, boolean isValid)1111     public void onProposedRotationChanged(int rotation, boolean isValid) {
1112         synchronized (mLock) {
1113             mHandler.removeMessages(MSG_ROTATION_PROPOSAL);
1114             mHandler.obtainMessage(MSG_ROTATION_PROPOSAL, rotation, isValid ? 1 : 0,
1115                     null).sendToTarget();
1116         }
1117     }
1118 
1119     @Override
showAuthenticationDialog(PromptInfo promptInfo, IBiometricSysuiReceiver receiver, int[] sensorIds, boolean credentialAllowed, boolean requireConfirmation, int userId, long operationId, String opPackageName, long requestId)1120     public void showAuthenticationDialog(PromptInfo promptInfo, IBiometricSysuiReceiver receiver,
1121             int[] sensorIds, boolean credentialAllowed, boolean requireConfirmation,
1122             int userId, long operationId, String opPackageName, long requestId) {
1123         synchronized (mLock) {
1124             SomeArgs args = SomeArgs.obtain();
1125             args.arg1 = promptInfo;
1126             args.arg2 = receiver;
1127             args.arg3 = sensorIds;
1128             args.arg4 = credentialAllowed;
1129             args.arg5 = requireConfirmation;
1130             args.argi1 = userId;
1131             args.arg6 = opPackageName;
1132             args.argl1 = operationId;
1133             args.argl2 = requestId;
1134             mHandler.obtainMessage(MSG_BIOMETRIC_SHOW, args)
1135                     .sendToTarget();
1136         }
1137     }
1138 
1139     @Override
showToast(int uid, String packageName, IBinder token, CharSequence text, IBinder windowToken, int duration, @Nullable ITransientNotificationCallback callback, int displayId)1140     public void showToast(int uid, String packageName, IBinder token, CharSequence text,
1141             IBinder windowToken, int duration, @Nullable ITransientNotificationCallback callback,
1142             int displayId) {
1143         synchronized (mLock) {
1144             SomeArgs args = SomeArgs.obtain();
1145             args.arg1 = packageName;
1146             args.arg2 = token;
1147             args.arg3 = text;
1148             args.arg4 = windowToken;
1149             args.arg5 = callback;
1150             args.argi1 = uid;
1151             args.argi2 = duration;
1152             args.argi3 = displayId;
1153             mHandler.obtainMessage(MSG_SHOW_TOAST, args).sendToTarget();
1154         }
1155     }
1156 
1157     @Override
hideToast(String packageName, IBinder token)1158     public void hideToast(String packageName, IBinder token) {
1159         synchronized (mLock) {
1160             SomeArgs args = SomeArgs.obtain();
1161             args.arg1 = packageName;
1162             args.arg2 = token;
1163             mHandler.obtainMessage(MSG_HIDE_TOAST, args).sendToTarget();
1164         }
1165     }
1166 
1167     @Override
onBiometricAuthenticated(@odality int modality)1168     public void onBiometricAuthenticated(@Modality int modality) {
1169         synchronized (mLock) {
1170             SomeArgs args = SomeArgs.obtain();
1171             args.argi1 = modality;
1172             mHandler.obtainMessage(MSG_BIOMETRIC_AUTHENTICATED, args).sendToTarget();
1173         }
1174     }
1175 
1176     @Override
onBiometricHelp(@odality int modality, String message)1177     public void onBiometricHelp(@Modality int modality, String message) {
1178         synchronized (mLock) {
1179             SomeArgs args = SomeArgs.obtain();
1180             args.argi1 = modality;
1181             args.arg1 = message;
1182             mHandler.obtainMessage(MSG_BIOMETRIC_HELP, args).sendToTarget();
1183         }
1184     }
1185 
1186     @Override
onBiometricError(int modality, int error, int vendorCode)1187     public void onBiometricError(int modality, int error, int vendorCode) {
1188         synchronized (mLock) {
1189             SomeArgs args = SomeArgs.obtain();
1190             args.argi1 = modality;
1191             args.argi2 = error;
1192             args.argi3 = vendorCode;
1193             mHandler.obtainMessage(MSG_BIOMETRIC_ERROR, args).sendToTarget();
1194         }
1195     }
1196 
1197     @Override
hideAuthenticationDialog(long requestId)1198     public void hideAuthenticationDialog(long requestId) {
1199         synchronized (mLock) {
1200             final SomeArgs args = SomeArgs.obtain();
1201             args.argl1 = requestId;
1202             mHandler.obtainMessage(MSG_BIOMETRIC_HIDE, args).sendToTarget();
1203         }
1204     }
1205 
1206     @Override
setBiometicContextListener(IBiometricContextListener listener)1207     public void setBiometicContextListener(IBiometricContextListener listener) {
1208         synchronized (mLock) {
1209             mHandler.obtainMessage(MSG_SET_BIOMETRICS_LISTENER, listener).sendToTarget();
1210         }
1211     }
1212 
1213     @Override
setUdfpsRefreshRateCallback(IUdfpsRefreshRateRequestCallback callback)1214     public void setUdfpsRefreshRateCallback(IUdfpsRefreshRateRequestCallback callback) {
1215         synchronized (mLock) {
1216             mHandler.obtainMessage(MSG_SET_UDFPS_REFRESH_RATE_CALLBACK, callback).sendToTarget();
1217         }
1218     }
1219 
1220     @Override
onDisplayAddSystemDecorations(int displayId)1221     public void onDisplayAddSystemDecorations(int displayId) {
1222         synchronized (mLock) {
1223             mHandler.obtainMessage(MSG_DISPLAY_ADD_SYSTEM_DECORATIONS, displayId, 0).sendToTarget();
1224         }
1225     }
1226 
1227     @Override
onDisplayRemoveSystemDecorations(int displayId)1228     public void onDisplayRemoveSystemDecorations(int displayId) {
1229         synchronized (mLock) {
1230             mHandler.obtainMessage(MSG_DISPLAY_REMOVE_SYSTEM_DECORATIONS, displayId, 0)
1231                     .sendToTarget();
1232         }
1233     }
1234 
1235     // This was previously called from WM, but is now called from WMShell
onRecentsAnimationStateChanged(boolean running)1236     public void onRecentsAnimationStateChanged(boolean running) {
1237         synchronized (mLock) {
1238             mHandler.obtainMessage(MSG_RECENTS_ANIMATION_STATE_CHANGED, running ? 1 : 0, 0)
1239                     .sendToTarget();
1240         }
1241     }
1242 
1243     @Override
showInattentiveSleepWarning()1244     public void showInattentiveSleepWarning() {
1245         synchronized (mLock) {
1246             mHandler.obtainMessage(MSG_SHOW_INATTENTIVE_SLEEP_WARNING)
1247                     .sendToTarget();
1248         }
1249     }
1250 
1251     @Override
dismissInattentiveSleepWarning(boolean animated)1252     public void dismissInattentiveSleepWarning(boolean animated) {
1253         synchronized (mLock) {
1254             mHandler.obtainMessage(MSG_DISMISS_INATTENTIVE_SLEEP_WARNING, animated)
1255                     .sendToTarget();
1256         }
1257     }
1258 
1259     @Override
requestMagnificationConnection(boolean connect)1260     public void requestMagnificationConnection(boolean connect) {
1261         synchronized (mLock) {
1262             mHandler.obtainMessage(MSG_REQUEST_MAGNIFICATION_CONNECTION, connect)
1263                     .sendToTarget();
1264         }
1265     }
1266 
handleShowImeButton(int displayId, @ImeWindowVisibility int vis, @BackDispositionMode int backDisposition, boolean showImeSwitcher)1267     private void handleShowImeButton(int displayId, @ImeWindowVisibility int vis,
1268             @BackDispositionMode int backDisposition, boolean showImeSwitcher) {
1269         if (displayId == INVALID_DISPLAY) return;
1270 
1271         boolean isConcurrentMultiUserModeEnabled = UserManager.isVisibleBackgroundUsersEnabled()
1272                 && mContext.getResources().getBoolean(android.R.bool.config_perDisplayFocusEnabled)
1273                 && android.view.inputmethod.Flags.concurrentInputMethods();
1274 
1275         if (!isConcurrentMultiUserModeEnabled
1276                 && mLastUpdatedImeDisplayId != displayId
1277                 && mLastUpdatedImeDisplayId != INVALID_DISPLAY) {
1278             // Set previous NavBar's IME window status as invisible when IME
1279             // window switched to another display for single-session IME case.
1280             sendImeNotVisibleStatusForPrevNavBar();
1281         }
1282         for (int i = 0; i < mCallbacks.size(); i++) {
1283             mCallbacks.get(i).setImeWindowStatus(displayId, vis, backDisposition, showImeSwitcher);
1284         }
1285         mLastUpdatedImeDisplayId = displayId;
1286     }
1287 
sendImeNotVisibleStatusForPrevNavBar()1288     private void sendImeNotVisibleStatusForPrevNavBar() {
1289         for (int i = 0; i < mCallbacks.size(); i++) {
1290             mCallbacks.get(i).setImeWindowStatus(mLastUpdatedImeDisplayId, 0 /* vis */,
1291                     BACK_DISPOSITION_DEFAULT, false /* showImeSwitcher */);
1292         }
1293     }
1294 
1295     @Override
onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, @Behavior int behavior, @InsetsType int requestedVisibleTypes, String packageName, LetterboxDetails[] letterboxDetails)1296     public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance,
1297             AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme,
1298             @Behavior int behavior, @InsetsType int requestedVisibleTypes, String packageName,
1299             LetterboxDetails[] letterboxDetails) {
1300         synchronized (mLock) {
1301             SomeArgs args = SomeArgs.obtain();
1302             args.argi1 = displayId;
1303             args.argi2 = appearance;
1304             args.argi3 = navbarColorManagedByIme ? 1 : 0;
1305             args.arg1 = appearanceRegions;
1306             args.argi4 = behavior;
1307             args.argi5 = requestedVisibleTypes;
1308             args.arg3 = packageName;
1309             args.arg4 = letterboxDetails;
1310             mHandler.obtainMessage(MSG_SYSTEM_BAR_CHANGED, args).sendToTarget();
1311         }
1312     }
1313 
1314     @Override
showTransient(int displayId, int types, boolean isGestureOnSystemBar)1315     public void showTransient(int displayId, int types, boolean isGestureOnSystemBar) {
1316         synchronized (mLock) {
1317             SomeArgs args = SomeArgs.obtain();
1318             args.argi1 = displayId;
1319             args.argi2 = types;
1320             args.argi3 = isGestureOnSystemBar ? 1 : 0;
1321             mHandler.obtainMessage(MSG_SHOW_TRANSIENT, args).sendToTarget();
1322         }
1323     }
1324 
1325     @Override
abortTransient(int displayId, int types)1326     public void abortTransient(int displayId, int types) {
1327         synchronized (mLock) {
1328             SomeArgs args = SomeArgs.obtain();
1329             args.argi1 = displayId;
1330             args.argi2 = types;
1331             mHandler.obtainMessage(MSG_ABORT_TRANSIENT, args).sendToTarget();
1332         }
1333     }
1334 
1335     @Override
startTracing()1336     public void startTracing() {
1337         synchronized (mLock) {
1338             mHandler.obtainMessage(MSG_TRACING_STATE_CHANGED, true).sendToTarget();
1339         }
1340     }
1341 
1342     @Override
stopTracing()1343     public void stopTracing() {
1344         synchronized (mLock) {
1345             mHandler.obtainMessage(MSG_TRACING_STATE_CHANGED, false).sendToTarget();
1346         }
1347     }
1348 
1349     @Override
suppressAmbientDisplay(boolean suppress)1350     public void suppressAmbientDisplay(boolean suppress) {
1351         synchronized (mLock) {
1352             mHandler.obtainMessage(MSG_SUPPRESS_AMBIENT_DISPLAY, suppress).sendToTarget();
1353         }
1354     }
1355 
1356     @Override
setNavigationBarLumaSamplingEnabled(int displayId, boolean enable)1357     public void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable) {
1358         synchronized (mLock) {
1359             mHandler.obtainMessage(MSG_SET_NAVIGATION_BAR_LUMA_SAMPLING_ENABLED, displayId,
1360                     enable ? 1 : 0).sendToTarget();
1361         }
1362     }
1363 
1364     @Override
passThroughShellCommand(String[] args, ParcelFileDescriptor pfd)1365     public void passThroughShellCommand(String[] args, ParcelFileDescriptor pfd) {
1366         final FileOutputStream fos = new FileOutputStream(pfd.getFileDescriptor());
1367         final PrintWriter pw = new PrintWriter(fos);
1368         // This is mimicking Binder#dumpAsync, but on this side of the binder. Might be possible
1369         // to just throw this work onto the handler just like the other messages
1370         Thread thr = new Thread("Sysui.passThroughShellCommand") {
1371             public void run() {
1372                 try {
1373                     if (mRegistry == null) {
1374                         return;
1375                     }
1376 
1377                     // Registry blocks this thread until finished
1378                     mRegistry.onShellCommand(pw, args);
1379                 } finally {
1380                     pw.flush();
1381                     try {
1382                         // Close the file descriptor so the TransferPipe finishes its thread
1383                         pfd.close();
1384                     } catch (Exception e) {
1385                     }
1386                 }
1387             }
1388         };
1389         thr.start();
1390     }
1391 
1392     @Override
dumpProto(String[] args, ParcelFileDescriptor pfd)1393     public void dumpProto(String[] args, ParcelFileDescriptor pfd) {
1394         final FileDescriptor fd = pfd.getFileDescriptor();
1395         // This is mimicking Binder#dumpAsync, but on this side of the binder. Might be possible
1396         // to just throw this work onto the handler just like the other messages
1397         Thread thr = new Thread("Sysui.dumpProto") {
1398             public void run() {
1399                 try {
1400                     if (mDumpHandler == null) {
1401                         return;
1402                     }
1403                     // We won't be using the PrintWriter.
1404                     OutputStream o = new OutputStream() {
1405                         @Override
1406                         public void write(int b) {}
1407                     };
1408                     mDumpHandler.dump(fd, new PrintWriter(o), args);
1409                 } finally {
1410                     try {
1411                         // Close the file descriptor so the TransferPipe finishes its thread
1412                         pfd.close();
1413                     } catch (Exception e) {
1414                     }
1415                 }
1416             }
1417         };
1418         thr.start();
1419     }
1420 
1421     @Override
runGcForTest()1422     public void runGcForTest() {
1423         // Gc sysui
1424         GcUtils.runGcAndFinalizersSync();
1425     }
1426 
1427     @Override
requestTileServiceListeningState(@onNull ComponentName componentName)1428     public void requestTileServiceListeningState(@NonNull ComponentName componentName) {
1429         mHandler.obtainMessage(MSG_TILE_SERVICE_REQUEST_LISTENING_STATE, componentName)
1430                 .sendToTarget();
1431     }
1432 
1433     @Override
showRearDisplayDialog(int currentBaseState)1434     public void showRearDisplayDialog(int currentBaseState) {
1435         synchronized (mLock) {
1436             mHandler.obtainMessage(MSG_SHOW_REAR_DISPLAY_DIALOG, currentBaseState).sendToTarget();
1437         }
1438     }
1439 
1440     @Override
moveFocusedTaskToStageSplit(int displayId, boolean leftOrTop)1441     public void moveFocusedTaskToStageSplit(int displayId, boolean leftOrTop) {
1442         synchronized (mLock) {
1443             SomeArgs args = SomeArgs.obtain();
1444             args.argi1 = displayId;
1445             args.argi2 = leftOrTop ? 1 : 0;
1446             mHandler.obtainMessage(MSG_MOVE_FOCUSED_TASK_TO_STAGE_SPLIT,
1447                     args).sendToTarget();
1448         }
1449     }
1450 
1451     @Override
setSplitscreenFocus(boolean leftOrTop)1452     public void setSplitscreenFocus(boolean leftOrTop) {
1453         synchronized (mLock) {
1454             mHandler.obtainMessage(MSG_SET_SPLITSCREEN_FOCUS, leftOrTop).sendToTarget();
1455         }
1456     }
1457     @Override
showMediaOutputSwitcher(String packageName, UserHandle userHandle)1458     public void showMediaOutputSwitcher(String packageName, UserHandle userHandle) {
1459         int callingUid = Binder.getCallingUid();
1460         if (callingUid != 0 && callingUid != Process.SYSTEM_UID) {
1461             throw new SecurityException("Call only allowed from system server.");
1462         }
1463         synchronized (mLock) {
1464             SomeArgs args = SomeArgs.obtain();
1465             args.arg1 = packageName;
1466             args.arg2 = userHandle;
1467             mHandler.obtainMessage(MSG_SHOW_MEDIA_OUTPUT_SWITCHER, args).sendToTarget();
1468         }
1469     }
1470 
1471     @Override
requestAddTile( int callingUid, @NonNull ComponentName componentName, @NonNull CharSequence appName, @NonNull CharSequence label, @NonNull Icon icon, @NonNull IAddTileResultCallback callback )1472     public void requestAddTile(
1473             int callingUid,
1474             @NonNull ComponentName componentName,
1475             @NonNull CharSequence appName,
1476             @NonNull CharSequence label,
1477             @NonNull Icon icon,
1478             @NonNull IAddTileResultCallback callback
1479     ) {
1480         SomeArgs args = SomeArgs.obtain();
1481         args.arg1 = componentName;
1482         args.arg2 = appName;
1483         args.arg3 = label;
1484         args.arg4 = icon;
1485         args.arg5 = callback;
1486         args.arg6 = callingUid;
1487         mHandler.obtainMessage(MSG_TILE_SERVICE_REQUEST_ADD, args).sendToTarget();
1488     }
1489 
1490     @Override
cancelRequestAddTile(@onNull String s)1491     public void cancelRequestAddTile(@NonNull String s) throws RemoteException {
1492         mHandler.obtainMessage(MSG_TILE_SERVICE_REQUEST_CANCEL, s).sendToTarget();
1493     }
1494 
1495     @Override
updateMediaTapToTransferSenderDisplay( @tatusBarManager.MediaTransferSenderState int displayState, MediaRoute2Info routeInfo, IUndoMediaTransferCallback undoCallback )1496     public void updateMediaTapToTransferSenderDisplay(
1497             @StatusBarManager.MediaTransferSenderState int displayState,
1498             MediaRoute2Info routeInfo,
1499             IUndoMediaTransferCallback undoCallback
1500     ) throws RemoteException {
1501         SomeArgs args = SomeArgs.obtain();
1502         args.arg1 = displayState;
1503         args.arg2 = routeInfo;
1504         args.arg3 = undoCallback;
1505         mHandler.obtainMessage(MSG_MEDIA_TRANSFER_SENDER_STATE, args).sendToTarget();
1506     }
1507 
1508     @Override
updateMediaTapToTransferReceiverDisplay( int displayState, @NonNull MediaRoute2Info routeInfo, @Nullable Icon appIcon, @Nullable CharSequence appName)1509     public void updateMediaTapToTransferReceiverDisplay(
1510             int displayState,
1511             @NonNull MediaRoute2Info routeInfo,
1512             @Nullable Icon appIcon,
1513             @Nullable CharSequence appName) {
1514         SomeArgs args = SomeArgs.obtain();
1515         args.arg1 = displayState;
1516         args.arg2 = routeInfo;
1517         args.arg3 = appIcon;
1518         args.arg4 = appName;
1519         mHandler.obtainMessage(MSG_MEDIA_TRANSFER_RECEIVER_STATE, args).sendToTarget();
1520     }
1521 
1522     @Override
registerNearbyMediaDevicesProvider(@onNull INearbyMediaDevicesProvider provider)1523     public void registerNearbyMediaDevicesProvider(@NonNull INearbyMediaDevicesProvider provider) {
1524         mHandler.obtainMessage(MSG_REGISTER_NEARBY_MEDIA_DEVICE_PROVIDER, provider).sendToTarget();
1525     }
1526 
1527     @Override
unregisterNearbyMediaDevicesProvider( @onNull INearbyMediaDevicesProvider provider)1528     public void unregisterNearbyMediaDevicesProvider(
1529             @NonNull INearbyMediaDevicesProvider provider) {
1530         mHandler.obtainMessage(MSG_UNREGISTER_NEARBY_MEDIA_DEVICE_PROVIDER, provider)
1531                 .sendToTarget();
1532     }
1533 
1534     @Override
moveFocusedTaskToFullscreen(int displayId)1535     public void moveFocusedTaskToFullscreen(int displayId) {
1536         SomeArgs args = SomeArgs.obtain();
1537         args.arg1 = displayId;
1538         mHandler.obtainMessage(MSG_MOVE_FOCUSED_TASK_TO_FULLSCREEN, args).sendToTarget();
1539     }
1540 
1541     @Override
moveFocusedTaskToDesktop(int displayId)1542     public void moveFocusedTaskToDesktop(int displayId) {
1543         SomeArgs args = SomeArgs.obtain();
1544         args.arg1 = displayId;
1545         mHandler.obtainMessage(MSG_ENTER_DESKTOP, args).sendToTarget();
1546     }
1547 
1548 
1549     private final class H extends Handler {
H(Looper l)1550         private H(Looper l) {
1551             super(l);
1552         }
1553 
handleMessage(Message msg)1554         public void handleMessage(Message msg) {
1555             final int what = msg.what & MSG_MASK;
1556             switch (what) {
1557                 case MSG_ICON: {
1558                     switch (msg.arg1) {
1559                         case OP_SET_ICON: {
1560                             Pair<String, StatusBarIcon> p = (Pair<String, StatusBarIcon>) msg.obj;
1561                             for (int i = 0; i < mCallbacks.size(); i++) {
1562                                 mCallbacks.get(i).setIcon(p.first, p.second);
1563                             }
1564                             break;
1565                         }
1566                         case OP_REMOVE_ICON:
1567                             for (int i = 0; i < mCallbacks.size(); i++) {
1568                                 mCallbacks.get(i).removeIcon((String) msg.obj);
1569                             }
1570                             break;
1571                     }
1572                     break;
1573                 }
1574                 case MSG_DISABLE:
1575                     SomeArgs args = (SomeArgs) msg.obj;
1576                     for (int i = 0; i < mCallbacks.size(); i++) {
1577                         mCallbacks.get(i).disable(args.argi1, args.argi2, args.argi3,
1578                                 args.argi4 != 0 /* animate */);
1579                     }
1580                     break;
1581                 case MSG_DISABLE_ALL:
1582                     DisableStates disableStates = (DisableStates) msg.obj;
1583                     boolean animate = disableStates.animate;
1584                     Map<Integer, Pair<Integer, Integer>> displaysWithDisableStates =
1585                             disableStates.displaysWithStates;
1586                     for (Map.Entry<Integer, Pair<Integer, Integer>> displayWithDisableStates :
1587                             displaysWithDisableStates.entrySet()) {
1588                         int displayId = displayWithDisableStates.getKey();
1589                         Pair<Integer, Integer> states = displayWithDisableStates.getValue();
1590                         for (int i = 0; i < mCallbacks.size(); i++) {
1591                             mCallbacks.get(i).disable(displayId, states.first, states.second,
1592                                     animate);
1593                         }
1594                     }
1595                     break;
1596                 case MSG_EXPAND_NOTIFICATIONS:
1597                     for (int i = 0; i < mCallbacks.size(); i++) {
1598                         mCallbacks.get(i).animateExpandNotificationsPanel();
1599                     }
1600                     break;
1601                 case MSG_COLLAPSE_PANELS:
1602                     for (int i = 0; i < mCallbacks.size(); i++) {
1603                         mCallbacks.get(i).animateCollapsePanels(msg.arg1, msg.arg2 != 0);
1604                     }
1605                     break;
1606                 case MSG_TOGGLE_NOTIFICATION_PANEL:
1607                     for (int i = 0; i < mCallbacks.size(); i++) {
1608                         mCallbacks.get(i).toggleNotificationsPanel();
1609                     }
1610                     break;
1611                 case MSG_EXPAND_SETTINGS:
1612                     for (int i = 0; i < mCallbacks.size(); i++) {
1613                         mCallbacks.get(i).animateExpandSettingsPanel((String) msg.obj);
1614                     }
1615                     break;
1616                 case MSG_TOGGLE_QUICK_SETTINGS_PANEL:
1617                     for (int i = 0; i < mCallbacks.size(); i++) {
1618                         mCallbacks.get(i).toggleQuickSettingsPanel();
1619                     }
1620                     break;
1621                 case MSG_SHOW_IME_BUTTON:
1622                     args = (SomeArgs) msg.obj;
1623                     handleShowImeButton(args.argi1 /* displayId */,
1624                             args.argi2 /* vis */, args.argi3 /* backDisposition */,
1625                             args.argi4 != 0 /* showImeSwitcher */);
1626                     break;
1627                 case MSG_SHOW_RECENT_APPS:
1628                     for (int i = 0; i < mCallbacks.size(); i++) {
1629                         mCallbacks.get(i).showRecentApps(msg.arg1 != 0);
1630                     }
1631                     break;
1632                 case MSG_HIDE_RECENT_APPS:
1633                     for (int i = 0; i < mCallbacks.size(); i++) {
1634                         mCallbacks.get(i).hideRecentApps(msg.arg1 != 0, msg.arg2 != 0);
1635                     }
1636                     break;
1637                 case MSG_TOGGLE_TASKBAR:
1638                     for (int i = 0; i < mCallbacks.size(); i++) {
1639                         mCallbacks.get(i).toggleTaskbar();
1640                     }
1641                     break;
1642                 case MSG_TOGGLE_RECENT_APPS:
1643                     for (int i = 0; i < mCallbacks.size(); i++) {
1644                         mCallbacks.get(i).toggleRecentApps();
1645                     }
1646                     break;
1647                 case MSG_PRELOAD_RECENT_APPS:
1648                     for (int i = 0; i < mCallbacks.size(); i++) {
1649                         mCallbacks.get(i).preloadRecentApps();
1650                     }
1651                     break;
1652                 case MSG_CANCEL_PRELOAD_RECENT_APPS:
1653                     for (int i = 0; i < mCallbacks.size(); i++) {
1654                         mCallbacks.get(i).cancelPreloadRecentApps();
1655                     }
1656                     break;
1657                 case MSG_DISMISS_KEYBOARD_SHORTCUTS:
1658                     for (int i = 0; i < mCallbacks.size(); i++) {
1659                         mCallbacks.get(i).dismissKeyboardShortcutsMenu();
1660                     }
1661                     break;
1662                 case MSG_TOGGLE_KEYBOARD_SHORTCUTS:
1663                     for (int i = 0; i < mCallbacks.size(); i++) {
1664                         mCallbacks.get(i).toggleKeyboardShortcutsMenu(msg.arg1);
1665                     }
1666                     break;
1667                 case MSG_SET_WINDOW_STATE:
1668                     for (int i = 0; i < mCallbacks.size(); i++) {
1669                         mCallbacks.get(i).setWindowState(msg.arg1, msg.arg2, (int) msg.obj);
1670                     }
1671                     break;
1672                 case MSG_SHOW_SCREEN_PIN_REQUEST:
1673                     for (int i = 0; i < mCallbacks.size(); i++) {
1674                         mCallbacks.get(i).showScreenPinningRequest(msg.arg1);
1675                     }
1676                     break;
1677                 case MSG_APP_TRANSITION_PENDING:
1678                     for (int i = 0; i < mCallbacks.size(); i++) {
1679                         mCallbacks.get(i).appTransitionPending(msg.arg1, msg.arg2 != 0);
1680                     }
1681                     break;
1682                 case MSG_APP_TRANSITION_CANCELLED:
1683                     for (int i = 0; i < mCallbacks.size(); i++) {
1684                         mCallbacks.get(i).appTransitionCancelled(msg.arg1);
1685                     }
1686                     break;
1687                 case MSG_APP_TRANSITION_STARTING:
1688                     args = (SomeArgs) msg.obj;
1689                     for (int i = 0; i < mCallbacks.size(); i++) {
1690                         mCallbacks.get(i).appTransitionStarting(args.argi1, (long) args.arg1,
1691                                 (long) args.arg2, args.argi2 != 0 /* forced */);
1692                     }
1693                     break;
1694                 case MSG_APP_TRANSITION_FINISHED:
1695                     for (int i = 0; i < mCallbacks.size(); i++) {
1696                         mCallbacks.get(i).appTransitionFinished(msg.arg1);
1697                     }
1698                     break;
1699                 case MSG_ASSIST_DISCLOSURE:
1700                     for (int i = 0; i < mCallbacks.size(); i++) {
1701                         mCallbacks.get(i).showAssistDisclosure();
1702                     }
1703                     break;
1704                 case MSG_START_ASSIST:
1705                     for (int i = 0; i < mCallbacks.size(); i++) {
1706                         mCallbacks.get(i).startAssist((Bundle) msg.obj);
1707                     }
1708                     break;
1709                 case MSG_CAMERA_LAUNCH_GESTURE:
1710                     for (int i = 0; i < mCallbacks.size(); i++) {
1711                         mCallbacks.get(i).onCameraLaunchGestureDetected(msg.arg1);
1712                     }
1713                     break;
1714                 case MSG_WALLET_ACTION_LAUNCH_GESTURE:
1715                     for (int i = 0; i < mCallbacks.size(); i++) {
1716                         mCallbacks.get(i).onWalletLaunchGestureDetected();
1717                     }
1718                     break;
1719                 case MSG_EMERGENCY_ACTION_LAUNCH_GESTURE:
1720                     for (int i = 0; i < mCallbacks.size(); i++) {
1721                         mCallbacks.get(i).onEmergencyActionLaunchGestureDetected();
1722                     }
1723                     break;
1724                 case MSG_SHOW_PICTURE_IN_PICTURE_MENU:
1725                     for (int i = 0; i < mCallbacks.size(); i++) {
1726                         mCallbacks.get(i).showPictureInPictureMenu();
1727                     }
1728                     break;
1729                 case MSG_ADD_QS_TILE: {
1730                     SomeArgs someArgs = (SomeArgs) msg.obj;
1731                     for (int i = 0; i < mCallbacks.size(); i++) {
1732                         mCallbacks.get(i).addQsTileToFrontOrEnd(
1733                                 (ComponentName) someArgs.arg1, (boolean) someArgs.arg2);
1734                     }
1735                     someArgs.recycle();
1736                     break;
1737                 }
1738                 case MSG_REMOVE_QS_TILE:
1739                     for (int i = 0; i < mCallbacks.size(); i++) {
1740                         mCallbacks.get(i).remQsTile((ComponentName) msg.obj);
1741                     }
1742                     break;
1743                 case MSG_SET_QS_TILES:
1744                     for (int i = 0; i < mCallbacks.size(); i++) {
1745                         mCallbacks.get(i).setQsTiles((String[]) msg.obj);
1746                     }
1747                     break;
1748                 case MSG_CLICK_QS_TILE:
1749                     for (int i = 0; i < mCallbacks.size(); i++) {
1750                         mCallbacks.get(i).clickTile((ComponentName) msg.obj);
1751                     }
1752                     break;
1753                 case MSG_TOGGLE_APP_SPLIT_SCREEN:
1754                     for (int i = 0; i < mCallbacks.size(); i++) {
1755                         mCallbacks.get(i).toggleSplitScreen();
1756                     }
1757                     break;
1758                 case MSG_HANDLE_SYSTEM_KEY:
1759                     for (int i = 0; i < mCallbacks.size(); i++) {
1760                         mCallbacks.get(i).handleSystemKey((KeyEvent) msg.obj);
1761                     }
1762                     break;
1763                 case MSG_SHOW_GLOBAL_ACTIONS:
1764                     for (int i = 0; i < mCallbacks.size(); i++) {
1765                         mCallbacks.get(i).handleShowGlobalActionsMenu();
1766                     }
1767                     break;
1768                 case MSG_SHOW_SHUTDOWN_UI:
1769                     for (int i = 0; i < mCallbacks.size(); i++) {
1770                         mCallbacks.get(i).handleShowShutdownUi(msg.arg1 != 0, (String) msg.obj);
1771                     }
1772                     break;
1773                 case MSG_SET_TOP_APP_HIDES_STATUS_BAR:
1774                     for (int i = 0; i < mCallbacks.size(); i++) {
1775                         mCallbacks.get(i).setTopAppHidesStatusBar(msg.arg1 != 0);
1776                     }
1777                     break;
1778                 case MSG_ROTATION_PROPOSAL:
1779                     for (int i = 0; i < mCallbacks.size(); i++) {
1780                         mCallbacks.get(i).onRotationProposal(msg.arg1, msg.arg2 != 0);
1781                     }
1782                     break;
1783                 case MSG_BIOMETRIC_SHOW: {
1784                     mHandler.removeMessages(MSG_BIOMETRIC_ERROR);
1785                     mHandler.removeMessages(MSG_BIOMETRIC_HELP);
1786                     mHandler.removeMessages(MSG_BIOMETRIC_AUTHENTICATED);
1787                     SomeArgs someArgs = (SomeArgs) msg.obj;
1788                     for (int i = 0; i < mCallbacks.size(); i++) {
1789                         mCallbacks.get(i).showAuthenticationDialog(
1790                                 (PromptInfo) someArgs.arg1,
1791                                 (IBiometricSysuiReceiver) someArgs.arg2,
1792                                 (int[]) someArgs.arg3 /* sensorIds */,
1793                                 (boolean) someArgs.arg4 /* credentialAllowed */,
1794                                 (boolean) someArgs.arg5 /* requireConfirmation */,
1795                                 someArgs.argi1 /* userId */,
1796                                 someArgs.argl1 /* operationId */,
1797                                 (String) someArgs.arg6 /* opPackageName */,
1798                                 someArgs.argl2 /* requestId */);
1799                     }
1800                     someArgs.recycle();
1801                     break;
1802                 }
1803                 case MSG_BIOMETRIC_AUTHENTICATED: {
1804                     SomeArgs someArgs = (SomeArgs) msg.obj;
1805                     for (int i = 0; i < mCallbacks.size(); i++) {
1806                         mCallbacks.get(i).onBiometricAuthenticated(someArgs.argi1 /* modality */);
1807                     }
1808                     someArgs.recycle();
1809                     break;
1810                 }
1811                 case MSG_BIOMETRIC_HELP: {
1812                     SomeArgs someArgs = (SomeArgs) msg.obj;
1813                     for (int i = 0; i < mCallbacks.size(); i++) {
1814                         mCallbacks.get(i).onBiometricHelp(
1815                                 someArgs.argi1 /* modality */,
1816                                 (String) someArgs.arg1 /* message */);
1817                     }
1818                     someArgs.recycle();
1819                     break;
1820                 }
1821                 case MSG_BIOMETRIC_ERROR: {
1822                     SomeArgs someArgs = (SomeArgs) msg.obj;
1823                     for (int i = 0; i < mCallbacks.size(); i++) {
1824                         mCallbacks.get(i).onBiometricError(
1825                                 someArgs.argi1 /* modality */,
1826                                 someArgs.argi2 /* error */,
1827                                 someArgs.argi3 /* vendorCode */
1828                         );
1829                     }
1830                     someArgs.recycle();
1831                     break;
1832                 }
1833                 case MSG_BIOMETRIC_HIDE: {
1834                     final SomeArgs someArgs = (SomeArgs) msg.obj;
1835                     for (int i = 0; i < mCallbacks.size(); i++) {
1836                         mCallbacks.get(i).hideAuthenticationDialog(someArgs.argl1 /* requestId */);
1837                     }
1838                     someArgs.recycle();
1839                     break;
1840                 }
1841                 case MSG_SET_BIOMETRICS_LISTENER:
1842                     for (int i = 0; i < mCallbacks.size(); i++) {
1843                         mCallbacks.get(i).setBiometricContextListener(
1844                                 (IBiometricContextListener) msg.obj);
1845                     }
1846                     break;
1847                 case MSG_SET_UDFPS_REFRESH_RATE_CALLBACK:
1848                     for (int i = 0; i < mCallbacks.size(); i++) {
1849                         mCallbacks.get(i).setUdfpsRefreshRateCallback(
1850                                 (IUdfpsRefreshRateRequestCallback) msg.obj);
1851                     }
1852                     break;
1853                 case MSG_SHOW_CHARGING_ANIMATION:
1854                     for (int i = 0; i < mCallbacks.size(); i++) {
1855                         mCallbacks.get(i).showWirelessChargingAnimation(msg.arg1);
1856                     }
1857                     break;
1858                 case MSG_SHOW_PINNING_TOAST_ENTER_EXIT:
1859                     for (int i = 0; i < mCallbacks.size(); i++) {
1860                         mCallbacks.get(i).showPinningEnterExitToast((Boolean) msg.obj);
1861                     }
1862                     break;
1863                 case MSG_SHOW_PINNING_TOAST_ESCAPE:
1864                     for (int i = 0; i < mCallbacks.size(); i++) {
1865                         mCallbacks.get(i).showPinningEscapeToast();
1866                     }
1867                     break;
1868                 case MSG_DISPLAY_ADD_SYSTEM_DECORATIONS:
1869                     for (int i = 0; i < mCallbacks.size(); i++) {
1870                         mCallbacks.get(i).onDisplayAddSystemDecorations(msg.arg1);
1871                     }
1872                     break;
1873                 case MSG_DISPLAY_REMOVE_SYSTEM_DECORATIONS:
1874                     for (int i = 0; i < mCallbacks.size(); i++) {
1875                         mCallbacks.get(i).onDisplayRemoveSystemDecorations(msg.arg1);
1876                     }
1877                     break;
1878                 case MSG_RECENTS_ANIMATION_STATE_CHANGED:
1879                     for (int i = 0; i < mCallbacks.size(); i++) {
1880                         mCallbacks.get(i).onRecentsAnimationStateChanged(msg.arg1 > 0);
1881                     }
1882                     break;
1883                 case MSG_SYSTEM_BAR_CHANGED:
1884                     args = (SomeArgs) msg.obj;
1885                     for (int i = 0; i < mCallbacks.size(); i++) {
1886                         mCallbacks.get(i).onSystemBarAttributesChanged(args.argi1, args.argi2,
1887                                 (AppearanceRegion[]) args.arg1, args.argi3 == 1, args.argi4,
1888                                 args.argi5, (String) args.arg3, (LetterboxDetails[]) args.arg4);
1889                     }
1890                     args.recycle();
1891                     break;
1892                 case MSG_SHOW_TRANSIENT: {
1893                     args = (SomeArgs) msg.obj;
1894                     final int displayId = args.argi1;
1895                     final int types = args.argi2;
1896                     final boolean isGestureOnSystemBar = args.argi3 != 0;
1897                     args.recycle();
1898                     for (int i = 0; i < mCallbacks.size(); i++) {
1899                         mCallbacks.get(i).showTransient(displayId, types, isGestureOnSystemBar);
1900                     }
1901                     break;
1902                 }
1903                 case MSG_ABORT_TRANSIENT: {
1904                     args = (SomeArgs) msg.obj;
1905                     final int displayId = args.argi1;
1906                     final int types = args.argi2;
1907                     args.recycle();
1908                     for (int i = 0; i < mCallbacks.size(); i++) {
1909                         mCallbacks.get(i).abortTransient(displayId, types);
1910                     }
1911                     break;
1912                 }
1913                 case MSG_SHOW_INATTENTIVE_SLEEP_WARNING:
1914                     for (int i = 0; i < mCallbacks.size(); i++) {
1915                         mCallbacks.get(i).showInattentiveSleepWarning();
1916                     }
1917                     break;
1918                 case MSG_DISMISS_INATTENTIVE_SLEEP_WARNING:
1919                     for (int i = 0; i < mCallbacks.size(); i++) {
1920                         mCallbacks.get(i).dismissInattentiveSleepWarning((Boolean) msg.obj);
1921                     }
1922                     break;
1923                 case MSG_SHOW_TOAST: {
1924                     args = (SomeArgs) msg.obj;
1925                     String packageName = (String) args.arg1;
1926                     IBinder token = (IBinder) args.arg2;
1927                     CharSequence text = (CharSequence) args.arg3;
1928                     IBinder windowToken = (IBinder) args.arg4;
1929                     ITransientNotificationCallback callback =
1930                             (ITransientNotificationCallback) args.arg5;
1931                     int uid = args.argi1;
1932                     int duration = args.argi2;
1933                     int displayId = args.argi3;
1934                     for (Callbacks callbacks : mCallbacks) {
1935                         callbacks.showToast(uid, packageName, token, text, windowToken, duration,
1936                                 callback, displayId);
1937                     }
1938                     break;
1939                 }
1940                 case MSG_HIDE_TOAST: {
1941                     args = (SomeArgs) msg.obj;
1942                     String packageName = (String) args.arg1;
1943                     IBinder token = (IBinder) args.arg2;
1944                     for (Callbacks callbacks : mCallbacks) {
1945                         callbacks.hideToast(packageName, token);
1946                     }
1947                     break;
1948                 }
1949                 case MSG_TRACING_STATE_CHANGED:
1950                     for (int i = 0; i < mCallbacks.size(); i++) {
1951                         mCallbacks.get(i).onTracingStateChanged((Boolean) msg.obj);
1952                     }
1953                     break;
1954                 case MSG_SUPPRESS_AMBIENT_DISPLAY:
1955                     for (Callbacks callbacks: mCallbacks) {
1956                         callbacks.suppressAmbientDisplay((boolean) msg.obj);
1957                     }
1958                     break;
1959                 case MSG_REQUEST_MAGNIFICATION_CONNECTION:
1960                     for (int i = 0; i < mCallbacks.size(); i++) {
1961                         mCallbacks.get(i).requestMagnificationConnection((Boolean) msg.obj);
1962                     }
1963                     break;
1964                 case MSG_SET_NAVIGATION_BAR_LUMA_SAMPLING_ENABLED:
1965                     for (int i = 0; i < mCallbacks.size(); i++) {
1966                         mCallbacks.get(i).setNavigationBarLumaSamplingEnabled(msg.arg1,
1967                                 msg.arg2 != 0);
1968                     }
1969                     break;
1970                 case MSG_TILE_SERVICE_REQUEST_ADD:
1971                     args = (SomeArgs) msg.obj;
1972                     ComponentName componentName = (ComponentName) args.arg1;
1973                     CharSequence appName = (CharSequence) args.arg2;
1974                     CharSequence label = (CharSequence) args.arg3;
1975                     Icon icon = (Icon) args.arg4;
1976                     IAddTileResultCallback callback = (IAddTileResultCallback) args.arg5;
1977                     int callingUid = (int) args.arg6;
1978                     for (int i = 0; i < mCallbacks.size(); i++) {
1979                         mCallbacks.get(i).requestAddTile(callingUid,
1980                                 componentName, appName, label, icon, callback);
1981                     }
1982                     args.recycle();
1983                     break;
1984                 case MSG_TILE_SERVICE_REQUEST_CANCEL:
1985                     String packageName = (String) msg.obj;
1986                     for (int i = 0; i < mCallbacks.size(); i++) {
1987                         mCallbacks.get(i).cancelRequestAddTile(packageName);
1988                     }
1989                     break;
1990                 case MSG_MEDIA_TRANSFER_SENDER_STATE:
1991                     args = (SomeArgs) msg.obj;
1992                     int displayState = (int) args.arg1;
1993                     MediaRoute2Info routeInfo = (MediaRoute2Info) args.arg2;
1994                     IUndoMediaTransferCallback undoCallback =
1995                             (IUndoMediaTransferCallback) args.arg3;
1996                     for (int i = 0; i < mCallbacks.size(); i++) {
1997                         mCallbacks.get(i).updateMediaTapToTransferSenderDisplay(
1998                                 displayState, routeInfo, undoCallback);
1999                     }
2000                     args.recycle();
2001                     break;
2002                 case MSG_MEDIA_TRANSFER_RECEIVER_STATE:
2003                     args = (SomeArgs) msg.obj;
2004                     int receiverDisplayState = (int) args.arg1;
2005                     MediaRoute2Info receiverRouteInfo = (MediaRoute2Info) args.arg2;
2006                     Icon appIcon = (Icon) args.arg3;
2007                     appName = (CharSequence) args.arg4;
2008                     for (int i = 0; i < mCallbacks.size(); i++) {
2009                         mCallbacks.get(i).updateMediaTapToTransferReceiverDisplay(
2010                                 receiverDisplayState, receiverRouteInfo, appIcon, appName);
2011                     }
2012                     args.recycle();
2013                     break;
2014                 case MSG_REGISTER_NEARBY_MEDIA_DEVICE_PROVIDER:
2015                     INearbyMediaDevicesProvider provider = (INearbyMediaDevicesProvider) msg.obj;
2016                     for (int i = 0; i < mCallbacks.size(); i++) {
2017                         mCallbacks.get(i).registerNearbyMediaDevicesProvider(provider);
2018                     }
2019                     break;
2020                 case MSG_UNREGISTER_NEARBY_MEDIA_DEVICE_PROVIDER:
2021                     provider = (INearbyMediaDevicesProvider) msg.obj;
2022                     for (int i = 0; i < mCallbacks.size(); i++) {
2023                         mCallbacks.get(i).unregisterNearbyMediaDevicesProvider(provider);
2024                     }
2025                     break;
2026                 case MSG_TILE_SERVICE_REQUEST_LISTENING_STATE:
2027                     ComponentName component = (ComponentName) msg.obj;
2028                     for (int i = 0; i < mCallbacks.size(); i++) {
2029                         mCallbacks.get(i).requestTileServiceListeningState(component);
2030                     }
2031                     break;
2032                 case MSG_SHOW_REAR_DISPLAY_DIALOG:
2033                     for (int i = 0; i < mCallbacks.size(); i++) {
2034                         mCallbacks.get(i).showRearDisplayDialog((Integer) msg.obj);
2035                     }
2036                     break;
2037                 case MSG_MOVE_FOCUSED_TASK_TO_FULLSCREEN: {
2038                     args = (SomeArgs) msg.obj;
2039                     int displayId = args.argi1;
2040                     for (int i = 0; i < mCallbacks.size(); i++) {
2041                         mCallbacks.get(i).moveFocusedTaskToFullscreen(displayId);
2042                     }
2043                     break;
2044                 }
2045                 case MSG_MOVE_FOCUSED_TASK_TO_STAGE_SPLIT: {
2046                     args = (SomeArgs) msg.obj;
2047                     int displayId = args.argi1;
2048                     boolean leftOrTop = args.argi2 != 0;
2049                     for (int i = 0; i < mCallbacks.size(); i++) {
2050                         mCallbacks.get(i).moveFocusedTaskToStageSplit(displayId, leftOrTop);
2051                     }
2052                     break;
2053                 }
2054                 case MSG_SET_SPLITSCREEN_FOCUS:
2055                     for (int i = 0; i < mCallbacks.size(); i++) {
2056                         mCallbacks.get(i).setSplitscreenFocus((Boolean) msg.obj);
2057                     }
2058                     break;
2059                 case MSG_SHOW_MEDIA_OUTPUT_SWITCHER:
2060                     args = (SomeArgs) msg.obj;
2061                     String clientPackageName = (String) args.arg1;
2062                     UserHandle clientUserHandle = (UserHandle) args.arg2;
2063                     for (int i = 0; i < mCallbacks.size(); i++) {
2064                         mCallbacks.get(i).showMediaOutputSwitcher(clientPackageName,
2065                                 clientUserHandle);
2066                     }
2067                     break;
2068                 case MSG_CONFIRM_IMMERSIVE_PROMPT:
2069                     for (int i = 0; i < mCallbacks.size(); i++) {
2070                         mCallbacks.get(i).confirmImmersivePrompt();
2071                     }
2072                     break;
2073                 case MSG_IMMERSIVE_CHANGED:
2074                     args = (SomeArgs) msg.obj;
2075                     int rootDisplayAreaId = args.argi1;
2076                     boolean isImmersiveMode = args.argi2 != 0;
2077                     int windowType = args.argi3;
2078                     for (int i = 0; i < mCallbacks.size(); i++) {
2079                         mCallbacks.get(i).immersiveModeChanged(rootDisplayAreaId, isImmersiveMode,
2080                                 windowType);
2081                     }
2082                     break;
2083                 case MSG_ENTER_DESKTOP: {
2084                     args = (SomeArgs) msg.obj;
2085                     int displayId = args.argi1;
2086                     for (int i = 0; i < mCallbacks.size(); i++) {
2087                         mCallbacks.get(i).moveFocusedTaskToDesktop(displayId);
2088                     }
2089                     break;
2090                 }
2091             }
2092         }
2093     }
2094 }
2095