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