summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt25
-rw-r--r--core/api/lint-baseline.txt17
-rw-r--r--core/api/test-current.txt12
-rw-r--r--core/java/android/app/Notification.java17
-rw-r--r--core/java/android/companion/CompanionDeviceManager.java74
-rw-r--r--core/java/android/companion/ICompanionDeviceManager.aidl2
-rw-r--r--core/java/android/content/pm/ActivityInfo.java13
-rw-r--r--core/java/android/content/res/flags.aconfig13
-rw-r--r--core/java/android/hardware/input/InputManager.java10
-rw-r--r--core/java/android/hardware/input/InputSettings.java77
-rw-r--r--core/java/android/hardware/input/input_framework.aconfig29
-rw-r--r--core/java/android/media/Image.java (renamed from media/java/android/media/Image.java)0
-rw-r--r--core/java/android/media/ImageReader.java (renamed from media/java/android/media/ImageReader.java)0
-rw-r--r--core/java/android/media/ImageUtils.java (renamed from media/java/android/media/ImageUtils.java)0
-rw-r--r--core/java/android/media/ImageWriter.java (renamed from media/java/android/media/ImageWriter.java)0
-rw-r--r--core/java/android/media/PublicFormatUtils.java (renamed from media/java/android/media/PublicFormatUtils.java)0
-rw-r--r--core/java/android/os/TestLooperManager.java2
-rw-r--r--core/java/android/provider/DocumentsProvider.java7
-rw-r--r--core/java/android/provider/Settings.java28
-rw-r--r--core/java/android/view/FrameMetrics.java25
-rw-r--r--core/java/android/view/ViewRootImpl.java20
-rw-r--r--core/java/android/view/WindowManager.java9
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeInfo.java405
-rw-r--r--core/java/android/view/contentcapture/MainContentCaptureSession.java4
-rw-r--r--core/java/android/view/contentcapture/flags/content_capture_flags.aconfig11
-rw-r--r--core/java/android/window/ConfigurationDispatcher.java44
-rw-r--r--core/java/android/window/TaskFragmentCreationParams.java43
-rw-r--r--core/java/android/window/WindowContext.java13
-rw-r--r--core/java/android/window/WindowContextController.java1
-rw-r--r--core/java/android/window/WindowProviderService.java14
-rw-r--r--core/java/android/window/WindowTokenClient.java25
-rw-r--r--core/java/android/window/WindowTokenClientController.java17
-rw-r--r--core/java/android/window/flags/windowing_sdk.aconfig8
-rw-r--r--core/java/com/android/internal/os/ZygoteInit.java21
-rw-r--r--core/java/com/android/internal/os/flags.aconfig7
-rw-r--r--core/java/com/android/internal/pm/pkg/component/AconfigFlags.java77
-rw-r--r--core/java/com/android/internal/widget/ConversationLayout.java9
-rw-r--r--core/java/com/android/internal/widget/MessagingLayout.java5
-rw-r--r--core/java/com/android/internal/widget/NotificationProgressBar.java107
-rw-r--r--core/jni/Android.bp36
-rw-r--r--core/jni/AndroidRuntime.cpp6
-rw-r--r--core/jni/android_media_ImageReader.cpp (renamed from media/jni/android_media_ImageReader.cpp)1
-rw-r--r--core/jni/android_media_ImageWriter.cpp (renamed from media/jni/android_media_ImageWriter.cpp)1
-rw-r--r--core/jni/android_media_PublicFormatUtils.cpp (renamed from media/jni/android_media_PublicFormatUtils.cpp)0
-rw-r--r--core/jni/android_media_Utils.cpp (renamed from media/jni/android_media_Utils.cpp)0
-rw-r--r--core/jni/android_media_Utils.h (renamed from media/jni/android_media_Utils.h)0
-rw-r--r--core/res/res/values-af/strings.xml35
-rw-r--r--core/res/res/values-am/strings.xml33
-rw-r--r--core/res/res/values-ar/strings.xml31
-rw-r--r--core/res/res/values-as/strings.xml33
-rw-r--r--core/res/res/values-az/strings.xml33
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml25
-rw-r--r--core/res/res/values-be/strings.xml37
-rw-r--r--core/res/res/values-bg/strings.xml33
-rw-r--r--core/res/res/values-bn/strings.xml33
-rw-r--r--core/res/res/values-bs/strings.xml29
-rw-r--r--core/res/res/values-ca/strings.xml33
-rw-r--r--core/res/res/values-cs/strings.xml8
-rw-r--r--core/res/res/values-da/strings.xml33
-rw-r--r--core/res/res/values-de/strings.xml39
-rw-r--r--core/res/res/values-el/strings.xml35
-rw-r--r--core/res/res/values-en-rAU/strings.xml33
-rw-r--r--core/res/res/values-en-rCA/strings.xml25
-rw-r--r--core/res/res/values-en-rGB/strings.xml33
-rw-r--r--core/res/res/values-en-rIN/strings.xml33
-rw-r--r--core/res/res/values-es-rUS/strings.xml29
-rw-r--r--core/res/res/values-es/strings.xml33
-rw-r--r--core/res/res/values-et/strings.xml27
-rw-r--r--core/res/res/values-eu/strings.xml33
-rw-r--r--core/res/res/values-fa/strings.xml37
-rw-r--r--core/res/res/values-fi/strings.xml35
-rw-r--r--core/res/res/values-fr-rCA/strings.xml33
-rw-r--r--core/res/res/values-fr/strings.xml33
-rw-r--r--core/res/res/values-gl/strings.xml33
-rw-r--r--core/res/res/values-gu/strings.xml37
-rw-r--r--core/res/res/values-hi/strings.xml39
-rw-r--r--core/res/res/values-hr/strings.xml25
-rw-r--r--core/res/res/values-hu/strings.xml33
-rw-r--r--core/res/res/values-hy/strings.xml12
-rw-r--r--core/res/res/values-in/strings.xml33
-rw-r--r--core/res/res/values-is/strings.xml33
-rw-r--r--core/res/res/values-it/strings.xml45
-rw-r--r--core/res/res/values-iw/strings.xml14
-rw-r--r--core/res/res/values-ja/strings.xml25
-rw-r--r--core/res/res/values-ka/strings.xml25
-rw-r--r--core/res/res/values-kk/strings.xml35
-rw-r--r--core/res/res/values-km/strings.xml25
-rw-r--r--core/res/res/values-kn/strings.xml37
-rw-r--r--core/res/res/values-ko/strings.xml33
-rw-r--r--core/res/res/values-ky/strings.xml33
-rw-r--r--core/res/res/values-lo/strings.xml25
-rw-r--r--core/res/res/values-lt/strings.xml37
-rw-r--r--core/res/res/values-lv/strings.xml33
-rw-r--r--core/res/res/values-mk/strings.xml33
-rw-r--r--core/res/res/values-ml/strings.xml25
-rw-r--r--core/res/res/values-mn/strings.xml33
-rw-r--r--core/res/res/values-mr/strings.xml37
-rw-r--r--core/res/res/values-ms/strings.xml25
-rw-r--r--core/res/res/values-my/strings.xml33
-rw-r--r--core/res/res/values-nb/strings.xml33
-rw-r--r--core/res/res/values-ne/strings.xml44
-rw-r--r--core/res/res/values-nl/strings.xml25
-rw-r--r--core/res/res/values-or/strings.xml35
-rw-r--r--core/res/res/values-pa/strings.xml25
-rw-r--r--core/res/res/values-pl/strings.xml33
-rw-r--r--core/res/res/values-pt-rBR/strings.xml37
-rw-r--r--core/res/res/values-pt-rPT/strings.xml25
-rw-r--r--core/res/res/values-pt/strings.xml37
-rw-r--r--core/res/res/values-ro/strings.xml33
-rw-r--r--core/res/res/values-ru/strings.xml25
-rw-r--r--core/res/res/values-si/strings.xml12
-rw-r--r--core/res/res/values-sk/strings.xml27
-rw-r--r--core/res/res/values-sl/strings.xml27
-rw-r--r--core/res/res/values-sq/strings.xml33
-rw-r--r--core/res/res/values-sr/strings.xml25
-rw-r--r--core/res/res/values-sv/strings.xml33
-rw-r--r--core/res/res/values-sw/strings.xml33
-rw-r--r--core/res/res/values-ta/strings.xml33
-rw-r--r--core/res/res/values-te/strings.xml33
-rw-r--r--core/res/res/values-th/strings.xml25
-rw-r--r--core/res/res/values-tl/strings.xml29
-rw-r--r--core/res/res/values-tr/strings.xml33
-rw-r--r--core/res/res/values-uk/strings.xml14
-rw-r--r--core/res/res/values-ur/strings.xml37
-rw-r--r--core/res/res/values-uz/strings.xml29
-rw-r--r--core/res/res/values-vi/strings.xml33
-rw-r--r--core/res/res/values-zh-rCN/strings.xml35
-rw-r--r--core/res/res/values-zh-rHK/strings.xml33
-rw-r--r--core/res/res/values-zh-rTW/strings.xml33
-rw-r--r--core/res/res/values-zu/strings.xml33
-rw-r--r--core/res/res/values/dimens.xml9
-rw-r--r--core/res/res/values/ids.xml3
-rw-r--r--core/res/res/values/public-staging.xml2
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--core/tests/coretests/src/android/app/NotificationTest.java48
-rw-r--r--core/tests/coretests/src/android/hardware/input/InputFlagsTest.java51
-rw-r--r--core/tests/coretests/src/android/hardware/input/OWNERS2
-rw-r--r--core/tests/coretests/src/android/view/WindowManagerTests.java18
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java2
-rw-r--r--core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java35
-rw-r--r--core/tests/coretests/src/android/window/ConfigurationDispatcherTest.kt110
-rw-r--r--core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java21
-rw-r--r--core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java62
-rw-r--r--core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java568
-rw-r--r--core/tests/coretests/src/com/android/internal/widget/NotificationProgressModelTest.java4
-rw-r--r--graphics/java/android/graphics/FrameInfo.java3
-rw-r--r--libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerBubbleBarTest.kt3
-rw-r--r--libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt4
-rw-r--r--libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt11
-rw-r--r--libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt3
-rw-r--r--libs/WindowManager/Shell/res/drawable/decor_handle_dark.xml24
-rw-r--r--libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml2
-rw-r--r--libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml147
-rw-r--r--libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_action_button.xml38
-rw-r--r--libs/WindowManager/Shell/res/values-af/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-am/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-ar/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-az/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-bg/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-bn/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-bs/strings.xml24
-rw-r--r--libs/WindowManager/Shell/res/values-ca/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-cs/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-de/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-el/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-en-rAU/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-en-rGB/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-en-rIN/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-es/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-eu/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-fi/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-fr-rCA/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-fr/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-gu/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-hi/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-hu/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-hy/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-in/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-iw/strings.xml35
-rw-r--r--libs/WindowManager/Shell/res/values-ka/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-kk/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-ko/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-ky/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-lo/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-lv/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-mk/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-mn/strings.xml35
-rw-r--r--libs/WindowManager/Shell/res/values-mr/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-my/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-nb/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-ne/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-or/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-pl/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-ro/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-sq/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-sr/strings.xml6
-rw-r--r--libs/WindowManager/Shell/res/values-sv/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-sw/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-ta/strings.xml35
-rw-r--r--libs/WindowManager/Shell/res/values-tr/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-uk/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-ur/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-vi/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-zh-rCN/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-zh-rHK/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-zh-rTW/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values-zu/strings.xml33
-rw-r--r--libs/WindowManager/Shell/res/values/attrs.xml7
-rw-r--r--libs/WindowManager/Shell/res/values/dimen.xml2
-rw-r--r--libs/WindowManager/Shell/res/values/strings.xml12
-rw-r--r--libs/WindowManager/Shell/res/values/styles.xml9
-rw-r--r--libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt17
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java11
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java61
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java13
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUiEventLogger.kt20
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt18
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt84
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt57
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipAppIconOverlay.java25
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java13
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt53
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuActionButton.kt120
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt54
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java86
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt12
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt62
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt14
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt10
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt39
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java3
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt7
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt13
-rw-r--r--libs/hwui/FrameInfo.cpp5
-rw-r--r--libs/hwui/FrameInfo.h9
-rw-r--r--libs/hwui/JankTracker.cpp2
-rw-r--r--libs/hwui/Properties.cpp8
-rw-r--r--libs/hwui/Properties.h1
-rw-r--r--libs/hwui/aconfig/hwui_flags.aconfig11
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp8
-rw-r--r--libs/hwui/tests/unit/JankTrackerTests.cpp13
-rw-r--r--media/jni/Android.bp36
-rw-r--r--media/jni/android_media_MediaPlayer.cpp18
-rw-r--r--nfc-non-updatable/OWNERS2
-rw-r--r--nfc-non-updatable/java/android/nfc/cardemulation/ApduServiceInfo.java5
-rw-r--r--packages/CredentialManager/res/values-pl/strings.xml4
-rw-r--r--packages/InputDevices/res/raw/keyboard_layout_english_india.kcm400
-rw-r--r--packages/InputDevices/res/values/strings.xml3
-rw-r--r--packages/InputDevices/res/xml/keyboard_layouts.xml7
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/widget/PreviewPageFrame.java23
-rw-r--r--packages/SettingsLib/res/values-af/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-am/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ar/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-as/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-as/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-az/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-az/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-be/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-be/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-bg/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-bn/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-bn/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-bs/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml4
-rw-r--r--packages/SettingsLib/res/values-ca/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-cs/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-da/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-de/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml5
-rw-r--r--packages/SettingsLib/res/values-el/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rAU/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rCA/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-en-rGB/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-en-rIN/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-es-rUS/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-es/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-et/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-eu/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-eu/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-fa/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-fi/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-fr/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-gl/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-gl/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-gu/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-gu/strings.xml5
-rw-r--r--packages/SettingsLib/res/values-hi/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml5
-rw-r--r--packages/SettingsLib/res/values-hr/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-hu/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-hy/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-in/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-is/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-is/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-it/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-iw/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml5
-rw-r--r--packages/SettingsLib/res/values-ja/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-ja/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-ka/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-kk/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-kk/strings.xml5
-rw-r--r--packages/SettingsLib/res/values-km/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-kn/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-kn/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ko/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ky/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-ky/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-lo/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-lt/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-lv/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-mk/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-mk/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ml/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-mn/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-mn/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-mr/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-mr/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ms/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-my/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-nb/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ne/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-ne/strings.xml5
-rw-r--r--packages/SettingsLib/res/values-nl/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-or/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-or/strings.xml5
-rw-r--r--packages/SettingsLib/res/values-pa/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-pa/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-pl/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-pl/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-pt/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ro/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ru/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-si/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-si/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sk/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-sl/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-sq/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-sq/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sr/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-sv/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-sw/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ta/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-te/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-te/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-th/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-tl/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-tr/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-uk/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-ur/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-ur/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-uz/arrays.xml9
-rw-r--r--packages/SettingsLib/res/values-vi/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml5
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml3
-rw-r--r--packages/SettingsLib/res/values-zu/arrays.xml21
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml3
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/display/DisplayDensityUtilsTest.java144
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java1
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java1
-rw-r--r--packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java4
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt3
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt5
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt45
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt5
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt7
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt7
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneTransitionLayoutDataSource.kt12
-rw-r--r--packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt2
-rw-r--r--packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt11
-rw-r--r--packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt3
-rw-r--r--packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt15
-rw-r--r--packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt3
-rw-r--r--packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt26
-rw-r--r--packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt10
-rw-r--r--packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt2
-rw-r--r--packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt8
-rw-r--r--packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt6
-rw-r--r--packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt4
-rw-r--r--packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt4
-rw-r--r--packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt4
-rw-r--r--packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt10
-rw-r--r--packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt82
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt7
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt834
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt3
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelTest.kt4
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt241
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt19
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorTest.kt19
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialNotificationCoordinatorTest.kt66
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt41
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt7
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt23
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt7
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt438
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt56
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt11
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandlerTest.kt135
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java46
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt40
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/GridLayoutTypeInteractorTest.kt2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/QSColumnsInteractorTest.kt2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/MediaInRowInLandscapeViewModelTest.kt4
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/QSColumnsViewModelTest.kt4
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt120
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractorImplTest.kt4
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt3
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt75
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt7
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelperTest.kt21
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelperTest.kt8
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/ConversationNotificationProcessorTest.kt161
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java20
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt29
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/shelf/ui/viewmodel/NotificationShelfViewModelTest.kt5
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt4
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt34
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt30
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt123
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt28
-rw-r--r--packages/SystemUI/plugin_core/proguard.flags5
-rw-r--r--packages/SystemUI/proguard_common.flags20
-rw-r--r--packages/SystemUI/res/layout/combined_qs_header.xml1
-rw-r--r--packages/SystemUI/res/layout/ongoing_activity_chip_content.xml7
-rw-r--r--packages/SystemUI/res/layout/system_icons.xml7
-rw-r--r--packages/SystemUI/res/values-iw/tiles_states_strings.xml2
-rw-r--r--packages/SystemUI/res/values-night/colors.xml10
-rw-r--r--packages/SystemUI/res/values/colors.xml10
-rw-r--r--packages/SystemUI/res/values/config.xml3
-rw-r--r--packages/SystemUI/res/values/dimens.xml1
-rw-r--r--packages/SystemUI/res/values/strings.xml4
-rw-r--r--packages/SystemUI/res/values/styles.xml9
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java23
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java42
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/common/shared/colors/SurfaceEffectColors.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt225
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt9
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt12
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt22
-rw-r--r--packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt29
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt60
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt31
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt20
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt142
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt23
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt15
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitions.kt146
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandler.kt55
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt134
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt76
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt62
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractor.kt14
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ui/ShadeColors.kt40
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java73
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModel.kt9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipContent.kt125
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt24
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt42
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelper.kt10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/BundleEntry.java (renamed from core/java/com/android/internal/app/IAppOpsCallback.aidl)15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/EntryAdapter.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListEntry.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/PipelineEntry.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackOptionalModule.kt (renamed from packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackModule.kt)4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/AvalancheController.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java24
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java55
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/binder/UnifiedBatteryViewBinder.kt13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/composable/BatteryWithEstimate.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModel.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt47
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt27
-rw-r--r--packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/unfold/NoCooldownDisplaySwitchLatencyTracker.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt20
-rw-r--r--packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt18
-rw-r--r--packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurModule.kt35
-rw-r--r--packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurNotSupportedModule.kt35
-rw-r--r--packages/SystemUI/src/com/android/systemui/window/data/repository/NoopWindowRootViewBlurRepository.kt28
-rw-r--r--packages/SystemUI/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepository.kt69
-rw-r--r--packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt23
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt42
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/EditModeTest.kt21
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/TestMatchers.kt52
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java110
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt2
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt1
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt1
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt1
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt8
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt2
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/ConversationNotificationManagerKosmos.kt (renamed from packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitionsKosmos.kt)17
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderLoggerKosmos.kt (renamed from packages/SystemUI/src/com/android/systemui/common/shared/colors/ShadeColors.kt)19
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModelKosmos.kt7
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt2
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt24
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepositoryKosmos.kt13
-rw-r--r--services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickController.java40
-rw-r--r--services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickIndicatorView.java5
-rw-r--r--services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickTypePanel.java75
-rw-r--r--services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java4
-rw-r--r--services/companion/java/com/android/server/companion/securechannel/AttestationVerifier.java26
-rw-r--r--services/companion/java/com/android/server/companion/securechannel/SecureChannel.java13
-rw-r--r--services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java32
-rw-r--r--services/companion/java/com/android/server/companion/transport/SecureTransport.java15
-rw-r--r--services/companion/java/com/android/server/companion/transport/TransportUtils.java77
-rw-r--r--services/core/Android.bp5
-rw-r--r--services/core/java/com/android/server/app/GameManagerService.java26
-rw-r--r--services/core/java/com/android/server/app/GameManagerSettings.java5
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java2
-rw-r--r--services/core/java/com/android/server/display/mode/VotesStatsReporter.java13
-rw-r--r--services/core/java/com/android/server/flags/services.aconfig7
-rw-r--r--services/core/java/com/android/server/input/InputGestureManager.java36
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java6
-rw-r--r--services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java128
-rw-r--r--services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java15
-rw-r--r--services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java37
-rw-r--r--services/core/java/com/android/server/location/contexthub/ContextHubService.java3
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java9
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java140
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java17
-rw-r--r--services/core/java/com/android/server/wm/AnimatingActivityRegistry.java120
-rw-r--r--services/core/java/com/android/server/wm/AnimationAdapter.java9
-rw-r--r--services/core/java/com/android/server/wm/AppTransition.java2
-rw-r--r--services/core/java/com/android/server/wm/AppTransitionController.java1352
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java27
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java64
-rw-r--r--services/core/java/com/android/server/wm/SnapshotController.java5
-rw-r--r--services/core/java/com/android/server/wm/SurfaceAnimator.java23
-rw-r--r--services/core/java/com/android/server/wm/Task.java29
-rw-r--r--services/core/java/com/android/server/wm/TaskFragment.java17
-rw-r--r--services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java6
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotController.java21
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java11
-rw-r--r--services/core/java/com/android/server/wm/WindowOrganizerController.java20
-rw-r--r--services/core/jni/com_android_server_input_InputManagerService.cpp6
-rw-r--r--services/credentials/java/com/android/server/credentials/RequestSession.java2
-rw-r--r--services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java5
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java33
-rw-r--r--services/incremental/IncrementalService.cpp4
-rw-r--r--services/incremental/IncrementalService.h7
-rw-r--r--services/incremental/ServiceWrappers.h3
-rw-r--r--services/incremental/test/IncrementalServiceTest.cpp2
-rw-r--r--services/java/com/android/server/SystemServer.java32
-rw-r--r--services/java/com/android/server/flags.aconfig7
-rw-r--r--services/proguard.flags5
-rw-r--r--services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java265
-rw-r--r--services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/Android.bp3
-rw-r--r--services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/AndroidManifest.xml1
-rw-r--r--services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/res/layout/input_view.xml22
-rw-r--r--services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/KeyCodeConstants.java85
-rw-r--r--services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java44
-rw-r--r--services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboard.java132
-rw-r--r--services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboardView.java181
-rw-r--r--services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java73
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueImplTest.java1
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java131
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickTypePanelTest.java32
-rw-r--r--services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java128
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java3
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java54
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java107
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java1306
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java520
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java6
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java25
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java6
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java76
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java78
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java27
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java13
-rw-r--r--services/usb/java/com/android/server/usb/UsbPortManager.java11
-rw-r--r--tests/Input/src/android/hardware/input/KeyboardLayoutPreviewTests.kt16
-rw-r--r--tests/Input/src/android/hardware/input/StickyModifierStateListenerTest.kt5
-rw-r--r--tests/Input/src/com/android/server/input/InputManagerServiceTests.kt9
-rw-r--r--tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt6
-rw-r--r--tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewAnsiScreenshotTest.kt10
-rw-r--r--tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewIsoScreenshotTest.kt13
-rw-r--r--tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewJisScreenshotTest.kt10
-rw-r--r--tests/testables/src/android/testing/TestableLooper.java112
663 files changed, 9718 insertions, 11954 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index 050cad4e1a52..d4ed533cad9e 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -2419,6 +2419,7 @@ package android {
field public static final int accessibilityActionScrollRight = 16908347; // 0x102003b
field public static final int accessibilityActionScrollToPosition = 16908343; // 0x1020037
field public static final int accessibilityActionScrollUp = 16908344; // 0x1020038
+ field @FlaggedApi("android.view.accessibility.a11y_selection_api") public static final int accessibilityActionSetExtendedSelection;
field public static final int accessibilityActionSetProgress = 16908349; // 0x102003d
field public static final int accessibilityActionShowOnScreen = 16908342; // 0x1020036
field public static final int accessibilityActionShowTextSuggestions = 16908376; // 0x1020058
@@ -56266,6 +56267,7 @@ package android.view.accessibility {
method public android.view.accessibility.AccessibilityNodeInfo getParent();
method @Nullable public android.view.accessibility.AccessibilityNodeInfo getParent(int);
method public android.view.accessibility.AccessibilityNodeInfo.RangeInfo getRangeInfo();
+ method @FlaggedApi("android.view.accessibility.a11y_selection_api") @Nullable public android.view.accessibility.AccessibilityNodeInfo.Selection getSelection();
method @Nullable public CharSequence getStateDescription();
method @FlaggedApi("android.view.accessibility.supplemental_description") @Nullable public CharSequence getSupplementalDescription();
method public CharSequence getText();
@@ -56374,6 +56376,7 @@ package android.view.accessibility {
method public void setScreenReaderFocusable(boolean);
method public void setScrollable(boolean);
method public void setSelected(boolean);
+ method @FlaggedApi("android.view.accessibility.a11y_selection_api") public void setSelection(@Nullable android.view.accessibility.AccessibilityNodeInfo.Selection);
method public void setShowingHintText(boolean);
method public void setSource(android.view.View);
method public void setSource(android.view.View, int);
@@ -56406,6 +56409,7 @@ package android.view.accessibility {
field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
field @FlaggedApi("android.view.accessibility.granular_scrolling") public static final String ACTION_ARGUMENT_SCROLL_AMOUNT_FLOAT = "android.view.accessibility.action.ARGUMENT_SCROLL_AMOUNT_FLOAT";
field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+ field @FlaggedApi("android.view.accessibility.a11y_selection_api") public static final String ACTION_ARGUMENT_SELECTION_PARCELABLE = "android.view.accessibility.action.ARGUMENT_SELECTION_PARCELABLE";
field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
@@ -56503,6 +56507,7 @@ package android.view.accessibility {
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SCROLL_TO_POSITION;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SCROLL_UP;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SELECT;
+ field @FlaggedApi("android.view.accessibility.a11y_selection_api") @NonNull public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SET_EXTENDED_SELECTION;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SET_PROGRESS;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SET_SELECTION;
field public static final android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction ACTION_SET_TEXT;
@@ -56588,6 +56593,26 @@ package android.view.accessibility {
field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
}
+ @FlaggedApi("android.view.accessibility.a11y_selection_api") public static final class AccessibilityNodeInfo.Selection implements android.os.Parcelable {
+ ctor public AccessibilityNodeInfo.Selection(@NonNull android.view.accessibility.AccessibilityNodeInfo.SelectionPosition, @NonNull android.view.accessibility.AccessibilityNodeInfo.SelectionPosition);
+ method public int describeContents();
+ method @NonNull public android.view.accessibility.AccessibilityNodeInfo.SelectionPosition getEnd();
+ method @NonNull public android.view.accessibility.AccessibilityNodeInfo.SelectionPosition getStart();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityNodeInfo.Selection> CREATOR;
+ }
+
+ @FlaggedApi("android.view.accessibility.a11y_selection_api") public static final class AccessibilityNodeInfo.SelectionPosition implements android.os.Parcelable {
+ ctor public AccessibilityNodeInfo.SelectionPosition(@NonNull android.view.accessibility.AccessibilityNodeInfo, int);
+ ctor public AccessibilityNodeInfo.SelectionPosition(@NonNull android.view.View, int);
+ ctor public AccessibilityNodeInfo.SelectionPosition(@NonNull android.view.View, int, int);
+ method public int describeContents();
+ method @Nullable public android.view.accessibility.AccessibilityNodeInfo getNode();
+ method public int getOffset();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityNodeInfo.SelectionPosition> CREATOR;
+ }
+
public static final class AccessibilityNodeInfo.TouchDelegateInfo implements android.os.Parcelable {
ctor public AccessibilityNodeInfo.TouchDelegateInfo(@NonNull java.util.Map<android.graphics.Region,android.view.View>);
method public int describeContents();
diff --git a/core/api/lint-baseline.txt b/core/api/lint-baseline.txt
index e71dffaf152d..577113b80d84 100644
--- a/core/api/lint-baseline.txt
+++ b/core/api/lint-baseline.txt
@@ -1,3 +1,4 @@
+
// Baseline format: 1.0
BroadcastBehavior: android.app.AlarmManager#ACTION_NEXT_ALARM_CLOCK_CHANGED:
Field 'ACTION_NEXT_ALARM_CLOCK_CHANGED' is missing @BroadcastBehavior
@@ -243,8 +244,6 @@ BroadcastBehavior: android.telephony.TelephonyManager#ACTION_SUBSCRIPTION_SPECIF
Field 'ACTION_SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED' is missing @BroadcastBehavior
BroadcastBehavior: android.telephony.euicc.EuiccManager#ACTION_NOTIFY_CARRIER_SETUP_INCOMPLETE:
Field 'ACTION_NOTIFY_CARRIER_SETUP_INCOMPLETE' is missing @BroadcastBehavior
-
-
DeprecationMismatch: android.accounts.AccountManager#newChooseAccountIntent(android.accounts.Account, java.util.ArrayList<android.accounts.Account>, String[], boolean, String, String, String[], android.os.Bundle):
Method android.accounts.AccountManager.newChooseAccountIntent(android.accounts.Account, java.util.ArrayList<android.accounts.Account>, String[], boolean, String, String, String[], android.os.Bundle): @Deprecated annotation (present) and @deprecated doc tag (not present) do not match
DeprecationMismatch: android.app.Activity#enterPictureInPictureMode():
@@ -381,8 +380,6 @@ DeprecationMismatch: android.webkit.WebViewDatabase#hasFormData():
Method android.webkit.WebViewDatabase.hasFormData(): @Deprecated annotation (present) and @deprecated doc tag (not present) do not match
DeprecationMismatch: javax.microedition.khronos.egl.EGL10#eglCreatePixmapSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, Object, int[]):
Method javax.microedition.khronos.egl.EGL10.eglCreatePixmapSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, Object, int[]): @Deprecated annotation (present) and @deprecated doc tag (not present) do not match
-
-
FlaggedApiLiteral: android.Manifest.permission#BIND_APP_FUNCTION_SERVICE:
@FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.app.appfunctions.flags.Flags.FLAG_ENABLE_APP_FUNCTION_MANAGER).
FlaggedApiLiteral: android.Manifest.permission#BIND_TV_AD_SERVICE:
@@ -405,26 +402,22 @@ FlaggedApiLiteral: android.R.attr#optional:
@FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.content.pm.Flags.FLAG_SDK_LIB_INDEPENDENCE).
FlaggedApiLiteral: android.R.attr#supplementalDescription:
@FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.view.accessibility.Flags.FLAG_SUPPLEMENTAL_DESCRIPTION).
+FlaggedApiLiteral: android.R.id#accessibilityActionSetExtendedSelection:
+ @FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.view.accessibility.Flags.FLAG_A11Y_SELECTION_API).
FlaggedApiLiteral: android.accessibilityservice.AccessibilityService#OVERLAY_RESULT_INTERNAL_ERROR:
@FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.view.accessibility.Flags.FLAG_A11Y_OVERLAY_CALLBACKS).
FlaggedApiLiteral: android.accessibilityservice.AccessibilityService#OVERLAY_RESULT_INVALID:
@FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.view.accessibility.Flags.FLAG_A11Y_OVERLAY_CALLBACKS).
FlaggedApiLiteral: android.accessibilityservice.AccessibilityService#OVERLAY_RESULT_SUCCESS:
@FlaggedApi contains a string literal, but should reference the field generated by aconfig (android.view.accessibility.Flags.FLAG_A11Y_OVERLAY_CALLBACKS).
-
-
InvalidNullabilityOverride: android.app.Notification.TvExtender#extend(android.app.Notification.Builder) parameter #0:
Invalid nullability on parameter `builder` in method `extend`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
InvalidNullabilityOverride: android.media.midi.MidiUmpDeviceService#onBind(android.content.Intent) parameter #0:
Invalid nullability on parameter `intent` in method `onBind`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.
-
-
KotlinOperator: android.graphics.Matrix44#get(int, int):
Method can be invoked with an indexing operator from Kotlin: `get` (this is usually desirable; just make sure it makes sense for this type of object)
KotlinOperator: android.graphics.Matrix44#set(int, int, float):
Method can be invoked with an indexing operator from Kotlin: `set` (this is usually desirable; just make sure it makes sense for this type of object)
-
-
MissingGetterMatchingBuilder: android.os.RemoteCallbackList.Builder#setInterfaceDiedCallback(android.os.RemoteCallbackList.Builder.InterfaceDiedCallback<E>):
android.os.RemoteCallbackList does not declare a `getInterfaceDiedCallback()` method matching method android.os.RemoteCallbackList.Builder.setInterfaceDiedCallback(android.os.RemoteCallbackList.Builder.InterfaceDiedCallback<E>)
RequiresPermission: android.accounts.AccountManager#getAccountsByTypeAndFeatures(String, String[], android.accounts.AccountManagerCallback<android.accounts.Account[]>, android.os.Handler):
@@ -1117,14 +1110,10 @@ RequiresPermission: android.webkit.WebSettings#setBlockNetworkLoads(boolean):
Method 'setBlockNetworkLoads' documentation mentions permissions without declaring @RequiresPermission
RequiresPermission: android.webkit.WebSettings#setGeolocationEnabled(boolean):
Method 'setGeolocationEnabled' documentation mentions permissions without declaring @RequiresPermission
-
-
Todo: android.hardware.camera2.params.StreamConfigurationMap:
Documentation mentions 'TODO'
Todo: android.provider.ContactsContract.RawContacts#newEntityIterator(android.database.Cursor):
Documentation mentions 'TODO'
-
-
UnflaggedApi: android.R.color#on_surface_disabled_material:
New API must be flagged with @FlaggedApi: field android.R.color.on_surface_disabled_material
UnflaggedApi: android.R.color#outline_disabled_material:
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index e8ff546cc61a..9e9e3c2f13c1 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -1806,17 +1806,17 @@ package android.hardware.input {
}
public class InputSettings {
- method @FlaggedApi("com.android.hardware.input.keyboard_a11y_bounce_keys_flag") public static int getAccessibilityBounceKeysThreshold(@NonNull android.content.Context);
- method @FlaggedApi("com.android.hardware.input.keyboard_a11y_slow_keys_flag") public static int getAccessibilitySlowKeysThreshold(@NonNull android.content.Context);
+ method public static int getAccessibilityBounceKeysThreshold(@NonNull android.content.Context);
+ method public static int getAccessibilitySlowKeysThreshold(@NonNull android.content.Context);
method @FlaggedApi("com.android.input.flags.keyboard_repeat_keys") public static int getRepeatKeysDelay(@NonNull android.content.Context);
method @FlaggedApi("com.android.input.flags.keyboard_repeat_keys") public static int getRepeatKeysTimeout(@NonNull android.content.Context);
method @FlaggedApi("com.android.hardware.input.keyboard_a11y_mouse_keys") public static boolean isAccessibilityMouseKeysEnabled(@NonNull android.content.Context);
- method @FlaggedApi("com.android.hardware.input.keyboard_a11y_sticky_keys_flag") public static boolean isAccessibilityStickyKeysEnabled(@NonNull android.content.Context);
+ method public static boolean isAccessibilityStickyKeysEnabled(@NonNull android.content.Context);
method @FlaggedApi("com.android.input.flags.keyboard_repeat_keys") public static boolean isRepeatKeysEnabled(@NonNull android.content.Context);
- method @FlaggedApi("com.android.hardware.input.keyboard_a11y_bounce_keys_flag") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilityBounceKeysThreshold(@NonNull android.content.Context, int);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilityBounceKeysThreshold(@NonNull android.content.Context, int);
method @FlaggedApi("com.android.hardware.input.keyboard_a11y_mouse_keys") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilityMouseKeysEnabled(@NonNull android.content.Context, boolean);
- method @FlaggedApi("com.android.hardware.input.keyboard_a11y_slow_keys_flag") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilitySlowKeysThreshold(@NonNull android.content.Context, int);
- method @FlaggedApi("com.android.hardware.input.keyboard_a11y_sticky_keys_flag") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilityStickyKeysEnabled(@NonNull android.content.Context, boolean);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilitySlowKeysThreshold(@NonNull android.content.Context, int);
+ method @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setAccessibilityStickyKeysEnabled(@NonNull android.content.Context, boolean);
method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static void setMaximumObscuringOpacityForTouch(@NonNull android.content.Context, @FloatRange(from=0, to=1) float);
method @FlaggedApi("com.android.input.flags.keyboard_repeat_keys") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setRepeatKeysDelay(@NonNull android.content.Context, int);
method @FlaggedApi("com.android.input.flags.keyboard_repeat_keys") @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS) public static void setRepeatKeysEnabled(@NonNull android.content.Context, boolean);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index dce15b833bbb..0ca4a329fd5a 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -11204,10 +11204,15 @@ public class Notification implements Parcelable
* </pre>
*
*
- *
+ * <p>
* NOTE: The progress bar layout will be mirrored for RTL layout.
+ * </p>
+ *
+ * <p>
* NOTE: The extras set by {@link Notification.Builder#setProgress} will be overridden by
- * the values set on this style object when the notification is built.
+ * the values set on this style object when the notification is built. Therefore, that method
+ * is not used with this style.
+ * </p>
*
*/
@FlaggedApi(Flags.FLAG_API_RICH_ONGOING)
@@ -11370,7 +11375,7 @@ public class Notification implements Parcelable
if (mProgressPoints == null) {
mProgressPoints = new ArrayList<>();
}
- if (point.getPosition() >= 0) {
+ if (point.getPosition() > 0) {
mProgressPoints.add(point);
if (mProgressPoints.size() > MAX_PROGRESS_POINT_LIMIT) {
@@ -11379,7 +11384,7 @@ public class Notification implements Parcelable
}
} else {
- Log.w(TAG, "Dropped the point. The position is a negative integer.");
+ Log.w(TAG, "Dropped the point. The position is a negative or zero integer.");
}
return this;
@@ -11893,7 +11898,9 @@ public class Notification implements Parcelable
final List<Point> points = new ArrayList<>();
for (Point point : mProgressPoints) {
final int position = point.getPosition();
- if (position < 0 || position > totalLength) continue;
+ // The points at start/end aren't supposed to show in the progress bar.
+ // Therefore those are also dropped here.
+ if (position <= 0 || position >= totalLength) continue;
points.add(sanitizePoint(point, backgroundColor, defaultProgressColor));
if (points.size() == MAX_PROGRESS_POINT_LIMIT) {
break;
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index 566e78a8de35..2b0e941cf602 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -277,6 +277,23 @@ public final class CompanionDeviceManager {
*/
public static final int MESSAGE_ONEWAY_TO_WEARABLE = 0x43847987; // +TOW
+
+ /** @hide */
+ @IntDef(flag = true, prefix = { "TRANSPORT_FLAG_" }, value = {
+ TRANSPORT_FLAG_EXTEND_PATCH_DIFF,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface TransportFlags {}
+
+ /**
+ * A security flag that allows transports to be attached to devices that may be more vulnerable
+ * due to infrequent updates. Can only be used for associations with
+ * {@link AssociationRequest#DEVICE_PROFILE_WEARABLE_SENSING} device profile.
+ *
+ * @hide
+ */
+ public static final int TRANSPORT_FLAG_EXTEND_PATCH_DIFF = 1;
+
/**
* Callback for applications to receive updates about and the outcome of
* {@link AssociationRequest} issued via {@code associate()} call.
@@ -1452,7 +1469,52 @@ public final class CompanionDeviceManager {
}
try {
- final Transport transport = new Transport(associationId, in, out);
+ final Transport transport = new Transport(associationId, in, out, 0);
+ mTransports.put(associationId, transport);
+ transport.start();
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to attach transport", e);
+ }
+ }
+ }
+
+ /**
+ * Attach a bidirectional communication stream to be used as a transport channel for
+ * transporting system data between associated devices. Flags can be provided to further
+ * customize the behavior of the transport.
+ *
+ * @param associationId id of the associated device.
+ * @param in Already connected stream of data incoming from remote
+ * associated device.
+ * @param out Already connected stream of data outgoing to remote associated
+ * device.
+ * @param flags Flags to customize transport behavior.
+ * @throws DeviceNotAssociatedException Thrown if the associationId was not previously
+ * associated with this app.
+ *
+ * @see #buildPermissionTransferUserConsentIntent(int)
+ * @see #startSystemDataTransfer(int, Executor, OutcomeReceiver)
+ * @see #detachSystemDataTransport(int)
+ *
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.DELIVER_COMPANION_MESSAGES)
+ public void attachSystemDataTransport(int associationId,
+ @NonNull InputStream in,
+ @NonNull OutputStream out,
+ @TransportFlags int flags) throws DeviceNotAssociatedException {
+ if (mService == null) {
+ Log.w(TAG, "CompanionDeviceManager service is not available.");
+ return;
+ }
+
+ synchronized (mTransports) {
+ if (mTransports.contains(associationId)) {
+ detachSystemDataTransport(associationId);
+ }
+
+ try {
+ final Transport transport = new Transport(associationId, in, out, flags);
mTransports.put(associationId, transport);
transport.start();
} catch (IOException e) {
@@ -1931,16 +1993,22 @@ public final class CompanionDeviceManager {
private final int mAssociationId;
private final InputStream mRemoteIn;
private final OutputStream mRemoteOut;
+ private final int mFlags;
private InputStream mLocalIn;
private OutputStream mLocalOut;
private volatile boolean mStopped;
- public Transport(int associationId, InputStream remoteIn, OutputStream remoteOut) {
+ Transport(int associationId, InputStream remoteIn, OutputStream remoteOut) {
+ this(associationId, remoteIn, remoteOut, 0);
+ }
+
+ Transport(int associationId, InputStream remoteIn, OutputStream remoteOut, int flags) {
mAssociationId = associationId;
mRemoteIn = remoteIn;
mRemoteOut = remoteOut;
+ mFlags = flags;
}
public void start() throws IOException {
@@ -1957,7 +2025,7 @@ public final class CompanionDeviceManager {
try {
mService.attachSystemDataTransport(mContext.getOpPackageName(),
- mContext.getUserId(), mAssociationId, remoteFd);
+ mContext.getUserId(), mAssociationId, remoteFd, mFlags);
} catch (RemoteException e) {
throw new IOException("Failed to configure transport", e);
}
diff --git a/core/java/android/companion/ICompanionDeviceManager.aidl b/core/java/android/companion/ICompanionDeviceManager.aidl
index a2b7dd9c3d0e..787e8b65a736 100644
--- a/core/java/android/companion/ICompanionDeviceManager.aidl
+++ b/core/java/android/companion/ICompanionDeviceManager.aidl
@@ -113,7 +113,7 @@ interface ICompanionDeviceManager {
in ISystemDataTransferCallback callback);
@EnforcePermission("DELIVER_COMPANION_MESSAGES")
- void attachSystemDataTransport(String packageName, int userId, int associationId, in ParcelFileDescriptor fd);
+ void attachSystemDataTransport(String packageName, int userId, int associationId, in ParcelFileDescriptor fd, int flags);
@EnforcePermission("DELIVER_COMPANION_MESSAGES")
void detachSystemDataTransport(String packageName, int userId, int associationId);
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 37f3f17ebe42..e6450606d450 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -1643,6 +1643,19 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
public static final long OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION = 327313645L;
/**
+ * When the override is enabled, the activity receives configuration coupled with caption bar
+ * insets. Normally, caption bar insets are decoupled from configuration.
+ *
+ * <p>Override applies only if the activity targets SDK level 34 or earlier version.
+ *
+ * @hide
+ */
+ @ChangeId
+ @Overridable
+ @Disabled
+ public static final long OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS = 388014743L;
+
+ /**
* Optional set of a certificates identifying apps that are allowed to embed this activity. From
* the "knownActivityEmbeddingCerts" attribute.
*/
diff --git a/core/java/android/content/res/flags.aconfig b/core/java/android/content/res/flags.aconfig
index 027eb9df1d9e..88fbdaddb3d2 100644
--- a/core/java/android/content/res/flags.aconfig
+++ b/core/java/android/content/res/flags.aconfig
@@ -137,4 +137,15 @@ flag {
namespace: "resource_manager"
description: "flag always meant to be false, for testing resource flagging within cts tests"
bug: "377974898"
-} \ No newline at end of file
+}
+
+flag {
+ name: "use_new_aconfig_storage"
+ is_exported: true
+ namespace: "resource_manager"
+ description: "Retrieve flag values from new Aconfig flag storage in AconfigFlags.java"
+ bug: "352348353"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index 0ead8232c5b1..49db54d81e65 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -19,7 +19,6 @@ package android.hardware.input;
import static com.android.input.flags.Flags.FLAG_INPUT_DEVICE_VIEW_BEHAVIOR_API;
import static com.android.input.flags.Flags.FLAG_DEVICE_ASSOCIATIONS;
import static com.android.hardware.input.Flags.enableCustomizableInputGestures;
-import static com.android.hardware.input.Flags.keyboardLayoutPreviewFlag;
import static com.android.hardware.input.Flags.keyboardGlyphMap;
import android.Manifest;
@@ -966,9 +965,6 @@ public final class InputManager {
@Nullable
public Drawable getKeyboardLayoutPreview(@Nullable KeyboardLayout keyboardLayout, int width,
int height) {
- if (!keyboardLayoutPreviewFlag()) {
- return null;
- }
PhysicalKeyLayout keyLayout = new PhysicalKeyLayout(
mGlobal.getKeyCharacterMap(keyboardLayout), keyboardLayout);
return new KeyboardLayoutPreviewDrawable(mContext, keyLayout, width, height);
@@ -1403,9 +1399,6 @@ public final class InputManager {
@RequiresPermission(Manifest.permission.MONITOR_STICKY_MODIFIER_STATE)
public void registerStickyModifierStateListener(@NonNull Executor executor,
@NonNull StickyModifierStateListener listener) throws IllegalArgumentException {
- if (!InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
- return;
- }
mGlobal.registerStickyModifierStateListener(executor, listener);
}
@@ -1419,9 +1412,6 @@ public final class InputManager {
@RequiresPermission(Manifest.permission.MONITOR_STICKY_MODIFIER_STATE)
public void unregisterStickyModifierStateListener(
@NonNull StickyModifierStateListener listener) {
- if (!InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
- return;
- }
mGlobal.unregisterStickyModifierStateListener(listener);
}
diff --git a/core/java/android/hardware/input/InputSettings.java b/core/java/android/hardware/input/InputSettings.java
index af40188c4eba..3d4b8854b01f 100644
--- a/core/java/android/hardware/input/InputSettings.java
+++ b/core/java/android/hardware/input/InputSettings.java
@@ -16,15 +16,9 @@
package android.hardware.input;
-import static com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG;
import static com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS;
-import static com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG;
-import static com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG;
import static com.android.hardware.input.Flags.enableCustomizableInputGestures;
-import static com.android.hardware.input.Flags.keyboardA11yBounceKeysFlag;
import static com.android.hardware.input.Flags.keyboardA11yMouseKeys;
-import static com.android.hardware.input.Flags.keyboardA11ySlowKeysFlag;
-import static com.android.hardware.input.Flags.keyboardA11yStickyKeysFlag;
import static com.android.hardware.input.Flags.mouseScrollingAcceleration;
import static com.android.hardware.input.Flags.mouseReverseVerticalScrolling;
import static com.android.hardware.input.Flags.mouseSwapPrimaryButton;
@@ -871,21 +865,6 @@ public class InputSettings {
}
/**
- * Whether Accessibility bounce keys feature is enabled.
- *
- * <p>
- * Bounce keys’ is an accessibility feature to aid users who have physical disabilities,
- * that allows the user to configure the device to ignore rapid, repeated keypresses of the
- * same key.
- * </p>
- *
- * @hide
- */
- public static boolean isAccessibilityBounceKeysFeatureEnabled() {
- return keyboardA11yBounceKeysFlag();
- }
-
- /**
* Whether Accessibility bounce keys is enabled.
*
* <p>
@@ -912,11 +891,7 @@ public class InputSettings {
* @hide
*/
@TestApi
- @FlaggedApi(FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG)
public static int getAccessibilityBounceKeysThreshold(@NonNull Context context) {
- if (!isAccessibilityBounceKeysFeatureEnabled()) {
- return 0;
- }
return Settings.Secure.getIntForUser(context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BOUNCE_KEYS, 0, UserHandle.USER_CURRENT);
}
@@ -936,13 +911,9 @@ public class InputSettings {
* @hide
*/
@TestApi
- @FlaggedApi(FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG)
@RequiresPermission(Manifest.permission.WRITE_SETTINGS)
public static void setAccessibilityBounceKeysThreshold(@NonNull Context context,
int thresholdTimeMillis) {
- if (!isAccessibilityBounceKeysFeatureEnabled()) {
- return;
- }
if (thresholdTimeMillis < 0
|| thresholdTimeMillis > MAX_ACCESSIBILITY_BOUNCE_KEYS_THRESHOLD_MILLIS) {
throw new IllegalArgumentException(
@@ -955,21 +926,6 @@ public class InputSettings {
}
/**
- * Whether Accessibility slow keys feature flags is enabled.
- *
- * <p>
- * 'Slow keys' is an accessibility feature to aid users who have physical disabilities, that
- * allows the user to specify the duration for which one must press-and-hold a key before the
- * system accepts the keypress.
- * </p>
- *
- * @hide
- */
- public static boolean isAccessibilitySlowKeysFeatureFlagEnabled() {
- return keyboardA11ySlowKeysFlag();
- }
-
- /**
* Whether Accessibility slow keys is enabled.
*
* <p>
@@ -996,11 +952,7 @@ public class InputSettings {
* @hide
*/
@TestApi
- @FlaggedApi(FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG)
public static int getAccessibilitySlowKeysThreshold(@NonNull Context context) {
- if (!isAccessibilitySlowKeysFeatureFlagEnabled()) {
- return 0;
- }
return Settings.Secure.getIntForUser(context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_SLOW_KEYS, 0, UserHandle.USER_CURRENT);
}
@@ -1020,13 +972,9 @@ public class InputSettings {
* @hide
*/
@TestApi
- @FlaggedApi(FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG)
@RequiresPermission(Manifest.permission.WRITE_SETTINGS)
public static void setAccessibilitySlowKeysThreshold(@NonNull Context context,
int thresholdTimeMillis) {
- if (!isAccessibilitySlowKeysFeatureFlagEnabled()) {
- return;
- }
if (thresholdTimeMillis < 0
|| thresholdTimeMillis > MAX_ACCESSIBILITY_SLOW_KEYS_THRESHOLD_MILLIS) {
throw new IllegalArgumentException(
@@ -1039,23 +987,6 @@ public class InputSettings {
}
/**
- * Whether Accessibility sticky keys feature is enabled.
- *
- * <p>
- * 'Sticky keys' is an accessibility feature that assists users who have physical
- * disabilities or help users reduce repetitive strain injury. It serializes keystrokes
- * instead of pressing multiple keys at a time, allowing the user to press and release a
- * modifier key, such as Shift, Ctrl, Alt, or any other modifier key, and have it remain
- * active until any other key is pressed.
- * </p>
- *
- * @hide
- */
- public static boolean isAccessibilityStickyKeysFeatureEnabled() {
- return keyboardA11yStickyKeysFlag();
- }
-
- /**
* Whether Accessibility sticky keys is enabled.
*
* <p>
@@ -1069,11 +1000,7 @@ public class InputSettings {
* @hide
*/
@TestApi
- @FlaggedApi(FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG)
public static boolean isAccessibilityStickyKeysEnabled(@NonNull Context context) {
- if (!isAccessibilityStickyKeysFeatureEnabled()) {
- return false;
- }
return Settings.Secure.getIntForUser(context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_STICKY_KEYS, 0, UserHandle.USER_CURRENT) != 0;
}
@@ -1092,13 +1019,9 @@ public class InputSettings {
* @hide
*/
@TestApi
- @FlaggedApi(FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG)
@RequiresPermission(Manifest.permission.WRITE_SETTINGS)
public static void setAccessibilityStickyKeysEnabled(@NonNull Context context,
boolean enabled) {
- if (!isAccessibilityStickyKeysFeatureEnabled()) {
- return;
- }
Settings.Secure.putIntForUser(context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_STICKY_KEYS, enabled ? 1 : 0,
UserHandle.USER_CURRENT);
diff --git a/core/java/android/hardware/input/input_framework.aconfig b/core/java/android/hardware/input/input_framework.aconfig
index 8d58296e5581..6c2ce3685b30 100644
--- a/core/java/android/hardware/input/input_framework.aconfig
+++ b/core/java/android/hardware/input/input_framework.aconfig
@@ -8,35 +8,6 @@ container: "system"
flag {
namespace: "input_native"
- name: "keyboard_layout_preview_flag"
- description: "Controls whether a preview will be shown in Settings when selecting a physical keyboard layout"
- bug: "293579375"
-}
-
-
-flag {
- namespace: "input_native"
- name: "keyboard_a11y_sticky_keys_flag"
- description: "Controls if the sticky keys accessibility feature for physical keyboard is available to the user"
- bug: "294546335"
-}
-
-flag {
- namespace: "input_native"
- name: "keyboard_a11y_bounce_keys_flag"
- description: "Controls if the bounce keys accessibility feature for physical keyboard is available to the user"
- bug: "294546335"
-}
-
-flag {
- namespace: "input_native"
- name: "keyboard_a11y_slow_keys_flag"
- description: "Controls if the slow keys accessibility feature for physical keyboard is available to the user"
- bug: "294546335"
-}
-
-flag {
- namespace: "input_native"
name: "keyboard_glyph_map"
description: "Allows system to provide keyboard specific key drawables and shortcuts via config files"
bug: "345440920"
diff --git a/media/java/android/media/Image.java b/core/java/android/media/Image.java
index 486063ed5f6b..486063ed5f6b 100644
--- a/media/java/android/media/Image.java
+++ b/core/java/android/media/Image.java
diff --git a/media/java/android/media/ImageReader.java b/core/java/android/media/ImageReader.java
index 530d48d3e60b..530d48d3e60b 100644
--- a/media/java/android/media/ImageReader.java
+++ b/core/java/android/media/ImageReader.java
diff --git a/media/java/android/media/ImageUtils.java b/core/java/android/media/ImageUtils.java
index 7c6ba838b24f..7c6ba838b24f 100644
--- a/media/java/android/media/ImageUtils.java
+++ b/core/java/android/media/ImageUtils.java
diff --git a/media/java/android/media/ImageWriter.java b/core/java/android/media/ImageWriter.java
index 0a79f41e1ff0..0a79f41e1ff0 100644
--- a/media/java/android/media/ImageWriter.java
+++ b/core/java/android/media/ImageWriter.java
diff --git a/media/java/android/media/PublicFormatUtils.java b/core/java/android/media/PublicFormatUtils.java
index 209e1c892045..209e1c892045 100644
--- a/media/java/android/media/PublicFormatUtils.java
+++ b/core/java/android/media/PublicFormatUtils.java
diff --git a/core/java/android/os/TestLooperManager.java b/core/java/android/os/TestLooperManager.java
index 2d9d025b8d80..1a54f4df58fb 100644
--- a/core/java/android/os/TestLooperManager.java
+++ b/core/java/android/os/TestLooperManager.java
@@ -159,7 +159,7 @@ public class TestLooperManager {
*/
public void execute(Message message) {
checkReleased();
- if (Looper.myLooper() == mLooper) {
+ if (mLooper.isCurrentThread()) {
// This is being called from the thread it should be executed on, we can just dispatch.
message.target.dispatchMessage(message);
} else {
diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java
index 5b527c70b4f7..1b65a8859924 100644
--- a/core/java/android/provider/DocumentsProvider.java
+++ b/core/java/android/provider/DocumentsProvider.java
@@ -1124,12 +1124,13 @@ public abstract class DocumentsProvider extends ContentProvider {
}
final Uri documentUri = extraUri;
- final String authority = documentUri.getAuthority();
+ final String authorityWithoutUserId = getAuthorityWithoutUserId(documentUri.getAuthority());
final String documentId = DocumentsContract.getDocumentId(documentUri);
- if (!mAuthority.equals(authority)) {
+ if (!mAuthority.equals(authorityWithoutUserId)) {
throw new SecurityException(
- "Requested authority " + authority + " doesn't match provider " + mAuthority);
+ "Requested authority " + authorityWithoutUserId + " doesn't match provider "
+ + mAuthority);
}
if (METHOD_IS_CHILD_DOCUMENT.equals(method)) {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 3cd7a00591ca..670709846d4c 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -10269,6 +10269,16 @@ public final class Settings {
public static final String DOZE_ALWAYS_ON = "doze_always_on";
/**
+ * Indicates whether ambient wallpaper is visible with AOD.
+ * <p>
+ * Type: int (0 for false, 1 for true)
+ *
+ * @hide
+ */
+ public static final String DOZE_ALWAYS_ON_WALLPAPER_ENABLED =
+ "doze_always_on_wallpaper_enabled";
+
+ /**
* Whether the device should pulse on pick up gesture.
* @hide
*/
@@ -13006,6 +13016,24 @@ public final class Settings {
public static final String STYLUS_POINTER_ICON_ENABLED = "stylus_pointer_icon_enabled";
/**
+ * Toggle for whether to redact OTP notification while connected to wifi. Defaults to
+ * false/0.
+ * @hide
+ */
+ @Readable
+ public static final String REDACT_OTP_NOTIFICATION_WHILE_CONNECTED_TO_WIFI =
+ "redact_otp_on_wifi";
+
+ /**
+ * Toggle for whether to immediately redact OTP notifications, or require the device to be
+ * locked for 10 minutes. Defaults to false/0
+ * @hide
+ */
+ @Readable
+ public static final String REDACT_OTP_NOTIFICATION_IMMEDIATELY =
+ "remove_otp_redaction_delay";
+
+ /**
* These entries are considered common between the personal and the managed profile,
* since the managed profile doesn't get to change them.
*/
diff --git a/core/java/android/view/FrameMetrics.java b/core/java/android/view/FrameMetrics.java
index 58b2a67ec69e..a4fc342756ef 100644
--- a/core/java/android/view/FrameMetrics.java
+++ b/core/java/android/view/FrameMetrics.java
@@ -259,19 +259,20 @@ public final class FrameMetrics {
int FRAME_DEADLINE = 9;
int FRAME_START_TIME = 10;
int FRAME_INTERVAL = 11;
- int SYNC_QUEUED = 12;
- int SYNC_START = 13;
- int ISSUE_DRAW_COMMANDS_START = 14;
- int SWAP_BUFFERS = 15;
- int FRAME_COMPLETED = 16;
- int DEQUEUE_BUFFER_DURATION = 17;
- int QUEUE_BUFFER_DURATION = 18;
- int GPU_COMPLETED = 19;
- int SWAP_BUFFERS_COMPLETED = 20;
- int DISPLAY_PRESENT_TIME = 21;
- int COMMAND_SUBMISSION_COMPLETED = 22;
+ int WORKLOAD_TARGET = 12;
+ int SYNC_QUEUED = 13;
+ int SYNC_START = 14;
+ int ISSUE_DRAW_COMMANDS_START = 15;
+ int SWAP_BUFFERS = 16;
+ int FRAME_COMPLETED = 17;
+ int DEQUEUE_BUFFER_DURATION = 18;
+ int QUEUE_BUFFER_DURATION = 19;
+ int GPU_COMPLETED = 20;
+ int SWAP_BUFFERS_COMPLETED = 21;
+ int DISPLAY_PRESENT_TIME = 22;
+ int COMMAND_SUBMISSION_COMPLETED = 23;
- int FRAME_STATS_COUNT = 23; // must always be last and in sync with
+ int FRAME_STATS_COUNT = 24; // must always be last and in sync with
// FrameInfoIndex::NumIndexes in libs/hwui/FrameInfo.h
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 0d6f82773622..80b4f2caabbb 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -272,9 +272,9 @@ import android.window.OnBackInvokedCallback;
import android.window.OnBackInvokedDispatcher;
import android.window.ScreenCapture;
import android.window.SurfaceSyncGroup;
-import android.window.WindowContext;
import android.window.WindowOnBackInvokedDispatcher;
import android.window.WindowTokenClient;
+import android.window.WindowTokenClientController;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
@@ -6614,12 +6614,15 @@ public final class ViewRootImpl implements ViewParent,
} else {
if (enableWindowContextResourcesUpdateOnConfigChange()) {
// There is no activity callback - update resources for window token, if needed.
- final WindowTokenClient windowTokenClient = getWindowTokenClient();
- if (windowTokenClient != null) {
- windowTokenClient.onConfigurationChanged(
+ final IBinder windowContextToken = mContext.getWindowContextToken();
+ if (windowContextToken instanceof WindowTokenClient) {
+ WindowTokenClientController.getInstance().onWindowConfigurationChanged(
+ windowContextToken,
mLastReportedMergedConfiguration.getMergedConfiguration(),
- newDisplayId == INVALID_DISPLAY ? mDisplay.getDisplayId()
- : newDisplayId);
+ newDisplayId == INVALID_DISPLAY
+ ? mDisplay.getDisplayId()
+ : newDisplayId
+ );
}
}
updateConfiguration(newDisplayId);
@@ -6627,11 +6630,6 @@ public final class ViewRootImpl implements ViewParent,
mForceNextConfigUpdate = false;
}
- private WindowTokenClient getWindowTokenClient() {
- if (!(mContext instanceof WindowContext)) return null;
- return (WindowTokenClient) mContext.getWindowContextToken();
- }
-
/**
* Update display and views if last applied merged configuration changed.
* @param newDisplayId Id of new display if moved, {@link Display#INVALID_DISPLAY} otherwise.
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index edfa1d5aea1f..db699d7bfb06 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -1531,15 +1531,6 @@ public interface WindowManager extends ViewManager {
*/
@TestApi
static boolean hasWindowExtensionsEnabled() {
- if (!Flags.enableWmExtensionsForAllFlag() && ACTIVITY_EMBEDDING_GUARD_WITH_ANDROID_15) {
- // Since enableWmExtensionsForAllFlag, HAS_WINDOW_EXTENSIONS_ON_DEVICE is now true
- // on all devices by default as a build file property.
- // Until finishing flag ramp up, only return true when
- // ACTIVITY_EMBEDDING_GUARD_WITH_ANDROID_15 is false, which is set per device by
- // OEMs.
- return false;
- }
-
if (!HAS_WINDOW_EXTENSIONS_ON_DEVICE) {
return false;
}
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 8a10979eb3c9..578b7b6a63fa 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -541,6 +541,22 @@ public class AccessibilityNodeInfo implements Parcelable {
"ACTION_ARGUMENT_HTML_ELEMENT_STRING";
/**
+ * Argument for specifying the extended selection.
+ *
+ * <p><strong>Type:</strong> {@link AccessibilityNodeInfo.Selection}<br>
+ * <strong>Actions:</strong>
+ *
+ * <ul>
+ * <li>{@link AccessibilityAction#ACTION_SET_EXTENDED_SELECTION}
+ * </ul>
+ *
+ * @see AccessibilityAction#ACTION_SET_EXTENDED_SELECTION
+ */
+ @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+ public static final String ACTION_ARGUMENT_SELECTION_PARCELABLE =
+ "android.view.accessibility.action.ARGUMENT_SELECTION_PARCELABLE";
+
+ /**
* Argument for whether when moving at granularity to extend the selection
* or to move it otherwise.
* <p>
@@ -1146,6 +1162,8 @@ public class AccessibilityNodeInfo implements Parcelable {
private int mConnectionId = UNDEFINED_CONNECTION_ID;
+ private Selection mSelection;
+
private RangeInfo mRangeInfo;
private CollectionInfo mCollectionInfo;
private CollectionItemInfo mCollectionItemInfo;
@@ -2660,6 +2678,56 @@ public class AccessibilityNodeInfo implements Parcelable {
}
/**
+ * Sets the extended selection, which is a representation of selection that spans multiple nodes
+ * that exist within the subtree of the node defining selection.
+ *
+ * <p><b>Note:</b> The start and end {@link SelectionPosition} of the provided {@link Selection}
+ * should be constructed with {@code this} node or a descendant of it.
+ *
+ * <p><b>Note:</b> {@link AccessibilityNodeInfo#setFocusable} and {@link
+ * AccessibilityNodeInfo#setFocused} should both be called with {@code true} before setting the
+ * selection in order to make {@code this} node a candidate to contain a selection.
+ *
+ * <p><b>Note:</b> Cannot be called from an AccessibilityService. This class is made immutable
+ * before being delivered to an AccessibilityService.
+ *
+ * @param selection The extended selection within the node's subtree, or {@code null} if no
+ * selection exists.
+ * @see AccessibilityNodeInfo.AccessibilityAction#ACTION_SET_EXTENDED_SELECTION
+ * @throws IllegalStateException If called from an AccessibilityService
+ */
+ @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+ public void setSelection(@Nullable Selection selection) {
+ enforceNotSealed();
+ mSelection = selection;
+ }
+
+ /**
+ * Gets the extended selection, which is a representation of selection that spans multiple nodes
+ * that exist within the subtree of the node defining selection.
+ *
+ * <p><b>Note:</b> The start and end {@link SelectionPosition} of the provided {@link Selection}
+ * should be constructed with {@code this} node or a descendant of it.
+ *
+ * <p><b>Note:</b> In order for a node to be a candidate to contain a selection, {@link
+ * AccessibilityNodeInfo#isFocusable()} ()} and {@link AccessibilityNodeInfo#isFocused()} should
+ * both be return with {@code true}.
+ *
+ * @return The extended selection within the node's subtree, or {@code null} if no selection
+ * exists.
+ */
+ @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+ public @Nullable Selection getSelection() {
+ if (mSelection != null) {
+ mSelection.getStart().setWindowId(mWindowId);
+ mSelection.getStart().setConnectionId(mConnectionId);
+ mSelection.getEnd().setWindowId(mWindowId);
+ mSelection.getEnd().setConnectionId(mConnectionId);
+ }
+ return mSelection;
+ }
+
+ /**
* Gets whether this node is visible to the user.
* <p>
* Between {@link Build.VERSION_CODES#JELLY_BEAN API 16} and
@@ -4168,6 +4236,15 @@ public class AccessibilityNodeInfo implements Parcelable {
* there is no text selection and no cursor.
*/
public int getTextSelectionStart() {
+ if (Flags.a11ySelectionApi()) {
+ Selection current = getSelection();
+ if ((current != null)
+ && current.getStart().usesNode(this)
+ && current.getEnd().usesNode(this)) {
+ return current.getStart().getOffset();
+ }
+ return UNDEFINED_SELECTION_INDEX;
+ }
return mTextSelectionStart;
}
@@ -4183,6 +4260,15 @@ public class AccessibilityNodeInfo implements Parcelable {
* there is no text selection and no cursor.
*/
public int getTextSelectionEnd() {
+ if (Flags.a11ySelectionApi()) {
+ Selection current = getSelection();
+ if ((current != null)
+ && current.getStart().usesNode(this)
+ && current.getEnd().usesNode(this)) {
+ return current.getEnd().getOffset();
+ }
+ return UNDEFINED_SELECTION_INDEX;
+ }
return mTextSelectionEnd;
}
@@ -4201,6 +4287,13 @@ public class AccessibilityNodeInfo implements Parcelable {
*/
public void setTextSelection(int start, int end) {
enforceNotSealed();
+ if (Flags.a11ySelectionApi()) {
+ Selection selection =
+ new Selection(
+ new SelectionPosition(this, start), new SelectionPosition(this, end));
+ setSelection(selection);
+ return;
+ }
mTextSelectionStart = start;
mTextSelectionEnd = end;
}
@@ -4875,6 +4968,10 @@ public class AccessibilityNodeInfo implements Parcelable {
nonDefaultFields |= bitAt(fieldIndex);
}
fieldIndex++;
+ if (!Objects.equals(mSelection, DEFAULT.mSelection)) {
+ nonDefaultFields |= bitAt(fieldIndex);
+ }
+ fieldIndex++;
if (mChecked != DEFAULT.mChecked) {
nonDefaultFields |= bitAt(fieldIndex);
}
@@ -5055,6 +5152,9 @@ public class AccessibilityNodeInfo implements Parcelable {
parcel.writeLong(mLeashedParentNodeId);
}
if (isBitSet(nonDefaultFields, fieldIndex++)) {
+ mSelection.writeToParcel(parcel, flags);
+ }
+ if (isBitSet(nonDefaultFields, fieldIndex++)) {
parcel.writeInt(mChecked);
}
if (isBitSet(nonDefaultFields, fieldIndex++)) {
@@ -5172,6 +5272,17 @@ public class AccessibilityNodeInfo implements Parcelable {
ExtraRenderingInfo ti = other.mExtraRenderingInfo;
mExtraRenderingInfo = (ti == null) ? null
: new ExtraRenderingInfo(ti);
+
+ if (Flags.a11ySelectionApi()) {
+ if (other.getSelection() != null) {
+ SelectionPosition sps = other.getSelection().getStart();
+ SelectionPosition spe = other.getSelection().getEnd();
+ mSelection =
+ new Selection(
+ new SelectionPosition(sps.mSourceNodeId, sps.getOffset()),
+ new SelectionPosition(spe.mSourceNodeId, spe.getOffset()));
+ }
+ }
}
/**
@@ -5344,6 +5455,9 @@ public class AccessibilityNodeInfo implements Parcelable {
mLeashedParentNodeId = parcel.readLong();
}
if (isBitSet(nonDefaultFields, fieldIndex++)) {
+ mSelection = Selection.CREATOR.createFromParcel(parcel);
+ }
+ if (isBitSet(nonDefaultFields, fieldIndex++)) {
mChecked = parcel.readInt();
}
if (isBitSet(nonDefaultFields, fieldIndex++)) {
@@ -5495,6 +5609,9 @@ public class AccessibilityNodeInfo implements Parcelable {
if (action == R.id.accessibilityActionScrollInDirection) {
return "ACTION_SCROLL_IN_DIRECTION";
}
+ if (action == R.id.accessibilityActionSetExtendedSelection) {
+ return "ACTION_SET_EXTENDED_SELECTION";
+ }
return "ACTION_UNKNOWN";
}
}
@@ -5696,6 +5813,271 @@ public class AccessibilityNodeInfo implements Parcelable {
}
/**
+ * A class which defines either the start or end of a selection that can span across multiple
+ * AccessibilityNodeInfo objects.
+ *
+ * @see AccessibilityNodeInfo.Selection
+ */
+ @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+ public static final class SelectionPosition implements Parcelable {
+
+ private final int mOffset;
+ private final long mSourceNodeId;
+ private int mConnectionId;
+ private int mWindowId;
+
+ /**
+ * Instantiates a new SelectionPosition.
+ *
+ * @param node The {@link AccessibilityNodeInfo} for the node of this selection.
+ * @param offset The offset for a {@link SelectionPosition} within {@code view}'s text
+ * content, which should be a value between 0 and the length of {@code view}'s text.
+ */
+ public SelectionPosition(@NonNull AccessibilityNodeInfo node, int offset) {
+ this(node.mSourceNodeId, offset);
+ }
+
+ /**
+ * Instantiates a new SelectionPosition.
+ *
+ * @param view The {@link View} containing the virtual descendant associated with the
+ * selection position.
+ * @param offset The offset for a selection position within {@code view}'s text content,
+ * which should be a value between 0 and the length of {@code view}'s text.
+ */
+ public SelectionPosition(@NonNull View view, int offset) {
+ this(
+ makeNodeId(
+ view.getAccessibilityViewId(), AccessibilityNodeProvider.HOST_VIEW_ID),
+ offset);
+ }
+
+ /**
+ * Instantiates a new {@link SelectionPosition}.
+ *
+ * @param view The view whose virtual descendant is associated with the selection position.
+ * @param virtualDescendantId The ID of the virtual descendant within {@code view}'s virtual
+ * subtree that contains the selection position.
+ * @param offset The offset for a selection position within the virtual descendant's text
+ * content, which should be a value between 0 and the length of the descendant's text.
+ * @see AccessibilityNodeProvider
+ */
+ public SelectionPosition(@NonNull View view, int virtualDescendantId, int offset) {
+ this(makeNodeId(view.getAccessibilityViewId(), virtualDescendantId), offset);
+ }
+
+ private SelectionPosition(long sourceNodeId, int offset) {
+ mOffset = offset;
+ mSourceNodeId = sourceNodeId;
+ }
+
+ private SelectionPosition(Parcel in) {
+ mOffset = in.readInt();
+ mSourceNodeId = in.readLong();
+ }
+
+ private void setWindowId(int windowId) {
+ mWindowId = windowId;
+ }
+
+ private void setConnectionId(int connectionId) {
+ mConnectionId = connectionId;
+ }
+
+ /**
+ * Gets the node for {@code this} {@link SelectionPosition}
+ * <br>
+ * <strong>Note:</strong> This api can only be called from {@link AccessibilityService}.
+ *
+ * @return The node associated with {@code this} {@link SelectionPosition}
+ */
+ public @Nullable AccessibilityNodeInfo getNode() {
+ return getNodeForAccessibilityId(mConnectionId, mWindowId, mSourceNodeId);
+ }
+
+ /**
+ * Gets the offset for {@code this} {@link SelectionPosition}.
+ *
+ * @return A value from 0 to the length of {@link #getNode()}'s content representing the
+ * offset of the {@link SelectionPosition}
+ */
+ public int getOffset() {
+ return mOffset;
+ }
+
+ private boolean usesNode(@NonNull AccessibilityNodeInfo node) {
+ return this.mSourceNodeId == node.mSourceNodeId
+ && this.mConnectionId == node.mConnectionId
+ && this.mWindowId == node.mWindowId;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == null) {
+ return false;
+ }
+
+ if (other == this) {
+ return true;
+ }
+
+ if (getClass() != other.getClass()) {
+ return false;
+ }
+
+ SelectionPosition rhs = (SelectionPosition) other;
+ if (getOffset() != rhs.getOffset()) {
+ return false;
+ }
+
+ return mSourceNodeId == rhs.mSourceNodeId;
+ }
+
+ @Override
+ public int hashCode() {
+ final long prime = 877;
+ long result = 1;
+
+ if (mOffset != 0) {
+ result *= mOffset;
+ }
+
+ if (mSourceNodeId != UNDEFINED_NODE_ID) {
+ result *= mSourceNodeId;
+ }
+
+ return Long.hashCode(result * prime);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(mOffset);
+ dest.writeLong(mSourceNodeId);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * @see android.os.Parcelable.Creator
+ */
+ @NonNull
+ public static final Creator<SelectionPosition> CREATOR =
+ new Creator<SelectionPosition>() {
+ @Override
+ public SelectionPosition createFromParcel(Parcel in) {
+ return new SelectionPosition(in);
+ }
+
+ @Override
+ public SelectionPosition[] newArray(int size) {
+ return new SelectionPosition[size];
+ }
+ };
+ }
+
+ /**
+ * Represents a selection of content that may extend across more than one {@link
+ * AccessibilityNodeInfo} instance.
+ *
+ * @see AccessibilityNodeInfo.SelectionPosition
+ */
+ @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+ public static final class Selection implements Parcelable {
+
+ private final SelectionPosition mStart;
+ private final SelectionPosition mEnd;
+
+ /**
+ * Instantiates a new Selection.
+ *
+ * @param start The start of the extended selection.
+ * @param end The end of the extended selection.
+ */
+ public Selection(@NonNull SelectionPosition start, @NonNull SelectionPosition end) {
+ this.mStart = start;
+ this.mEnd = end;
+ }
+
+ private Selection(Parcel in) {
+ mStart = SelectionPosition.CREATOR.createFromParcel(in);
+ mEnd = SelectionPosition.CREATOR.createFromParcel(in);
+ }
+
+ /**
+ * @return The start of the extended selection.
+ */
+ public @NonNull SelectionPosition getStart() {
+ return mStart;
+ }
+
+ /**
+ * @return The end of the extended selection.
+ */
+ public @NonNull SelectionPosition getEnd() {
+ return mEnd;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+
+ if (obj == this) {
+ return true;
+ }
+
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+
+ Selection rhs = (Selection) obj;
+ return getStart().equals(rhs.getStart()) && getEnd().equals(rhs.getEnd());
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 17;
+ return prime * getStart().hashCode() * getEnd().hashCode();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ mStart.writeToParcel(dest, flags);
+ mEnd.writeToParcel(dest, flags);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * @see android.os.Parcelable.Creator
+ */
+ @NonNull
+ public static final Creator<Selection> CREATOR =
+ new Creator<Selection>() {
+ @Override
+ public Selection createFromParcel(Parcel in) {
+ return new Selection(in);
+ }
+
+ @Override
+ public Selection[] newArray(int size) {
+ return new Selection[size];
+ }
+ };
+ }
+
+ /**
* A class defining an action that can be performed on an {@link AccessibilityNodeInfo}.
* Each action has a unique id that is mandatory and optional data.
* <p>
@@ -6419,6 +6801,29 @@ public class AccessibilityNodeInfo implements Parcelable {
@NonNull public static final AccessibilityAction ACTION_SHOW_TEXT_SUGGESTIONS =
new AccessibilityAction(R.id.accessibilityActionShowTextSuggestions);
+ /**
+ * Action to set the extended selection. Performing this action with no arguments clears the
+ * selection.
+ *
+ * <p><strong>Arguments:</strong> {@link
+ * AccessibilityNodeInfo#ACTION_ARGUMENT_SELECTION_PARCELABLE
+ * AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_PARCELABLE}<br>
+ * <strong>Example:</strong> <code><pre><p>
+ * Bundle arguments = new Bundle();
+ * Selection selection = new Selection(null, null);
+ * arguments.setParcelable(
+ * AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_PARCELABLE, selection);
+ * info.performAction(
+ * AccessibilityAction.ACTION_SET_EXTENDED_SELECTION.getId(), arguments);
+ * </pre></code>
+ *
+ * @see AccessibilityNodeInfo#ACTION_ARGUMENT_SELECTION_PARCELABLE
+ */
+ @FlaggedApi(Flags.FLAG_A11Y_SELECTION_API)
+ @NonNull
+ public static final AccessibilityAction ACTION_SET_EXTENDED_SELECTION =
+ new AccessibilityAction(R.id.accessibilityActionSetExtendedSelection);
+
private final int mActionId;
private final CharSequence mLabel;
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index 2fb78c038ca2..b66020b0c92b 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -57,6 +57,7 @@ import android.view.View;
import android.view.ViewStructure;
import android.view.autofill.AutofillId;
import android.view.contentcapture.ViewNode.ViewStructureImpl;
+import android.view.contentcapture.flags.Flags;
import android.view.contentprotection.ContentProtectionEventProcessor;
import android.view.inputmethod.BaseInputConnection;
@@ -1008,6 +1009,9 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
}
}
internalNotifyViewTreeEvent(sessionId, /* started= */ false);
+ if (Flags.flushAfterEachFrame()) {
+ internalNotifySessionFlushEvent(sessionId);
+ }
}
} finally {
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
diff --git a/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig b/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig
index e7bc004ca2d2..8c98fa455cc8 100644
--- a/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig
+++ b/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig
@@ -15,3 +15,14 @@ flag {
bug: "380381249"
is_exported: true
}
+
+flag {
+ name: "flush_after_each_frame"
+ namespace: "pixel_state_server"
+ description: "Feature flag to send a flush event after each frame"
+ bug: "380381249"
+ is_fixed_read_only: true
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/core/java/android/window/ConfigurationDispatcher.java b/core/java/android/window/ConfigurationDispatcher.java
new file mode 100644
index 000000000000..b8f0da1e2c58
--- /dev/null
+++ b/core/java/android/window/ConfigurationDispatcher.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.window;
+
+import android.annotation.NonNull;
+import android.content.ComponentCallbacks;
+import android.content.res.Configuration;
+
+/**
+ * Indicates a {@link android.content.Context} could propagate the
+ * {@link android.content.res.Configuration} from the server side and users may listen to the
+ * updates through {@link android.content.Context#registerComponentCallbacks(ComponentCallbacks)}.
+ *
+ * @hide
+ */
+public interface ConfigurationDispatcher {
+
+ /**
+ * Called when there's configuration update from the server side.
+ */
+ void dispatchConfigurationChanged(@NonNull Configuration configuration);
+
+ /**
+ * Indicates that if this dispatcher should report the change even if it's not
+ * {@link Configuration#diffPublicOnly}.
+ */
+ default boolean shouldReportPrivateChanges() {
+ return false;
+ }
+}
diff --git a/core/java/android/window/TaskFragmentCreationParams.java b/core/java/android/window/TaskFragmentCreationParams.java
index 89327fe358f5..bc5ad50483ee 100644
--- a/core/java/android/window/TaskFragmentCreationParams.java
+++ b/core/java/android/window/TaskFragmentCreationParams.java
@@ -24,6 +24,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.TestApi;
+import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo.ScreenOrientation;
import android.graphics.Rect;
import android.os.IBinder;
@@ -112,12 +113,21 @@ public final class TaskFragmentCreationParams implements Parcelable {
*/
private final @ScreenOrientation int mOverrideOrientation;
+ /**
+ * {@link android.content.pm.ActivityInfo.Config} mask that specifies which
+ * configuration changes should trigger TaskFragment info change callbacks.
+ *
+ * @see android.content.pm.ActivityInfo.Config
+ */
+ private final @ActivityInfo.Config int mConfigurationChangeMask;
+
private TaskFragmentCreationParams(
@NonNull TaskFragmentOrganizerToken organizer, @NonNull IBinder fragmentToken,
@NonNull IBinder ownerToken, @NonNull Rect initialRelativeBounds,
@WindowingMode int windowingMode, @Nullable IBinder pairedPrimaryFragmentToken,
@Nullable IBinder pairedActivityToken, boolean allowTransitionWhenEmpty,
- @ScreenOrientation int overrideOrientation) {
+ @ScreenOrientation int overrideOrientation,
+ @ActivityInfo.Config int configurationChangeMask) {
if (pairedPrimaryFragmentToken != null && pairedActivityToken != null) {
throw new IllegalArgumentException("pairedPrimaryFragmentToken and"
+ " pairedActivityToken should not be set at the same time.");
@@ -131,6 +141,7 @@ public final class TaskFragmentCreationParams implements Parcelable {
mPairedActivityToken = pairedActivityToken;
mAllowTransitionWhenEmpty = allowTransitionWhenEmpty;
mOverrideOrientation = overrideOrientation;
+ mConfigurationChangeMask = configurationChangeMask;
}
@NonNull
@@ -186,6 +197,11 @@ public final class TaskFragmentCreationParams implements Parcelable {
return mOverrideOrientation;
}
+ /** @hide */
+ public @ActivityInfo.Config int getConfigurationChangeMask() {
+ return mConfigurationChangeMask;
+ }
+
private TaskFragmentCreationParams(Parcel in) {
mOrganizer = TaskFragmentOrganizerToken.CREATOR.createFromParcel(in);
mFragmentToken = in.readStrongBinder();
@@ -196,6 +212,7 @@ public final class TaskFragmentCreationParams implements Parcelable {
mPairedActivityToken = in.readStrongBinder();
mAllowTransitionWhenEmpty = in.readBoolean();
mOverrideOrientation = in.readInt();
+ mConfigurationChangeMask = in.readInt();
}
/** @hide */
@@ -210,6 +227,7 @@ public final class TaskFragmentCreationParams implements Parcelable {
dest.writeStrongBinder(mPairedActivityToken);
dest.writeBoolean(mAllowTransitionWhenEmpty);
dest.writeInt(mOverrideOrientation);
+ dest.writeInt(mConfigurationChangeMask);
}
@NonNull
@@ -238,6 +256,7 @@ public final class TaskFragmentCreationParams implements Parcelable {
+ " pairedActivityToken=" + mPairedActivityToken
+ " allowTransitionWhenEmpty=" + mAllowTransitionWhenEmpty
+ " overrideOrientation=" + mOverrideOrientation
+ + " configurationChangeMask=" + mConfigurationChangeMask
+ "}";
}
@@ -275,6 +294,8 @@ public final class TaskFragmentCreationParams implements Parcelable {
private @ScreenOrientation int mOverrideOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
+ private @ActivityInfo.Config int mConfigurationChangeMask = 0;
+
public Builder(@NonNull TaskFragmentOrganizerToken organizer,
@NonNull IBinder fragmentToken, @NonNull IBinder ownerToken) {
mOrganizer = organizer;
@@ -369,12 +390,30 @@ public final class TaskFragmentCreationParams implements Parcelable {
return this;
}
+ /**
+ * Sets {@link android.content.pm.ActivityInfo.Config} mask that specifies which
+ * configuration changes should trigger TaskFragment info change callbacks.
+ *
+ * Only system organizers are allowed to configure this value. This value is ignored for
+ * non-system organizers.
+ *
+ * @see android.content.pm.ActivityInfo.Config
+ * @hide
+ */
+ @NonNull
+ public Builder setConfigurationChangeMask(
+ @ActivityInfo.Config int configurationChangeMask) {
+ mConfigurationChangeMask = configurationChangeMask;
+ return this;
+ }
+
/** Constructs the options to create TaskFragment with. */
@NonNull
public TaskFragmentCreationParams build() {
return new TaskFragmentCreationParams(mOrganizer, mFragmentToken, mOwnerToken,
mInitialRelativeBounds, mWindowingMode, mPairedPrimaryFragmentToken,
- mPairedActivityToken, mAllowTransitionWhenEmpty, mOverrideOrientation);
+ mPairedActivityToken, mAllowTransitionWhenEmpty, mOverrideOrientation,
+ mConfigurationChangeMask);
}
}
}
diff --git a/core/java/android/window/WindowContext.java b/core/java/android/window/WindowContext.java
index 84a8b8f5b5b0..778ccafedd3c 100644
--- a/core/java/android/window/WindowContext.java
+++ b/core/java/android/window/WindowContext.java
@@ -17,8 +17,6 @@ package android.window;
import static android.view.WindowManagerImpl.createWindowContextWindowManager;
-import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UiContext;
@@ -46,7 +44,8 @@ import java.lang.ref.Reference;
* @hide
*/
@UiContext
-public class WindowContext extends ContextWrapper implements WindowProvider {
+public class WindowContext extends ContextWrapper implements WindowProvider,
+ ConfigurationDispatcher {
private final WindowManager mWindowManager;
@WindowManager.LayoutParams.WindowType
private final int mType;
@@ -155,7 +154,7 @@ public class WindowContext extends ContextWrapper implements WindowProvider {
}
/** Dispatch {@link Configuration} to each {@link ComponentCallbacks}. */
- @VisibleForTesting(visibility = PACKAGE)
+ @Override
public void dispatchConfigurationChanged(@NonNull Configuration newConfig) {
mCallbacksController.dispatchConfigurationChanged(newConfig);
}
@@ -170,4 +169,10 @@ public class WindowContext extends ContextWrapper implements WindowProvider {
public Bundle getWindowContextOptions() {
return mOptions;
}
+
+ @Override
+ public boolean shouldReportPrivateChanges() {
+ // Always dispatch config changes to WindowContext.
+ return true;
+ }
}
diff --git a/core/java/android/window/WindowContextController.java b/core/java/android/window/WindowContextController.java
index 1e2f454adeef..d31e43f6102d 100644
--- a/core/java/android/window/WindowContextController.java
+++ b/core/java/android/window/WindowContextController.java
@@ -86,7 +86,6 @@ public class WindowContextController {
* @param token The token used to attach to a window manager node. It is usually from
* {@link Context#getWindowContextToken()}.
*/
- @VisibleForTesting
public WindowContextController(@NonNull WindowTokenClient token) {
mToken = token;
}
diff --git a/core/java/android/window/WindowProviderService.java b/core/java/android/window/WindowProviderService.java
index c81c9eccfa3d..8468867de033 100644
--- a/core/java/android/window/WindowProviderService.java
+++ b/core/java/android/window/WindowProviderService.java
@@ -49,9 +49,11 @@ import android.view.WindowManagerImpl;
*
* @hide
*/
+@SuppressWarnings("HiddenSuperclass")
@TestApi
@UiContext
-public abstract class WindowProviderService extends Service implements WindowProvider {
+public abstract class WindowProviderService extends Service implements WindowProvider,
+ ConfigurationDispatcher {
private static final String TAG = WindowProviderService.class.getSimpleName();
@@ -240,4 +242,14 @@ public abstract class WindowProviderService extends Service implements WindowPro
mController.detachIfNeeded();
mCallbacksController.clearCallbacks();
}
+
+ /**
+ * {@inheritDoc}
+ *
+ * @hide
+ */
+ @Override
+ public void dispatchConfigurationChanged(@NonNull Configuration configuration) {
+ onConfigurationChanged(configuration);
+ }
}
diff --git a/core/java/android/window/WindowTokenClient.java b/core/java/android/window/WindowTokenClient.java
index f7bee619bc4b..9b296c80d298 100644
--- a/core/java/android/window/WindowTokenClient.java
+++ b/core/java/android/window/WindowTokenClient.java
@@ -107,6 +107,7 @@ public class WindowTokenClient extends Binder {
* @param newDisplayId the updated {@link android.view.Display} ID
*/
@MainThread
+ @VisibleForTesting(visibility = PACKAGE)
public void onConfigurationChanged(Configuration newConfig, int newDisplayId) {
onConfigurationChanged(newConfig, newDisplayId, true /* shouldReportConfigChange */);
}
@@ -120,8 +121,6 @@ public class WindowTokenClient extends Binder {
newDisplayId, true /* shouldReportConfigChange */).recycleOnUse());
}
- // TODO(b/192048581): rewrite this method based on WindowContext and WindowProviderService
- // are inherited from WindowProvider.
/**
* Called when {@link Configuration} updates from the server side receive.
*
@@ -168,7 +167,7 @@ public class WindowTokenClient extends Binder {
CompatibilityInfo.applyOverrideIfNeeded(newConfig);
final boolean displayChanged;
final boolean shouldUpdateResources;
- final int diff;
+ final int publicDiff;
final Configuration currentConfig;
synchronized (mConfiguration) {
@@ -176,7 +175,7 @@ public class WindowTokenClient extends Binder {
shouldUpdateResources = shouldUpdateResources(this, mConfiguration,
newConfig, newConfig /* overrideConfig */, displayChanged,
null /* configChanged */);
- diff = mConfiguration.diffPublicOnly(newConfig);
+ publicDiff = mConfiguration.diffPublicOnly(newConfig);
currentConfig = mShouldDumpConfigForIme ? new Configuration(mConfiguration) : null;
if (shouldUpdateResources) {
mConfiguration.setTo(newConfig);
@@ -199,17 +198,15 @@ public class WindowTokenClient extends Binder {
// TODO(ag/9789103): update resource manager logic to track non-activity tokens
mResourcesManager.updateResourcesForActivity(this, newConfig, newDisplayId);
- if (shouldReportConfigChange && context instanceof WindowContext) {
- final WindowContext windowContext = (WindowContext) context;
- windowContext.dispatchConfigurationChanged(newConfig);
+ if (shouldReportConfigChange && context instanceof ConfigurationDispatcher dispatcher) {
+ // Updating resources implies some fields of configuration are updated despite they
+ // are public or not.
+ if (dispatcher.shouldReportPrivateChanges() || publicDiff != 0) {
+ dispatcher.dispatchConfigurationChanged(newConfig);
+ }
}
- if (shouldReportConfigChange && diff != 0
- && context instanceof WindowProviderService) {
- final WindowProviderService windowProviderService = (WindowProviderService) context;
- windowProviderService.onConfigurationChanged(newConfig);
- }
- freeTextLayoutCachesIfNeeded(diff);
+ freeTextLayoutCachesIfNeeded(publicDiff);
if (mShouldDumpConfigForIme) {
if (!shouldReportConfigChange) {
Log.d(TAG, "Only apply configuration update to Resources because "
@@ -218,7 +215,7 @@ public class WindowTokenClient extends Binder {
+ ", config=" + context.getResources().getConfiguration()
+ ", display ID=" + context.getDisplayId() + "\n"
+ Debug.getCallers(5));
- } else if (diff == 0) {
+ } else if (publicDiff == 0) {
Log.d(TAG, "Configuration not dispatch to IME because configuration has no "
+ " public difference with updated config. "
+ " Current config=" + context.getResources().getConfiguration()
diff --git a/core/java/android/window/WindowTokenClientController.java b/core/java/android/window/WindowTokenClientController.java
index fcd7dfbb1769..72278d927d74 100644
--- a/core/java/android/window/WindowTokenClientController.java
+++ b/core/java/android/window/WindowTokenClientController.java
@@ -25,7 +25,9 @@ import android.app.IApplicationThread;
import android.app.servertransaction.WindowContextInfoChangeItem;
import android.app.servertransaction.WindowContextWindowRemovalItem;
import android.content.Context;
+import android.content.res.Configuration;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.ArraySet;
@@ -50,6 +52,7 @@ public class WindowTokenClientController {
private final Object mLock = new Object();
private final IApplicationThread mAppThread = ActivityThread.currentActivityThread()
.getApplicationThread();
+ private final Handler mHandler = ActivityThread.currentActivityThread().getHandler();
/** Attached {@link WindowTokenClient}. */
@GuardedBy("mLock")
@@ -257,6 +260,20 @@ public class WindowTokenClientController {
}
}
+ /** Propagates the configuration change to the client token. */
+ public void onWindowConfigurationChanged(@NonNull IBinder clientToken,
+ @NonNull Configuration config, int displayId) {
+ final WindowTokenClient windowTokenClient = getWindowTokenClientIfAttached(clientToken);
+ if (windowTokenClient != null) {
+ // Let's make sure it's called on the main thread!
+ if (mHandler.getLooper().isCurrentThread()) {
+ windowTokenClient.onConfigurationChanged(config, displayId);
+ } else {
+ windowTokenClient.postOnConfigurationChanged(config, displayId);
+ }
+ }
+ }
+
@Nullable
private WindowTokenClient getWindowTokenClientIfAttached(@NonNull IBinder clientToken) {
if (!(clientToken instanceof WindowTokenClient windowTokenClient)) {
diff --git a/core/java/android/window/flags/windowing_sdk.aconfig b/core/java/android/window/flags/windowing_sdk.aconfig
index ac6625b17413..54d0eeffc9bb 100644
--- a/core/java/android/window/flags/windowing_sdk.aconfig
+++ b/core/java/android/window/flags/windowing_sdk.aconfig
@@ -55,14 +55,6 @@ flag {
flag {
namespace: "windowing_sdk"
- name: "enable_wm_extensions_for_all_flag"
- description: "Whether to enable WM Extensions for all devices"
- bug: "306666082"
- is_fixed_read_only: true
-}
-
-flag {
- namespace: "windowing_sdk"
name: "activity_embedding_animation_customization_flag"
description: "Whether the animation customization feature for AE is enabled"
bug: "293658614"
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index e60879e02b4b..38dc198fa9f8 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -429,6 +429,27 @@ public class ZygoteInit {
null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/));
}
+ if (Flags.enableMediaAndLocationPreload()) {
+ // As these libraries are technically optional and not necessarily inherited from
+ // base_system.mk, only cache them if they exist.
+ final String mediaJarPath = "/system/framework/com.android.media.remotedisplay.jar";
+ if (new File(mediaJarPath).exists()) {
+ libs.add(new SharedLibraryInfo(
+ mediaJarPath, null /*packageName*/,
+ null /*codePaths*/, null /*name*/, 0 /*version*/,
+ SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/,
+ null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/));
+ }
+ final String locationJarPath = "/system/framework/com.android.location.provider.jar";
+ if (new File(locationJarPath).exists()) {
+ libs.add(new SharedLibraryInfo(
+ locationJarPath, null /*packageName*/,
+ null /*codePaths*/, null /*name*/, 0 /*version*/,
+ SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/,
+ null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/));
+ }
+ }
+
// WindowManager Extensions is an optional shared library that is required for WindowManager
// Jetpack to fully function. Since it is a widely used library, preload it to improve apps
// startup performance.
diff --git a/core/java/com/android/internal/os/flags.aconfig b/core/java/com/android/internal/os/flags.aconfig
index 25a9fbc8476c..32cde50f11a2 100644
--- a/core/java/com/android/internal/os/flags.aconfig
+++ b/core/java/com/android/internal/os/flags.aconfig
@@ -53,6 +53,13 @@ flag {
}
flag {
+ name: "enable_media_and_location_preload"
+ namespace: "system_performance"
+ description: "Enables zygote preload of non-BCP media and location libraries."
+ bug: "241474956"
+}
+
+flag {
name: "use_transaction_codes_for_unknown_methods"
namespace: "stability"
description: "Use transaction codes when the method names is unknown"
diff --git a/core/java/com/android/internal/pm/pkg/component/AconfigFlags.java b/core/java/com/android/internal/pm/pkg/component/AconfigFlags.java
index 445dac7411da..21d000dc5224 100644
--- a/core/java/com/android/internal/pm/pkg/component/AconfigFlags.java
+++ b/core/java/com/android/internal/pm/pkg/component/AconfigFlags.java
@@ -16,6 +16,7 @@
package com.android.internal.pm.pkg.component;
+import static android.provider.flags.Flags.newStoragePublicApi;
import static com.android.internal.pm.pkg.parsing.ParsingUtils.ANDROID_RES_NAMESPACE;
import android.aconfig.DeviceProtos;
@@ -27,6 +28,7 @@ import android.annotation.Nullable;
import android.content.res.Flags;
import android.os.Environment;
import android.os.Process;
+import android.os.flagging.AconfigPackage;
import android.util.ArrayMap;
import android.util.Slog;
import android.util.Xml;
@@ -43,6 +45,7 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
/**
* A class that manages a cache of all device feature flags and their default + override values.
@@ -58,7 +61,8 @@ public class AconfigFlags {
private static final String OVERRIDE_PREFIX = "device_config_overrides/";
private static final String STAGED_PREFIX = "staged/";
- private final ArrayMap<String, Boolean> mFlagValues = new ArrayMap<>();
+ private final Map<String, Boolean> mFlagValues = new ArrayMap<>();
+ private final Map<String, AconfigPackage> mAconfigPackages = new ConcurrentHashMap<>();
public AconfigFlags() {
if (!Flags.manifestFlagging()) {
@@ -67,23 +71,33 @@ public class AconfigFlags {
}
return;
}
- final var defaultFlagProtoFiles =
- (Process.myUid() == Process.SYSTEM_UID) ? DeviceProtos.parsedFlagsProtoPaths()
- : Arrays.asList(DeviceProtos.PATHS);
- for (String fileName : defaultFlagProtoFiles) {
- try (var inputStream = new FileInputStream(fileName)) {
- loadAconfigDefaultValues(inputStream.readAllBytes());
- } catch (IOException e) {
- Slog.e(LOG_TAG, "Failed to read Aconfig values from " + fileName, e);
+
+ if (useNewStorage()) {
+ Slog.i(LOG_TAG, "Using new flag storage");
+ } else {
+ Slog.i(LOG_TAG, "Using OLD proto flag storage");
+ final var defaultFlagProtoFiles =
+ (Process.myUid() == Process.SYSTEM_UID) ? DeviceProtos.parsedFlagsProtoPaths()
+ : Arrays.asList(DeviceProtos.PATHS);
+ for (String fileName : defaultFlagProtoFiles) {
+ try (var inputStream = new FileInputStream(fileName)) {
+ loadAconfigDefaultValues(inputStream.readAllBytes());
+ } catch (IOException e) {
+ Slog.w(LOG_TAG, "Failed to read Aconfig values from " + fileName, e);
+ }
+ }
+ if (Process.myUid() == Process.SYSTEM_UID) {
+ // Server overrides are only accessible to the system, no need to even try loading
+ // them in user processes.
+ loadServerOverrides();
}
- }
- if (Process.myUid() == Process.SYSTEM_UID) {
- // Server overrides are only accessible to the system, no need to even try loading them
- // in user processes.
- loadServerOverrides();
}
}
+ private static boolean useNewStorage() {
+ return newStoragePublicApi() && Flags.useNewAconfigStorage();
+ }
+
private void loadServerOverrides() {
// Reading the proto files is enough for READ_ONLY flags but if it's a READ_WRITE flag
// (which you can check with `flag.getPermission() == flag_permission.READ_WRITE`) then we
@@ -200,7 +214,40 @@ public class AconfigFlags {
*/
@Nullable
public Boolean getFlagValue(@NonNull String flagPackageAndName) {
- Boolean value = mFlagValues.get(flagPackageAndName);
+ if (useNewStorage()) {
+ return getFlagValueFromNewStorage(flagPackageAndName);
+ } else {
+ Boolean value = mFlagValues.get(flagPackageAndName);
+ if (DEBUG) {
+ Slog.v(LOG_TAG, "Aconfig flag value for " + flagPackageAndName + " = " + value);
+ }
+ return value;
+ }
+ }
+
+ private Boolean getFlagValueFromNewStorage(String flagPackageAndName) {
+ int index = flagPackageAndName.lastIndexOf('.');
+ if (index < 0) {
+ Slog.e(LOG_TAG, "Unable to parse package name from " + flagPackageAndName);
+ return null;
+ }
+ String flagPackage = flagPackageAndName.substring(0, index);
+ String flagName = flagPackageAndName.substring(index + 1);
+ Boolean value = null;
+ AconfigPackage aconfigPackage = mAconfigPackages.computeIfAbsent(flagPackage, p -> {
+ try {
+ return AconfigPackage.load(p);
+ } catch (Exception e) {
+ Slog.e(LOG_TAG, "Failed to load aconfig package " + p, e);
+ return null;
+ }
+ });
+ if (aconfigPackage != null) {
+ // Default value is false for when the flag is not found.
+ // Note: Unlike with the old storage, with AconfigPackage, we don't have a way to
+ // know if the flag is not found or if it's found but the value is false.
+ value = aconfigPackage.getBooleanFlagValue(flagName, false);
+ }
if (DEBUG) {
Slog.v(LOG_TAG, "Aconfig flag value for " + flagPackageAndName + " = " + value);
}
diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java
index 9a5849a28065..641ecc9b675a 100644
--- a/core/java/com/android/internal/widget/ConversationLayout.java
+++ b/core/java/com/android/internal/widget/ConversationLayout.java
@@ -399,7 +399,9 @@ public class ConversationLayout extends FrameLayout
@RemotableViewMethod(asyncImpl = "setIsCollapsedAsync")
public void setIsCollapsed(boolean isCollapsed) {
mIsCollapsed = isCollapsed;
- mMessagingLinearLayout.setMaxDisplayedLines(isCollapsed ? 1 : Integer.MAX_VALUE);
+ mMessagingLinearLayout.setMaxDisplayedLines(isCollapsed
+ ? TextUtils.isEmpty(mSummarizedContent) ? 1 : 2
+ : Integer.MAX_VALUE);
updateExpandButton();
updateContentEndPaddings();
}
@@ -448,7 +450,7 @@ public class ConversationLayout extends FrameLayout
List<MessagingMessage> newMessagingMessages;
mSummarizedContent = extras.getCharSequence(Notification.EXTRA_SUMMARIZED_CONTENT);
- if (mSummarizedContent != null && mIsCollapsed) {
+ if (!TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed) {
Notification.MessagingStyle.Message summary =
new Notification.MessagingStyle.Message(mSummarizedContent, 0, "");
newMessagingMessages = createMessages(List.of(summary), false, usePrecomputedText);
@@ -1162,7 +1164,7 @@ public class ConversationLayout extends FrameLayout
nameOverride = mNameReplacement;
}
newGroup.setShowingAvatar(!mIsOneToOne && !mIsCollapsed);
- newGroup.setSingleLine(mIsCollapsed);
+ newGroup.setSingleLine(mIsCollapsed && TextUtils.isEmpty(mSummarizedContent));
newGroup.setSender(sender, nameOverride);
newGroup.setSending(groupIndex == (groups.size() - 1) && showSpinner);
mGroups.add(newGroup);
@@ -1462,7 +1464,6 @@ public class ConversationLayout extends FrameLayout
maxHeight = Math.max(maxHeight,
child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
}
-
maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
if (maxHeight != getMeasuredHeight()) {
setMeasuredDimension(getMeasuredWidth(), maxHeight);
diff --git a/core/java/com/android/internal/widget/MessagingLayout.java b/core/java/com/android/internal/widget/MessagingLayout.java
index 90ab6605b2e8..e9d920ca3fcd 100644
--- a/core/java/com/android/internal/widget/MessagingLayout.java
+++ b/core/java/com/android/internal/widget/MessagingLayout.java
@@ -198,7 +198,8 @@ public class MessagingLayout extends FrameLayout
/* isHistoric= */true, usePrecomputedText);
List<MessagingMessage> newMessagingMessages;
mSummarizedContent = extras.getCharSequence(Notification.EXTRA_SUMMARIZED_CONTENT);
- if (mSummarizedContent != null && mIsCollapsed) {
+ if (!TextUtils.isEmpty(mSummarizedContent) && mIsCollapsed) {
+ mMessagingLinearLayout.setMaxDisplayedLines(2);
Notification.MessagingStyle.Message summary =
new Notification.MessagingStyle.Message(mSummarizedContent, 0, "");
newMessagingMessages = createMessages(List.of(summary), false, usePrecomputedText);
@@ -488,7 +489,7 @@ public class MessagingLayout extends FrameLayout
if (sender != mUser && mNameReplacement != null) {
nameOverride = mNameReplacement;
}
- newGroup.setSingleLine(mIsCollapsed);
+ newGroup.setSingleLine(mIsCollapsed && TextUtils.isEmpty(mSummarizedContent));
newGroup.setShowingAvatar(!mIsCollapsed);
newGroup.setSender(sender, nameOverride);
newGroup.setSending(groupIndex == (groups.size() - 1) && showSpinner);
diff --git a/core/java/com/android/internal/widget/NotificationProgressBar.java b/core/java/com/android/internal/widget/NotificationProgressBar.java
index 5e82772730b7..905d4dd547f3 100644
--- a/core/java/com/android/internal/widget/NotificationProgressBar.java
+++ b/core/java/com/android/internal/widget/NotificationProgressBar.java
@@ -83,7 +83,7 @@ public final class NotificationProgressBar extends ProgressBar implements
/** @see R.styleable#NotificationProgressBar_trackerHeight */
private final int mTrackerHeight;
- private int mTrackerWidth;
+ private int mTrackerDrawWidth = 0;
private int mTrackerPos;
private final Matrix mMatrix = new Matrix();
private Matrix mTrackerDrawMatrix = null;
@@ -157,7 +157,7 @@ public final class NotificationProgressBar extends ProgressBar implements
} else {
// TODO: b/372908709 - maybe don't rerun the entire calculation every time the
// progress model is updated? For example, if the segments and parts aren't changed,
- // there is no need to call `processAndConvertToViewParts` again.
+ // there is no need to call `processModelAndConvertToViewParts` again.
final int progress = mProgressModel.getProgress();
final int progressMax = mProgressModel.getProgressMax();
@@ -286,8 +286,11 @@ public final class NotificationProgressBar extends ProgressBar implements
private void configureTrackerBounds() {
// Reset the tracker draw matrix to null
mTrackerDrawMatrix = null;
+ mTrackerDrawWidth = 0;
- if (mTracker == null || mTrackerHeight <= 0) {
+ if (mTracker == null) return;
+ if (mTrackerHeight <= 0) {
+ mTrackerDrawWidth = mTracker.getIntrinsicWidth();
return;
}
@@ -306,14 +309,14 @@ public final class NotificationProgressBar extends ProgressBar implements
if (dWidth > maxDWidth) {
scale = (float) mTrackerHeight / (float) dHeight;
dx = (maxDWidth * scale - dWidth * scale) * 0.5f;
- mTrackerWidth = (int) (maxDWidth * scale);
+ mTrackerDrawWidth = (int) (maxDWidth * scale);
} else if (dHeight > maxDHeight) {
scale = (float) mTrackerHeight * 0.5f / (float) dWidth;
dy = (maxDHeight * scale - dHeight * scale) * 0.5f;
- mTrackerWidth = mTrackerHeight / 2;
+ mTrackerDrawWidth = mTrackerHeight / 2;
} else {
scale = (float) mTrackerHeight / (float) dHeight;
- mTrackerWidth = (int) (dWidth * scale);
+ mTrackerDrawWidth = (int) (dWidth * scale);
}
mTrackerDrawMatrix.setScale(scale, scale);
@@ -449,7 +452,8 @@ public final class NotificationProgressBar extends ProgressBar implements
segSegGap,
segPointGap,
pointRadius,
- mHasTrackerIcon
+ mHasTrackerIcon,
+ mTrackerDrawWidth
);
final float segmentMinWidth = mNotificationProgressDrawable.getSegmentMinWidth();
@@ -465,7 +469,6 @@ public final class NotificationProgressBar extends ProgressBar implements
segmentMinWidth,
pointRadius,
progressFraction,
- width,
isStyledByProgress,
progressGap
);
@@ -493,8 +496,8 @@ public final class NotificationProgressBar extends ProgressBar implements
pointRadius,
mHasTrackerIcon,
segmentMinWidth,
- isStyledByProgress
- );
+ isStyledByProgress,
+ mTrackerDrawWidth);
} catch (NotEnoughWidthToFitAllPartsException ex) {
Log.w(TAG, "Failed to stretch and rescale segments with single segment fallback",
ex);
@@ -522,8 +525,8 @@ public final class NotificationProgressBar extends ProgressBar implements
pointRadius,
mHasTrackerIcon,
segmentMinWidth,
- isStyledByProgress
- );
+ isStyledByProgress,
+ mTrackerDrawWidth);
} catch (NotEnoughWidthToFitAllPartsException ex) {
Log.w(TAG,
"Failed to stretch and rescale segments with single segments and no points",
@@ -537,16 +540,20 @@ public final class NotificationProgressBar extends ProgressBar implements
mParts,
mProgressDrawableParts,
progressFraction,
- width,
isStyledByProgress,
progressGap);
}
+ // Extend the first and last segments to fill the entire width.
+ p.first.getFirst().setStart(0);
+ p.first.getLast().setEnd(width);
+
if (DEBUG) {
Log.d(TAG, "Updating NotificationProgressDrawable parts");
}
mNotificationProgressDrawable.setParts(p.first);
- mAdjustedProgressFraction = p.second / width;
+ mAdjustedProgressFraction =
+ (p.second - mTrackerDrawWidth / 2F) / (width - mTrackerDrawWidth);
}
private void updateTrackerAndBarPos(int w, int h) {
@@ -607,7 +614,7 @@ public final class NotificationProgressBar extends ProgressBar implements
int available = w - mPaddingLeft - mPaddingRight;
final int trackerWidth = tracker.getIntrinsicWidth();
final int trackerHeight = tracker.getIntrinsicHeight();
- available -= ((mTrackerHeight <= 0) ? trackerWidth : mTrackerWidth);
+ available -= mTrackerDrawWidth;
final int trackerPos = (int) (progressFraction * available + 0.5f);
@@ -672,7 +679,7 @@ public final class NotificationProgressBar extends ProgressBar implements
canvas.translate(mPaddingLeft + mTrackerPos, mPaddingTop);
if (mTrackerHeight > 0) {
- canvas.clipRect(0, 0, mTrackerWidth, mTrackerHeight);
+ canvas.clipRect(0, 0, mTrackerDrawWidth, mTrackerHeight);
}
if (mTrackerDrawMatrix != null) {
@@ -751,6 +758,7 @@ public final class NotificationProgressBar extends ProgressBar implements
throw new IllegalArgumentException("Invalid progress : " + progress);
}
+
for (ProgressStyle.Point point : points) {
final int pos = point.getPosition();
if (pos < 0 || pos > progressMax) {
@@ -758,6 +766,19 @@ public final class NotificationProgressBar extends ProgressBar implements
}
}
+ // There should be no points at start or end. If there are, drop them with a warning.
+ points.removeIf(point -> {
+ final int pos = point.getPosition();
+ if (pos == 0) {
+ Log.w(TAG, "Dropping point at start");
+ return true;
+ } else if (pos == progressMax) {
+ Log.w(TAG, "Dropping point at end");
+ return true;
+ }
+ return false;
+ });
+
final Map<Integer, ProgressStyle.Segment> startToSegmentMap = generateStartToSegmentMap(
segments);
final Map<Integer, ProgressStyle.Point> positionToPointMap = generatePositionToPointMap(
@@ -891,12 +912,14 @@ public final class NotificationProgressBar extends ProgressBar implements
float segSegGap,
float segPointGap,
float pointRadius,
- boolean hasTrackerIcon
- ) {
+ boolean hasTrackerIcon,
+ int trackerDrawWidth) {
List<DrawablePart> drawableParts = new ArrayList<>();
- // generally, we will start drawing at (x, y) and end at (x+w, y)
- float x = (float) 0;
+ float available = totalWidth - trackerDrawWidth;
+ // Generally, we will start the first segment at (x+trackerDrawWidth/2, y) and end the last
+ // segment at (x+w-trackerDrawWidth/2, y)
+ float x = trackerDrawWidth / 2F;
final int nParts = parts.size();
for (int iPart = 0; iPart < nParts; iPart++) {
@@ -904,15 +927,14 @@ public final class NotificationProgressBar extends ProgressBar implements
final Part prevPart = iPart == 0 ? null : parts.get(iPart - 1);
final Part nextPart = iPart + 1 == nParts ? null : parts.get(iPart + 1);
if (part instanceof Segment segment) {
- final float segWidth = segment.mFraction * totalWidth;
+ final float segWidth = segment.mFraction * available;
// Advance the start position to account for a point immediately prior.
- final float startOffset = getSegStartOffset(prevPart, pointRadius, segPointGap,
- iPart == 1);
+ final float startOffset = getSegStartOffset(prevPart, pointRadius, segPointGap);
final float start = x + startOffset;
// Retract the end position to account for the padding and a point immediately
// after.
final float endOffset = getSegEndOffset(segment, nextPart, pointRadius, segPointGap,
- segSegGap, iPart == nParts - 2, hasTrackerIcon);
+ segSegGap, hasTrackerIcon);
final float end = x + segWidth - endOffset;
drawableParts.add(new DrawableSegment(start, end, segment.mColor, segment.mFaded));
@@ -927,16 +949,6 @@ public final class NotificationProgressBar extends ProgressBar implements
final float pointWidth = 2 * pointRadius;
float start = x - pointRadius;
float end = x + pointRadius;
- // Only shift the points right at the start/end.
- // For the points close to the start/end, the segment minimum width requirement
- // would take care of shifting them to be within the bounds.
- if (iPart == 0) {
- start = 0;
- end = pointWidth;
- } else if (iPart == nParts - 1) {
- start = totalWidth - pointWidth;
- end = totalWidth;
- }
drawableParts.add(new DrawablePoint(start, end, point.mColor));
}
@@ -945,16 +957,13 @@ public final class NotificationProgressBar extends ProgressBar implements
return drawableParts;
}
- private static float getSegStartOffset(Part prevPart, float pointRadius, float segPointGap,
- boolean isSecondPart) {
+ private static float getSegStartOffset(Part prevPart, float pointRadius, float segPointGap) {
if (!(prevPart instanceof Point)) return 0F;
- final float pointOffset = isSecondPart ? pointRadius : 0;
- return pointOffset + pointRadius + segPointGap;
+ return pointRadius + segPointGap;
}
private static float getSegEndOffset(Segment seg, Part nextPart, float pointRadius,
- float segPointGap, float segSegGap, boolean isSecondToLastPart,
- boolean hasTrackerIcon) {
+ float segPointGap, float segSegGap, boolean hasTrackerIcon) {
if (nextPart == null) return 0F;
if (nextPart instanceof Segment nextSeg) {
if (!seg.mFaded && nextSeg.mFaded) {
@@ -964,8 +973,7 @@ public final class NotificationProgressBar extends ProgressBar implements
return segSegGap;
}
- final float pointOffset = isSecondToLastPart ? pointRadius : 0;
- return segPointGap + pointRadius + pointOffset;
+ return segPointGap + pointRadius;
}
/**
@@ -980,7 +988,6 @@ public final class NotificationProgressBar extends ProgressBar implements
float segmentMinWidth,
float pointRadius,
float progressFraction,
- float totalWidth,
boolean isStyledByProgress,
float progressGap
) throws NotEnoughWidthToFitAllPartsException {
@@ -1003,7 +1010,6 @@ public final class NotificationProgressBar extends ProgressBar implements
parts,
drawableParts,
progressFraction,
- totalWidth,
isStyledByProgress,
progressGap);
}
@@ -1056,7 +1062,6 @@ public final class NotificationProgressBar extends ProgressBar implements
parts,
drawableParts,
progressFraction,
- totalWidth,
isStyledByProgress,
progressGap);
}
@@ -1071,11 +1076,12 @@ public final class NotificationProgressBar extends ProgressBar implements
List<Part> parts,
List<DrawablePart> drawableParts,
float progressFraction,
- float totalWidth,
boolean isStyledByProgress,
float progressGap
) {
- if (progressFraction == 1) return new Pair<>(drawableParts, totalWidth);
+ if (progressFraction == 1) {
+ return new Pair<>(drawableParts, drawableParts.getLast().getEnd());
+ }
int iPartFirstSegmentToStyle = -1;
int iPartSegmentToSplit = -1;
@@ -1162,14 +1168,15 @@ public final class NotificationProgressBar extends ProgressBar implements
float pointRadius,
boolean hasTrackerIcon,
float segmentMinWidth,
- boolean isStyledByProgress
+ boolean isStyledByProgress,
+ int trackerDrawWidth
) throws NotEnoughWidthToFitAllPartsException {
List<Part> parts = processModelAndConvertToViewParts(segments, points, progress,
progressMax);
List<DrawablePart> drawableParts = processPartsAndConvertToDrawableParts(parts, totalWidth,
- segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ segSegGap, segPointGap, pointRadius, hasTrackerIcon, trackerDrawWidth);
return maybeStretchAndRescaleSegments(parts, drawableParts, segmentMinWidth, pointRadius,
- getProgressFraction(progressMax, progress), totalWidth, isStyledByProgress,
+ getProgressFraction(progressMax, progress), isStyledByProgress,
hasTrackerIcon ? 0F : segSegGap);
}
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 447822f0903f..06702e2fa4bf 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -134,6 +134,10 @@ cc_library_shared_for_libandroid_runtime {
"android_app_ActivityThread.cpp",
"android_app_NativeActivity.cpp",
"android_app_admin_SecurityLog.cpp",
+ "android_media_ImageReader.cpp",
+ "android_media_ImageWriter.cpp",
+ "android_media_PublicFormatUtils.cpp",
+ "android_media_Utils.cpp",
"android_opengl_EGL14.cpp",
"android_opengl_EGL15.cpp",
"android_opengl_EGLExt.cpp",
@@ -531,3 +535,35 @@ cc_library_shared {
"vintf",
],
}
+
+cc_library_shared {
+ name: "libmedia_jni_utils",
+ srcs: [
+ ":libgui_frame_event_aidl",
+ "android_media_Utils.cpp",
+ ],
+
+ header_libs: [
+ "libgui_headers",
+ ],
+
+ shared_libs: [
+ "liblog",
+ "libui",
+ "libutils",
+ ],
+
+ include_dirs: [
+ "system/media/camera/include",
+ ],
+
+ export_include_dirs: ["."],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-error=deprecated-declarations",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 5c0b72013a06..b2b826391e1d 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -102,7 +102,10 @@ extern int register_android_media_AudioAttributes(JNIEnv *env);
extern int register_android_media_AudioProductStrategies(JNIEnv *env);
extern int register_android_media_AudioVolumeGroups(JNIEnv *env);
extern int register_android_media_AudioVolumeGroupChangeHandler(JNIEnv *env);
+extern int register_android_media_ImageReader(JNIEnv *env);
+extern int register_android_media_ImageWriter(JNIEnv *env);
extern int register_android_media_MicrophoneInfo(JNIEnv *env);
+extern int register_android_media_PublicFormatUtils(JNIEnv *env);
extern int register_android_media_ToneGenerator(JNIEnv *env);
extern int register_android_media_audio_common_AidlConversion(JNIEnv* env);
extern int register_android_media_midi(JNIEnv *env);
@@ -1658,8 +1661,11 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_media_AudioProductStrategies),
REG_JNI(register_android_media_AudioVolumeGroups),
REG_JNI(register_android_media_AudioVolumeGroupChangeHandler),
+ REG_JNI(register_android_media_ImageReader),
+ REG_JNI(register_android_media_ImageWriter),
REG_JNI(register_android_media_MediaMetrics),
REG_JNI(register_android_media_MicrophoneInfo),
+ REG_JNI(register_android_media_PublicFormatUtils),
REG_JNI(register_android_media_RemoteDisplay),
REG_JNI(register_android_media_ToneGenerator),
REG_JNI(register_android_media_audio_common_AidlConversion),
diff --git a/media/jni/android_media_ImageReader.cpp b/core/jni/android_media_ImageReader.cpp
index effa92c5f2fa..20b9c571317e 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/core/jni/android_media_ImageReader.cpp
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code
//#define LOG_NDEBUG 0
#define LOG_TAG "ImageReader_JNI"
diff --git a/media/jni/android_media_ImageWriter.cpp b/core/jni/android_media_ImageWriter.cpp
index 93deb51df142..1357dd842ff1 100644
--- a/media/jni/android_media_ImageWriter.cpp
+++ b/core/jni/android_media_ImageWriter.cpp
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code
//#define LOG_NDEBUG 0
#define LOG_TAG "ImageWriter_JNI"
diff --git a/media/jni/android_media_PublicFormatUtils.cpp b/core/jni/android_media_PublicFormatUtils.cpp
index 04494ad00a65..04494ad00a65 100644
--- a/media/jni/android_media_PublicFormatUtils.cpp
+++ b/core/jni/android_media_PublicFormatUtils.cpp
diff --git a/media/jni/android_media_Utils.cpp b/core/jni/android_media_Utils.cpp
index e8f8644a4503..e8f8644a4503 100644
--- a/media/jni/android_media_Utils.cpp
+++ b/core/jni/android_media_Utils.cpp
diff --git a/media/jni/android_media_Utils.h b/core/jni/android_media_Utils.h
index c12cec129ede..c12cec129ede 100644
--- a/media/jni/android_media_Utils.h
+++ b/core/jni/android_media_Utils.h
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 368cf65ae67c..5da0924c08c3 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Ontspeld"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Ontspeld <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Appinligting"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direktedelingteikens"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Appvoorstelle"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Applys"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Begin tans demonstrasie …"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Stel toestel tans terug …"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-paneel links"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-paneel regs"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-paneel middel"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Outoklik-tipe instellingspaneel"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Linksklik"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Onderbreek"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posisie"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in die BEPERK-groep geplaas"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"het \'n prent gestuur"</string>
@@ -2269,7 +2270,7 @@
<string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Deur jou IT-admin geblokkeer"</string>
<string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Hierdie inhoud kan nie met werkprogramme gedeel word nie"</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Hierdie inhoud kan nie met werkprogramme oopgemaak word nie"</string>
- <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Hierdie inhoud kan nie met persoonlike programme gedeel word nie"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Hierdie inhoud kan nie met persoonlike apps gedeel word nie"</string>
<string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Hierdie inhoud kan nie met persoonlike programme oopgemaak word nie"</string>
<string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Werkapps is onderbreek"</string>
<string name="resolver_switch_on_work" msgid="4527096360772311894">"Hervat"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Jou vingerafdrukke kan nie meer herken word nie. Stel Vingerafdrukslot weer op."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-toestel is ingeprop wanneer dit gesluit is"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-toestel is ingeprop wanneer jou Android gesluit is. Om die toestel te gebruik, moet jy eers jou Android ontsluit en dan weer die USB-toestel insit om dit te gebruik."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Verdagte USB-aktiwiteit"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-datasein is gedeaktiveer."</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 1ab3beb71858..c55f1c63bf04 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"ንቀል"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ንቀል"</string>
<string name="app_info" msgid="6113278084877079851">"የመተግበሪያ መረጃ"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"የቀጥታ ማጋራት ዒላማዎች"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"የመተግበሪያ አስተያየቶች"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"የመተግበሪያ ዝርዝር"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"ማሳያን በማስጀመር ላይ…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"መሣሪያን ዳግም በማስጀመር ላይ…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ከDpad በስተግራ"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ከDpad በስተቀኝ"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"የDpad ማዕከል"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"የራስ-ሰር ጠቅ ማድረግ ትየባ ቅንብሮች ፓነል"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"የግራ ጠቅታ"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ባለበት አቁም"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"አቀማመጥ"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ወደ የRESTRICTED ባልዲ ተከትቷል"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>፦"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"አንድ ምስል ልከዋል"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ካርታዎች"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"መተግበሪያዎች"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ከእንግዲህ የጣት አሻራዎችዎ ሊለዩ አይችሉም። በጣት አሻራ መክፈቻን እንደገና ያዋቅሩ።"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ሲቆለፍ የUSB መሣሪያ ተሰክቷል።"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android ሲቆለፍ የUSB መሣሪያ ተሰክቷል። መሣሪያ ለመጠቀም እባክዎ መጀመሪያ Androidን ይክፈቱ እና ከዚያም እሱን ለመጠቀም የUSB መሣሪያ እንደገና ያስገቡ።"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"አጠራጣሪ የUSB እንቅስቃሴ"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"የUSB የውሂብ ምልክት ተሰናክሏል።"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 637b08daa171..f542d439bf2e 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1468,7 +1468,7 @@
<string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"انقر لاختيار لغة وتنسيق"</string>
<string name="fast_scroll_alphabet" msgid="8854435958703888376">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
<string name="fast_scroll_numeric_alphabet" msgid="2529539945421557329">" 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
- <string name="alert_windows_notification_channel_group_name" msgid="6063891141815714246">"إظهار فوق التطبيقات الأخرى"</string>
+ <string name="alert_windows_notification_channel_group_name" msgid="6063891141815714246">"الظهور فوق التطبيقات الأخرى"</string>
<string name="alert_windows_notification_channel_name" msgid="3437528564303192620">"جارٍ عرض <xliff:g id="NAME">%s</xliff:g> فوق تطبيقات أخرى"</string>
<string name="alert_windows_notification_title" msgid="6331662751095228536">"يتم عرض <xliff:g id="NAME">%s</xliff:g> فوق التطبيقات الأخرى."</string>
<string name="alert_windows_notification_message" msgid="6538171456970725333">"إذا كنت لا تريد أن يستخدم <xliff:g id="NAME">%s</xliff:g> هذه الميزة، فانقر لفتح الإعدادات، ثم اختر إيقافها."</string>
@@ -2092,12 +2092,9 @@
<string name="unpin_target" msgid="3963318576590204447">"إزالة تثبيت"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"إزالة تثبيت <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"معلومات عن التطبيق"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"أهداف المشاركة المباشرة"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"التطبيقات المقترَحة"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"قائمة التطبيقات"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"جارٍ بدء العرض التوضيحي…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"جارٍ إعادة ضبط الجهاز…"</string>
@@ -2254,6 +2251,14 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"الزرّ المركزي"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"لوحة إعدادات نوع النقر التلقائي"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"النقر بالزر الأيسر"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
+ <skip />
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"إيقاف مؤقت"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"تعديل الموضع"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"تم وضع <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> في الحزمة \"محظورة\"."</string>
@@ -2530,12 +2535,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"‏خرائط Google"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"التطبيقات"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"لم يعد بالإمكان التعرّف على بصمات أصابعك. يجب ضبط ميزة \"فتح الجهاز ببصمة الإصبع\" مجددًا."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"‏تم توصيل جهاز USB عندما كان الجهاز مقفلاً"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"‏تم توصيل جهاز USB عندما كان جهاز Android مقفلاً. لاستخدام الجهاز، يُرجى فتح قفل جهاز Android أولاً ثم إعادة إدخال جهاز USB لاستخدامه."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"‏نشاط مريب في جهاز USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"‏تم إيقاف مؤشر بيانات USB."</string>
</resources>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 95d442bf43a4..b8afd2edc2e1 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"আনপিন"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ক আনপিন কৰক"</string>
<string name="app_info" msgid="6113278084877079851">"এপ্ সম্পৰ্কীয় তথ্য"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"পোনপটীয়াকৈ কৰা শ্বেয়াৰৰ লক্ষ্য"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"এপৰ পৰামৰ্শ"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"এপৰ সূচী"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"ডেম\' আৰম্ভ কৰি থকা হৈছে…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"ডিভাইচটো আকৌ ছেটিং কৰি থকা হৈছে…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ডিপেডৰ বাওঁফালৰ বুটাম"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ডিপেডৰ সোঁফালৰ বুটাম"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ডিপেডৰ মাজৰ বুটাম"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"প্ৰকাৰৰ ছেটিঙৰ পেনেলত স্বয়ংক্ৰিয়ভাৱে ক্লিক কৰক"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"বাওঁফালৰ ক্লিক"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"পজ কৰক"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"স্থান"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ক সীমাবদ্ধ বাকেটটোত ৰখা হৈছে"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"এখন প্ৰতিচ্ছবি পঠিয়াইছে"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"মেপ"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"এপ্লিকেশ্বন"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"আপোনাৰ ফিংগাৰপ্ৰিণ্ট আৰু চিনাক্ত কৰিব নোৱাৰি। ফিংগাৰপ্ৰিণ্ট আনলক পুনৰ ছেট আপ কৰক।"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"লক হৈ থাকোঁতে USB ডিভাইচ প্লাগ ইন কৰা হৈছে"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android লক হৈ থাকোঁতে USB ডিভাইচ প্লাগ ইন কৰা হৈছে। ডিভাইচ ব্যৱহাৰ কৰিবলৈ অনুগ্ৰহ কৰি প্ৰথমে Android আনলক কৰক আৰু তাৰ পাছত USB ডিভাইচটো ব্যৱহাৰ কৰিবলৈ সেইটো পুনৰ ভৰাওক।"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"সন্দেহজনক USBৰ কাৰ্যকলাপ"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ডেটা ছিগনেল অক্ষম কৰা হৈছে।"</string>
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 4f7da4f74a71..affa56954001 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Çıxarın"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"İşarələməyin: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Tətbiq haqqında"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Birbaşa paylaşım hədəfləri"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Tətbiq təklifləri"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Tətbiq siyahısı"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Demo başlayır…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Cihaz sıfırlanır…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Sola"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Sağa"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Mərkəzə"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Avtomatik klikləmə növü üzrə ayarlar paneli"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Sola klik"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Durdurun"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Mövqe"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> MƏHDUDLAŞDIRILMIŞ səbətinə yerləşdirilib"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"şəkil göndərdi"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Xəritə"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Tətbiqlər"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Barmaq izlərinizi artıq tanımaq mümkün deyil. Barmaqla Kilidaçmanı yenidən ayarlayın."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Kilidli olduqda USB cihazı qoşulu olur"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android kilidləndikdə USB cihazı qoşulu olur. Cihazdan istifadə etmək üçün əvvəlcə Android-i kiliddən çıxarın və sonra USB cihazını yenidən taxaraq ondan istifadə edin."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Şübhəli USB fəaliyyəti"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB data siqnalı deaktiv edilib."</string>
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 049359b85a1e..3acc8df73a83 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Otkači"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Otkači aplikaciju <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Informacije o aplikaciji"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Ciljevi direktnog deljenja"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Predlozi aplikacija"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista aplikacija"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Pokrećemo demonstraciju..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Resetujemo uređaj..."</string>
@@ -2251,6 +2248,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"centar na D-pad-u"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Okno sa podešavanjima tipa automatskog klika"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Levi klik"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Kliknite desnim tasterom"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dvaput kliknite"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Prevucite"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Skrolujte"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauziraj"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicija"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je dodat u segment OGRANIČENO"</string>
@@ -2527,12 +2528,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mape"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Otisci prstiju više ne mogu da se prepoznaju. Ponovo podesite otključavanje otiskom prsta."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB uređaj je priključen kada je Android zaključan"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB uređaj je priključen kada je Android zaključan. Da biste koristili uređaj, prvo otključajte Android, pa ponovo ubacite USB uređaj da biste ga koristili."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Sumnjiva USB aktivnost"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Signal za prenos podataka sa USB-a je onemogućen."</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 02cc889e9ecc..7c827bbecaab 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -2090,12 +2090,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Адмацаваць"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Адмацаваць праграму \"<xliff:g id="LABEL">%1$s</xliff:g>\""</string>
<string name="app_info" msgid="6113278084877079851">"Звесткі аб праграме"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Адрасаты для прамога абагульвання"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Прапановы праграм"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Спіс праграм"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Ідзе запуск дэманстрацыі…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Ідзе скід налад прылады…"</string>
@@ -2250,14 +2247,14 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Улева на панэлі кіравання"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Управа на панэлі кіравання"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"У цэнтр на панэлі кіравання"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
- <skip />
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Панэль налад тыпу аўтаматычнага націскання"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Націсканне левай клавішай мышы"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Націсканне правай кнопкай мышы"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Двайное націсканне"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Перацягванне"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Гартанне"</string>
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Прыпыніць"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Пазіцыя"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" дададзены ў АБМЕЖАВАНУЮ групу"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"адпраўлены відарыс"</string>
@@ -2532,12 +2529,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карты"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Праграмы"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Вашы адбіткі пальцаў больш не распазнаюцца. Паўторна наладзьце разблакіроўку адбіткам пальца."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-прылада падключана, калі прылада заблакіравана"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-прылада падключана, калі прылада Android заблакіравана. Каб выкарыстоўваць прыладу, разблакіруйце прыладу Android і паўторна ўстаўце USB-прыладу."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Падазроная актыўнасць на USB-прыладзе"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Сігнал даных USB адключаны."</string>
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index d85e319edaaa..c3a271267a36 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Освобождаване"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Премахване на фиксирането на <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Информация за приложението"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Цели за директно споделяне"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Предложения за приложения"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Списък с приложения"</string>
<string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Демонстрацията се стартира…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Устройството се нулира…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Контролен пад – ляво"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Контролен пад – дясно"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Контролен пад – център"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Панел с настройки за типа на автоматичното кликване"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Кликване с ляв бутон"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Пауза"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Позиция"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакетът <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е поставен в ОГРАНИЧЕНИЯ контейнер"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"изпратено изображение"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карти"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Приложения"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Отпечатъците ви вече не могат да бъдат разпознати. Настройте отново „Отключване с отпечатък“."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB устройството е свързано, когато устройството е заключено"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB устройството е включено, когато устройството с Android е заключено. За да използвате устройството, първо отключете Android и след това поставете отново USB устройството."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Подозрителна активност на USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Сигналът за данни през USB е деактивиран."</string>
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 19d4962175b1..f6492c5b9ef3 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"আনপিন করুন"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> অ্যাপ আনপিন করুন"</string>
<string name="app_info" msgid="6113278084877079851">"অ্যাপের তথ্য"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"সরাসরি টার্গেট শেয়ার করুন"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"অ্যাপ সাজেশন"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"অ্যাপ তালিকা"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"ডেমো শুরু করা হচ্ছে…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"ডিভাইস আবার সেট করা হচ্ছে…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ডিপ্যাড (Dpad)-এর বাঁদিকে"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ডিপ্যাড (Dpad)-এর ডানদিকে"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ডিপ্যাড (Dpad)-এর মাঝখানে"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"অটোক্লিক টাইপ সেটিংস প্যানেল"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"বাঁদিকের বোতামে ক্লিক করুন"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"পজ করুন"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"পজিশন"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> সীমাবদ্ধ গ্রুপে অন্তর্ভুক্ত করা হয়েছে"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"একটি ছবি পাঠানো হয়েছে"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ম্যাপ"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"অ্যাপ্লিকেশন"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"আপনার ফিঙ্গারপ্রিন্ট আর শনাক্ত করা যাবে না। \'ফিঙ্গারপ্রিন্ট আনলক\' ফিচার আবার সেট-আপ করুন।"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"লক থাকাকালীন USB ডিভাইস প্লাগ-ইন করা হয়েছে"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android লক থাকাকালীন USB ডিভাইস প্লাগ-ইন করা হয়েছে। ডিভাইস ব্যবহার করতে, প্রথমে Android আনলক করুন এবং তারপর সেটি ব্যবহার করতে USB ডিভাইস আবার যোগ করুন।"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"সন্দেহজনক USB অ্যাক্টিভিটি"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ডেটা সিগন্যাল বন্ধ করা হয়েছে।"</string>
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index e95bedf3dcd3..3ff85acf48a0 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Otkači"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Otkači aplikaciju <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Informacije o aplikaciji"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Ciljevi direktnog dijeljenja"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Prijedlozi aplikacija"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista aplikacija"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Pokretanje demonstracije…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Vraćanje uređaja na početne postavke…"</string>
@@ -2251,8 +2248,12 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Upravljač sredina"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Ploča postavki vrste automatskog klika"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Lijevi klik"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Desni klik"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dvostruki klik"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Povuci"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Pomakni se"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauziraj"</string>
- <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicija"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Položaj"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je stavljen u odjeljak OGRANIČENO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"je poslao/la sliku"</string>
@@ -2266,7 +2267,7 @@
<string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Blokirao je vaš IT administrator"</string>
<string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Ovaj sadržaj nije moguće dijeliti pomoću poslovnih aplikacija"</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Ovaj sadržaj nije moguće otvoriti pomoću poslovnih aplikacija"</string>
- <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Ovaj sadržaj nije moguće dijeliti pomoću ličnih aplikacija"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Ovaj sadržaj nije moguće dijeliti s ličnim aplikacijama"</string>
<string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Ovaj sadržaj nije moguće otvoriti pomoću ličnih aplikacija"</string>
<string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Poslovne aplikacije su pauzirane"</string>
<string name="resolver_switch_on_work" msgid="4527096360772311894">"Ponovo pokreni"</string>
@@ -2527,12 +2528,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mape"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaši otisci prstiju se više ne mogu prepoznavati. Ponovo postavite otključavanje otiskom prsta."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB uređaj je priključen dok je uređaj bio zaključan"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB uređaj je priključen dok je Android bio zaključan. Da koristite uređaj, prvo otključajte Android, a zatim ponovo umetnite USB uređaj da ga koristite."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Sumnjiva aktivnost USB-a"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Podatkovni signal USB-a je onemogućen."</string>
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 9b67f28bbfb2..9b61887da0bd 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"No fixis"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"No fixis <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Informació de l\'app"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Destinataris de la compartició directa"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Suggeriments d\'aplicacions"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Llista d\'aplicacions"</string>
<string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"S\'està iniciant la demostració…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"S\'està restablint el dispositiu…"</string>
@@ -2249,14 +2246,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Creu direccional: esquerra"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Creu direccional: dreta"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Creu direccional: centre"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Tauler de configuració del tipus de clic automàtic"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic esquerre"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Posa en pausa"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posició"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> s\'ha transferit al segment RESTRINGIT"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha enviat una imatge"</string>
@@ -2531,12 +2532,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicacions"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Les teves empremtes digitals ja no es poden reconèixer. Torna a configurar Desbloqueig amb empremta digital."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"S\'ha connectat un dispositiu USB quan el dispositiu estava bloquejat"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"El dispositiu USB està connectat quan Android està bloquejat. Per utilitzar el dispositiu, primer desbloqueja Android i, a continuació, torna a inserir el dispositiu USB per utilitzar-lo."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Activitat USB sospitosa"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"El senyal de dades per USB s\'ha desactivat."</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index f4eef972c0d1..9c8cc9a17878 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -2252,6 +2252,14 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad střed"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel nastavení typu automatického kliknutí"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Kliknutí levým"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
+ <skip />
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pozastavit"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozice"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balíček <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> byl vložen do sekce OMEZENO"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index bcdb691eaf86..1b96dbbe07f7 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Frigør"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Frigør <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Appinfo"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Personer/grupper, der skal deles direkte med"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Appforslag"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Appliste"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Starter demoen…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Nulstiller enheden…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad, venstre"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad, højre"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad, midten"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel med indstillinger for type af automatisk klik"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Venstreklik"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Sæt på pause"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Placering"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blevet placeret i samlingen BEGRÆNSET"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sendte et billede"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Kort"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Dine fingeraftryk kan ikke længere genkendes. Konfigurer fingeroplåsning igen."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-enheden er tilsluttet, når Android er låst"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-enheden er tilsluttet, når Android er låst. Hvis du vil bruge enheden, skal du først låse Android op og derefter tilslutte USB-enheden."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Mistænkelig USB-aktivitet"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-datasignalet er blevet deaktiveret."</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 4191512fd018..73e7b9a9c0c8 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -2042,7 +2042,7 @@
<string name="app_suspended_title" msgid="888873445010322650">"App nicht verfügbar"</string>
<string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ist momentan nicht verfügbar. Dies wird über die App \"<xliff:g id="APP_NAME_1">%2$s</xliff:g>\" verwaltet."</string>
<string name="app_suspended_more_details" msgid="211260942831587014">"Weitere Informationen"</string>
- <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"App-Pausierung aufheben"</string>
+ <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Pausierung der App aufheben"</string>
<string name="work_mode_off_title" msgid="6367463960165135829">"Geschäftliche Apps nicht mehr pausieren?"</string>
<string name="work_mode_turn_on" msgid="5316648862401307800">"Nicht mehr pausieren"</string>
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Notruf"</string>
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Markierung entfernen"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> loslösen"</string>
<string name="app_info" msgid="6113278084877079851">"App-Informationen"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"„Direct Share“-Ziele"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App-Vorschläge"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App-Liste"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Demo wird gestartet…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Gerät wird zurückgesetzt…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Steuerkreuz nach links"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Steuerkreuz nach rechts"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Steuerkreuz Mitte"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Bereich mit Einstellungen für automatische Klicks"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Linksklick"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausieren"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> wurde in den BESCHRÄNKT-Bucket gelegt"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"hat ein Bild gesendet"</string>
@@ -2267,9 +2268,9 @@
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Private Ansicht"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Geschäftliche Ansicht"</string>
<string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Von deinem IT-Administrator blockiert"</string>
- <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Diese Art von Inhalt kann nicht über geschäftliche Apps geteilt werden"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Dieser Inhalt kann nicht über geschäftliche Apps geteilt werden"</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Diese Art von Inhalt kann nicht mit geschäftlichen Apps geöffnet werden"</string>
- <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Diese Art von Inhalt kann nicht über private Apps geteilt werden"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Dieser Inhalt kann nicht über private Apps geteilt werden"</string>
<string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Diese Art von Inhalt kann nicht mit privaten Apps geöffnet werden"</string>
<string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Geschäftliche Apps sind pausiert"</string>
<string name="resolver_switch_on_work" msgid="4527096360772311894">"Nicht mehr pausieren"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Anwendungen"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Deine Fingerabdrücke können nicht mehr erkannt werden. Bitte richte die Entsperrung per Fingerabdruck neu ein."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-Gerät wurde angeschlossen, als das Android-Gerät gesperrt war"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Das USB-Gerät wurde angeschlossen, als das Android-Gerät gesperrt war. Du musst erst das Android-Gerät entsperren und dann das USB-Gerät noch einmal anschließen, damit du es verwenden kannst."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Verdächtige USB-Aktivitäten"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-Datensignal wurde deaktiviert."</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 332fb1b47585..25a787c5d06b 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Ξεκαρφίτσωμα"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Ξεκαρφίτσωμα <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Πληροφορίες εφαρμογής"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Στοχευόμενοι χρήστες για Άμεση κοινή χρήση"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Προτεινόμενες εφαρμογές"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Λίστα εφαρμογών"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Έναρξη επίδειξης…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Επαναφορά συσκευής…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad αριστερά"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad δεξιά"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad κέντρο"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Πλαίσιο ρυθμίσεων τύπου αυτόματου κλικ"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Αριστερό κλικ"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Παύση"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Θέση"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Το πακέτο <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> τοποθετήθηκε στον κάδο ΠΕΡΙΟΡΙΣΜΕΝΗΣ ΠΡΟΣΒΑΣΗΣ."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"έστειλε μια εικόνα"</string>
@@ -2269,7 +2270,7 @@
<string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Αποκλείστηκε από τον διαχειριστή IT"</string>
<string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Δεν είναι δυνατή η κοινοποίηση αυτού του περιεχομένου με εφαρμογές εργασιών"</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Δεν είναι δυνατό το άνοιγμα αυτού του περιεχομένου με εφαρμογές εργασιών"</string>
- <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Δεν είναι δυνατή η κοινοποίηση αυτού του περιεχομένου με προσωπικές εφαρμογές"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Δεν είναι δυνατή η κοινοποίηση αυτού του περιεχομένου σε προσωπικές εφαρμογές"</string>
<string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Δεν είναι δυνατό το άνοιγμα αυτού του περιεχομένου με προσωπικές εφαρμογές"</string>
<string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Οι εφαρμογές εργασιών τέθηκαν σε παύση"</string>
<string name="resolver_switch_on_work" msgid="4527096360772311894">"Αναίρεση παύσης"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Χάρτες"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Εφαρμογές"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Δεν είναι δυνατή πλέον η αναγνώριση των δακτυλικών αποτυπωμάτων σας. Ρυθμίστε ξανά τη λειτουργία Ξεκλείδωμα με δακτυλικό αποτύπωμα."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Σύνδεση συσκευής USB σε κατάσταση κλειδώματος"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Η συσκευή USB είναι συνδεδεμένη, όταν το Android είναι κλειδωμένο. Για να χρησιμοποιήσετε τη συσκευή, ξεκλειδώστε πρώτα το Android και, στη συνέχεια, επανατοποθετήστε τη συσκευή USB για να τη χρησιμοποιήσετε."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Ύποπτη δραστηριότητα USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Το σήμα δεδομένων USB έχει απενεργοποιηθεί."</string>
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 74feb323b4dc..886befff643f 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Unpin"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"App info"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direct share targets"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App suggestions"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App list"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Autoclick type settings panel"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Left-click"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognised. Set up Fingerprint Unlock again."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB device plugged in when locked"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB device is plugged in when Android is locked. To use the device, please unlock Android first and then reinsert the USB device to use it."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Suspicious USB activity"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB data signal has been disabled."</string>
</resources>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 9b7764ef0475..33bbc6faba3f 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Unpin"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"App info"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direct share targets"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App suggestions"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App list"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string>
@@ -2250,6 +2247,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Center"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Autoclick type settings panel"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Left click"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Right click"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Double click"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Drag"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Scroll"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
@@ -2526,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognized. Set up Fingerprint Unlock again."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB device plugged in when locked"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB device is plugged in when Android is locked. To use device, please unlock Android first and then reinsert USB device to use it."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Suspicious USB activity"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB data signal has been disabled."</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 51148ae3be1d..f0a9c2a27ddc 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Unpin"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"App info"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direct share targets"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App suggestions"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App list"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Autoclick type settings panel"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Left-click"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognised. Set up Fingerprint Unlock again."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB device plugged in when locked"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB device is plugged in when Android is locked. To use the device, please unlock Android first and then reinsert the USB device to use it."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Suspicious USB activity"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB data signal has been disabled."</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 0b9bb83b6a4a..8fcb412154cc 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Unpin"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"App info"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direct share targets"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App suggestions"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App list"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Autoclick type settings panel"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Left-click"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognised. Set up Fingerprint Unlock again."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB device plugged in when locked"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB device is plugged in when Android is locked. To use the device, please unlock Android first and then reinsert the USB device to use it."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Suspicious USB activity"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB data signal has been disabled."</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 07c66ead87df..f46a4d4abb40 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Dejar de fijar"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Dejar de fijar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Información de apps"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Objetivos de uso compartido directo"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugerencias de aplicaciones"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de apps"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demostración…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Restableciendo dispositivo…"</string>
@@ -2251,6 +2248,14 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pad direccional: centro"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel de configuración del tipo de clic automático"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic izquierdo"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
+ <skip />
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posición"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Se colocó <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> en el bucket RESTRICTED"</string>
@@ -2527,12 +2532,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicaciones"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Ya no se pueden reconocer tus huellas dactilares. Vuelve a configurar el Desbloqueo con huellas dactilares."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispositivo USB conectado cuando el dispositivo está bloqueado"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"El dispositivo USB está conectado cuando Android está bloqueado. Para usar el dispositivo, primero desbloquea Android y, luego, vuelve a insertar el dispositivo USB."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Actividad de USB sospechosa"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Se inhabilitó la señal de datos por USB."</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index f035d5bbceaf..d5948972ec9c 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"No fijar"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"No fijar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Información de la app"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Objetivos de compartición directa"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugerencias de aplicaciones"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de aplicaciones"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demostración…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Restableciendo dispositivo…"</string>
@@ -2249,14 +2246,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Cruceta: izquierda"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Cruceta: derecha"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Cruceta: centro"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel de ajustes del tipo de clic automático"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic izquierdo"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posición"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> se ha incluido en el grupo de restringidos"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha enviado una imagen"</string>
@@ -2531,12 +2532,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicaciones"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Tus huellas digitales ya no pueden reconocerse. Vuelve a configurar Desbloqueo con huella digital."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispositivo USB conectado con el dispositivo bloqueado"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"El dispositivo USB está conectado cuando Android está bloqueado. Para usar el dispositivo, desbloquea Android primero y, a continuación, vuelve a insertar el dispositivo USB para usarlo."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Actividad USB sospechosa"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"La señal de datos USB se ha inhabilitado."</string>
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 1e299a609bd2..5e961f4fcae8 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -318,7 +318,7 @@
<string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Aku ja andmekasutuse üksikasjade nägemiseks puudutage"</string>
<string name="foreground_service_multiple_separator" msgid="5002287361849863168">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="8974401416068943888">"Turvarežiim"</string>
- <string name="android_system_label" msgid="5974767339591067210">"Android-süsteem"</string>
+ <string name="android_system_label" msgid="5974767339591067210">"Androidi süsteem"</string>
<string name="user_owner_label" msgid="8628726904184471211">"Lülitu isiklikule profiilile"</string>
<string name="managed_profile_label" msgid="7316778766973512382">"Lülitu tööprofiilile"</string>
<string name="user_owner_app_label" msgid="1553595155465750298">"Lülita <xliff:g id="APP_NAME">%1$s</xliff:g> isiklikule profiilile"</string>
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Vabasta"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Vabasta <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Rakenduse teave"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Otsejagamise sihtmärgid"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Rakenduste soovitused"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Rakenduste loend"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Demo käivitamine …"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Seadme lähtestamine …"</string>
@@ -2250,6 +2247,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Suunaklahvistiku keskmine nupp"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automaatkliki tüübi seadete paneel"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Vasakklikk"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Paremklikk"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Topeltklikk"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Lohista"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Keri"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Peata"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Asukoht"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on lisatud salve PIIRANGUTEGA"</string>
@@ -2526,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Rakendused"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Teie sõrmejälgi ei saa enam tuvastada. Seadistage sõrmejäljega avamine uuesti."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-seade ühendati, kui seade oli lukus"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-seade ühendati, kui Android oli lukustatud. Seadme kasutamiseks avage esmalt Android ja ühendage siis USB-seade uuesti, et seda kasutada."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Kahtlane tegevus USB-ga"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB andmesignaal on keelatud."</string>
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 177449ccb494..0e450d1a0a4e 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Kendu aingura"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Kendu aingura <xliff:g id="LABEL">%1$s</xliff:g> aplikazioari"</string>
<string name="app_info" msgid="6113278084877079851">"Aplikazioari buruzko informazioa"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Partekatze zuzenen helburuak"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Aplikazioen iradokizunak"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Aplikazioen zerrenda"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Demoa abiarazten…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Gailua berrezartzen…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Norabide-kontrolagailuko ezkerreko botoia"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Norabide-kontrolagailuko eskuineko botoia"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Norabide-kontrolagailuko erdiko botoia"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automatikoki klik egiteko eginbide motaren ezarpenen panela"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Egin klik ezkerreko botoiarekin"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausatu"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Ezarri posizioan"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Murriztuen edukiontzian ezarri da <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"erabiltzaileak irudi bat bidali du"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikazioak"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Zure hatz-markak ez dira ezagutzen jada. Konfiguratu berriro hatz-marka bidez desblokeatzeko eginbidea."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB bidezko gailua blokeatuta zegoen bitartean entxufatu da"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB bidezko gailua entxufatuta dago Android blokeatuta dagoenean. Gailua erabiltzeko, desblokeatu Android eta entxufatu berriro USB bidezko gailua hura erabiltzeko."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"USB bidezko jarduera susmagarriak"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB bidezko datu-seinalea desgaitu da."</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index e0a8c1b67cb5..4334713515d9 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"برداشتن سنجاق"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"برداشتن سنجاق <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"اطلاعات برنامه"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"هدف‌های هم‌رسانی مستقیم"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"پیشنهادهای برنامه"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"فهرست برنامه"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"در حال شروع نسخه نمایشی…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"در حال بازنشانی دستگاه…"</string>
@@ -2248,14 +2245,14 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"پد کنترل چپ"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"پد کنترل راست"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"پد کنترل وسط"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
- <skip />
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"پانل تنظیمات نوع کلیک خودکار"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"کلیک چپ"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"کلیک راست"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"دوکلیک کردن"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"کشیدن"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"پیمایش"</string>
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"توقف موقت"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"موقعیت"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> در سطل «محدودشده» قرار گرفت"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"تصویری ارسال کرد"</string>
@@ -2530,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"نقشه"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"برنامه‌ها"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"اثر انگشتانتان دیگر قابل‌شناسایی نیست. «قفل‌گشایی با اثر انگشت» را دوباره راه‌اندازی کنید."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"‏دستگاه USB هنگام قفل بودن وصل شده است"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"‏دستگاه USB هنگام قفل بودن Android متصل شده است. برای استفاده از دستگاه، لطفاً ابتدا قفل Android را باز کنید و سپس دستگاه USB را دوباره وارد کنید."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"‏فعالیت مشکوک USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"‏نشانِ داده USB غیرفعال شده است."</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 1b53196c9808..5e3913e86d8b 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Irrota"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Irrota <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Sovellustiedot"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Suorajaon vastaanottajat"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sovellusehdotukset"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Sovelluslista"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Aloitetaan esittelyä…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Palautetaan asetuksia…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Suuntanäppäimistö: vasen painike"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Suuntanäppäimistö: oikea painike"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Suuntanäppäimistö: keskipainike"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automaattisen klikkaustyypin asetuspaneeli"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Ykköspainike"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Keskeytä"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Sijainti"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on nyt rajoitettujen ryhmässä"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"lähetti kuvan"</string>
@@ -2484,7 +2485,7 @@
<string name="satellite_manual_selection_state_popup_cancel" msgid="973605633339469252">"Takaisin"</string>
<string name="unarchival_session_app_label" msgid="6811856981546348205">"Odottaa…"</string>
<string name="satellite_sos_available_notification_title" msgid="5396708154268096124">"Satellite SOS on nyt käytettävissä"</string>
- <string name="satellite_sos_available_notification_summary" msgid="1727088812951848330">"Voit lähettää viestin hätäkeskukseen, jos sinulla ei ole mobiili‑ tai Wi-Fi-verkkoyhteyttä. Google Messages täytyy valita oletusviestisovellukseksi."</string>
+ <string name="satellite_sos_available_notification_summary" msgid="1727088812951848330">"Voit lähettää viestin hätäkeskukseen, jos sinulla ei ole mobiili‑ tai Wi-Fi-verkkoyhteyttä. Google Messagesin on oltava oletustekstiviestisovelluksesi."</string>
<string name="satellite_sos_not_supported_notification_title" msgid="2659100983227637285">"Satellite SOS ei tueta"</string>
<string name="satellite_sos_not_supported_notification_summary" msgid="1071762454665310549">"Satellite SOS ei tueta tällä laitteella"</string>
<string name="satellite_sos_not_provisioned_notification_title" msgid="8564738683795406715">"Satellite SOS ei ole otettu käyttöön"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Sovellukset"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Sormenjälkiäsi ei voi enää tunnistaa. Ota sormenjälkiavaus uudelleen käyttöön."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-laite kytkettynä, kun lukitus on päällä"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-laite on kytkettynä, kun Android on lukittu. Jos haluat käyttää laitetta, avaa ensin Androidin lukitus ja kytke USB-laite uudelleen."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Epäilyttävää USB-toimintaa"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-datasignaali on poistettu käytöstä."</string>
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index d742d87f7ed7..6ef3e21c6a63 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Annuler l\'épinglage"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Annuler l\'épinglage de <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Détails de l\'appli"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Cibles du partage direct"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Applis suggérées"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Liste d\'applis"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Démarrage de la démonstration en cours…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Réinitialisation de l\'appareil en cours…"</string>
@@ -2249,14 +2246,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Pavé directionnel – gauche"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Pavé directionnel – droite"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pavé directionnel – centre"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panneau de configuration des paramètres de type clic automatique"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic gauche"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le compartiment RESTREINT"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a envoyé une image"</string>
@@ -2531,12 +2532,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vos empreintes digitales ne peuvent plus être reconnues. Reconfigurez le Déverrouillage par empreinte digitale."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"L\'appareil USB est branché quand Android est verrouillé"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"L\'appareil USB est branché quand Android est verrouillé. Pour utiliser l\'appareil, veuillez d\'abord déverrouiller Android, puis réinsérer l\'appareil USB."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Activité USB suspecte"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Le signal de données USB a été désactivé."</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index f0727d69c325..4fd8601a1d8a 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Retirer"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Retirer <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Infos sur l\'appli"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Cibles de partage direct"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Suggestions d\'applications"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Liste des applications"</string>
<string name="negative_duration" msgid="1938335096972945232">"− <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Lancement de la démo…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Réinitialisation…"</string>
@@ -2249,14 +2246,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Pavé directionnel - Gauche"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Pavé directionnel - Droite"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pavé directionnel - Centre"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panneau des paramètres du type de clic automatique"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic gauche"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le bucket RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a envoyé une image"</string>
@@ -2531,12 +2532,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vos empreintes ne peuvent plus être reconnues. Reconfigurez le déverrouillage par empreinte digitale."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Appareil USB branché alors que l\'appareil Android est verrouillé"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"L\'appareil USB est branché alors que l\'appareil Android est verrouillé. Pour utiliser l\'appareil, veuillez d\'abord déverrouiller Android, puis brancher à nouveau l\'appareil USB."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Activité USB suspecte"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Le signal de données USB a été désactivé."</string>
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index bb41a4f5fd3d..4ce3fc33b7e9 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Deixar de fixar"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Deixar de fixar a <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Información da app"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Destinatarios da función de compartir directamente"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Suxestións de aplicacións"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de aplicacións"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demostración…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Restablecendo dispositivo…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Cruceta: esquerda"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Cruceta: dereita"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Cruceta: centro"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel de configuración do tipo de clic automático"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic co botón esquerdo do rato"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausa"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posición"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> incluíuse no grupo RESTRINXIDO"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviouse unha imaxe"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapas"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicacións"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Xa non se recoñecen as túas impresións dixitais. Configura de novo o desbloqueo dactilar."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispositivo USB conectado cando Android está bloqueado"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"O dispositivo USB está conectado cando Android está bloqueado. Para usalo, primeiro desbloquea Android e despois volve inserir o dispositivo USB."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Actividade USB sospeitosa"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Desactivouse o indicador de datos USB."</string>
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index ff32df0b26fe..fcba3feb7819 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"અનપિન કરો"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ને અનપિન કરો"</string>
<string name="app_info" msgid="6113278084877079851">"ઍપની માહિતી"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"સીધા શેર કરવાના લક્ષ્યો"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ઍપના સૂચનો"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ઍપની સૂચિ"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"ડેમો પ્રારંભ કરી રહ્યાં છે…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"ઉપકરણ ફરીથી સેટ કરી રહ્યાં છે…"</string>
@@ -2248,14 +2245,14 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ડી-પૅડ ડાબે"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ડી-પૅડ જમણે"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ડી-પૅડ મધ્યમાં"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
- <skip />
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ઑટોક્લિક પ્રકારના સેટિંગની પૅનલ"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ડાબું ક્લિક કરો"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"રાઇટ ક્લિક કરો"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"બે વાર ક્લિક કરો"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ખેંચો"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"સ્ક્રોલ કરો"</string>
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"થોભાવો"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"સ્થિતિ"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ને પ્રતિબંધિત સમૂહમાં મૂકવામાં આવ્યું છે"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"છબી મોકલી"</string>
@@ -2530,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ઍપ્લિકેશનો"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"તમારી ફિંગરપ્રિન્ટને હવેથી ઓળખી શકાશે નહીં. ફિંગરપ્રિન્ટ અનલૉક સુવિધાનું ફરી સેટઅપ કરો."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"લૉક કરેલું હોય ત્યારે USB ડિવાઇસ પ્લગ-ઇન હોય છે"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android લૉક હોય ત્યારે USB ડિવાઇસ પ્લગ-ઇન હોય છે. ડિવાઇસનો ઉપયોગ કરવા માટે, કૃપા કરીને પહેલા Android અનલૉક કરો અને પછી USB ડિવાઇસનો ઉપયોગ કરવા માટે તેને ફરી શામેલ કરો."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"શંકાસ્પદ USB ઍક્ટિવિટી"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ડેટા સિગ્નલ બંધ કરવામાં આવ્યું છે."</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 393316b2386e..66f0ced39df6 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -329,7 +329,7 @@
<string name="permgroupdesc_location" msgid="1995955142118450685">"इस डिवाइस की जगह तक पहुंचने दें"</string>
<string name="permgrouplab_calendar" msgid="6426860926123033230">"कैलेंडर"</string>
<string name="permgroupdesc_calendar" msgid="6762751063361489379">"आपके कैलेंडर को ऐक्सेस करने की अनुमति"</string>
- <string name="permgrouplab_sms" msgid="795737735126084874">"मैसेज (एसएमएस)"</string>
+ <string name="permgrouplab_sms" msgid="795737735126084874">"एसएमएस"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"मैसेज (एसएमएस) भेजें और देखें"</string>
<string name="permgrouplab_storage" msgid="17339216290379241">"फ़ाइल"</string>
<string name="permgroupdesc_storage" msgid="5378659041354582769">"अपने डिवाइस में मौजूद फ़ाइलों का ऐक्सेस दें"</string>
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"अनपिन करें"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> को अनपिन करें"</string>
<string name="app_info" msgid="6113278084877079851">"ऐप्लिकेशन की जानकारी"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"सीधे तौर पर कॉन्टेंट शेयर करने के लिए चुने गए लोग या ग्रुप"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"सुझाए गए ऐप्लिकेशन"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ऐप्लिकेशन की सूची"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"डेमो प्रारंभ हो रहा है…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"डिवाइस फिर से रीसेट कर रहा है…"</string>
@@ -2248,14 +2245,14 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"डी-पैड का बाईं ओर वाला बटन"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"डी-पैड का दाईं ओर वाला बटन"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"डी-पैड का बीच वाला बटन"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
- <skip />
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"अपने-आप क्लिक होने की सुविधा वाली सेटिंग का पैनल"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"लेफ़्ट क्लिक करें"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"राइट क्लिक करें"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"दो बार क्लिक करें"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"खींचें और छोड़ें"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"स्क्रोल करें"</string>
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"रोकें"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"पोज़िशन"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> को प्रतिबंधित बकेट में रखा गया है"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"एक इमेज भेजी गई"</string>
@@ -2530,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"मैप"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ऐप्लिकेशन"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"अब आपके फ़िंगरप्रिंट की पहचान नहीं की जा सकती. फ़िंगरप्रिंट अनलॉक की सुविधा को दोबारा सेट अप करें."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"यूएसबी डिवाइस को, Android डिवाइस के लॉक होने के दौरान प्लग इन किया गया"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"यूएसबी डिवाइस को, Android डिवाइस के लॉक होने के दौरान प्लग इन किया गया. यूएसबी डिवाइस का इस्तेमाल करने के लिए, कृपया पहले Android डिवाइस को अनलॉक करें. इसके बाद, यूएसबी को फिर से इंसर्ट करें."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"यूएसबी से कोई संदिग्ध गतिविधि की गई"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"यूएसबी से डेटा सिग्नल भेजने की प्रोसेस बंद कर दी गई है."</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index cc4d29689743..aadf1185883b 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Otkvači"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Otkvači sudionika <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Informacije o aplikaciji"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Osoba/skupina za izravno dijeljenje"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Prijedlozi aplikacija"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Popis aplikacija"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Pokretanje demo-načina..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Vraćanje uređaja na zadano…"</string>
@@ -2251,6 +2248,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"U središtu plohe za smjerove"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Ploča postavki vrste automatskog klika"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Lijevi klik"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Desni klik"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dvostruki klik"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Povuci"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Pomakni se"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauziraj"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicija"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> premješten je u spremnik OGRANIČENO"</string>
@@ -2527,12 +2528,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Karte"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaši se otisci prstiju više ne prepoznaju. Ponovo postavite otključavanje otiskom prsta."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB uređaj priključen je kada je zaključan"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB uređaj priključen je kad je Android zaključan. Da biste upotrebljavali uređaj, najprije otključajte Android, a zatim ponovno umetnite USB uređaj da biste ga upotrebljavali."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Sumnjiva aktivnost USB-a"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB podatkovni signal je onemogućen."</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index ddfef1aae499..39a4cfcbe0c7 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Feloldás"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> rögzítésének feloldása"</string>
<string name="app_info" msgid="6113278084877079851">"Alkalmazásinfó"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Közvetlen megosztási lehetőségek"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Alkalmazásjavaslatok"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Alkalmazáslista"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Bemutató indítása…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Eszköz visszaállítása…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad – balra"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad – jobbra"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad – középre"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automatikus kattintás típusának beállításai panel"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Kattintás bal egérgombbal"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Szüneteltetés"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozíció"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"A következő csomag a KORLÁTOZOTT csoportba került: <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"képet küldött"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Térkép"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Alkalmazások"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Az ujjlenyomata már nem ismerhető fel. Állítsa be újra a Feloldás ujjlenyomattal funkciót."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-eszköz zárolt állapotban csatlakoztatva"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Az USB-eszköz csatlakoztatása az Android rendszer zárolt állapotában történt. Az eszköz használatához először oldja fel az Android zárolását, majd helyezze be újra az USB-eszközt."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Gyanús USB-tevékenység"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Az USB-adatjel le lett tiltva."</string>
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 92633245988e..f4b83f2a6540 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -2248,14 +2248,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad-ի «Ձախ» կոճակ"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad-ի «Աջ» կոճակ"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad-ի «Կենտրոն» կոճակ"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Ավտոմատ սեղմման տեսակի կարգավորումների վահանակ"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Ձախ սեղմում"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Դադարեցնել"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Դիրքը"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> փաթեթը գցվեց ՍԱՀՄԱՆԱՓԱԿՎԱԾ զամբյուղի մեջ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>՝"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"օգտատերը պատկեր է ուղարկել"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 86f711483ed1..ce9a7f6c6bea 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Lepas pin"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Lepas sematan <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Info aplikasi"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Target berbagi langsung"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Saran aplikasi"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Daftar aplikasi"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Memulai demo..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Mereset perangkat..."</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Kiri"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Kanan"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Tengah"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel setelan jenis klik otomatis"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Klik kiri"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Jeda"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posisi"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah dimasukkan ke dalam bucket DIBATASI"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"mengirim gambar"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikasi"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Sidik jari Anda tidak dapat dikenali lagi. Siapkan Buka dengan Sidik Jari lagi."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Perangkat USB dicolokkan saat terkunci"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Perangkat USB dicolokkan saat Android terkunci. Untuk menggunakan perangkat, buka kunci Android terlebih dahulu, lalu pasang kembali perangkat USB untuk menggunakannya."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Aktivitas USB yang mencurigakan"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Sinyal data USB telah dinonaktifkan."</string>
</resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 360e3d9815a0..b80efc7878f5 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Losa"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Losa <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Forritsupplýsingar"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Deila beint með"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Tillögð forrit"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Forritalisti"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Byrjar kynningu…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Endurstillir tækið…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Vinstrihnappur stýriflatar"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Hægrihnappur stýriflatar"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Miðjuhnappur stýriflatar"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Stillingasvæði fyrir tegund sjálfvirks smells"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Vinstrismellur"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Hlé"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Staðsetning"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> var sett í flokkinn TAKMARKAÐ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sendi mynd"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Kort"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Forrit"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Ekki er lengur hægt að bera kennsl á fingraförin þín. Settu fingrafarskenni upp aftur."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-tæki stungið í samband á meðan tæki var læst"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-tæki stungið í samband á meðan Android-tækið var læst. Byrjaðu á því að taka Android-tækið úr lás og stingdu síðan USB-tækinu í samband til að nota það."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Grunsamleg USB-virkni"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Slökkt var á USB-gagnamerki."</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 1914ea5ec6b5..3ca9f7f8c7f1 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -333,11 +333,11 @@
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"Possono inviare e visualizzare SMS"</string>
<string name="permgrouplab_storage" msgid="17339216290379241">"File"</string>
- <string name="permgroupdesc_storage" msgid="5378659041354582769">"accedere ai file sul tuo dispositivo"</string>
+ <string name="permgroupdesc_storage" msgid="5378659041354582769">"Possono accedere ai file sul tuo dispositivo"</string>
<string name="permgrouplab_readMediaAural" msgid="1858331312624942053">"Musica e audio"</string>
- <string name="permgroupdesc_readMediaAural" msgid="7565467343667089595">"accedere a musica e audio sul tuo dispositivo"</string>
+ <string name="permgroupdesc_readMediaAural" msgid="7565467343667089595">"Possono accedere a musica e audio sul tuo dispositivo"</string>
<string name="permgrouplab_readMediaVisual" msgid="4724874717811908660">"Foto e video"</string>
- <string name="permgroupdesc_readMediaVisual" msgid="4080463241903508688">"accedere a foto e video sul tuo dispositivo"</string>
+ <string name="permgroupdesc_readMediaVisual" msgid="4080463241903508688">"Possono accedere a foto e video sul tuo dispositivo"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microfono"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"Possono registrare audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Attività fisica"</string>
@@ -345,7 +345,7 @@
<string name="permgrouplab_camera" msgid="9090413408963547706">"Fotocamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"Possono scattare foto e registrare video"</string>
<string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivi nelle vicinanze"</string>
- <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"rilevare e connettersi a dispositivi nelle vicinanze"</string>
+ <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"Possono rilevare e connettersi a dispositivi nelle vicinanze"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Registri chiamate"</string>
<string name="permgroupdesc_calllog" msgid="2026996642917801803">"Possono leggere e modificare il registro chiamate del telefono"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefono"</string>
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Stacca"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Sblocca <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Informazioni app"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Target di condivisione diretta"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App suggerite"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Elenco di app"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Avvio della demo…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Reset del dispositivo…"</string>
@@ -2249,14 +2246,14 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad - Sinistra"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad - Destra"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad - Centro"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
- <skip />
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Riquadro impostazioni del tipo di clic automatico"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic sinistro"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Clic con il tasto destro del mouse"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Doppio clic"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Trascina"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Scorri"</string>
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Metti in pausa"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posizione"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> è stato inserito nel bucket RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha inviato un\'immagine"</string>
@@ -2531,12 +2528,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applicazioni"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Non è più possibile riconoscere le tue impronte. Riconfigura lo Sblocco con l\'Impronta."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispositivo USB collegato quando bloccato"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Il dispositivo USB è collegato quando Android è bloccato. Per usare il dispositivo, sblocca prima Android e poi reinserisci il dispositivo USB."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Attività USB sospetta"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"L\'indicatore di dati USB è stato disattivato."</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 5e0df4708c03..cfa0987c15d4 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1786,7 +1786,7 @@
<string name="hearing_aids_feature_name" msgid="1125892105105852542">"מכשירי שמיעה"</string>
<string name="hearing_device_status_disconnected" msgid="497547752953543832">"מנותק"</string>
<string name="hearing_device_status_connected" msgid="2149385149669918764">"מחובר"</string>
- <string name="hearing_device_status_active" msgid="4770378695482566032">"פעיל"</string>
+ <string name="hearing_device_status_active" msgid="4770378695482566032">"מצב פעיל"</string>
<string name="hearing_device_status_loading" msgid="5717083847663109747">"בטעינה"</string>
<string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"לחצני עוצמת הקול נלחצו בלחיצה ארוכה. שירות <xliff:g id="SERVICE_NAME">%1$s</xliff:g> הופעל."</string>
<string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"לחצני עוצמת הקול נלחצו בלחיצה ארוכה. שירות <xliff:g id="SERVICE_NAME">%1$s</xliff:g> הושבת."</string>
@@ -2249,14 +2249,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"‏לחצן שמאלי ב-Dpad"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"‏לחצן ימני ב-Dpad"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"‏לחצן אמצעי ב-Dpad"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"חלונית ההגדרות של סוג הקליק האוטומטי"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"לחיצה שמאלית"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"השהיה"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"מיקום"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> התווספה לקטגוריה \'מוגבל\'"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"נשלחה תמונה"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index ac37d558e8bb..ad770aaae3ac 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"固定を解除"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> の固定を解除"</string>
<string name="app_info" msgid="6113278084877079851">"アプリ情報"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"ダイレクト シェア ターゲット"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"アプリの候補"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"アプリリスト"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"デモを開始しています…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"デバイスをリセットしています…"</string>
@@ -2250,6 +2247,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad: 中央"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"自動クリックの種類の設定パネル"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"左クリック"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"右クリック"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ダブルクリック"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ドラッグ"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"スクロール"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"一時停止"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"位置"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> は RESTRICTED バケットに移動しました。"</string>
@@ -2526,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"マップ"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"アプリ"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"指紋を認識できなくなりました。指紋認証をもう一度設定してください。"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ロック状態で USB デバイスが接続されました"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android がロックされている状態で USB デバイスが接続されています。デバイスを使用するには、まず Android のロックを解除してから、USB デバイスを再挿入してください。"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"不審な USB アクティビティ"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB データシグナルが無効になっています。"</string>
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 2dee93b1dc24..481c422ae22c 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"ჩამაგრების მოხსნა"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>-ის ჩამაგრების მოხსნა"</string>
<string name="app_info" msgid="6113278084877079851">"აპის შესახებ"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"პირდაპირი გაზიარების მიზნები"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"აპის შეთავაზებები"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"აპების სია"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"მიმდინარეობს დემონსტრაციის დაწყება…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"მიმდინარეობს მოწყობილობის გადაყენება…"</string>
@@ -2250,6 +2247,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ცენტრი"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ავტოდაწკაპუნების ტიპის პარამეტრების არე"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"მარცხენა დაწკაპუნება"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"მარჯვენა დაწკაპუნება"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ორმაგი დაწკაპუნება"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ჩავლება"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"გადაადგილება"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"პაუზა"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"პოზიცია"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> მოთავსდა კალათაში „შეზღუდული“"</string>
@@ -2526,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"აპლიკაციები"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"თქვენი თითის ანაბეჭდის ამოცნობა ვეღარ ხერხდება. ხელახლა დააყენეთ ანაბეჭდით განბლოკვა."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB მოწყობილობა ჩართულია, როდესაც ჩაკეტილია"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB მოწყობილობა ჩართულია, როდესაც Android ჩაკეტილია. მოწყობილობის გამოსაყენებლად ჯერ განბლოკეთ Android და შემდეგ ხელახლა ჩადეთ USB მოწყობილობა მის გამოსაყენებლად."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"საეჭვო USB აქტივობა"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB მონაცემთა სიგნალი გამორთულია."</string>
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 6655e5d31590..70412bed6215 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Босату"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> босату"</string>
<string name="app_info" msgid="6113278084877079851">"Қолданба ақпараты"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Тікелей бөлісу опциялары"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Қолданба ұсыныстары"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Қолданбалар тізімі"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Демо нұсқасы іске қосылуда..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Құрылғы бастапқы күйге қайтарылуда..."</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Сол жақ Dpad түймесі"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Оң жақ Dpad түймесі"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Ортаңғы Dpad түймесі"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Автоматты басу түрі параметрлері панелі"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Сол жағын басу"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Кідірту"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Орналастыру"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ШЕКТЕЛГЕН себетке салынды."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"сурет жіберілді"</string>
@@ -2266,7 +2267,7 @@
<string name="resolver_work_tab" msgid="2690019516263167035">"Жұмыс"</string>
<string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Жеке көру"</string>
<string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Жұмыс деректерін көру"</string>
- <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Әкімшіңіз бөгеген"</string>
+ <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Әкімшіңіз блоктаған"</string>
<string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Бұл контентті жұмыс қолданбаларымен бөлісу мүмкін емес."</string>
<string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Бұл контентті жұмыс қолданбаларымен ашу мүмкін емес."</string>
<string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Бұл контентті жеке қолданбалармен бөлісу мүмкін емес."</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Қолданбалар"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Саусағыңыздың іздері бұдан былай танылмайды. Саусақ ізімен ашу функциясын қайта реттеу"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB құрылғысы құлыптаулы кезде жалғанған"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB құрылғысы Android құрылғысы құлыптаулы кезде жалғанған. Құрылғыны пайдалану үшін алдымен Android құрылғысының құлпын ашып, содан кейін USB құрылғысын қайта енгізіңіз."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"USB-ге қатысты күдікті әрекет"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB дерек сигналы өшірілді."</string>
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 3d78797d9a70..fdd522bd0ede 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"មិនខ្ទាស់"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"ដកខ្ទាស់ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"ព័ត៌មាន​កម្មវិធី"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"គោលដៅចែករំលែកដោយផ្ទាល់"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ការណែនាំកម្មវិធី"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"បញ្ជីកម្មវិធី"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"កំពុងចាប់ផ្តើមការបង្ហាញសាកល្បង…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"កំពុងកំណត់ឧបករណ៍ឡើងវិញ…"</string>
@@ -2250,6 +2247,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad កណ្ដាល"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ផ្ទាំងការកំណត់ប្រភេទចុចស្វ័យប្រវត្តិ"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ចុចម៉ៅស៍ខាងឆ្វេង"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"ចុចម៉ៅស៍ខាងស្ដាំ"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ចុចពីរដង"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"អូស"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"រំកិល"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ផ្អាក"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"ទីតាំង"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ត្រូវបានដាក់​ទៅក្នុងធុង​ដែលបានដាក់កំហិត"</string>
@@ -2526,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ផែនទី"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"កម្មវិធី"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"លែងអាចសម្គាល់ស្នាមម្រាមដៃរបស់អ្នកបានទៀតហើយ។ សូមរៀបចំការដោះសោ​ដោយស្កេន​ស្នាមម្រាមដៃម្ដងទៀត។"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"បានដោតឧបករណ៍ USB នៅពេលជាប់សោ"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"ឧបករណ៍ USB ត្រូវបានដោត នៅពេល Android ត្រូវបានចាក់សោ។ ដើម្បីប្រើឧបករណ៍ សូមដោះសោ Android ជាមុនសិន បន្ទាប់មកដោតឧបករណ៍ USB ឡើងវិញ ដើម្បីប្រើប្រាស់វា។"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"សកម្មភាព USB ដែលគួរឱ្យសង្ស័យ"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"សញ្ញាទិន្នន័យ USB ត្រូវបានបិទ។"</string>
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 1d89ad7c08e5..887938cce097 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"ಅನ್‌ಪಿನ್"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ಅನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಿ"</string>
<string name="app_info" msgid="6113278084877079851">"ಆ್ಯಪ್ ಮಾಹಿತಿ"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"ನೇರ ಹಂಚಿಕೊಳ್ಳುವಿಕೆ ಟಾರ್ಗೆಟ್‌ಗಳು"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ಆ್ಯಪ್ ಸಲಹೆಗಳು"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ಆ್ಯಪ್ ಪಟ್ಟಿ"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"ಡೆಮೋ ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"ಸಾಧನ ಮರುಹೊಂದಿಸಲಾಗುತ್ತಿದೆ..."</string>
@@ -2248,14 +2245,14 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ನ ಎಡಭಾಗದ ಬಟನ್"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ನ ಬಲಭಾಗದ ಬಟನ್"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ನ ಮಧ್ಯದ ಬಟನ್"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
- <skip />
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ಆಟೋಕ್ಲಿಕ್ ಪ್ರಕಾರದ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಪ್ಯಾನೆಲ್"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ಎಡ-ಕ್ಲಿಕ್"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"ಬಲ-ಕ್ಲಿಕ್"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ಡಬಲ್‌ ಕ್ಲಿಕ್"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"ಸ್ಕ್ರಾಲ್ ಮಾಡಿ"</string>
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ವಿರಾಮಗೊಳಿಸಿ"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ಸ್ಥಾನ"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ಅನ್ನು ನಿರ್ಬಂಧಿತ ಬಕೆಟ್‌ಗೆ ಹಾಕಲಾಗಿದೆ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ"</string>
@@ -2530,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ಆ್ಯಪ್‌ಗಳು"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ಗಳನ್ನು ಇನ್ನು ಮುಂದೆ ಗುರುತಿಸಲಾಗುವುದಿಲ್ಲ. ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ಮತ್ತೊಮ್ಮೆ ಸೆಟಪ್ ಮಾಡಿ."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ಲಾಕ್ ಆಗಿರುವಾಗ USB ಸಾಧನವನ್ನು ಪ್ಲಗ್-ಇನ್ ಮಾಡಲಾಗುತ್ತದೆ"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android ಲಾಕ್ ಆಗಿರುವಾಗ USB ಸಾಧನವನ್ನು ಪ್ಲಗ್-ಇನ್ ಮಾಡಲಾಗುತ್ತದೆ. ಸಾಧನವನ್ನು ಬಳಸಲು, ಮೊದಲು Android ಅನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿ ಮತ್ತು ನಂತರ ಅದನ್ನು ಬಳಸಲು USB ಸಾಧನವನ್ನು ಪುನಃ ಸೇರಿಸಿ."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"ಅನುಮಾನಾಸ್ಪದ USB ಚಟುವಟಿಕೆ"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ಡೇಟಾ ಸಿಗ್ನಲ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index ad1bdae6fc30..fc392711bd57 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"고정 해제"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> 고정 해제"</string>
<string name="app_info" msgid="6113278084877079851">"앱 정보"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"직접 공유 타겟"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"앱 제안"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"앱 목록"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"데모 시작 중..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"기기 초기화 중..."</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"방향 패드 왼쪽"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"방향 패드 오른쪽"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"방향 패드 가운데"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"자동 클릭 유형 설정 패널"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"왼쪽 클릭"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"일시중지"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"위치"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 항목이 RESTRICTED 버킷으로 이동함"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"이미지 보냄"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"지도"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"애플리케이션"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"지문을 더 이상 인식할 수 없습니다. 지문 잠금 해제를 다시 설정하세요."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"잠금 상태에서 USB 기기가 연결됨"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android가 잠겨 있는 상태에서 USB 기기가 연결되었습니다. 기기를 사용하려면 먼저 Android를 잠금 해제한 다음 USB 기기를 다시 삽입하세요."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"의심스러운 USB 활동"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB 데이터 신호가 사용 중지됨"</string>
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index cb4edb963c76..f8c0022f0f31 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Кадоодон алып коюу"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> бошотуу"</string>
<string name="app_info" msgid="6113278084877079851">"Колдонмо тууралуу"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Түздөн-түз бөлүшүлгөндөрдү алуучулар"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Сунушталган колдонмолор"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Колдонмолордун тизмеси"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Демо режим башталууда…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Түзмөк баштапкы абалга келтирилүүдө…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad\'дын сол баскычы"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad\'дын оң баскычы"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad\'дын ортоңку баскычы"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Авточыкылдатуу түрүнүн параметрлеринин панели"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Сол баскычын чыкылдатуу"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Тындыруу"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Орду"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ЧЕКТЕЛГЕН чакага коюлган"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"сүрөт жөнөттү"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карталар"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Колдонмолор"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Манжаңыздын изи мындан ары таанылбайт. Манжа изи менен ачуу функциясын кайрадан тууралаңыз."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB түзмөк Android кулпуланып турганда туташтырылды"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB түзмөк Android кулпуланганда туташтырылды. Түзмөктү колдонуу үчүн алгач Android\'дин кулпусун ачып, USB түзмөктү кайрадан сайыңыз."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"USB\'ге байланыштуу шектүү аракет"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB сигналы өчүрүлдү."</string>
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 4b426c818179..429f3f79cf64 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"ຖອນປັກໝຸດ"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"ຖອດປັກມຸດ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"ຂໍ້ມູນແອັບ"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"ເປົ້າໝາຍການແບ່ງປັນໂດຍກົງ"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ການແນະນຳແອັບ"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ລາຍຊື່ແອັບ"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"ກຳລັງເລີ່ມເດໂມ…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"ກຳລັງຣີເຊັດອຸປະກອນ…"</string>
@@ -2250,6 +2247,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ກາງ"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ແຜງການຕັ້ງຄ່າປະເພດການຄລິກອັດຕະໂນມັດ"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ຄລິກຊ້າຍ"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"ຄລິກຂວາ"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ຄລິກສອງເທື່ອ"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ລາກ"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"ເລື່ອນ"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ຢຸດຊົ່ວຄາວ"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"ຕຳແໜ່ງ"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ຖືກວາງໄວ້ໃນກະຕ່າ \"ຈຳກັດ\" ແລ້ວ"</string>
@@ -2526,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ແຜນທີ່"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ແອັບພລິເຄຊັນ"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ລະບົບບໍ່ສາມາດຈຳແນກລາຍນິ້ວມືຂອງທ່ານໄດ້ອີກຕໍ່ໄປ. ກະລຸນາຕັ້ງຄ່າການປົດລັອກດ້ວຍລາຍນິ້ວມືອີກຄັ້ງ."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ທ່ານສຽບອຸປະກອນ USB ໃນຂະນະທີ່ລັອກຢູ່"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"ທ່ານສຽບອຸປະກອນ USB ໃນຂະນະທີ່ Android ລັອກຢູ່. ເພື່ອໃຊ້ອຸປະກອນ, ກະລຸນາປົດລັອກ Android ກ່ອນແລ້ວຈຶ່ງສຽບອຸປະກອນ USB ອີກຄັ້ງເພື່ອນຳໃຊ້."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"ການເຄື່ອນໄຫວຂອງ USB ທີ່ໜ້າສົງໄສ"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"ສັນຍານຂໍ້ມູນຂອງ USB ຖືກປິດການນຳໃຊ້."</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 544cd4108e02..3ca681bffc63 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -2090,12 +2090,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Atsegti"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Atsegti <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Programos informacija"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Tiesioginio bendrinimo paskirties vietos"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Siūlomos programos"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Programų sąrašas"</string>
<string name="negative_duration" msgid="1938335096972945232">"–<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Paleidžiama demonstracinė versija…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Įrenginys nustatomas iš naujo…"</string>
@@ -2250,14 +2247,14 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Valdymo pultas – kairėn"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Valdymo pultas – dešinėn"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Valdymo pultas – centras"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
- <skip />
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automatinio paspaudimo tipo nustatymų skydelis"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Spustelėti kairiuoju klavišu"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Spustelėti dešiniuoju klavišu"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dukart spustelėti"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Vilkti"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Slinkti"</string>
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pristabdyti"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicija"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"„<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>“ įkeltas į grupę APRIBOTA"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"išsiuntė vaizdą"</string>
@@ -2532,12 +2529,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Žemėlapiai"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Programos"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Nebegalima atpažinti jūsų piršto atspaudų. Dar kartą nustatykite atrakinimą piršto atspaudu."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB įrenginys prijungtas, kai užrakintas"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB įrenginys prijungtas, kai „Android“ užrakintas. Jei norite naudoti įrenginį, pirmiausia atrakinkite „Android“, tada vėl įkiškite USB įrenginį, kad galėtumėte jį naudoti."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Įtartina USB veikla"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB duomenų signalas išjungtas."</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 02e93395237c..1e7ffd145eac 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Atspraust"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Atspraust lietotni <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Lietotnes informācija"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Tiešās kopīgošanas adresāti"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Ieteicamās lietotnes"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lietotņu saraksts"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Notiek demonstrācijas palaišana..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Notiek ierīces atiestatīšana..."</string>
@@ -2249,14 +2246,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Virzienu slēdzis — pa kreisi"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Virzienu slēdzis — pa labi"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Virzienu slēdzis — centrs"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automātiskās klikšķināšanas veida iestatījumu panelis"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Noklikšķināt ar peles kreiso pogu"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pārtraukt"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozīcija"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Pakotne “<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>” ir ievietota ierobežotā kopā."</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"nosūtīts attēls"</string>
@@ -2531,12 +2532,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Lietojumprogrammas"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Jūsu pirkstu nospiedumus vairs nevar atpazīt. Vēlreiz iestatiet autorizāciju ar pirksta nospiedumu."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB ierīce tika pievienota, kad Android ierīce bija bloķēta"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB ierīce tika pievienota, kad Android ierīce bija bloķēta. Lai izmantotu ierīci, vispirms atbloķējiet Android ierīci un pēc tam atkārtoti pievienojiet USB ierīci."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Aizdomīgas darbības ar USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB datu signāls ir atspējots."</string>
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index df101f24f158..c1a7c1dc5739 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Откачете"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Откачи <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Информации за апликација"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Директни цели на споделување"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Предлози за апликации"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Список со апликации"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Се вклучува демонстрацијата…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Се ресетира уредот…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Навигациско копче за налево"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Навигациско копче за надесно"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Навигациско копче за средина"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Табла со поставки за вид автоматско кликнување"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Кликни со лево копче"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Паузирај"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Позиционирај"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е ставен во корпата ОГРАНИЧЕНИ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"испрати слика"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карти"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Апликации"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Вашите отпечатоци веќе не може да се препознаат. Поставете „Отклучување со отпечаток“ повторно."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-уредот е приклучен кога е заклучен"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-уредот е приклучен кога Android е заклучен. За да го користите уредот, прво отклучете го Android, па вметнете го USB-уредот повторно за да го користите."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Сомнителна активност на USB-уредот"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Сигналот со податоци преку USB е оневозможен."</string>
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index b5ded52f10b7..5c31433e9456 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"അൺപിൻ ചെയ്യുക"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> അൺപിൻ ചെയ്യുക"</string>
<string name="app_info" msgid="6113278084877079851">"ആപ്പ് വിവരം"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"നേരിട്ടുള്ള പങ്കിടൽ ടാർഗറ്റുകൾ"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ആപ്പ് നിർദ്ദേശങ്ങൾ"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ആപ്പ് ലിസ്റ്റ്"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"ഡെമോ ആരംഭിക്കുന്നു…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"ഉപകരണം പുനക്രമീകരിക്കുന്നു…"</string>
@@ -2250,6 +2247,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad സെന്റർ"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ഓട്ടോക്ലിക്ക് തരം ക്രമീകരണ പാനല്‍"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ഇടത് ക്ലിക്ക്"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"വലത്-ക്ലിക്ക്"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ഡബിൾ ക്ലിക്ക്"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"വലിച്ചിടുക"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"സ്‌ക്രോൾ ചെയ്യുക"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"താൽക്കാലികമായി നിർത്തുക"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"സ്ഥാനം"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> നിയന്ത്രിത ബക്കറ്റിലേക്ക് നീക്കി"</string>
@@ -2526,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ആപ്പുകൾ"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"നിങ്ങളുടെ ഫിംഗർപ്രിന്റുകൾ ഇനി തിരിച്ചറിയാനാകില്ല. ഫിംഗർപ്രിന്റ് അൺലോക്ക് വീണ്ടും സജ്ജീകരിക്കുക."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ലോക്കായിരിക്കുമ്പോഴാണ് USB ഉപകരണം പ്ലഗ്-ഇൻ ചെയ്തത്"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android ലോക്കായിരിക്കുമ്പോഴാണ് USB ഉപകരണം പ്ലഗ്-ഇൻ ചെയ്തത്. ഉപകരണം ഉപയോഗിക്കാൻ ആദ്യം Android അൺലോക്ക് ചെയ്യുക, ശേഷം USB ഉപകരണം വീണ്ടും ഇൻസേർട്ട് ചെയ്ത് ഉപയോഗിക്കുക."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"സംശയാസ്പദമായ USB ആക്റ്റിവിറ്റി"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ഡാറ്റാ സിഗ്‌നൽ പ്രവർത്തനരഹിതമാക്കി."</string>
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index a61bd7fbf1da..24637fa0b323 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Unpin"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>-г тогтоосныг болиулах"</string>
<string name="app_info" msgid="6113278084877079851">"Аппын мэдээлэл"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Шууд хуваалцах сонголтууд"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Санал болгож буй аппууд"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Аппын жагсаалт"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Жишээг эхлүүлж байна…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Төхөөрөмжийг шинэчилж байна…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad зүүн"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad баруун"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad гол"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Автомат товшилтын төрлийн тохиргооны түр зуурын самбар"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Зүүн талыг товших"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Түр зогсоох"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Байрлал"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>-г ХЯЗГААРЛАСАН сагс руу орууллаа"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"зураг илгээсэн"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Газрын зураг"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Аппликэйшн"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Таны хурууны хээг цаашид таних боломжгүй. Хурууны хээгээр түгжээ тайлахыг дахин тохируулна уу."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Түгжээтэй үед USB төхөөрөмж залгаатай байна"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android-г түгжсэн үед USB төхөөрөмж залгаатай байна. Төхөөрөмжийг ашиглахын тулд эхлээд Android-н түгжээг тайлж, дараа нь USB төхөөрөмжийг ашиглахын тулд дахин оруулна уу."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"USB-н сэжигтэй үйл ажиллагаа"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-н өгөгдлийн дохиог идэвхгүй болгосон."</string>
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 3f2e57f5163a..0717eb976261 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"अनपिन करा"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ला अनपिन करा"</string>
<string name="app_info" msgid="6113278084877079851">"अ‍ॅप माहिती"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"थेट शेअर करण्यासंबंधी लक्ष्ये"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"अ‍ॅप सूचना"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"अ‍ॅप सूची"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"डेमो सुरू करत आहे..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"डिव्हाइस रीसेट करत आहे..."</string>
@@ -2248,14 +2245,14 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad डावीकडील"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad चे उजवीकडील"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad चे मधले"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
- <skip />
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ऑटोक्लिक प्रकाराचे सेटिंग्ज पॅनल"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"लेफ्ट क्लिक करा"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"राइट क्लिक करा"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"डबल क्लिक करा"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ड्रॅग करा"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"स्क्रोल करा"</string>
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"थांबवा"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"स्थिती"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> हे प्रतिबंधित बादलीमध्ये ठेवण्यात आले आहे"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"इमेज पाठवली आहे"</string>
@@ -2530,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"अ‍ॅप्लिकेशन"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"तुमची फिंगरप्रिंट यापुढे ओळखता येणार नाहीत. फिंगरप्रिंट अनलॉक पुन्हा सेट करा."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"लॉक केलेले असताना USB डिव्हाइस प्लग इन केले आहे"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android लॉक केलेले असताना USB डिव्हाइस प्लग इन केले आहे. डिव्हाइस वापरण्यासाठी, कृपया सर्वप्रथम Android अनलॉक करा आणि त्यानंतर USB डिव्हाइस वापरण्यासाठी ते पुन्हा घाला."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"संशयास्पद USB ॲक्टिव्हिटी"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB डेटा सिग्नल बंद करण्यात आला आहे."</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index f9aeec485295..5cac65d3077c 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Nyahsemat"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Nyahsemat <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Maklumat apl"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Sasaran perkongsian langsung"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Cadangan apl"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Senarai apl"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Memulakan tunjuk cara…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Menetapkan semula peranti…"</string>
@@ -2250,6 +2247,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Tengah"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel tetapan jenis autoklik"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Klik kiri"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Klik kanan"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Klik dua kali"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Seret"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Tatal"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Jeda"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Kedudukan"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah diletakkan dalam baldi TERHAD"</string>
@@ -2526,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikasi"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Cap jari anda tidak dapat dicam lagi. Sediakan semula Buka Kunci Cap Jari."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Peranti USB dipalamkan apabila dikunci"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Peranti USB dipalamkan apabila Android dikunci. Untuk menggunakan peranti, sila buka kunci Android dahulu, kemudian masukkan semula peranti USB untuk menggunakan peranti itu."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Aktiviti USB yang mencurigakan"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Isyarat data USB telah dilumpuhkan."</string>
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 293b316efa00..10bcd1b75d9c 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"ဖြုတ်ပါ"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ကို ပင်ဖြုတ်ရန်"</string>
<string name="app_info" msgid="6113278084877079851">"အက်ပ်အချက်အလက်"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"တိုက်ရိုက်မျှဝေသည့် ပစ်မှတ်များ"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"အက်ပ်အကြံပြုချက်များ"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"အက်ပ်စာရင်း"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"သရုပ်ပြချက်ကို စတင်နေသည်…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"စက်ပစ္စည်းကို ပြန်လည်သတ်မှတ်နေသည်…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ဘယ်"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ညာ"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad အလယ်"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"အော်တိုနှိပ်ခြင်း အမျိုးအစား ဆက်တင်အကန့်"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ဘယ်ကလစ်"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ခဏရပ်ရန်"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"နေရာ"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ကို တားမြစ်ထားသော သိမ်းဆည်းမှုအတွင်းသို့ ထည့်ပြီးပါပြီ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>-"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ပုံပို့ထားသည်"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"အပလီကေးရှင်းများ"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"သင့်လက်ဗွေများကို မသိရှိနိုင်တော့ပါ။ ‘လက်ဗွေသုံး လော့ခ်ဖွင့်ခြင်း’ ထပ်မံစနစ်ထည့်သွင်းပါ။"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"လော့ခ်ချထားချိန်တွင် USB စက်ကို ပလတ်တပ်ထားခြင်း"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android လော့ခ်ချထားချိန်တွင် USB စက်ကို ပလတ်တပ်ထားသည်။ စက်သုံးရန်အတွက် Android ကို အရင်ဖွင့်ပြီး USB စက်ပြန်ထည့်ကာ သုံးပါ။"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"သံသယဖြစ်ဖွယ် USB လုပ်ဆောင်ချက်"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ဒေတာအချက်ပြမှုကို ပိတ်လိုက်ပါပြီ။"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index a79ff1e4d7bf..800f118baea5 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Løsne"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Løsne <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Info om appen"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direkte delingsmål"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Appforslag"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Appliste"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Starter demo …"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Tilbakestiller enheten …"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Venstre på styrepilene"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Høyre på styrepilene"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Midt på styrepilene"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Innstillingspanel for type autoklikk"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Venstreklikk"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Sett på pause"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Plassér"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blitt plassert i TILGANGSBEGRENSET-toppmappen"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"har sendt et bilde"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apper"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Fingeravtrykkene dine kan ikke gjenkjennes lenger. Konfigurer opplåsing med fingeravtrykk på nytt."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-enheten er koblet til når den er låst"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-enheten er koblet til når Android er låst. Før du kan bruke enheten, må du låse opp Android og så sette inn USB-enheten på nytt."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Mistenkelig USB-aktivitet"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-datasignalet er slått av."</string>
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 3f24b2773404..ce0c67ebd8a2 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -351,7 +351,7 @@
<string name="permgroupdesc_phone" msgid="270048070781478204">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string>
<string name="permgrouplab_sensors" msgid="9134046949784064495">"बडी सेन्सरहरू"</string>
<string name="permgroupdesc_sensors" msgid="2610631290633747752">"तपाईंको महत्त्वपूर्ण संकेत बारे सेन्सर डेटा पहुँच गर्नुहोस्"</string>
- <string name="permgrouplab_notifications" msgid="5472972361980668884">"सूचनाहरू"</string>
+ <string name="permgrouplab_notifications" msgid="5472972361980668884">"नोटिफिकेसनहरू"</string>
<string name="permgroupdesc_notifications" msgid="4608679556801506580">"सूचनाहरू देखाउनुहोस्"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"विन्डो सामग्रीको पुनःबहाली गर्नुहोस्।"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।"</string>
@@ -877,7 +877,7 @@
<string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"स्क्रिन लकका केही सुविधा असक्षम पार्ने"</string>
<string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"स्क्रिन लकका केही सुविधाहरूको प्रयोगमा रोक लगाउन।"</string>
<string-array name="phoneTypes">
- <item msgid="8996339953292723951">"गृह"</item>
+ <item msgid="8996339953292723951">"घर"</item>
<item msgid="7740243458912727194">"मोबाइल"</item>
<item msgid="8526146065496663766">"काम गर्नुहोस्"</item>
<item msgid="8150904584178569699">"कार्य फ्याक्स"</item>
@@ -887,19 +887,19 @@
<item msgid="6216981255272016212">" कस्टम"</item>
</string-array>
<string-array name="emailAddressTypes">
- <item msgid="7786349763648997741">"गृह"</item>
+ <item msgid="7786349763648997741">"घर"</item>
<item msgid="435564470865989199">"काम"</item>
<item msgid="4199433197875490373">"अन्य"</item>
<item msgid="3233938986670468328">" कस्टम"</item>
</string-array>
<string-array name="postalAddressTypes">
- <item msgid="3861463339764243038">"गृह"</item>
+ <item msgid="3861463339764243038">"घर"</item>
<item msgid="5472578890164979109">"काम"</item>
<item msgid="5718921296646594739">"अन्य"</item>
<item msgid="5523122236731783179">" कस्टम"</item>
</string-array>
<string-array name="imAddressTypes">
- <item msgid="588088543406993772">"गृह"</item>
+ <item msgid="588088543406993772">"घर"</item>
<item msgid="5503060422020476757">"काम"</item>
<item msgid="2530391194653760297">"अन्य"</item>
<item msgid="7640927178025203330">" कस्टम"</item>
@@ -920,7 +920,7 @@
<item msgid="8293711853624033835">"Jabber"</item>
</string-array>
<string name="phoneTypeCustom" msgid="5120365721260686814">" कस्टम"</string>
- <string name="phoneTypeHome" msgid="3880132427643623588">"गृह"</string>
+ <string name="phoneTypeHome" msgid="3880132427643623588">"घर"</string>
<string name="phoneTypeMobile" msgid="1178852541462086735">"मोबाइल"</string>
<string name="phoneTypeWork" msgid="6604967163358864607">"काम"</string>
<string name="phoneTypeFaxWork" msgid="6757519896109439123">"कार्य फ्याक्स"</string>
@@ -945,16 +945,16 @@
<string name="eventTypeAnniversary" msgid="4684702412407916888">"वार्षिक समारोह"</string>
<string name="eventTypeOther" msgid="530671238533887997">"अन्य"</string>
<string name="emailTypeCustom" msgid="1809435350482181786">" कस्टम"</string>
- <string name="emailTypeHome" msgid="1597116303154775999">"गृह"</string>
+ <string name="emailTypeHome" msgid="1597116303154775999">"घर"</string>
<string name="emailTypeWork" msgid="2020095414401882111">"काम"</string>
<string name="emailTypeOther" msgid="5131130857030897465">"अन्य"</string>
<string name="emailTypeMobile" msgid="787155077375364230">"मोबाइल"</string>
<string name="postalTypeCustom" msgid="5645590470242939129">" कस्टम"</string>
- <string name="postalTypeHome" msgid="7562272480949727912">"गृह"</string>
+ <string name="postalTypeHome" msgid="7562272480949727912">"घर"</string>
<string name="postalTypeWork" msgid="8553425424652012826">"काम"</string>
<string name="postalTypeOther" msgid="7094245413678857420">"अन्य"</string>
<string name="imTypeCustom" msgid="5653384545085765570">" कस्टम"</string>
- <string name="imTypeHome" msgid="6996507981044278216">"गृह"</string>
+ <string name="imTypeHome" msgid="6996507981044278216">"घर"</string>
<string name="imTypeWork" msgid="2099668940169903123">"काम"</string>
<string name="imTypeOther" msgid="8068447383276219810">"अन्य"</string>
<string name="imProtocolCustom" msgid="4437878287653764692">" कस्टम"</string>
@@ -986,7 +986,7 @@
<string name="relationTypeSister" msgid="3721676005094140671">"बहिनी"</string>
<string name="relationTypeSpouse" msgid="6916682664436031703">"पति-पत्नी"</string>
<string name="sipAddressTypeCustom" msgid="6283889809842649336">" कस्टम"</string>
- <string name="sipAddressTypeHome" msgid="5918441930656878367">"गृह"</string>
+ <string name="sipAddressTypeHome" msgid="5918441930656878367">"घर"</string>
<string name="sipAddressTypeWork" msgid="7873967986701216770">"काम गर्नुहोस्"</string>
<string name="sipAddressTypeOther" msgid="6317012577345187275">"अन्य"</string>
<string name="quick_contacts_not_available" msgid="1262709196045052223">"यो सम्पर्क हेर्न कुनै पनि एप फेला परेन।"</string>
@@ -1408,7 +1408,7 @@
<string name="install_carrier_app_notification_button" msgid="6257740533102594290">"एप डाउनलोड गर्नुहोस्"</string>
<string name="carrier_app_notification_title" msgid="5815477368072060250">"नयाँ SIM घुसाइयो"</string>
<string name="carrier_app_notification_text" msgid="6567057546341958637">"यसलाई सेटअप गर्न ट्याप गर्नुहोस्"</string>
- <string name="time_zone_change_notification_title" msgid="5232503069219193218">"तपाईंको प्रामाणिक समय परिवर्तन गरिएको छ"</string>
+ <string name="time_zone_change_notification_title" msgid="5232503069219193218">"तपाईंको प्रामाणिक समय परिवर्तन भएको छ"</string>
<string name="time_zone_change_notification_body" msgid="6135793674904665585">"तपाईं अहिले <xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g> (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>) मा हुनुहुन्छ"</string>
<string name="time_picker_dialog_title" msgid="9053376764985220821">"समय मिलाउनुहोस्"</string>
<string name="date_picker_dialog_title" msgid="5030520449243071926">"मिति मिलाउनुहोस्"</string>
@@ -1758,7 +1758,7 @@
<string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"केही सेकेन्डसम्म दुवै भोल्युम की थिचिराख्नुले <xliff:g id="SERVICE">%1$s</xliff:g> नामक पहुँचसम्बन्धी सुविधा सक्रिय गर्छ। यसले तपाईंको यन्त्रले काम गर्ने तरिका परिवर्तन गर्न सक्छ।\n\nतपाईं सेटिङ &gt; पहुँचमा गई यो सर्टकटमार्फत अर्को सुविधा खुल्ने बनाउन सक्नुहुन्छ।"</string>
<string name="accessibility_shortcut_on" msgid="5463618449556111344">"सक्रिय गर्नुहोस्"</string>
<string name="accessibility_shortcut_off" msgid="3651336255403648739">"सक्रिय नगर्नुहोस्"</string>
- <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"सक्रिय"</string>
+ <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"अन छ"</string>
<string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"निष्क्रिय"</string>
<string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> लाई तपाईंको डिभाइस पूर्ण रूपमा नियन्त्रण गर्न दिने हो?"</string>
<string name="accessibility_service_warning_description" msgid="291674995220940133">"एक्सेसिबिलिटीसम्बन्धी आवश्यकतामा सहयोग गर्ने एपको पूर्ण नियन्त्रण गर्न दिनु उपयुक्त हुन्छ तर अधिकांश एपका हकमा यस्तो नियन्त्रण उपयुक्त हुँदैन।"</string>
@@ -2188,12 +2188,12 @@
<string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"यस सूचनालाई कम महत्त्वपूर्ण ठानी यसका लागि साइलेन्ट मोड सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
<string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"यस सूचनालाई धेरै महत्त्वपूर्ण सूचनाका रूपमा सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
<string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"यस सूचनालाई कम महत्त्वपूर्ण सूचनाका रूपमा सेट गरिएको छ। प्रतिक्रिया दिन ट्याप गर्नुहोस्।"</string>
- <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"परिष्कृत सूचनाहरू"</string>
- <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"अब परिष्कृत सूचनाहरू नामक सुविधाले कारबाही तथा जवाफहरूसम्बन्धी सुझाव देखाउँछ। Android को एड्याप्टिभ सूचनाहरू नामक सुविधाले अब उप्रान्त काम गर्दैन।"</string>
+ <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"परिष्कृत नोटिफिकेसनहरू"</string>
+ <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"अब परिष्कृत नोटिफिकेसनहरू नामक सुविधाले कारबाही तथा जवाफहरूसम्बन्धी सुझाव देखाउँछ। Android को एड्याप्टिभ नोटिफिकेसनहरू नामक सुविधाले अब उप्रान्त काम गर्दैन।"</string>
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ठिक छ"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"अफ गर्नुहोस्"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"थप जान्नुहोस्"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android १२ मा Android को एड्याप्टिभ सूचनाहरू नामक सुविधालाई परिष्कृत सूचनाहरू नामक सुविधाले प्रतिस्थापन गरेको छ। यो सुविधाले कारबाही तथा जवाफसम्बन्धी सुझाव देखाउँछ र तपाईंका सूचनाहरू व्यवस्थित गर्छ।\n\nपरिष्कृत सूचनाहरू नामक सुविधाले सूचनामा उल्लिखित सम्पर्क व्यक्तिको नाम र म्यासेज जस्ता व्यक्तिगत जानकारीलगायतका सामग्री हेर्न तथा प्रयोग गर्न सक्छ। यो सुविधाले फोन उठाउने तथा \'बाधा नपुऱ्याउनुहोस्\' मोड नियन्त्रण गर्ने कार्यसहित सूचनाहरू हटाउने वा सूचनाहरूको जवाफ दिने कार्य पनि गर्न सक्छ।"</string>
+ <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android १२ मा Android को एड्याप्टिभ नोटिफिकेसनहरू नामक सुविधालाई परिष्कृत नोटिफिकेसनहरू नामक सुविधाले प्रतिस्थापन गरेको छ। यो सुविधाले कारबाही तथा जवाफसम्बन्धी सुझाव देखाउँछ र तपाईंका नोटिफिकेसनहरू व्यवस्थित गर्छ।\n\nपरिष्कृत नोटिफिकेसनहरू नामक सुविधाले नोटिफिकेसनमा उल्लिखित सम्पर्क व्यक्तिको नाम र म्यासेज जस्ता व्यक्तिगत जानकारीलगायतका सामग्री हेर्न तथा प्रयोग गर्न सक्छ। यो सुविधाले फोन उठाउने तथा \'बाधा नपुऱ्याउनुहोस्\' मोड नियन्त्रण गर्ने कार्यसहित नोटिफिकेसनहरू हटाउने वा नोटिफिकेसनहरूको जवाफ दिने कार्य पनि गर्न सक्छ।"</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"दिनचर्या मोडको जानकारीमूलक सूचना"</string>
<string name="dynamic_mode_notification_title" msgid="1388718452788985481">"ब्याट्री सेभर अन गरिएको छ"</string>
<string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"ब्याट्रीको आयु बढाउन ब्याट्रीको खपत कम गरिँदै छ"</string>
@@ -2231,7 +2231,7 @@
<string name="accessibility_system_action_home_label" msgid="3234748160850301870">"होम"</string>
<string name="accessibility_system_action_back_label" msgid="4205361367345537608">"पछाडि फर्कनुहोस्"</string>
<string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"हालसालैका एपहरू"</string>
- <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"सूचनाहरू"</string>
+ <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"नोटिफिकेसनहरू"</string>
<string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"द्रुत सेटिङहरू"</string>
<string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पावर संवाद"</string>
<string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"लक स्क्रिन"</string>
@@ -2248,14 +2248,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad को बायाँको बटन"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad को दायाँको बटन"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad को बिचको बटन"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"अटोक्लिकको प्रकारसम्बन्धी सेटिङको प्यानल"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"बायाँ क्लिक गर्नुहोस्"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"पज गर्नुहोस्"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"स्थिति"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> लाई प्रतिबन्धित बाल्टीमा राखियो"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"फोटो पठाइयो"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 38bcffab7c33..34666415d87a 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Losmaken"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> losmaken"</string>
<string name="app_info" msgid="6113278084877079851">"App-info"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Doelen voor direct delen"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"App-suggesties"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"App-lijst"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Demo starten…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Apparaat resetten…"</string>
@@ -2250,6 +2247,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad midden"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Deelvenster met instellingen voor het type automatisch klikken"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Klikken met de linkermuisknop"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Klikken met de rechtermuisknop"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dubbelklikken"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Slepen"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Scrollen"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauzeren"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Positie"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in de bucket RESTRICTED geplaatst"</string>
@@ -2526,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Kaarten"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Je vingerafdrukken worden niet meer herkend. Stel Ontgrendelen met vingerafdruk opnieuw in."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-apparaat aangesloten terwijl vergrendeld"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Het USB-apparaat is aangesloten terwijl Android is vergrendeld. Als je het apparaat wilt gebruiken, ontgrendel je eerst Android en plaats je het USB-apparaat opnieuw om het te gebruiken."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Verdachte USB-activiteit"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-gegevenssignaal is uitgezet."</string>
</resources>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index e99010f02be0..418231f5e9b2 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -2042,7 +2042,7 @@
<string name="app_suspended_title" msgid="888873445010322650">"ଆପ୍‌ ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="app_suspended_default_message" msgid="6451215678552004172">"ବର୍ତ୍ତମାନ <xliff:g id="APP_NAME_0">%1$s</xliff:g> ଉପଲବ୍ଧ ନାହିଁ। ଏହା <xliff:g id="APP_NAME_1">%2$s</xliff:g> ଦ୍ଵାରା ପରିଚାଳିତ ହେଉଛି।"</string>
<string name="app_suspended_more_details" msgid="211260942831587014">"ଅଧିକ ଜାଣନ୍ତୁ"</string>
- <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"ଆପ୍ ଅନପଜ୍ କରନ୍ତୁ"</string>
+ <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"ଆପ ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ"</string>
<string name="work_mode_off_title" msgid="6367463960165135829">"ୱାର୍କ ଆପ୍ସକୁ ପୁଣି ଚାଲୁ କରିବେ?"</string>
<string name="work_mode_turn_on" msgid="5316648862401307800">"ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"ଜରୁରୀକାଳୀନ"</string>
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"ଅନପିନ୍ କରନ୍ତୁ"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ରେ ଅନ୍‌ପିନ୍ କରନ୍ତୁ"</string>
<string name="app_info" msgid="6113278084877079851">"ଆପ୍‍ ସୂଚନା"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"ଡାଇରେକ୍ଟ ସେୟାର ଟାର୍ଗେଟ"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ଆପ ପରାମର୍ଶ"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ଆପ ତାଲିକା"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"ଡେମୋ ଆରମ୍ଭ କରାଯାଉଛି…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"ଡିଭାଇସ୍‍କୁ ରିସେଟ୍‍ କରାଯାଉଛି…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ବାମ"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ଡାହାଣ"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad କେନ୍ଦ୍ର"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ଅଟୋକ୍ଲିକ ପ୍ରକାର ସେଟିଂସ ପେନେଲ"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ବାମ ବଟନ କ୍ଲିକ କରନ୍ତୁ"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ବିରତ କରନ୍ତୁ"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ସ୍ଥିତି"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>କୁ ପ୍ରତିବନ୍ଧିତ ବକେଟରେ ରଖାଯାଇଛି"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ଏକ ଛବି ପଠାଯାଇଛି"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ଆପ୍ଲିକେସନ"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ଆପଣଙ୍କ ଟିପଚିହ୍ନକୁ ଆଉ ଚିହ୍ନଟ କରାଯାଇପାରିବ ନାହିଁ। ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ ପୁଣି ସେଟ ଅପ କରନ୍ତୁ।"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ଲକ ଥିବା ସମୟରେ USB ଡିଭାଇସ ପ୍ଲଗ ଇନ ହୋଇଛି"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android ଲକ ଥିବାବେଳେ USB ଡିଭାଇସ ପ୍ଲଗ ଇନ ହୋଇଥାଏ। ଡିଭାଇସ ବ୍ୟବହାର କରିବାକୁ, ଦୟାକରି ପ୍ରଥମେ Android ଅନଲକ କରନ୍ତୁ ଏବଂ ତାପରେ ଏହାକୁ ବ୍ୟବହାର କରିବାକୁ USB ଡିଭାଇସ ପୁଣି ଭର୍ତ୍ତି କରନ୍ତୁ।"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"ସନ୍ଦେହଜନକ USB କାର୍ଯ୍ୟକଳାପ"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ଡାଟା ସିଗନାଲକୁ ଅକ୍ଷମ କରାଯାଇଛି।"</string>
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 63765aa11e78..26769a637388 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"ਅਨਪਿੰਨ ਕਰੋ"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ਨੂੰ ਅਨਪਿੰਨ ਕਰੋ"</string>
<string name="app_info" msgid="6113278084877079851">"ਐਪ ਜਾਣਕਾਰੀ"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"ਸਿੱਧੇ ਤੌਰ \'ਤੇ ਸਾਂਝਾ ਕਰਨ ਲਈ ਟਾਰਗੇਟ ਗਰੁੱਪ"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ਐਪ ਸੁਝਾਅ"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ਐਪ ਸੂਚੀ"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"ਡੈਮੋ ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"ਡੀਵਾਈਸ ਰੀਸੈੱਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
@@ -2250,6 +2247,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ਦਾ ਵਿਚਕਾਰਲਾ ਬਟਨ"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ਸਵੈ-ਕਲਿੱਕ ਟਾਈਪ ਸੈਟਿੰਗ ਪੈਨਲ"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ਖੱਬਾ-ਕਲਿੱਕ ਦਬਾਓ"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"ਸੱਜਾ-ਕਲਿੱਕ ਦਬਾਓ"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ਡਬਲ ਕਲਿੱਕ ਕਰੋ"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ਘਸੀਟੋ"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"ਸਕ੍ਰੋਲ ਕਰੋ"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ਰੋਕੋ"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"ਸਥਿਤੀ"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ਨੂੰ ਪ੍ਰਤਿਬੰਧਿਤ ਖਾਨੇ ਵਿੱਚ ਪਾਇਆ ਗਿਆ ਹੈ"</string>
@@ -2526,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ਐਪਲੀਕੇਸ਼ਨਾਂ"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ਤੁਹਾਡੇ ਫਿੰਗਰਪ੍ਰਿੰਟਾਂ ਦੀ ਹੁਣ ਪਛਾਣ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਫਿੰਗਰਪ੍ਰਿੰਟ ਅਣਲਾਕ ਦਾ ਦੁਬਾਰਾ ਸੈੱਟਅੱਪ ਕਰੋ।"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"ਲਾਕ ਹੋਣ \'ਤੇ USB ਡੀਵਾਈਸ ਨੂੰ ਪਲੱਗ-ਇਨ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android ਲਾਕ ਹੋਣ \'ਤੇ USB ਡੀਵਾਈਸ ਨੂੰ ਪਲੱਗ-ਇਨ ਕੀਤਾ ਗਿਆ। ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਪਹਿਲਾਂ Android ਨੂੰ ਅਣਲਾਕ ਕਰੋ ਅਤੇ ਫਿਰ USB ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਉਸਨੂੰ ਦੁਬਾਰਾ ਲਗਾਓ।"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"ਸ਼ੱਕੀ USB ਸਰਗਰਮੀ"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB ਡਾਟਾ ਸਿਗਨਲ ਬੰਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ।"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 372608d3af15..e091700ed9d0 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -2090,12 +2090,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Odepnij"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Odepnij: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"O aplikacji"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Odbiorcy udostępniania bezpośredniego"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugestie aplikacji"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista aplikacji"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Uruchamiam tryb demo…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Resetuję urządzenie…"</string>
@@ -2250,14 +2247,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad – w lewo"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad – w prawo"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad – środek"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel ustawień typu automatycznego kliknięcia"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Kliknięcie lewym przyciskiem"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Wstrzymaj"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozycja"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Umieszczono pakiet <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> w zasobniku danych RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"wysłano obraz"</string>
@@ -2532,12 +2533,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapy"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacje"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Nie można już rozpoznać Twoich odcisków palców. Skonfiguruj ponownie odblokowywanie odciskiem palca."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Podłączono urządzenie USB przy zablokowanym urządzeniu"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Podłączono urządzenie USB, gdy Android był zablokowany. Aby używać urządzenia USB, najpierw odblokuj Androida, a potem podłącz je ponownie."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Podejrzana aktywność przez USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Sygnał danych z urządzenia USB został wyłączony."</string>
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index dc5275918233..06b43cbd0699 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Liberar guia"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Liberar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Informações do app"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Destinos de compartilhamento direto"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugestões de apps"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de apps"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demonstração…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Redefinindo dispositivo…"</string>
@@ -2249,14 +2246,14 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Botão direcional: para a esquerda"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Botão direcional: para a direita"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Botão direcional: centro"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
- <skip />
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Painel de configurações do tipo de clique automático"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Botão esquerdo"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Clicar com o botão direito do mouse"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Clicar duas vezes"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Arrastar"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Rolar"</string>
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posição"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviou uma imagem"</string>
@@ -2531,12 +2528,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapas"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"As impressões digitais não são mais reconhecidas. Configure o Desbloqueio por impressão digital de novo."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"O dispositivo USB foi conectado com o Android bloqueado"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"O dispositivo USB foi conectado com o Android bloqueado. Para usá-lo, primeiro desbloqueie o Android e, em seguida, reconecte o dispositivo USB."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Atividade suspeita do USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"O indicador de dados USB foi desativado."</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 1418a0b0aac2..f48c3260534a 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Soltar"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Soltar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Info. da app"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Segmentações de partilha direta"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugestões de apps"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de apps"</string>
<string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"A iniciar a demonstração…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"A repor o dispositivo…"</string>
@@ -2251,6 +2248,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Teclado direcional: centrar"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Painel de definições do tipo de clique automático"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clicar com o botão esquerdo do rato"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Clicar com o botão direito do rato"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Clicar duas vezes"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Arrastar"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Deslocar"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posição"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no contentor RESTRITO."</string>
@@ -2527,12 +2528,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicações"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Já não é possível reconhecer as suas impressões digitais. Configure o Desbloqueio por impressão digital novamente."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispositivo USB ligado quando bloqueado"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"O dispositivo USB está ligado quando o Android está bloqueado. Para usar o dispositivo, desbloqueie primeiro o Android e, de seguida, volte a inserir o dispositivo USB para o usar."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Atividade USB suspeita"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"O sinal de dados USB foi desativado."</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index dc5275918233..06b43cbd0699 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Liberar guia"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Liberar <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Informações do app"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Destinos de compartilhamento direto"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugestões de apps"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista de apps"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demonstração…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Redefinindo dispositivo…"</string>
@@ -2249,14 +2246,14 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Botão direcional: para a esquerda"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Botão direcional: para a direita"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Botão direcional: centro"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
- <skip />
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Painel de configurações do tipo de clique automático"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Botão esquerdo"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Clicar com o botão direito do mouse"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Clicar duas vezes"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Arrastar"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Rolar"</string>
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posição"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviou uma imagem"</string>
@@ -2531,12 +2528,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapas"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"As impressões digitais não são mais reconhecidas. Configure o Desbloqueio por impressão digital de novo."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"O dispositivo USB foi conectado com o Android bloqueado"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"O dispositivo USB foi conectado com o Android bloqueado. Para usá-lo, primeiro desbloqueie o Android e, em seguida, reconecte o dispositivo USB."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Atividade suspeita do USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"O indicador de dados USB foi desativado."</string>
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 75369415e322..73f532a7d633 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Anulează fixarea"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Anulează fixarea pentru <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Informații despre aplicație"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Destinații de distribuire directă"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Sugestii de aplicații"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista cu aplicații"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Se pornește demonstrația…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Se resetează dispozitivul…"</string>
@@ -2249,14 +2246,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad stânga"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad dreapta"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centru"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panoul de setări pentru clicul automat"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic stânga"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Întrerupe"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Poziție"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a fost adăugat la grupul RESTRICȚIONATE"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a trimis o imagine"</string>
@@ -2531,12 +2532,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicații"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"E posibil ca amprentele tale să nu mai fie recunoscute. Configurează din nou Deblocarea cu amprenta."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Dispozitiv USB conectat când Android este blocat"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Dispozitivul USB este conectat când dispozitivul Android este blocat. Pentru a folosi dispozitivul, deblochează mai întâi dispozitivul Android, apoi reconectează dispozitivul USB pentru a-l folosi."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Activitate suspectă a dispozitivului USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Semnalul de date USB a fost dezactivat."</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index f35392f3911a..e0e08072482a 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -2090,12 +2090,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Открепить"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Открепить приложение \"<xliff:g id="LABEL">%1$s</xliff:g>\""</string>
<string name="app_info" msgid="6113278084877079851">"О приложении"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Получатели Direct Share"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Рекомендуемые приложения"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Список приложений"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Запуск деморежима…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Сброс данных…"</string>
@@ -2252,6 +2249,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad – по центру"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Панель настроек типа автонажатия"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Нажать левую кнопку"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Нажать правую кнопку"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Нажать дважды"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Перетащить"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Прокрутить"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Приостановить"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Положение"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Приложение \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" помещено в категорию с ограниченным доступом."</string>
@@ -2528,12 +2529,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карты"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Приложения"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Ваши отпечатки больше не распознаются. Настройте разблокировку по отпечатку пальца снова."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Разблокируйте экран"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Устройство Android заблокировано. Чтобы использовать USB-устройство, переподключите его после разблокировки экрана."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Обнаружено подозрительное USB-устройство"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Передача данных по USB отключена."</string>
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index d21df4a7f702..45dd5df8f83f 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -2248,14 +2248,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad වම"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad දකුණ"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad මැද"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ස්වයං ක්ලික් ආකාර සැකසීම් පැනලය"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"වම්පස ක්ලිකය"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"විරාම කරන්න"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ස්ථානය"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> අවහිර කළ බාල්දියට දමා ඇත"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"රූපයක් එව්වා"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 56fa73cba3fd..d67597821b2d 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -75,7 +75,7 @@
<string name="CLIRDefaultOffNextCallOff" msgid="2491576172356463443">"V predvolenom nastavení nie je identifikácia volajúceho obmedzená. Ďalší hovor: Bez obmedzenia"</string>
<string name="page_size_compat_apk_warning" msgid="2982396798449041224">"Táto aplikácia nie je kompatibilná s režimom 16 kB. Nepodarilo sa skontrolovať zarovnanie súboru APK. Táto aplikácia bude spustená v režime kompatibilnom s veľkosťou stránky. Ak chcete dosiahnuť najlepšiu kompatibilitu, znova skompilujte aplikáciu s podporou 16 kB. Viac sa dozviete na &lt;a href=\"https://developer.android.com/16kb-page-size\"&gt;https://developer.android.com/16kb-page-size&lt;/a&gt;."</string>
<string name="page_size_compat_elf_warning" msgid="6753874059564812651">"Táto aplikácia nie je kompatibilná s režimom 16 kB. Nepodarilo sa skontrolovať zarovnanie formátu ELF. Táto aplikácia bude spustená v režime kompatibilnom s veľkosťou stránky. Ak chcete dosiahnuť najlepšiu kompatibilitu, znova skompilujte aplikáciu s podporou 16 kB. Viac sa dozviete na &lt;a href=\"https://developer.android.com/16kb-page-size\"&gt;https://developer.android.com/16kb-page-size&lt;/a&gt;."</string>
- <string name="page_size_compat_apk_and_elf_warning" msgid="7628675779500605390">"Táto aplikácia nie je kompatibilná s režimom 16 kB. Nepodarilo sa skontrolovať zarovnanie súboru APK a formátu ELF. Táto aplikácia bude spustená v režime kompatibilnom s veľkosťou stránky. Ak chcete dosiahnuť najlepšiu kompatibilitu, znova skompilujte aplikáciu s podporou 16 kB. Viac sa dozviete na &lt;a href=\"https://developer.android.com/16kb-page-size\"&gt;https://developer.android.com/16kb-page-size&lt;/a&gt;."</string>
+ <string name="page_size_compat_apk_and_elf_warning" msgid="7628675779500605390">"Táto aplikácia nie je kompatibilná s 16 kB stránkovaním. Kontrola zarovnania v súboroch APK a ELF sa nepodarila. Aplikácia pobeží v režime kompatibility s veľkosťou stránky. Pre optimálnu kompatibilitu aplikáciu prekompilujte s podporou 16 kB stránkovania. Viac sa dozviete na &lt;a href=\"https://developer.android.com/16kb-page-size\"&gt;https://developer.android.com/16kb-page-size&lt;/a&gt;."</string>
<string name="serviceNotProvisioned" msgid="8289333510236766193">"Služba nie je poskytovaná."</string>
<string name="CLIRPermanent" msgid="166443681876381118">"Nemôžete meniť nastavenie identifikácie volajúcich."</string>
<string name="auto_data_switch_title" msgid="3286350716870518297">"Dátové pripojenie bolo prepnuté na operátora <xliff:g id="CARRIERDISPLAY">%s</xliff:g>"</string>
@@ -2090,12 +2090,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Uvoľniť"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Odopnúť <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Informácie o aplikácii"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Ciele priameho zdieľania"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Návrhy aplikácií"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Zoznam aplikácií"</string>
<string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Spúšťa sa ukážka…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Resetuje sa zariadenie…"</string>
@@ -2252,6 +2249,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Stlačiť stredné tlačidlo krížového ovládača"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel nastavení typu automatického kliknutia"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Kliknutie ľavým tlačidlom"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Kliknúť pravým tlačidlom"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dvakrát kliknúť"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Presunúť"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Posúvať"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pozastaviť"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozícia"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balík <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> bol vložený do kontajnera OBMEDZENÉ"</string>
@@ -2528,12 +2529,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapy"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikácie"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaše odtlačky prstov sa už nedajú rozpoznať. Znova nastavte odomknutie odtlačkom prsta."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Zariadenie USB bolo pripojené počas uzamknutia"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Zariadenie USB bolo pripojené, keď bolo zariadenie s Androidom uzamknuté. Ak chcete dané zariadenie používať, najprv odomknite zariadenie s Androidom a potom znova vložte zariadenie USB."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Podozrivá aktivita cez USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Dátový signál cez USB bol deaktivovaný."</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index f44f1e798068..0136f5f8311a 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -278,7 +278,7 @@
<string name="bugreport_option_full_title" msgid="7681035745950045690">"Celotno poročilo"</string>
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"To možnost uporabite za najmanj motenj sistema, če je naprava neodzivna ali prepočasna oziroma ko potrebujete vse razdelke poročila. Ne omogoča vnosa več podrobnosti ali snemanja dodatnih posnetkov zaslona."</string>
<string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Posnetek zaslona za poročilo o napakah bo narejen čez # sekundo.}one{Posnetek zaslona za poročilo o napakah bo narejen čez # sekundo.}two{Posnetek zaslona za poročilo o napakah bo narejen čez # sekundi.}few{Posnetek zaslona za poročilo o napakah bo narejen čez # sekunde.}other{Posnetek zaslona za poročilo o napakah bo narejen čez # sekund.}}"</string>
- <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Posnetek zaslona s poročilom o napakah je izdelan"</string>
+ <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Posnetek zaslona s poročilom je ustvarjen"</string>
<string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Izdelava posnetka zaslona s poročilom o napakah ni uspela"</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Tihi način"</string>
<string name="global_action_silent_mode_on_status" msgid="2371892537738632013">"Zvok je IZKLOPLJEN"</string>
@@ -2090,12 +2090,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Odpenjanje"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Odpni aplikacijo <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Podatki o aplikacijah"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Naslovniki neposrednega deljenja"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Predlagane aplikacije"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Seznam aplikacij"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Začenjanje predstavitve …"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Ponastavljanje naprave …"</string>
@@ -2252,6 +2249,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Smerni gumb sredina"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Podokno z nastavitvami vrste samodejnega klika"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Levi klik"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Desni klik"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Dvoklik"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Vlečenje"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Drsenje"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Začasna zaustavitev"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Položaj"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je bil dodan v segment OMEJENO"</string>
@@ -2528,12 +2529,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Zemljevidi"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaših prstnih odtisov ni več mogoče prepoznati. Znova nastavite odklepanje s prstnim odtisom."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Naprava USB je bila priključena pri zaklenjenem Androidu"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Naprava USB je bila priključena pri zaklenjenem Androidu. Če želite uporabljati napravo, najprej odklenite Android in nato znova vstavite napravo USB, da jo boste lahko uporabljali."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Sumljiva dejavnost USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Podatkovni signal USB je bil onemogočen."</string>
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 3739b53b32ac..37aa8bf8108f 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Zhgozhdo"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Zhgozhdoje <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Informacioni mbi aplikacionin"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Objektivat e ndarjes së drejtpërdrejtë"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Aplikacionet e sugjeruara"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Lista e aplikacioneve"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Po nis demonstrimin..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Po rivendos pajisjen…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Majtas në bllokun e drejtimit"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Djathtas në bllokun e drejtimit"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Qendra e bllokut të drejtimit"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Paneli i cilësimeve për llojin e klikimit automatik"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Klikimi majtas"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Vendos në pauzë"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicioni"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> është vendosur në grupin E KUFIZUAR"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"dërgoi një imazh"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacionet"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Gjurmët e tua të gishtave nuk mund të njihen më. Konfiguro përsëri \"Shkyçjen me gjurmën e gishtit\"."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Pajisja USB është e futur kur është e kyçur"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Pajisja USB është e futur kur Android është i kyçur. Për ta përdorur pajisjen, shkyç fillimisht Android dhe më pas fut përsëri pajisjen USB për ta përdorur."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Aktivitet i dyshimtë i USB-së"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Sinjali i të dhënave të USB-së është çaktivizuar."</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 009c27bcbb25..a4f0e556a7c7 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -2089,12 +2089,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Откачи"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Откачи апликацију <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Информације о апликацији"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Циљеви директног дељења"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Предлози апликација"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Листа апликација"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Покрећемо демонстрацију..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Ресетујемо уређај..."</string>
@@ -2251,6 +2248,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"центар на D-pad-у"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Окно са подешавањима типа аутоматског клика"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Леви клик"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"Кликните десним тастером"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"Двапут кликните"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"Превуците"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"Скролујте"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Паузирај"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Позиција"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> је додат у сегмент ОГРАНИЧЕНО"</string>
@@ -2527,12 +2528,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Мапе"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Апликације"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Отисци прстију више не могу да се препознају. Поново подесите откључавање отиском прста."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB уређај је прикључен када је Android закључан"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB уређај је прикључен када је Android закључан. Да бисте користили уређај, прво откључајте Android, па поново убаците USB уређај да бисте га користили."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Сумњива USB активност"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Сигнал за пренос података са USB-а је онемогућен."</string>
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 442763ae3188..e56097f06120 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Lossa"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Lossa <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Appinformation"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Personer/grupper att dela direkt med"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Appförslag"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Applista"</string>
<string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Demo startas …"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Enheten återställs …"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Styrkors, vänster"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Styrkors, höger"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Styrkors, mitten"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Inställningspanel för typ av automatiskt klick"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Vänsterklick"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausa"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> har placerats i hinken RESTRICTED"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"har skickat en bild"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Appar"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Det går inte längre att känna igen dina fingeravtryck. Ställ in fingeravtryckslås igen."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB-enhet ansluten när enheten är låst"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB-enheten är ansluten när Android är låst. Om du vill använda enheten måste du först låsa upp Android och sedan sätta i USB-enheten igen."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Misstänkt USB-aktivitet"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB-datasignalen har inaktiverats."</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 8153eb02d625..03a581a362ba 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Bandua"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Bandua <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Maelezo ya programu"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Chaguo za kutuma maudhui moja kwa moja"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Mapendekezo ya programu"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Orodha ya programu"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Inaanzisha onyesho..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Inaweka upya kifaa..."</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Kitufe cha kushoto cha Dpad"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Kitufe cha kulia cha Dpad"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Kitufe cha katikati cha Dpad"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Kidirisha cha mipangilio ya aina ya kubofya kiotomatiki"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Bofya kushoto"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Sitisha"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Nafasi"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> kimewekwa katika kikundi KILICHODHIBITIWA"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"alituma picha"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Ramani"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Programu"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Alama zako za vidole hazitambuliki tena. Weka tena mipangilio ya Kufungua kwa Alama ya Kidole."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Kifaa cha USB kimechomekwa wakati Android imefungwa"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Kifaa cha USB huchomekwa wakati Android imefungwa. Tafadhali fungua kwanza Android kisha uweke upya kifaa cha USB ili ukitumie."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Shughuli za USB za kutilia shaka"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Kiashiria cha data cha USB kimezimwa."</string>
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 94168418ff4d..16c021e8c807 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"பின்னை அகற்று"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ஐப் பின் நீக்கு"</string>
<string name="app_info" msgid="6113278084877079851">"ஆப்ஸ் தகவல்"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"நேரடிப் பகிர்வு இலக்குகள்"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ஆப்ஸ் பரிந்துரைகள்"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ஆப்ஸ் பட்டியல்"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"டெமோவைத் தொடங்குகிறது…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"சாதனத்தை மீட்டமைக்கிறது…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"இடது திசை காட்டும் பட்டன்"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"வலது திசை காட்டும் பட்டன்"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"மையப் பகுதியைக் காட்டும் பட்டன்"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ஆட்டோ கிளிக் வகை அமைப்புகள் பேனல்"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"இடது கிளிக்"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"இடைநிறுத்து"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"நிலை"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> என்பதை வரம்பிடப்பட்ட பக்கெட்திற்குள் சேர்க்கப்பட்டது"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"படம் அனுப்பப்பட்டது"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ஆப்ஸ்"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"உங்கள் கைரேகைகளை இனி அடையாளம் காண முடியாது. கைரேகை அன்லாக் அம்சத்தை மீண்டும் அமையுங்கள்."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"பூட்டப்பட்டிருக்கும்போது USB சாதனம் செருகப்பட்டது"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android பூட்டப்பட்டிருக்கும்போது USB சாதனம் செருகப்பட்டது. சாதனத்தைப் பயன்படுத்த, முதலில் Androidடைத் திறக்கவும், பின்னர் USB சாதனத்தைப் பயன்படுத்த அதை மீண்டும் செருகவும்."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"சந்தேகத்திற்குரிய USB செயல்பாடு"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB தரவு சிக்னல் முடக்கப்பட்டுள்ளது."</string>
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 4bb85f72c1d8..c5656187776e 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"అన్‌‌పిన్‌ ‌చేయి"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ను అన్‌పిన్ చేయి"</string>
<string name="app_info" msgid="6113278084877079851">"యాప్ సమాచారం"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"టార్గెట్‌లను నేరుగా షేర్ చేయడం"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"యాప్ సూచనలు"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"యాప్ లిస్ట్"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"డెమోను ప్రారంభిస్తోంది..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"పరికరాన్ని రీసెట్ చేస్తోంది..."</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ఎడమవైపున"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad కుడివైపున"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"DPad మధ్యన"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ఆటో-క్లిక్ టైప్ సెట్టింగ్‌ల ప్యానెల్"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ఎడమ క్లిక్"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"పాజ్ చేయండి"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"స్థానం"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> పరిమితం చేయబడిన బకెట్‌లో ఉంచబడింది"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ఇమేజ్‌ను పంపారు"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"అప్లికేషన్‌లు"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"మీ వేలిముద్రలను ఇకపై గుర్తించడం సాధ్యం కాదు. వేలిముద్ర అన్‌లాక్‌ను మళ్లీ సెటప్ చేయండి."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"లాక్ చేసి ఉన్నప్పుడు USB డివైజ్ ప్లగ్-ఇన్ అయి ఉంది"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android లాక్ అయినప్పుడు USB డివైజ్ ప్లగ్-ఇన్ చేయబడింది. డివైజ్‌ను ఉపయోగించడానికి, దయచేసి ముందుగా Androidను అన్‌లాక్ చేసి, ఆ తర్వాత, USB డివైజ్‌ను ఉపయోగించడానికి దాన్ని మళ్లీ ఇన్‌సర్ట్ చేయండి."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"USB యాక్టివిటీ అనుమానాస్పదంగా ఉంది"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB డేటా సిగ్నల్ డిజేబుల్ అయింది."</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 26084553817a..f4a3651bc5b7 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"เลิกปักหมุด"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"เลิกปักหมุด <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"ข้อมูลแอป"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"เป้าหมายการแชร์โดยตรง"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"คำแนะนำเกี่ยวกับแอป"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"รายการแอป"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"กำลังเริ่มการสาธิต…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"กำลังรีเซ็ตอุปกรณ์…"</string>
@@ -2250,6 +2247,10 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad กึ่งกลาง"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"แผงการตั้งค่าประเภทการคลิกอัตโนมัติ"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"คลิกซ้าย"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"คลิกขวา"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"ดับเบิลคลิก"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"ลาก"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"เลื่อน"</string>
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"หยุดชั่วคราว"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"วางตำแหน่ง"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"ใส่ <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ในที่เก็บข้อมูลที่ถูกจำกัดแล้ว"</string>
@@ -2526,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"แผนที่"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"แอปพลิเคชัน"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ระบบจะไม่จดจำลายนิ้วมือของคุณอีกต่อไป ตั้งค่าการปลดล็อกด้วยลายนิ้วมืออีกครั้ง"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"เสียบอุปกรณ์ USB ขณะล็อกอยู่"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"คุณเสียบอุปกรณ์ USB ขณะ Android ล็อกอยู่ หากต้องการใช้อุปกรณ์ โปรดปลดล็อก Android ก่อนแล้วจึงเสียบอุปกรณ์ USB อีกครั้งเพื่อใช้งาน"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"กิจกรรม USB ที่น่าสงสัย"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"สัญญาณข้อมูล USB ปิดอยู่"</string>
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 482d7fdbb621..8782970c0aed 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"I-unpin"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"I-unpin ang <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Impormasyon ng app"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Mga target ng direktang pagbabahagi"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Mga iminumungkahing app"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Listahan ng app"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Sinisimulan ang demo…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Nire-reset ang device…"</string>
@@ -2250,6 +2247,14 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Center"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel ng mga setting ng uri ng autoclick"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Mag-left click"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
+ <skip />
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"I-pause"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posisyon"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Inilagay ang <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> sa PINAGHIHIGPITANG bucket"</string>
@@ -2526,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mga Mapa"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Mga Application"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Hindi na makikilala ang iyong mga fingerprint. I-set up ulit ang Pag-unlock Gamit ang Fingerprint."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Nakasaksak ang USB device kapag naka-lock"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Nakasaksak ang USB device kapag naka-lock ang Android. Para magamit ang device, paki-unlock muna ang Android at pagkatapos ay isaksak ulit ang USB device para magamit ito."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Kahina-hinalang aktibidad sa USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Na-disable ang data signal ng USB."</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index cb65ad72782d..7048a83b24b2 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Sabitlemeyi kaldır"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> uygulamasının sabitlemesini kaldır"</string>
<string name="app_info" msgid="6113278084877079851">"Uygulama bilgileri"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Doğrudan paylaşım hedefleri"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Önerilen uygulamalar"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Uygulama listesi"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Demo başlatılıyor…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Cihaz sıfırlanıyor…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Sol"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Sağ"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Orta"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Otomatik tıklama türü ayarları paneli"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Sol tıklama"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Duraklatma"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Konum"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> KISITLANMIŞ gruba yerleştirildi"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"bir resim gönderildi"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Haritalar"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Uygulamalar"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Parmak izleriniz artık tanınamıyor. Parmak İzi Kilidi\'ni tekrar kurun."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB cihazı, Android kilitliyken takıldı"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB cihazı, Android kilitliyken takıldı. Cihazı kullanmak için lütfen önce Android\'in kilidini açın, ardından USB cihazını yeniden takın."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Şüpheli USB etkinliği"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB veri sinyali devre dışı bırakıldı."</string>
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 341aff5d70b8..a36699013b33 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -2250,14 +2250,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Кнопка \"вліво\" панелі керування"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Кнопка \"вправо\" панелі керування"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Центральна кнопка панелі керування"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Панель налаштувань типу автоматичного натискання"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Натиснути лівою кнопкою миші"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Призупинити"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Змінити позицію"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" додано в сегмент з обмеженнями"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"надіслано зображення"</string>
@@ -2449,7 +2453,7 @@
<string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Функція Dual Screen недоступна, оскільки телефон сильно нагрівається"</string>
<string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Функція Dual Screen недоступна"</string>
<string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Функція Dual Screen недоступна, оскільки ввімкнено режим енергозбереження. Її можна вимкнути в налаштуваннях."</string>
- <string name="device_state_notification_settings_button" msgid="691937505741872749">"Перейти до налаштувань"</string>
+ <string name="device_state_notification_settings_button" msgid="691937505741872749">"Відкрити налаштування"</string>
<string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Вимкнути"</string>
<string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Клавіатуру \"<xliff:g id="DEVICE_NAME">%s</xliff:g>\" налаштовано"</string>
<string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Вибрано розкладку клавіатури \"<xliff:g id="LAYOUT_1">%s</xliff:g>\". Натисніть, щоб змінити."</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index ec832e67aa2f..b725a126e7cd 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"پن ہٹائیں"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> سے پن ہٹائیں"</string>
<string name="app_info" msgid="6113278084877079851">"ایپ کی معلومات"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"براہ راست اشتراک کے اہداف"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"ایپ کی تجاویز"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"ایپ کی فہرست"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"ڈیمو شروع ہو رہا ہے…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"آلہ ری سیٹ ہو رہا ہے…"</string>
@@ -2248,14 +2245,14 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"‏Dpad بائیں کریں"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"‏Dpad دائیں کریں"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"‏Dpad سینٹر"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
- <skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
- <skip />
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"خودکار کلک کی قسم کی ترتیبات کا پینل"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"بایاں کلک کریں"</string>
+ <string name="accessibility_autoclick_right_click" msgid="4353495816526181293">"دایاں کلک کریں"</string>
+ <string name="accessibility_autoclick_double_click" msgid="2103826849116176478">"دو بار کلک کریں"</string>
+ <string name="accessibility_autoclick_drag" msgid="1499559489796843224">"گھسیٹیں"</string>
+ <string name="accessibility_autoclick_scroll" msgid="3499385943728726933">"اسکرول کریں"</string>
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"موقوف کریں"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"پوزیشن"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> کو پابند کردہ بکٹ میں رکھ دیا گیا ہے"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ایک تصویر بھیجی"</string>
@@ -2530,12 +2527,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"نقشے"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ایپلیکیشنز"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"آپ کے فنگر پرنٹس کو مزید پہچانا نہیں جا سکتا۔ فنگر پرنٹ اَن لاک کو دوبارہ سیٹ اپ کریں۔"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"‏مقفل ہونے پر USB آلہ پلگ ان ہوتا ہے"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"‏‫Android کے مقفل ہونے پر USB آلہ پلگ ان ہوتا ہے۔ آلہ استعمال کرنے کے لیے، براہ کرم پہلے Android کو غیر مقفل کریں اور پھر اسے استعمال کرنے کے لیے USB آلہ کو دوبارہ داخل کریں۔"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"‏‫USB کی مشکوک سرگرمی"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"‏‫USB ڈیٹا سگنل کو غیر فعال کر دیا گیا ہے۔"</string>
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index e764fc293124..a83466937016 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Yechib olish"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Yechib olish: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Ilova haqida"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Direct Share nishonlari"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Ilova takliflari"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Ilovalar roʻyxati"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Demo boshlanmoqda…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Qurilma asl holatga qaytarilmoqda…"</string>
@@ -2250,6 +2247,14 @@
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad – markazga"</string>
<string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Avtomatik klik turi sozlamalari paneli"</string>
<string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Chap klik"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
+ <skip />
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
+ <skip />
<string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauza"</string>
<string name="accessibility_autoclick_position" msgid="2933660969907663545">"Joylashuvi"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> cheklangan turkumga joylandi"</string>
@@ -2526,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Xaritalar"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Ilovalar"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Barmoq izlaringiz endi tanilmaydi. Barmoq izi bilan ochishni qayta sozlang."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Qulflanganida USB qurilma quvvat manbasiga ulandi"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Android qulflanganda USB qurilma quvvat manbasiga ulandi. Qurilmani ishlatish uchun avval Android qulfini oching va keyin uni ishlatish uchun USB qurilmani qayta kiriting."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Shubhali USB faoliyati"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB maʼlumotlar signali faolsizlantirilgan."</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index cd89cfdaa017..c07ff1d0e040 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Bỏ ghim"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Bỏ ghim <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Thông tin ứng dụng"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Mục tiêu chia sẻ trực tiếp"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Ứng dụng đề xuất"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Danh sách ứng dụng"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Đang bắt đầu bản trình diễn..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Đang đặt lại thiết bị..."</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Chuyển sang trái bằng bàn phím di chuyển"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Chuyển sang phải bằng bàn phím di chuyển"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Căn giữa bằng bàn phím di chuyển"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Bảng cài đặt loại tự động nhấp"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Nhấp chuột trái"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Tạm dừng"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Vị trí"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Đã đưa <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> vào bộ chứa BỊ HẠN CHẾ"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"đã gửi hình ảnh"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Bản đồ"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Ứng dụng"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Hệ thống không nhận dạng được vân tay của bạn. Hãy thiết lập lại tính năng Mở khoá bằng vân tay."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Thiết bị USB được cắm khi thiết bị Android đang khoá"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Thiết bị USB đã được cắm khi thiết bị Android đang khoá. Để sử dụng thiết bị USB, trước tiên, hãy mở khoá thiết bị Android rồi cắm lại thiết bị USB."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Hoạt động đáng ngờ liên quan đến USB"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Tín hiệu dữ liệu qua USB đã bị tắt."</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index d5aa069c6e8b..c746d3c61e33 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1409,7 +1409,7 @@
<string name="carrier_app_notification_title" msgid="5815477368072060250">"已插入新 SIM 卡"</string>
<string name="carrier_app_notification_text" msgid="6567057546341958637">"点按即可进行设置"</string>
<string name="time_zone_change_notification_title" msgid="5232503069219193218">"您的时区已更改"</string>
- <string name="time_zone_change_notification_body" msgid="6135793674904665585">"您现在位于<xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g> (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>)"</string>
+ <string name="time_zone_change_notification_body" msgid="6135793674904665585">"您当前所处的时区是<xliff:g id="TIME_ZONE_DISPLAY_NAME">%1$s</xliff:g> (<xliff:g id="TIME_ZONE_OFFSET">%2$s</xliff:g>)"</string>
<string name="time_picker_dialog_title" msgid="9053376764985220821">"设置时间"</string>
<string name="date_picker_dialog_title" msgid="5030520449243071926">"设置日期"</string>
<string name="date_time_set" msgid="4603445265164486816">"设置"</string>
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"取消置顶"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"取消置顶<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"应用信息"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"直接分享目标"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"应用建议"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"应用列表"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"正在启动演示模式…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"正在重置设备…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"向左方向键"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"向右方向键"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"方向键中心"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"自动点击类型设置面板"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"点击鼠标左键"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"暂停"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"位置"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已被放入受限存储分区"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"发送了一张图片"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"地图"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"应用"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"系统无法再识别您的指纹。请重新设置“指纹解锁”功能。"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"锁定时插入了 USB 设备"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"在 Android 设备锁定时插入了 USB 设备。如需使用 USB 设备,请先解锁 Android 设备,然后重新插入 USB 设备才能使用 USB 设备。"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"可疑的 USB 活动"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB 数据信号已停用。"</string>
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 91c852146be7..c6b952c99b50 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"取消固定"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"取消將<xliff:g id="LABEL">%1$s</xliff:g>置頂"</string>
<string name="app_info" msgid="6113278084877079851">"應用程式資料"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"直接分享對象"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"應用程式建議"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"應用程式清單"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"正在開始示範…"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"正在重設裝置…"</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"十字鍵向左鍵"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"十字鍵向右鍵"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"十字鍵中心鍵"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"自動點擊類型設定面板"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"按一下左鍵"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"暫停"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"位置"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已納入受限制的儲存區"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"已傳送圖片"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"地圖"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"應用程式"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"無法再辨識你的指紋。請重新設定「指紋解鎖」功能。"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"USB 裝置插入時已鎖定"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"USB 裝置插入時,Android 已鎖定。如要使用裝置,請先解鎖 Android,然後重新插入 USB 裝置,才能使用。"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"可疑的 USB 活動"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB 資料訊號已停用。"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 1a71fedeef65..ca0402a1fe2c 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"取消固定"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"將「<xliff:g id="LABEL">%1$s</xliff:g>」取消固定"</string>
<string name="app_info" msgid="6113278084877079851">"應用程式資訊"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"直接分享目標"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"應用程式建議"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"應用程式清單"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"正在啟動示範模式..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"正在重設裝置..."</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad 向左移"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad 向右移"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad 置中"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"自動點選類型設定面板"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"按滑鼠左鍵"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"暫停"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"位置"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"已將「<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>」移入受限制的值區"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"傳送了一張圖片"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"地圖"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"應用程式"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"系統無法再辨識你的指紋,請重新設定「指紋解鎖」。"</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"在鎖定時插入 USB 裝置"</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"在 Android 裝置鎖定時插入 USB 裝置。如要使用 USB 裝置,請先解鎖 Android 裝置再重新插入。"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"可疑的 USB 活動"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"USB 資料信號已停用。"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 3eb20d6da55b..96d6b57ffb4e 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -2088,12 +2088,9 @@
<string name="unpin_target" msgid="3963318576590204447">"Susa ukuphina"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Susa ukuphina ku-<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="app_info" msgid="6113278084877079851">"Ulwazi nge-app"</string>
- <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) -->
- <skip />
- <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) -->
- <skip />
- <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) -->
- <skip />
+ <string name="shortcut_group_a11y_title" msgid="2992150163811583865">"Qondisa ofuna ukwabelana nabo"</string>
+ <string name="suggested_apps_group_a11y_title" msgid="2804876567839501831">"Iziphakamiso ze-app"</string>
+ <string name="all_apps_group_a11y_title" msgid="7020352520224108745">"Uhlu lwama-app"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Iqalisa i-demo..."</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Isetha kabusha idivayisi..."</string>
@@ -2248,14 +2245,18 @@
<string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Ngakwesokunxele se-Dpad"</string>
<string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Ngakwesokudla se-Dpad"</string>
<string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Isikhungo se-Dpad"</string>
- <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) -->
+ <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Iphaneli yamasethingi ohlobo lokuchofoza ngokuzenzekelayo"</string>
+ <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Chofoza kwesokunxele"</string>
+ <!-- no translation found for accessibility_autoclick_right_click (4353495816526181293) -->
<skip />
- <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) -->
+ <!-- no translation found for accessibility_autoclick_double_click (2103826849116176478) -->
<skip />
- <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) -->
+ <!-- no translation found for accessibility_autoclick_drag (1499559489796843224) -->
<skip />
- <!-- no translation found for accessibility_autoclick_position (2933660969907663545) -->
+ <!-- no translation found for accessibility_autoclick_scroll (3499385943728726933) -->
<skip />
+ <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Misa"</string>
+ <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Indawo"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"I-<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ifakwe kubhakede LOKUKHAWULELWE"</string>
<string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
<string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"uthumele isithombe"</string>
@@ -2530,12 +2531,8 @@
<string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Amamephu"</string>
<string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Ama-application"</string>
<string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Isigxivizo somunwe wakho ngeke zisakwazi ukubonwa. Setha Ukuvula Ngesigxivizo Somunwe futhi."</string>
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) -->
- <skip />
- <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) -->
- <skip />
- <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) -->
- <skip />
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_title" msgid="468577168569874967">"Idivayisi ye-USB iyapulagwa uma i-Android ikhiyiwe."</string>
+ <string name="usb_apm_usb_plugged_in_when_locked_notification_text" msgid="6695268246267993166">"Idivayisi ye-USB iyapulagwa uma i-Android ikhiyiwe. Ukuze usebenzisa idivayisi, sicela uvule i-Android kuqala bese uphinde ufake idivayisi ye-USB ukuze uyisebenzise."</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_title" msgid="3461195995882871461">"Umsebenzi we-USB osolisayo"</string>
+ <string name="usb_apm_usb_suspicious_activity_notification_text" msgid="6537085605929303187">"Isignali yedatha ye-USB ivaliwe."</string>
</resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 595160ec9f66..e9d87e4b5f5b 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -431,15 +431,18 @@
<!-- The minimum height of the notification content (even when there's only one line of text) -->
<dimen name="notification_2025_content_min_height">40dp</dimen>
- <!-- Height of a headerless notification with one or two lines -->
- <!-- 16 * 2 (margins) + 40 (min content height) = 72 (notification) -->
+ <!-- Max height of a collapsed (headerless) notification with a summarization -->
+ <dimen name="notification_collapsed_height_with_summarization">156dp</dimen>
+
+ <!-- Max height of a collapsed (headerless) notification with one or two lines -->
+ <!-- 16 * 2 (margins) + 48 (min content height) = 72 (notification) -->
<dimen name="notification_2025_min_height">72dp</dimen>
<!-- Height of a headerless notification with one line -->
<!-- 16 * 2 (margins) + 24 (1 line) = 56 (notification) -->
<dimen name="notification_headerless_min_height">56dp</dimen>
- <!-- Height of a small two-line notification -->
+ <!-- Max height of a collapsed two-line notification -->
<!-- 20 * 2 (margins) + 24 * 2 (2 lines) = 88 (notification) -->
<dimen name="notification_min_height">88dp</dimen>
diff --git a/core/res/res/values/ids.xml b/core/res/res/values/ids.xml
index 3b39a65b6795..5b5ef0954098 100644
--- a/core/res/res/values/ids.xml
+++ b/core/res/res/values/ids.xml
@@ -157,6 +157,9 @@
<!-- Accessibility action identifier for {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction#ACTION_CONTEXT_CLICK}. -->
<item type="id" name="accessibilityActionContextClick" />
+ <!-- Accessibility action identifier for {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction#ACTION_SET_EXTENDED_SELECTION}. -->
+ <item type="id" name="accessibilityActionSetExtendedSelection" />
+
<item type="id" name="remote_input_tag" />
<item type="id" name="pending_intent_tag" />
<item type="id" name="remote_checked_change_listener_tag" />
diff --git a/core/res/res/values/public-staging.xml b/core/res/res/values/public-staging.xml
index 2d411d0268b3..e3137e2e77e3 100644
--- a/core/res/res/values/public-staging.xml
+++ b/core/res/res/values/public-staging.xml
@@ -129,6 +129,8 @@
<staging-public-group type="id" first-id="0x01b20000">
<!-- @FlaggedApi(android.appwidget.flags.Flags.FLAG_ENGAGEMENT_METRICS) -->
<public name="remoteViewsMetricsId"/>
+ <!-- @FlaggedApi("android.view.accessibility.a11y_selection_api") -->
+ <public name="accessibilityActionSetExtendedSelection"/>
</staging-public-group>
<staging-public-group type="style" first-id="0x01b10000">
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index cc2897a2779e..da6fb3b58f21 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -5899,6 +5899,7 @@
<java-symbol type="array" name="config_notificationDefaultUnsupportedAdjustments" />
<java-symbol type="drawable" name="ic_notification_summarization" />
+ <java-symbol type="dimen" name="notification_collapsed_height_with_summarization" />
<!-- Advanced Protection Service USB feature -->
<java-symbol type="string" name="usb_apm_usb_plugged_in_when_locked_notification_title" />
diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java
index ca6ad6fae46e..f89e4416ce78 100644
--- a/core/tests/coretests/src/android/app/NotificationTest.java
+++ b/core/tests/coretests/src/android/app/NotificationTest.java
@@ -2532,6 +2532,46 @@ public class NotificationTest {
@Test
@EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+ public void progressStyle_addProgressPoint_dropsZeroPoints() {
+ // GIVEN
+ final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
+ // Points should not be a negative integer.
+ progressStyle
+ .addProgressPoint(new Notification.ProgressStyle.Point(0));
+
+ // THEN
+ assertThat(progressStyle.getProgressPoints()).isEmpty();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+ public void progressStyle_setProgressPoint_dropsZeroPoints() {
+ // GIVEN
+ final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
+ // Points should not be a negative integer.
+ progressStyle
+ .setProgressPoints(List.of(new Notification.ProgressStyle.Point(0)));
+
+ // THEN
+ assertThat(progressStyle.getProgressPoints()).isEmpty();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
+ public void progressStyle_createProgressModel_ignoresPointsAtMax() {
+ // GIVEN
+ final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
+ progressStyle.addProgressSegment(new Notification.ProgressStyle.Segment(100));
+ // Points should not larger than progress maximum.
+ progressStyle
+ .addProgressPoint(new Notification.ProgressStyle.Point(100));
+
+ // THEN
+ assertThat(progressStyle.createProgressModel(Color.BLUE, Color.RED).getPoints()).isEmpty();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_API_RICH_ONGOING)
public void progressStyle_createProgressModel_ignoresPointsExceedingMax() {
// GIVEN
final Notification.ProgressStyle progressStyle = new Notification.ProgressStyle();
@@ -2573,14 +2613,14 @@ public class NotificationTest {
// THEN
assertThat(progressStyle.createProgressModel(defaultProgressColor, backgroundColor)
.getPoints()).isEqualTo(
- List.of(new Notification.ProgressStyle.Point(0)
- .setColor(expectedProgressColor),
- new Notification.ProgressStyle.Point(20)
+ List.of(new Notification.ProgressStyle.Point(20)
.setColor(expectedProgressColor),
new Notification.ProgressStyle.Point(50)
.setColor(expectedProgressColor),
new Notification.ProgressStyle.Point(70)
- .setColor(expectedProgressColor)
+ .setColor(expectedProgressColor),
+ new Notification.ProgressStyle.Point(80)
+ .setColor(expectedProgressColor)
)
);
}
diff --git a/core/tests/coretests/src/android/hardware/input/InputFlagsTest.java b/core/tests/coretests/src/android/hardware/input/InputFlagsTest.java
deleted file mode 100644
index b4f1deebd796..000000000000
--- a/core/tests/coretests/src/android/hardware/input/InputFlagsTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.input;
-
-import static com.android.hardware.input.Flags.keyboardA11yStickyKeysFlag;
-import static com.android.hardware.input.Flags.keyboardLayoutPreviewFlag;
-
-import android.platform.test.annotations.Presubmit;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Tests for {@link com.android.hardware.input.Flags}
- *
- * Build/Install/Run:
- * atest FrameworksCoreTests:InputFlagsTest
- */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-@Presubmit
-public class InputFlagsTest {
-
- /**
- * Test that the flags work
- */
- @Test
- public void testFlags() {
- // No crash when accessing the flag.
- keyboardLayoutPreviewFlag();
- keyboardA11yStickyKeysFlag();
- }
-}
-
diff --git a/core/tests/coretests/src/android/hardware/input/OWNERS b/core/tests/coretests/src/android/hardware/input/OWNERS
deleted file mode 100644
index 3f8a6022e9eb..000000000000
--- a/core/tests/coretests/src/android/hardware/input/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-include /core/java/android/hardware/input/OWNERS
-
diff --git a/core/tests/coretests/src/android/view/WindowManagerTests.java b/core/tests/coretests/src/android/view/WindowManagerTests.java
index 211d768dde93..b32aa4670a9d 100644
--- a/core/tests/coretests/src/android/view/WindowManagerTests.java
+++ b/core/tests/coretests/src/android/view/WindowManagerTests.java
@@ -16,9 +16,6 @@
package android.view;
-import static com.android.window.flags.Flags.FLAG_ENABLE_WM_EXTENSIONS_FOR_ALL_FLAG;
-
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
@@ -47,19 +44,8 @@ public class WindowManagerTests {
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Test
- public void testHasWindowExtensionsEnabled_flagDisabled() {
- mSetFlagsRule.disableFlags(FLAG_ENABLE_WM_EXTENSIONS_FOR_ALL_FLAG);
-
- // Before FLAG_ENABLE_WM_EXTENSIONS_FOR_ALL_FLAG, Extensions are always bundled with AE.
- assertEquals(isActivityEmbeddingEnableForAll(),
- WindowManager.hasWindowExtensionsEnabled());
- }
-
- @Test
- public void testHasWindowExtensionsEnabled_flagEnabled() {
- mSetFlagsRule.enableFlags(FLAG_ENABLE_WM_EXTENSIONS_FOR_ALL_FLAG);
-
- // Extensions should be enabled on all devices.
+ public void testHasWindowExtensionsEnabled() {
+ // Extensions should be enabled on all phones/tablets.
assertTrue(WindowManager.hasWindowExtensionsEnabled());
}
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
index 3b0eab4661ff..cc5c6aff4232 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
@@ -46,7 +46,7 @@ public class AccessibilityNodeInfoTest {
// The number of fields tested in the corresponding CTS AccessibilityNodeInfoTest:
// See fullyPopulateAccessibilityNodeInfo, assertEqualsAccessibilityNodeInfo,
// and assertAccessibilityNodeInfoCleared in that class.
- private static final int NUM_MARSHALLED_PROPERTIES = 47;
+ private static final int NUM_MARSHALLED_PROPERTIES = 48;
/**
* The number of properties that are purposely not marshalled
diff --git a/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java b/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
index b42bcee77c67..5f89f9c14793 100644
--- a/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
+++ b/core/tests/coretests/src/android/view/contentcapture/MainContentCaptureSessionTest.java
@@ -36,11 +36,15 @@ import android.content.pm.ParceledListSlice;
import android.graphics.Insets;
import android.os.Handler;
import android.os.RemoteException;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.SparseArray;
import android.view.View;
import android.view.autofill.AutofillId;
+import android.view.contentcapture.flags.Flags;
import android.view.contentprotection.ContentProtectionEventProcessor;
import androidx.test.core.app.ApplicationProvider;
@@ -90,6 +94,8 @@ public class MainContentCaptureSessionTest {
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
@Mock private IContentCaptureManager mMockSystemServerInterface;
@Mock private ContentProtectionEventProcessor mMockContentProtectionEventProcessor;
@@ -407,6 +413,7 @@ public class MainContentCaptureSessionTest {
}
@Test
+ @DisableFlags(Flags.FLAG_FLUSH_AFTER_EACH_FRAME)
@SuppressWarnings("GuardedBy")
public void notifyContentCaptureEvents_started_ContentCaptureEnabled_ProtectionEnabled()
throws RemoteException {
@@ -434,6 +441,34 @@ public class MainContentCaptureSessionTest {
}
@Test
+ @EnableFlags(Flags.FLAG_FLUSH_AFTER_EACH_FRAME)
+ @SuppressWarnings("GuardedBy")
+ public void notifyContentCaptureEvents_started_ContentCaptureEnabled_ProtectionEnabled_Flush()
+ throws RemoteException {
+ ContentCaptureOptions options =
+ createOptions(
+ /* enableContentCaptureReceiver= */ true,
+ /* enableContentProtectionReceiver= */ true);
+ MainContentCaptureSession session = createSession(options);
+ session.mDirectServiceInterface = mMockContentCaptureDirectManager;
+
+ session.onSessionStarted(0x2, null);
+ // Override the processor for interaction verification.
+ session.mContentProtectionEventProcessor = mMockContentProtectionEventProcessor;
+ notifyContentCaptureEvents(session);
+ mTestableLooper.processAllMessages();
+
+ // Force flush will happen twice.
+ verify(mMockContentCaptureDirectManager, times(1))
+ .sendEvents(any(), eq(FLUSH_REASON_VIEW_TREE_APPEARING), any());
+ verify(mMockContentCaptureDirectManager, times(1))
+ .sendEvents(any(), eq(FLUSH_REASON_VIEW_TREE_APPEARED), any());
+ // 5 view events + 2 view tree events + 1 flush event
+ verify(mMockContentProtectionEventProcessor, times(8)).processEvent(any());
+ assertThat(session.mEvents).isEmpty();
+ }
+
+ @Test
public void notifyViewAppearedBelowMaximumBufferSize() throws RemoteException {
ContentCaptureOptions options =
createOptions(
diff --git a/core/tests/coretests/src/android/window/ConfigurationDispatcherTest.kt b/core/tests/coretests/src/android/window/ConfigurationDispatcherTest.kt
new file mode 100644
index 000000000000..e8e8a2e335f2
--- /dev/null
+++ b/core/tests/coretests/src/android/window/ConfigurationDispatcherTest.kt
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.window
+
+import android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW
+import android.content.ContextWrapper
+import android.content.res.Configuration
+import android.content.res.Configuration.ORIENTATION_PORTRAIT
+import android.platform.test.annotations.Presubmit
+import android.view.Display.DEFAULT_DISPLAY
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Test to verify [ConfigurationDispatcher]
+ *
+ * Build/Install/Run:
+ * atest FrameworksCoreTests:ConfigurationDispatcherTest
+ */
+@SmallTest
+@Presubmit
+@RunWith(Parameterized::class)
+class ConfigurationDispatcherTest(private val shouldReportPrivateChanges: Boolean) {
+
+ /**
+ * Verifies [ConfigurationDispatcher.shouldReportPrivateChanges].
+ */
+ @Test
+ fun testConfigurationDispatcher() {
+ val receiver = TestConfigurationReceiver(shouldReportPrivateChanges)
+ val config = Configuration().apply {
+ orientation = ORIENTATION_PORTRAIT
+ }
+
+ // Verify public config field change
+ receiver.windowToken.onConfigurationChangedInner(receiver, config, DEFAULT_DISPLAY, true)
+
+ assertThat(receiver.receivedConfig).isEqualTo(config)
+
+ // Clear the config value
+ receiver.receivedConfig.unset()
+
+ // Verify private config field change
+ config.windowConfiguration.windowingMode = WINDOWING_MODE_MULTI_WINDOW
+
+ receiver.windowToken.onConfigurationChangedInner(receiver, config, DEFAULT_DISPLAY, true)
+
+ assertThat(receiver.receivedConfig).isEqualTo(
+ if (shouldReportPrivateChanges) {
+ config
+ } else {
+ Configuration.EMPTY
+ }
+ )
+ }
+
+ /**
+ * Test [android.content.Context] to implement [ConfigurationDispatcher] for testing.
+ *
+ * @param shouldReportPrivateChanges used to override
+ * [ConfigurationDispatcher.shouldReportPrivateChanges] for testing,
+ */
+ private class TestConfigurationReceiver(
+ private val shouldReportPrivateChanges: Boolean
+ ) : ContextWrapper(null), ConfigurationDispatcher {
+ val windowToken = WindowTokenClient()
+ val receivedConfig = Configuration()
+
+ init {
+ windowToken.attachContext(this)
+ }
+
+ override fun dispatchConfigurationChanged(configuration: Configuration) {
+ receivedConfig.setTo(configuration)
+ }
+
+ override fun shouldReportPrivateChanges(): Boolean {
+ return shouldReportPrivateChanges
+ }
+
+ override fun getDisplayId(): Int {
+ return DEFAULT_DISPLAY
+ }
+ }
+
+ companion object {
+ @Parameterized.Parameters(name = "shouldReportPrivateChange={0}")
+ @JvmStatic
+ fun data(): Collection<Any> {
+ return listOf(true, false)
+ }
+ }
+} \ No newline at end of file
diff --git a/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java b/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java
index 84ff40f0dcf0..116dc124c902 100644
--- a/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java
+++ b/core/tests/coretests/src/android/window/WindowTokenClientControllerTest.java
@@ -266,4 +266,25 @@ public class WindowTokenClientControllerTest {
verify(mWindowTokenClient).onWindowTokenRemoved();
}
+
+ @Test
+ public void testOnWindowConfigurationChanged_propagatedToCorrectToken() throws RemoteException {
+ doReturn(mWindowContextInfo).when(mWindowManagerService)
+ .attachWindowContextToDisplayContent(any(), any(), anyInt());
+
+ mController.onWindowConfigurationChanged(mWindowTokenClient, mConfiguration,
+ DEFAULT_DISPLAY + 1);
+
+ // Not propagated before attaching
+ verify(mWindowTokenClient, never()).onConfigurationChanged(mConfiguration,
+ DEFAULT_DISPLAY + 1);
+
+ assertTrue(mController.attachToDisplayContent(mWindowTokenClient, DEFAULT_DISPLAY));
+
+ mController.onWindowConfigurationChanged(mWindowTokenClient, mConfiguration,
+ DEFAULT_DISPLAY + 1);
+
+ // Now that's attached, propagating it.
+ verify(mWindowTokenClient).postOnConfigurationChanged(mConfiguration, DEFAULT_DISPLAY + 1);
+ }
}
diff --git a/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java b/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java
index 52ff79da26ea..2edab6268bec 100644
--- a/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java
@@ -22,6 +22,8 @@ import static org.junit.Assert.fail;
import android.os.SystemClock;
+import android.os.SystemClock;
+
import androidx.test.runner.AndroidJUnit4;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -54,13 +56,13 @@ public class RateLimitingCacheTest {
*/
@Test
public void testTtl_Zero() {
- TestRateLimitingCache<Integer> s = new TestRateLimitingCache<>(0);
+ RateLimitingCache<Integer> s = new RateLimitingCache<>(0);
int first = s.get(mFetcher);
assertEquals(first, 0);
int second = s.get(mFetcher);
assertEquals(second, 1);
- s.advanceTime(20);
+ SystemClock.sleep(20);
int third = s.get(mFetcher);
assertEquals(third, 2);
}
@@ -71,14 +73,14 @@ public class RateLimitingCacheTest {
*/
@Test
public void testTtl_100() {
- TestRateLimitingCache<Integer> s = new TestRateLimitingCache<>(100);
+ RateLimitingCache<Integer> s = new RateLimitingCache<>(100);
int first = s.get(mFetcher);
assertEquals(first, 0);
int second = s.get(mFetcher);
// Too early to change
assertEquals(second, 0);
- s.advanceTime(150);
+ SystemClock.sleep(150);
int third = s.get(mFetcher);
// Changed by now
assertEquals(third, 1);
@@ -93,11 +95,11 @@ public class RateLimitingCacheTest {
*/
@Test
public void testTtl_Negative() {
- TestRateLimitingCache<Integer> s = new TestRateLimitingCache<>(-1);
+ RateLimitingCache<Integer> s = new RateLimitingCache<>(-1);
int first = s.get(mFetcher);
assertEquals(first, 0);
- s.advanceTime(200);
+ SystemClock.sleep(200);
// Should return the original value every time
int second = s.get(mFetcher);
assertEquals(second, 0);
@@ -109,7 +111,7 @@ public class RateLimitingCacheTest {
*/
@Test
public void testTtl_Spam() {
- TestRateLimitingCache<Integer> s = new TestRateLimitingCache<>(100);
+ RateLimitingCache<Integer> s = new RateLimitingCache<>(100);
assertCount(s, 1000, 7, 15);
}
@@ -119,13 +121,28 @@ public class RateLimitingCacheTest {
*/
@Test
public void testRate_10hz() {
- TestRateLimitingCache<Integer> s = new TestRateLimitingCache<>(1000, 10);
+ RateLimitingCache<Integer> s = new RateLimitingCache<>(1000, 10);
// At 10 per second, 2 seconds should not exceed about 30, assuming overlap into left and
// right windows that allow 10 each
assertCount(s, 2000, 20, 33);
}
/**
+ * Test that using a different timebase works correctly.
+ */
+ @Test
+ public void testTimebase() {
+ RateLimitingCache<Integer> s = new RateLimitingCache<>(1000, 10) {
+ @Override
+ protected long getTime() {
+ return SystemClock.elapsedRealtime() / 2;
+ }
+ };
+ // Timebase is moving at half the speed, so only allows for 1 second worth in 2 seconds.
+ assertCount(s, 2000, 10, 22);
+ }
+
+ /**
* Exercises concurrent access to the cache.
*/
@Test
@@ -270,36 +287,15 @@ public class RateLimitingCacheTest {
* @param minCount the lower end of the expected number of fetches, with a margin for error
* @param maxCount the higher end of the expected number of fetches, with a margin for error
*/
- private void assertCount(TestRateLimitingCache<Integer> cache, long period,
+ private void assertCount(RateLimitingCache<Integer> cache, long period,
int minCount, int maxCount) {
- long startTime = cache.getTime();
- while (cache.getTime() < startTime + period) {
+ long startTime = SystemClock.elapsedRealtime();
+ while (SystemClock.elapsedRealtime() < startTime + period) {
int value = cache.get(mFetcher);
- cache.advanceTime(5);
+ SystemClock.sleep(5);
}
int latest = cache.get(mFetcher);
assertTrue("Latest should be between " + minCount + " and " + maxCount
+ " but is " + latest, latest <= maxCount && latest >= minCount);
}
-
- private static class TestRateLimitingCache<Value> extends RateLimitingCache<Value> {
- private long mTime;
-
- public TestRateLimitingCache(long periodMillis) {
- super(periodMillis);
- }
-
- public TestRateLimitingCache(long periodMillis, int count) {
- super(periodMillis, count);
- }
-
- public void advanceTime(long time) {
- mTime += time;
- }
-
- @Override
- public long getTime() {
- return mTime;
- }
- }
}
diff --git a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
index 9baa31faea08..282886af9ef8 100644
--- a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
@@ -121,18 +121,20 @@ public class NotificationProgressBarTest {
assertThat(parts).isEqualTo(expectedParts);
- float drawableWidth = 300;
+ float drawableWidth = 320;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 300, Color.RED)));
+ List.of(new DrawableSegment(10, 310, Color.RED)));
assertThat(drawableParts).isEqualTo(expectedDrawableParts);
@@ -141,14 +143,14 @@ public class NotificationProgressBarTest {
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
// Colors with 50% opacity
int fadedRed = 0x80FF0000;
expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 300, fadedRed, true)));
+ List.of(new DrawableSegment(10, 310, fadedRed, true)));
- assertThat(p.second).isEqualTo(0);
+ assertThat(p.second).isEqualTo(10);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
@@ -168,18 +170,20 @@ public class NotificationProgressBarTest {
assertThat(parts).isEqualTo(expectedParts);
- float drawableWidth = 300;
+ float drawableWidth = 320;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 300, Color.RED)));
+ List.of(new DrawableSegment(10, 310, Color.RED)));
assertThat(drawableParts).isEqualTo(expectedDrawableParts);
@@ -188,9 +192,9 @@ public class NotificationProgressBarTest {
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
- assertThat(p.second).isEqualTo(300);
+ assertThat(p.second).isEqualTo(310);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
@@ -219,6 +223,42 @@ public class NotificationProgressBarTest {
progressMax);
}
+ @Test
+ public void processAndConvertToParts_pointPositionIsZero() {
+ List<ProgressStyle.Segment> segments = new ArrayList<>();
+ segments.add(new ProgressStyle.Segment(100).setColor(Color.RED));
+ List<ProgressStyle.Point> points = new ArrayList<>();
+ points.add(new ProgressStyle.Point(0).setColor(Color.RED));
+ int progress = 50;
+ int progressMax = 100;
+
+ List<Part> parts = NotificationProgressBar.processModelAndConvertToViewParts(segments,
+ points, progress, progressMax);
+
+ // Point at the start is dropped.
+ List<Part> expectedParts = new ArrayList<>(List.of(new Segment(1f, Color.RED)));
+
+ assertThat(parts).isEqualTo(expectedParts);
+ }
+
+ @Test
+ public void processAndConvertToParts_pointPositionAtMax() {
+ List<ProgressStyle.Segment> segments = new ArrayList<>();
+ segments.add(new ProgressStyle.Segment(100).setColor(Color.RED));
+ List<ProgressStyle.Point> points = new ArrayList<>();
+ points.add(new ProgressStyle.Point(100).setColor(Color.RED));
+ int progress = 50;
+ int progressMax = 100;
+
+ List<Part> parts = NotificationProgressBar.processModelAndConvertToViewParts(segments,
+ points, progress, progressMax);
+
+ // Point at the end is dropped.
+ List<Part> expectedParts = new ArrayList<>(List.of(new Segment(1f, Color.RED)));
+
+ assertThat(parts).isEqualTo(expectedParts);
+ }
+
@Test(expected = IllegalArgumentException.class)
public void processAndConvertToParts_pointPositionAboveMax() {
List<ProgressStyle.Segment> segments = new ArrayList<>();
@@ -249,18 +289,20 @@ public class NotificationProgressBarTest {
assertThat(parts).isEqualTo(expectedParts);
- float drawableWidth = 300;
+ float drawableWidth = 320;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 300, Color.BLUE)));
+ List.of(new DrawableSegment(10, 310, Color.BLUE)));
assertThat(drawableParts).isEqualTo(expectedDrawableParts);
@@ -269,15 +311,15 @@ public class NotificationProgressBarTest {
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
// Colors with 50% opacity
int fadedBlue = 0x800000FF;
expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 180, Color.BLUE),
- new DrawableSegment(180, 300, fadedBlue, true)));
+ List.of(new DrawableSegment(10, 190, Color.BLUE),
+ new DrawableSegment(190, 310, fadedBlue, true)));
- assertThat(p.second).isEqualTo(180);
+ assertThat(p.second).isEqualTo(190);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
@@ -299,19 +341,21 @@ public class NotificationProgressBarTest {
assertThat(parts).isEqualTo(expectedParts);
- float drawableWidth = 300;
+ float drawableWidth = 320;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 146, Color.RED),
- new DrawableSegment(150, 300, Color.GREEN)));
+ List.of(new DrawableSegment(10, 156, Color.RED),
+ new DrawableSegment(160, 310, Color.GREEN)));
assertThat(drawableParts).isEqualTo(expectedDrawableParts);
@@ -319,15 +363,15 @@ public class NotificationProgressBarTest {
boolean isStyledByProgress = true;
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
// Colors with 50% opacity
int fadedGreen = 0x8000FF00;
- expectedDrawableParts = new ArrayList<>(List.of(new DrawableSegment(0, 146, Color.RED),
- new DrawableSegment(150, 180, Color.GREEN),
- new DrawableSegment(180, 300, fadedGreen, true)));
+ expectedDrawableParts = new ArrayList<>(List.of(new DrawableSegment(10, 156, Color.RED),
+ new DrawableSegment(160, 190, Color.GREEN),
+ new DrawableSegment(190, 310, fadedGreen, true)));
- assertThat(p.second).isEqualTo(180);
+ assertThat(p.second).isEqualTo(190);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
@@ -353,10 +397,12 @@ public class NotificationProgressBarTest {
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = false;
+ int trackerDrawWidth = 0;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
List.of(new DrawableSegment(0, 146, Color.RED),
@@ -368,7 +414,7 @@ public class NotificationProgressBarTest {
boolean isStyledByProgress = true;
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
// Colors with 50% opacity
int fadedGreen = 0x8000FF00;
@@ -409,26 +455,28 @@ public class NotificationProgressBarTest {
assertThat(parts).isEqualTo(expectedParts);
- float drawableWidth = 300;
+ float drawableWidth = 320;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 35, Color.BLUE),
- new DrawablePoint(39, 51, Color.RED),
- new DrawableSegment(55, 65, Color.BLUE),
- new DrawablePoint(69, 81, Color.BLUE),
- new DrawableSegment(85, 170, Color.BLUE),
- new DrawablePoint(174, 186, Color.BLUE),
- new DrawableSegment(190, 215, Color.BLUE),
- new DrawablePoint(219, 231, Color.YELLOW),
- new DrawableSegment(235, 300, Color.BLUE)));
+ List.of(new DrawableSegment(10, 45, Color.BLUE),
+ new DrawablePoint(49, 61, Color.RED),
+ new DrawableSegment(65, 75, Color.BLUE),
+ new DrawablePoint(79, 91, Color.BLUE),
+ new DrawableSegment(95, 180, Color.BLUE),
+ new DrawablePoint(184, 196, Color.BLUE),
+ new DrawableSegment(200, 225, Color.BLUE),
+ new DrawablePoint(229, 241, Color.YELLOW),
+ new DrawableSegment(245, 310, Color.BLUE)));
assertThat(drawableParts).isEqualTo(expectedDrawableParts);
@@ -437,23 +485,23 @@ public class NotificationProgressBarTest {
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
// Colors with 50% opacity
int fadedBlue = 0x800000FF;
int fadedYellow = 0x80FFFF00;
expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 34.219177F, Color.BLUE),
- new DrawablePoint(38.219177F, 50.219177F, Color.RED),
- new DrawableSegment(54.219177F, 70.21918F, Color.BLUE),
- new DrawablePoint(74.21918F, 86.21918F, Color.BLUE),
- new DrawableSegment(90.21918F, 172.38356F, Color.BLUE),
- new DrawablePoint(176.38356F, 188.38356F, Color.BLUE),
- new DrawableSegment(192.38356F, 217.0137F, fadedBlue, true),
- new DrawablePoint(221.0137F, 233.0137F, fadedYellow),
- new DrawableSegment(237.0137F, 300F, fadedBlue, true)));
-
- assertThat(p.second).isEqualTo(182.38356F);
+ List.of(new DrawableSegment(10, 44.219177F, Color.BLUE),
+ new DrawablePoint(48.219177F, 60.219177F, Color.RED),
+ new DrawableSegment(64.219177F, 80.21918F, Color.BLUE),
+ new DrawablePoint(84.21918F, 96.21918F, Color.BLUE),
+ new DrawableSegment(100.21918F, 182.38356F, Color.BLUE),
+ new DrawablePoint(186.38356F, 198.38356F, Color.BLUE),
+ new DrawableSegment(202.38356F, 227.0137F, fadedBlue, true),
+ new DrawablePoint(231.0137F, 243.0137F, fadedYellow),
+ new DrawableSegment(247.0137F, 310F, fadedBlue, true)));
+
+ assertThat(p.second).isEqualTo(192.38356F);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
@@ -488,102 +536,29 @@ public class NotificationProgressBarTest {
assertThat(parts).isEqualTo(expectedParts);
- float drawableWidth = 300;
- float segSegGap = 4;
- float segPointGap = 4;
- float pointRadius = 6;
- boolean hasTrackerIcon = true;
- List<DrawablePart> drawableParts =
- NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
-
- List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 35, Color.RED), new DrawablePoint(39, 51, Color.RED),
- new DrawableSegment(55, 65, Color.RED),
- new DrawablePoint(69, 81, Color.BLUE),
- new DrawableSegment(85, 146, Color.RED),
- new DrawableSegment(150, 170, Color.GREEN),
- new DrawablePoint(174, 186, Color.BLUE),
- new DrawableSegment(190, 215, Color.GREEN),
- new DrawablePoint(219, 231, Color.YELLOW),
- new DrawableSegment(235, 300, Color.GREEN)));
-
- assertThat(drawableParts).isEqualTo(expectedDrawableParts);
-
- float segmentMinWidth = 16;
- boolean isStyledByProgress = true;
-
- Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
- parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
-
- // Colors with 50% opacity
- int fadedGreen = 0x8000FF00;
- int fadedYellow = 0x80FFFF00;
- expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 34.095238F, Color.RED),
- new DrawablePoint(38.095238F, 50.095238F, Color.RED),
- new DrawableSegment(54.095238F, 70.09524F, Color.RED),
- new DrawablePoint(74.09524F, 86.09524F, Color.BLUE),
- new DrawableSegment(90.09524F, 148.9524F, Color.RED),
- new DrawableSegment(152.95238F, 172.7619F, Color.GREEN),
- new DrawablePoint(176.7619F, 188.7619F, Color.BLUE),
- new DrawableSegment(192.7619F, 217.33333F, fadedGreen, true),
- new DrawablePoint(221.33333F, 233.33333F, fadedYellow),
- new DrawableSegment(237.33333F, 299.99997F, fadedGreen, true)));
-
- assertThat(p.second).isEqualTo(182.7619F);
- assertThat(p.first).isEqualTo(expectedDrawableParts);
- }
-
- @Test
- public void processAndConvertToParts_multipleSegmentsWithPointsAtStartAndEnd()
- throws NotEnoughWidthToFitAllPartsException {
- List<ProgressStyle.Segment> segments = new ArrayList<>();
- segments.add(new ProgressStyle.Segment(50).setColor(Color.RED));
- segments.add(new ProgressStyle.Segment(50).setColor(Color.GREEN));
- List<ProgressStyle.Point> points = new ArrayList<>();
- points.add(new ProgressStyle.Point(0).setColor(Color.RED));
- points.add(new ProgressStyle.Point(25).setColor(Color.BLUE));
- points.add(new ProgressStyle.Point(60).setColor(Color.BLUE));
- points.add(new ProgressStyle.Point(100).setColor(Color.YELLOW));
- int progress = 60;
- int progressMax = 100;
-
- List<Part> parts = NotificationProgressBar.processModelAndConvertToViewParts(segments,
- points, progress, progressMax);
-
- List<Part> expectedParts = new ArrayList<>(
- List.of(new Point(Color.RED),
- new Segment(0.25f, Color.RED),
- new Point(Color.BLUE),
- new Segment(0.25f, Color.RED),
- new Segment(0.10f, Color.GREEN),
- new Point(Color.BLUE),
- new Segment(0.4f, Color.GREEN),
- new Point(Color.YELLOW)));
-
- assertThat(parts).isEqualTo(expectedParts);
-
- float drawableWidth = 300;
+ float drawableWidth = 320;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawablePoint(0, 12, Color.RED),
- new DrawableSegment(16, 65, Color.RED),
- new DrawablePoint(69, 81, Color.BLUE),
- new DrawableSegment(85, 146, Color.RED),
- new DrawableSegment(150, 170, Color.GREEN),
- new DrawablePoint(174, 186, Color.BLUE),
- new DrawableSegment(190, 284, Color.GREEN),
- new DrawablePoint(288, 300, Color.YELLOW)));
+ List.of(new DrawableSegment(10, 45, Color.RED),
+ new DrawablePoint(49, 61, Color.RED),
+ new DrawableSegment(65, 75, Color.RED),
+ new DrawablePoint(79, 91, Color.BLUE),
+ new DrawableSegment(95, 156, Color.RED),
+ new DrawableSegment(160, 180, Color.GREEN),
+ new DrawablePoint(184, 196, Color.BLUE),
+ new DrawableSegment(200, 225, Color.GREEN),
+ new DrawablePoint(229, 241, Color.YELLOW),
+ new DrawableSegment(245, 310, Color.GREEN)));
assertThat(drawableParts).isEqualTo(expectedDrawableParts);
@@ -592,22 +567,24 @@ public class NotificationProgressBarTest {
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
// Colors with 50% opacity
int fadedGreen = 0x8000FF00;
int fadedYellow = 0x80FFFF00;
expectedDrawableParts = new ArrayList<>(
- List.of(new DrawablePoint(0, 12, Color.RED),
- new DrawableSegment(16, 65, Color.RED),
- new DrawablePoint(69, 81, Color.BLUE),
- new DrawableSegment(85, 146, Color.RED),
- new DrawableSegment(150, 170, Color.GREEN),
- new DrawablePoint(174, 186, Color.BLUE),
- new DrawableSegment(190, 284, fadedGreen, true),
- new DrawablePoint(288, 300, fadedYellow)));
-
- assertThat(p.second).isEqualTo(180);
+ List.of(new DrawableSegment(10, 44.095238F, Color.RED),
+ new DrawablePoint(48.095238F, 60.095238F, Color.RED),
+ new DrawableSegment(64.095238F, 80.09524F, Color.RED),
+ new DrawablePoint(84.09524F, 96.09524F, Color.BLUE),
+ new DrawableSegment(100.09524F, 158.9524F, Color.RED),
+ new DrawableSegment(162.95238F, 182.7619F, Color.GREEN),
+ new DrawablePoint(186.7619F, 198.7619F, Color.BLUE),
+ new DrawableSegment(202.7619F, 227.33333F, fadedGreen, true),
+ new DrawablePoint(231.33333F, 243.33333F, fadedYellow),
+ new DrawableSegment(247.33333F, 309.99997F, fadedGreen, true)));
+
+ assertThat(p.second).isEqualTo(192.7619F);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
@@ -644,27 +621,29 @@ public class NotificationProgressBarTest {
assertThat(parts).isEqualTo(expectedParts);
- float drawableWidth = 300;
+ float drawableWidth = 320;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, -7, Color.RED),
- new DrawablePoint(-3, 9, Color.RED),
- new DrawableSegment(13, 65, Color.RED),
- new DrawablePoint(69, 81, Color.BLUE),
- new DrawableSegment(85, 146, Color.RED),
- new DrawableSegment(150, 170, Color.GREEN),
- new DrawablePoint(174, 186, Color.BLUE),
- new DrawableSegment(190, 287, Color.GREEN),
- new DrawablePoint(291, 303, Color.YELLOW),
- new DrawableSegment(307, 300, Color.GREEN)));
+ List.of(new DrawableSegment(10, 3, Color.RED),
+ new DrawablePoint(7, 19, Color.RED),
+ new DrawableSegment(23, 75, Color.RED),
+ new DrawablePoint(79, 91, Color.BLUE),
+ new DrawableSegment(95, 156, Color.RED),
+ new DrawableSegment(160, 180, Color.GREEN),
+ new DrawablePoint(184, 196, Color.BLUE),
+ new DrawableSegment(200, 297, Color.GREEN),
+ new DrawablePoint(301, 313, Color.YELLOW),
+ new DrawableSegment(317, 310, Color.GREEN)));
assertThat(drawableParts).isEqualTo(expectedDrawableParts);
@@ -673,24 +652,24 @@ public class NotificationProgressBarTest {
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
// Colors with 50% opacity
int fadedGreen = 0x8000FF00;
int fadedYellow = 0x80FFFF00;
expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 16, Color.RED),
- new DrawablePoint(20, 32, Color.RED),
- new DrawableSegment(36, 78.02409F, Color.RED),
- new DrawablePoint(82.02409F, 94.02409F, Color.BLUE),
- new DrawableSegment(98.02409F, 146.55421F, Color.RED),
- new DrawableSegment(150.55421F, 169.44579F, Color.GREEN),
- new DrawablePoint(173.44579F, 185.44579F, Color.BLUE),
- new DrawableSegment(189.44579F, 264, fadedGreen, true),
- new DrawablePoint(268, 280, fadedYellow),
- new DrawableSegment(284, 300, fadedGreen, true)));
-
- assertThat(p.second).isEqualTo(179.44579F);
+ List.of(new DrawableSegment(10, 26, Color.RED),
+ new DrawablePoint(30, 42, Color.RED),
+ new DrawableSegment(46, 88.02409F, Color.RED),
+ new DrawablePoint(92.02409F, 104.02409F, Color.BLUE),
+ new DrawableSegment(108.02409F, 156.55421F, Color.RED),
+ new DrawableSegment(160.55421F, 179.44579F, Color.GREEN),
+ new DrawablePoint(183.44579F, 195.44579F, Color.BLUE),
+ new DrawableSegment(199.44579F, 274, fadedGreen, true),
+ new DrawablePoint(278, 290, fadedYellow),
+ new DrawableSegment(294, 310, fadedGreen, true)));
+
+ assertThat(p.second).isEqualTo(189.44579F);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
@@ -711,31 +690,38 @@ public class NotificationProgressBarTest {
points, progress, progressMax);
List<Part> expectedParts = new ArrayList<>(
- List.of(new Segment(0.15f, Color.RED), new Point(Color.RED),
- new Segment(0.10f, Color.RED), new Point(Color.BLUE),
- new Segment(0.25f, Color.RED), new Segment(0.25f, Color.GREEN),
- new Point(Color.YELLOW), new Segment(0.25f, Color.GREEN)));
+ List.of(new Segment(0.15f, Color.RED),
+ new Point(Color.RED),
+ new Segment(0.10f, Color.RED),
+ new Point(Color.BLUE),
+ new Segment(0.25f, Color.RED),
+ new Segment(0.25f, Color.GREEN),
+ new Point(Color.YELLOW),
+ new Segment(0.25f, Color.GREEN)));
assertThat(parts).isEqualTo(expectedParts);
- float drawableWidth = 300;
+ float drawableWidth = 320;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 35, Color.RED), new DrawablePoint(39, 51, Color.RED),
- new DrawableSegment(55, 65, Color.RED),
- new DrawablePoint(69, 81, Color.BLUE),
- new DrawableSegment(85, 146, Color.RED),
- new DrawableSegment(150, 215, Color.GREEN),
- new DrawablePoint(219, 231, Color.YELLOW),
- new DrawableSegment(235, 300, Color.GREEN)));
+ List.of(new DrawableSegment(10, 45, Color.RED),
+ new DrawablePoint(49, 61, Color.RED),
+ new DrawableSegment(65, 75, Color.RED),
+ new DrawablePoint(79, 91, Color.BLUE),
+ new DrawableSegment(95, 156, Color.RED),
+ new DrawableSegment(160, 225, Color.GREEN),
+ new DrawablePoint(229, 241, Color.YELLOW),
+ new DrawableSegment(245, 310, Color.GREEN)));
assertThat(drawableParts).isEqualTo(expectedDrawableParts);
@@ -744,34 +730,34 @@ public class NotificationProgressBarTest {
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 34.296295F, Color.RED),
- new DrawablePoint(38.296295F, 50.296295F, Color.RED),
- new DrawableSegment(54.296295F, 70.296295F, Color.RED),
- new DrawablePoint(74.296295F, 86.296295F, Color.BLUE),
- new DrawableSegment(90.296295F, 149.62962F, Color.RED),
- new DrawableSegment(153.62962F, 216.8148F, Color.GREEN),
- new DrawablePoint(220.81482F, 232.81482F, Color.YELLOW),
- new DrawableSegment(236.81482F, 300, Color.GREEN)));
-
- assertThat(p.second).isEqualTo(182.9037F);
+ List.of(new DrawableSegment(10, 44.296295F, Color.RED),
+ new DrawablePoint(48.296295F, 60.296295F, Color.RED),
+ new DrawableSegment(64.296295F, 80.296295F, Color.RED),
+ new DrawablePoint(84.296295F, 96.296295F, Color.BLUE),
+ new DrawableSegment(100.296295F, 159.62962F, Color.RED),
+ new DrawableSegment(163.62962F, 226.8148F, Color.GREEN),
+ new DrawablePoint(230.81482F, 242.81482F, Color.YELLOW),
+ new DrawableSegment(246.81482F, 310, Color.GREEN)));
+
+ assertThat(p.second).isEqualTo(192.9037F);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
- // The only difference from the `zeroWidthDrawableSegment` test below is the longer
+ // The only difference from the `segmentWidthAtMin` test below is the longer
// segmentMinWidth (= 16dp).
@Test
- public void maybeStretchAndRescaleSegments_negativeWidthDrawableSegment()
+ public void maybeStretchAndRescaleSegments_segmentWidthBelowMin()
throws NotEnoughWidthToFitAllPartsException {
List<ProgressStyle.Segment> segments = new ArrayList<>();
- segments.add(new ProgressStyle.Segment(100).setColor(Color.BLUE));
segments.add(new ProgressStyle.Segment(200).setColor(Color.BLUE));
+ segments.add(new ProgressStyle.Segment(100).setColor(Color.BLUE));
segments.add(new ProgressStyle.Segment(300).setColor(Color.BLUE));
segments.add(new ProgressStyle.Segment(400).setColor(Color.BLUE));
List<ProgressStyle.Point> points = new ArrayList<>();
- points.add(new ProgressStyle.Point(0).setColor(Color.BLUE));
+ points.add(new ProgressStyle.Point(200).setColor(Color.BLUE));
int progress = 1000;
int progressMax = 1000;
@@ -779,28 +765,32 @@ public class NotificationProgressBarTest {
points, progress, progressMax);
List<Part> expectedParts = new ArrayList<>(
- List.of(new Point(Color.BLUE), new Segment(0.1f, Color.BLUE),
- new Segment(0.2f, Color.BLUE), new Segment(0.3f, Color.BLUE),
+ List.of(new Segment(0.2f, Color.BLUE),
+ new Point(Color.BLUE),
+ new Segment(0.1f, Color.BLUE),
+ new Segment(0.3f, Color.BLUE),
new Segment(0.4f, Color.BLUE)));
assertThat(parts).isEqualTo(expectedParts);
- float drawableWidth = 200;
+ float drawableWidth = 220;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawablePoint(0, 12, Color.BLUE),
- new DrawableSegment(16, 16, Color.BLUE),
- new DrawableSegment(20, 56, Color.BLUE),
- new DrawableSegment(60, 116, Color.BLUE),
- new DrawableSegment(120, 200, Color.BLUE)));
+ List.of(new DrawableSegment(10, 40, Color.BLUE),
+ new DrawablePoint(44, 56, Color.BLUE),
+ new DrawableSegment(60, 66, Color.BLUE),
+ new DrawableSegment(70, 126, Color.BLUE),
+ new DrawableSegment(130, 210, Color.BLUE)));
assertThat(drawableParts).isEqualTo(expectedDrawableParts);
@@ -809,30 +799,31 @@ public class NotificationProgressBarTest {
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 200, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
- expectedDrawableParts = new ArrayList<>(List.of(new DrawablePoint(0, 12, Color.BLUE),
- new DrawableSegment(16, 32, Color.BLUE),
- new DrawableSegment(36, 69.41936F, Color.BLUE),
- new DrawableSegment(73.41936F, 124.25807F, Color.BLUE),
- new DrawableSegment(128.25807F, 200, Color.BLUE)));
+ expectedDrawableParts = new ArrayList<>(
+ List.of(new DrawableSegment(10, 38.81356F, Color.BLUE),
+ new DrawablePoint(42.81356F, 54.81356F, Color.BLUE),
+ new DrawableSegment(58.81356F, 74.81356F, Color.BLUE),
+ new DrawableSegment(78.81356F, 131.42374F, Color.BLUE),
+ new DrawableSegment(135.42374F, 210, Color.BLUE)));
- assertThat(p.second).isEqualTo(200);
+ assertThat(p.second).isEqualTo(210);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
- // The only difference from the `negativeWidthDrawableSegment` test above is the shorter
+ // The only difference from the `segmentWidthBelowMin` test above is the shorter
// segmentMinWidth (= 10dp).
@Test
- public void maybeStretchAndRescaleSegments_zeroWidthDrawableSegment()
+ public void maybeStretchAndRescaleSegments_segmentWidthAtMin()
throws NotEnoughWidthToFitAllPartsException {
List<ProgressStyle.Segment> segments = new ArrayList<>();
- segments.add(new ProgressStyle.Segment(100).setColor(Color.BLUE));
segments.add(new ProgressStyle.Segment(200).setColor(Color.BLUE));
+ segments.add(new ProgressStyle.Segment(100).setColor(Color.BLUE));
segments.add(new ProgressStyle.Segment(300).setColor(Color.BLUE));
segments.add(new ProgressStyle.Segment(400).setColor(Color.BLUE));
List<ProgressStyle.Point> points = new ArrayList<>();
- points.add(new ProgressStyle.Point(0).setColor(Color.BLUE));
+ points.add(new ProgressStyle.Point(200).setColor(Color.BLUE));
int progress = 1000;
int progressMax = 1000;
@@ -840,28 +831,32 @@ public class NotificationProgressBarTest {
points, progress, progressMax);
List<Part> expectedParts = new ArrayList<>(
- List.of(new Point(Color.BLUE), new Segment(0.1f, Color.BLUE),
- new Segment(0.2f, Color.BLUE), new Segment(0.3f, Color.BLUE),
+ List.of(new Segment(0.2f, Color.BLUE),
+ new Point(Color.BLUE),
+ new Segment(0.1f, Color.BLUE),
+ new Segment(0.3f, Color.BLUE),
new Segment(0.4f, Color.BLUE)));
assertThat(parts).isEqualTo(expectedParts);
- float drawableWidth = 200;
+ float drawableWidth = 220;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawablePoint(0, 12, Color.BLUE),
- new DrawableSegment(16, 16, Color.BLUE),
- new DrawableSegment(20, 56, Color.BLUE),
- new DrawableSegment(60, 116, Color.BLUE),
- new DrawableSegment(120, 200, Color.BLUE)));
+ List.of(new DrawableSegment(10, 40, Color.BLUE),
+ new DrawablePoint(44, 56, Color.BLUE),
+ new DrawableSegment(60, 66, Color.BLUE),
+ new DrawableSegment(70, 126, Color.BLUE),
+ new DrawableSegment(130, 210, Color.BLUE)));
assertThat(drawableParts).isEqualTo(expectedDrawableParts);
@@ -870,15 +865,16 @@ public class NotificationProgressBarTest {
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 200, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
- expectedDrawableParts = new ArrayList<>(List.of(new DrawablePoint(0, 12, Color.BLUE),
- new DrawableSegment(16, 26, Color.BLUE),
- new DrawableSegment(30, 64.169014F, Color.BLUE),
- new DrawableSegment(68.169014F, 120.92958F, Color.BLUE),
- new DrawableSegment(124.92958F, 200, Color.BLUE)));
+ expectedDrawableParts = new ArrayList<>(
+ List.of(new DrawableSegment(10, 39.411766F, Color.BLUE),
+ new DrawablePoint(43.411766F, 55.411766F, Color.BLUE),
+ new DrawableSegment(59.411766F, 69.411766F, Color.BLUE),
+ new DrawableSegment(73.411766F, 128.05884F, Color.BLUE),
+ new DrawableSegment(132.05882F, 210, Color.BLUE)));
- assertThat(p.second).isEqualTo(200);
+ assertThat(p.second).isEqualTo(210);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
@@ -886,12 +882,12 @@ public class NotificationProgressBarTest {
public void maybeStretchAndRescaleSegments_noStretchingNecessary()
throws NotEnoughWidthToFitAllPartsException {
List<ProgressStyle.Segment> segments = new ArrayList<>();
- segments.add(new ProgressStyle.Segment(200).setColor(Color.BLUE));
segments.add(new ProgressStyle.Segment(100).setColor(Color.BLUE));
+ segments.add(new ProgressStyle.Segment(200).setColor(Color.BLUE));
segments.add(new ProgressStyle.Segment(300).setColor(Color.BLUE));
segments.add(new ProgressStyle.Segment(400).setColor(Color.BLUE));
List<ProgressStyle.Point> points = new ArrayList<>();
- points.add(new ProgressStyle.Point(0).setColor(Color.BLUE));
+ points.add(new ProgressStyle.Point(100).setColor(Color.BLUE));
int progress = 1000;
int progressMax = 1000;
@@ -899,28 +895,32 @@ public class NotificationProgressBarTest {
points, progress, progressMax);
List<Part> expectedParts = new ArrayList<>(
- List.of(new Point(Color.BLUE), new Segment(0.2f, Color.BLUE),
- new Segment(0.1f, Color.BLUE), new Segment(0.3f, Color.BLUE),
+ List.of(new Segment(0.1f, Color.BLUE),
+ new Point(Color.BLUE),
+ new Segment(0.2f, Color.BLUE),
+ new Segment(0.3f, Color.BLUE),
new Segment(0.4f, Color.BLUE)));
assertThat(parts).isEqualTo(expectedParts);
- float drawableWidth = 200;
+ float drawableWidth = 220;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawablePoint(0, 12, Color.BLUE),
- new DrawableSegment(16, 36, Color.BLUE),
- new DrawableSegment(40, 56, Color.BLUE),
- new DrawableSegment(60, 116, Color.BLUE),
- new DrawableSegment(120, 200, Color.BLUE)));
+ List.of(new DrawableSegment(10, 20, Color.BLUE),
+ new DrawablePoint(24, 36, Color.BLUE),
+ new DrawableSegment(40, 66, Color.BLUE),
+ new DrawableSegment(70, 126, Color.BLUE),
+ new DrawableSegment(130, 210, Color.BLUE)));
assertThat(drawableParts).isEqualTo(expectedDrawableParts);
@@ -929,9 +929,9 @@ public class NotificationProgressBarTest {
Pair<List<DrawablePart>, Float> p = NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 200, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
- assertThat(p.second).isEqualTo(200);
+ assertThat(p.second).isEqualTo(210);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
@@ -951,10 +951,10 @@ public class NotificationProgressBarTest {
segments.add(new ProgressStyle.Segment(10).setColor(Color.GREEN));
segments.add(new ProgressStyle.Segment(10).setColor(Color.RED));
List<ProgressStyle.Point> points = new ArrayList<>();
- points.add(new ProgressStyle.Point(0).setColor(orange));
points.add(new ProgressStyle.Point(1).setColor(Color.BLUE));
+ points.add(new ProgressStyle.Point(10).setColor(orange));
points.add(new ProgressStyle.Point(55).setColor(Color.BLUE));
- points.add(new ProgressStyle.Point(100).setColor(orange));
+ points.add(new ProgressStyle.Point(90).setColor(orange));
int progress = 50;
int progressMax = 100;
@@ -962,10 +962,10 @@ public class NotificationProgressBarTest {
points, progress, progressMax);
List<Part> expectedParts = new ArrayList<>(
- List.of(new Point(orange),
- new Segment(0.01f, orange),
+ List.of(new Segment(0.01f, orange),
new Point(Color.BLUE),
new Segment(0.09f, orange),
+ new Point(orange),
new Segment(0.1f, Color.YELLOW),
new Segment(0.1f, Color.BLUE),
new Segment(0.1f, Color.GREEN),
@@ -976,21 +976,23 @@ public class NotificationProgressBarTest {
new Segment(0.1f, Color.YELLOW),
new Segment(0.1f, Color.BLUE),
new Segment(0.1f, Color.GREEN),
- new Segment(0.1f, Color.RED),
- new Point(orange)));
+ new Point(orange),
+ new Segment(0.1f, Color.RED)));
assertThat(parts).isEqualTo(expectedParts);
// For the list of ProgressStyle.Part used in this test, 300 is the minimum width.
- float drawableWidth = 299;
+ float drawableWidth = 319;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
List<DrawablePart> drawableParts =
NotificationProgressBar.processPartsAndConvertToDrawableParts(
- parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon);
+ parts, drawableWidth, segSegGap, segPointGap, pointRadius, hasTrackerIcon,
+ trackerDrawWidth);
// Skips the validation of the intermediate list of DrawableParts.
@@ -999,7 +1001,7 @@ public class NotificationProgressBarTest {
NotificationProgressBar.maybeStretchAndRescaleSegments(
parts, drawableParts, segmentMinWidth, pointRadius, (float) progress / progressMax,
- 300, isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
+ isStyledByProgress, hasTrackerIcon ? 0 : segSegGap);
}
@Test
@@ -1015,11 +1017,12 @@ public class NotificationProgressBarTest {
int progress = 60;
int progressMax = 100;
- float drawableWidth = 300;
+ float drawableWidth = 320;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
float segmentMinWidth = 16;
boolean isStyledByProgress = true;
@@ -1036,24 +1039,24 @@ public class NotificationProgressBarTest {
pointRadius,
hasTrackerIcon,
segmentMinWidth,
- isStyledByProgress
- );
+ isStyledByProgress,
+ trackerDrawWidth);
// Colors with 50% opacity
int fadedBlue = 0x800000FF;
int fadedYellow = 0x80FFFF00;
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 34.219177F, Color.BLUE),
- new DrawablePoint(38.219177F, 50.219177F, Color.RED),
- new DrawableSegment(54.219177F, 70.21918F, Color.BLUE),
- new DrawablePoint(74.21918F, 86.21918F, Color.BLUE),
- new DrawableSegment(90.21918F, 172.38356F, Color.BLUE),
- new DrawablePoint(176.38356F, 188.38356F, Color.BLUE),
- new DrawableSegment(192.38356F, 217.0137F, fadedBlue, true),
- new DrawablePoint(221.0137F, 233.0137F, fadedYellow),
- new DrawableSegment(237.0137F, 300F, fadedBlue, true)));
-
- assertThat(p.second).isEqualTo(182.38356F);
+ List.of(new DrawableSegment(10, 44.219177F, Color.BLUE),
+ new DrawablePoint(48.219177F, 60.219177F, Color.RED),
+ new DrawableSegment(64.219177F, 80.21918F, Color.BLUE),
+ new DrawablePoint(84.21918F, 96.21918F, Color.BLUE),
+ new DrawableSegment(100.21918F, 182.38356F, Color.BLUE),
+ new DrawablePoint(186.38356F, 198.38356F, Color.BLUE),
+ new DrawableSegment(202.38356F, 227.0137F, fadedBlue, true),
+ new DrawablePoint(231.0137F, 243.0137F, fadedYellow),
+ new DrawableSegment(247.0137F, 310F, fadedBlue, true)));
+
+ assertThat(p.second).isEqualTo(192.38356F);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
@@ -1065,11 +1068,12 @@ public class NotificationProgressBarTest {
int progress = 60;
int progressMax = 100;
- float drawableWidth = 100;
+ float drawableWidth = 120;
float segSegGap = 4;
float segPointGap = 4;
float pointRadius = 6;
boolean hasTrackerIcon = true;
+ int trackerDrawWidth = 20;
float segmentMinWidth = 16;
boolean isStyledByProgress = true;
@@ -1086,16 +1090,16 @@ public class NotificationProgressBarTest {
pointRadius,
hasTrackerIcon,
segmentMinWidth,
- isStyledByProgress
- );
+ isStyledByProgress,
+ trackerDrawWidth);
- // Colors with 50%f opacity
+ // Colors with 50% opacity
int fadedBlue = 0x800000FF;
List<DrawablePart> expectedDrawableParts = new ArrayList<>(
- List.of(new DrawableSegment(0, 60.000004F, Color.BLUE),
- new DrawableSegment(60.000004F, 100, fadedBlue, true)));
+ List.of(new DrawableSegment(10, 70F, Color.BLUE),
+ new DrawableSegment(70F, 110, fadedBlue, true)));
- assertThat(p.second).isWithin(1e-5f).of(60);
+ assertThat(p.second).isEqualTo(70);
assertThat(p.first).isEqualTo(expectedDrawableParts);
}
}
diff --git a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressModelTest.java b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressModelTest.java
index e1f5b1c2e4a4..140d268e855b 100644
--- a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressModelTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressModelTest.java
@@ -90,7 +90,7 @@ public class NotificationProgressModelTest {
new Notification.ProgressStyle.Segment(50).setColor(Color.YELLOW),
new Notification.ProgressStyle.Segment(50).setColor(Color.LTGRAY));
final List<Notification.ProgressStyle.Point> points = List.of(
- new Notification.ProgressStyle.Point(0).setColor(Color.RED),
+ new Notification.ProgressStyle.Point(1).setColor(Color.RED),
new Notification.ProgressStyle.Point(20).setColor(Color.BLUE));
final NotificationProgressModel savedModel = new NotificationProgressModel(segments,
points,
@@ -121,7 +121,7 @@ public class NotificationProgressModelTest {
new Notification.ProgressStyle.Segment(50).setColor(Color.YELLOW),
new Notification.ProgressStyle.Segment(50).setColor(Color.YELLOW));
final List<Notification.ProgressStyle.Point> points = List.of(
- new Notification.ProgressStyle.Point(0).setColor(Color.RED),
+ new Notification.ProgressStyle.Point(1).setColor(Color.RED),
new Notification.ProgressStyle.Point(20).setColor(Color.BLUE));
final NotificationProgressModel savedModel = new NotificationProgressModel(segments,
points,
diff --git a/graphics/java/android/graphics/FrameInfo.java b/graphics/java/android/graphics/FrameInfo.java
index 8f1282897780..7d236d203201 100644
--- a/graphics/java/android/graphics/FrameInfo.java
+++ b/graphics/java/android/graphics/FrameInfo.java
@@ -95,7 +95,8 @@ public final class FrameInfo {
// Must be the last one
// This value must be in sync with `UI_THREAD_FRAME_INFO_SIZE` in FrameInfo.h
- private static final int FRAME_INFO_SIZE = FRAME_INTERVAL + 1;
+ // In calculating size, + 1 for Flags, and + 1 for WorkloadTarget from FrameInfo.h
+ private static final int FRAME_INFO_SIZE = FRAME_INTERVAL + 2;
/** checkstyle */
public void setVsync(long intendedVsync, long usedVsync, long frameTimelineVsyncId,
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerBubbleBarTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerBubbleBarTest.kt
index bce6c5999a75..a32ec221e08a 100644
--- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerBubbleBarTest.kt
+++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerBubbleBarTest.kt
@@ -61,7 +61,6 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mockito
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
import java.util.Optional
@@ -133,7 +132,7 @@ class BubbleControllerBubbleBarTest {
mainExecutor,
bgExecutor,
)
- bubbleController.asBubbles().setSysuiProxy(Mockito.mock(SysuiProxy::class.java))
+ bubbleController.asBubbles().setSysuiProxy(mock<SysuiProxy>())
shellInit.init()
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt
index 88bfeb21bb74..e865111e59dc 100644
--- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt
+++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleStackViewTest.kt
@@ -50,10 +50,10 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mockito
import org.mockito.kotlin.any
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
+import org.mockito.kotlin.spy
import org.mockito.kotlin.verify
import java.util.concurrent.Semaphore
import java.util.concurrent.TimeUnit
@@ -635,7 +635,7 @@ class BubbleStackViewTest {
@Test
fun removeFromWindow_stopMonitoringSwipeUpGesture() {
- bubbleStackView = Mockito.spy(bubbleStackView)
+ bubbleStackView = spy(bubbleStackView)
InstrumentationRegistry.getInstrumentation().runOnMainSync {
// No way to add to window in the test environment right now so just pretend
bubbleStackView.onDetachedFromWindow()
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt
index af238d033aee..3499ee32e649 100644
--- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt
+++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt
@@ -29,7 +29,8 @@ import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mockito.mock
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
/** Test for [UiEventSubject] */
@@ -130,10 +131,10 @@ class UiEventSubjectTest {
}
private fun createBubble(appUid: Int, packageName: String, instanceId: InstanceId): Bubble {
- return mock(Bubble::class.java).apply {
- whenever(getAppUid()).thenReturn(appUid)
- whenever(getPackageName()).thenReturn(packageName)
- whenever(getInstanceId()).thenReturn(instanceId)
+ return mock<Bubble>() {
+ on { getAppUid() } doReturn appUid
+ on { getPackageName() } doReturn packageName
+ on { getInstanceId() } doReturn instanceId
}
}
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt
index c022a298e972..7b5831376dc0 100644
--- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt
+++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt
@@ -73,7 +73,6 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mockito.mock
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
@@ -127,7 +126,7 @@ class BubbleBarLayerViewTest {
mainExecutor,
bgExecutor,
)
- bubbleController.asBubbles().setSysuiProxy(mock(SysuiProxy::class.java))
+ bubbleController.asBubbles().setSysuiProxy(mock<SysuiProxy>())
// Flush so that proxy gets set
mainExecutor.flushAll()
diff --git a/libs/WindowManager/Shell/res/drawable/decor_handle_dark.xml b/libs/WindowManager/Shell/res/drawable/decor_handle_dark.xml
index ce242751c172..05c1e094d7ae 100644
--- a/libs/WindowManager/Shell/res/drawable/decor_handle_dark.xml
+++ b/libs/WindowManager/Shell/res/drawable/decor_handle_dark.xml
@@ -13,20 +13,10 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-<vector
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="128dp"
- android:height="4dp"
- android:viewportWidth="128"
- android:viewportHeight="4"
- >
- <group>
- <clip-path
- android:pathData="M2 0H126C127.105 0 128 0.895431 128 2C128 3.10457 127.105 4 126 4H2C0.895431 4 0 3.10457 0 2C0 0.895431 0.895431 0 2 0Z"
- />
- <path
- android:pathData="M0 0V4H128V0"
- android:fillColor="@android:color/black"
- />
- </group>
-</vector>
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="@android:color/black"/>
+ <corners android:radius="2dp"/>
+ <size android:height="4dp"/>
+</shape>
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml
index 1d1cdfa85040..9451fd43b1d8 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml
@@ -20,7 +20,7 @@
android:id="@+id/desktop_mode_caption"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:gravity="center_horizontal">
+ android:gravity="center">
<com.android.wm.shell.windowdecor.HandleImageButton
android:id="@+id/caption_handle"
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
index 50c08732543a..477d207a5c7e 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
@@ -41,7 +41,7 @@
android:id="@+id/application_icon"
android:layout_width="@dimen/desktop_mode_caption_icon_radius"
android:layout_height="@dimen/desktop_mode_caption_icon_radius"
- android:layout_marginStart="12dp"
+ android:layout_marginStart="10dp"
android:layout_marginEnd="12dp"
android:contentDescription="@string/app_icon_text"
android:importantForAccessibility="no"/>
@@ -53,10 +53,9 @@
<com.android.wm.shell.windowdecor.HandleMenuImageButton
android:id="@+id/collapse_menu_button"
- android:layout_width="32dp"
- android:layout_height="32dp"
- android:padding="4dp"
- android:layout_marginEnd="14dp"
+ android:layout_width="16dp"
+ android:layout_height="16dp"
+ android:layout_marginEnd="16dp"
android:layout_marginStart="14dp"
android:contentDescription="@string/collapse_menu_text"
android:src="@drawable/ic_baseline_expand_more_24"
@@ -78,40 +77,55 @@
<ImageButton
android:id="@+id/fullscreen_button"
- android:layout_marginEnd="4dp"
+ android:paddingStart="16dp"
+ android:paddingEnd="12dp"
android:contentDescription="@string/fullscreen_text"
android:src="@drawable/desktop_mode_ic_handle_menu_fullscreen"
android:tint="@androidprv:color/materialColorOnSurface"
- android:layout_weight="1"
style="@style/DesktopModeHandleMenuWindowingButton"/>
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1"/>
+
<ImageButton
android:id="@+id/split_screen_button"
- android:layout_marginStart="4dp"
- android:layout_marginEnd="4dp"
+ android:paddingStart="14dp"
+ android:paddingEnd="14dp"
android:contentDescription="@string/split_screen_text"
android:src="@drawable/desktop_mode_ic_handle_menu_splitscreen"
android:tint="@androidprv:color/materialColorOnSurface"
- android:layout_weight="1"
style="@style/DesktopModeHandleMenuWindowingButton"/>
+ <Space
+ android:id="@+id/floating_button_space"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1"/>
+
<ImageButton
android:id="@+id/floating_button"
- android:layout_marginStart="4dp"
- android:layout_marginEnd="4dp"
+ android:paddingStart="14dp"
+ android:paddingEnd="14dp"
android:contentDescription="@string/float_button_text"
android:src="@drawable/desktop_mode_ic_handle_menu_floating"
android:tint="@androidprv:color/materialColorOnSurface"
- android:layout_weight="1"
style="@style/DesktopModeHandleMenuWindowingButton"/>
+ <Space
+ android:id="@+id/desktop_button_space"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1"/>
+
<ImageButton
android:id="@+id/desktop_button"
- android:layout_marginStart="4dp"
+ android:paddingStart="12dp"
+ android:paddingEnd="16dp"
android:contentDescription="@string/desktop_text"
android:src="@drawable/desktop_mode_ic_handle_menu_desktop"
android:tint="@androidprv:color/materialColorOnSurface"
- android:layout_weight="1"
style="@style/DesktopModeHandleMenuWindowingButton"/>
</LinearLayout>
@@ -126,77 +140,33 @@
android:elevation="@dimen/desktop_mode_handle_menu_pill_elevation"
android:background="@drawable/desktop_mode_decor_handle_menu_background">
- <LinearLayout
+ <com.android.wm.shell.windowdecor.HandleMenuActionButton
android:id="@+id/screenshot_button"
android:contentDescription="@string/screenshot_text"
- style="@style/DesktopModeHandleMenuActionButtonLayout">
-
- <ImageView
- android:id="@+id/image"
- android:src="@drawable/desktop_mode_ic_handle_menu_screenshot"
- android:importantForAccessibility="no"
- style="@style/DesktopModeHandleMenuActionButtonImage"/>
-
- <com.android.wm.shell.windowdecor.MarqueedTextView
- android:id="@+id/label"
- android:text="@string/screenshot_text"
- style="@style/DesktopModeHandleMenuActionButtonTextView"/>
+ android:text="@string/screenshot_text"
+ android:src="@drawable/desktop_mode_ic_handle_menu_screenshot"
+ style="@style/DesktopModeHandleMenuActionButton"/>
- </LinearLayout>
-
- <LinearLayout
+ <com.android.wm.shell.windowdecor.HandleMenuActionButton
android:id="@+id/new_window_button"
android:contentDescription="@string/new_window_text"
- style="@style/DesktopModeHandleMenuActionButtonLayout">
-
- <ImageView
- android:id="@+id/image"
- android:src="@drawable/desktop_mode_ic_handle_menu_new_window"
- android:importantForAccessibility="no"
- style="@style/DesktopModeHandleMenuActionButtonImage"/>
-
- <com.android.wm.shell.windowdecor.MarqueedTextView
- android:id="@+id/label"
- android:text="@string/new_window_text"
- style="@style/DesktopModeHandleMenuActionButtonTextView"/>
+ android:text="@string/new_window_text"
+ android:src="@drawable/desktop_mode_ic_handle_menu_new_window"
+ style="@style/DesktopModeHandleMenuActionButton"/>
- </LinearLayout>
-
- <LinearLayout
+ <com.android.wm.shell.windowdecor.HandleMenuActionButton
android:id="@+id/manage_windows_button"
android:contentDescription="@string/manage_windows_text"
- style="@style/DesktopModeHandleMenuActionButtonLayout">
-
- <ImageView
- android:id="@+id/image"
- android:src="@drawable/desktop_mode_ic_handle_menu_manage_windows"
- android:importantForAccessibility="no"
- style="@style/DesktopModeHandleMenuActionButtonImage"/>
-
- <com.android.wm.shell.windowdecor.MarqueedTextView
- android:id="@+id/label"
- android:text="@string/manage_windows_text"
- style="@style/DesktopModeHandleMenuActionButtonTextView"/>
-
- </LinearLayout>
+ android:text="@string/manage_windows_text"
+ android:src="@drawable/desktop_mode_ic_handle_menu_manage_windows"
+ style="@style/DesktopModeHandleMenuActionButton"/>
- <LinearLayout
+ <com.android.wm.shell.windowdecor.HandleMenuActionButton
android:id="@+id/change_aspect_ratio_button"
android:contentDescription="@string/change_aspect_ratio_text"
- style="@style/DesktopModeHandleMenuActionButtonLayout">
-
- <ImageView
- android:id="@+id/image"
- android:src="@drawable/desktop_mode_ic_handle_menu_change_aspect_ratio"
- android:importantForAccessibility="no"
- style="@style/DesktopModeHandleMenuActionButtonImage"/>
-
- <com.android.wm.shell.windowdecor.MarqueedTextView
- android:id="@+id/label"
- android:text="@string/change_aspect_ratio_text"
- style="@style/DesktopModeHandleMenuActionButtonTextView"/>
-
- </LinearLayout>
+ android:text="@string/change_aspect_ratio_text"
+ android:src="@drawable/desktop_mode_ic_handle_menu_change_aspect_ratio"
+ style="@style/DesktopModeHandleMenuActionButton"/>
</LinearLayout>
<LinearLayout
@@ -209,29 +179,14 @@
android:elevation="@dimen/desktop_mode_handle_menu_pill_elevation"
android:background="@drawable/desktop_mode_decor_handle_menu_background">
- <LinearLayout
+ <com.android.wm.shell.windowdecor.HandleMenuActionButton
android:id="@+id/open_in_app_or_browser_button"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:layout_marginEnd="8dp"
- android:gravity="start|center_vertical"
- android:paddingStart="16dp"
android:contentDescription="@string/open_in_browser_text"
- android:background="?android:selectableItemBackground">
-
- <ImageView
- android:id="@+id/image"
- android:src="@drawable/desktop_mode_ic_handle_menu_open_in_browser"
- android:importantForAccessibility="no"
- style="@style/DesktopModeHandleMenuActionButtonImage"/>
-
- <com.android.wm.shell.windowdecor.MarqueedTextView
- android:id="@+id/label"
- android:text="@string/open_in_browser_text"
- style="@style/DesktopModeHandleMenuActionButtonTextView"/>
-
- </LinearLayout>
+ android:text="@string/open_in_browser_text"
+ android:src="@drawable/desktop_mode_ic_handle_menu_open_in_browser"
+ style="@style/DesktopModeHandleMenuActionButton"
+ android:layout_width="0dp"
+ android:layout_weight="1"/>
<ImageButton
android:id="@+id/open_by_default_button"
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_action_button.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_action_button.xml
new file mode 100644
index 000000000000..379f4e984b73
--- /dev/null
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu_action_button.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2025 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/action_button"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="start|center_vertical"
+ android:paddingHorizontal="16dp"
+ android:clickable="true"
+ android:focusable="true"
+ android:orientation="horizontal"
+ android:background="?android:attr/selectableItemBackground">
+
+ <ImageView
+ android:id="@+id/image"
+ android:contentDescription="@+id/label"
+ style="@style/DesktopModeHandleMenuActionButtonImage"/>
+
+ <com.android.wm.shell.windowdecor.MarqueedTextView
+ android:id="@+id/label"
+ style="@style/DesktopModeHandleMenuActionButtonTextView"/>
+</LinearLayout>
diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml
index 13e5f34e1586..5444c26e9ec9 100644
--- a/libs/WindowManager/Shell/res/values-af/strings.xml
+++ b/libs/WindowManager/Shell/res/values-af/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Links 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Links 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Volskerm regs"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Ruil apps om"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Volskerm bo"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Bo 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Bo 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Stel terug"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Spring na links"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Spring na regs"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Verander grootte van linkerkantse venster"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Verander grootte van regterkantse venster"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimeer of stel venstergrootte terug"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Gaan na deelskermmodus"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Gaan na werkskermvenstermodus"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Verander grootte van linkerkantse venster"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Verander grootte van regterkantse venster"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimeer of stel venstergrootte terug"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimeer of stel venstergrootte terug"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimeer appvenster"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Maak By Verstek Oop-instellings"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Kies hoe om webskakels vir hierdie app oop te maak"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"In die app"</string>
diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml
index 14a79aa8475b..f3bc29d95673 100644
--- a/libs/WindowManager/Shell/res/values-am/strings.xml
+++ b/libs/WindowManager/Shell/res/values-am/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ግራ 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ግራ 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"የቀኝ ሙሉ ማያ ገፅ"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"መተግበሪያዎችን ይቀያይሩ"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"የላይ ሙሉ ማያ ገፅ"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ከላይ 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ከላይ 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ወደነበረበት መልስ"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ወደ ግራ አሳድግ"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ወደ ቀኝ አሳድግ"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"የመተግበሪያ መስኮትን ወደ ግራ መጠን ቀይር"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"የመተግበሪያ መስኮትን ወደ ቀኝ መጠን ቀይር"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"የመስኮት መጠንን አሳድግ ወይም ወደነበረበት መልስ"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"ወደ የተከፈለ ማያ ገፅ ሁነታ ግባ"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ወደ የዴስክቶፕ መስኮት ሁነታ ግባ"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"መስኮትን ወደ ግራ መጠን ቀይር"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"መስኮትን ወደ ቀኝ መጠን ቀይር"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"የመስኮት መጠንን አሳድግ ወይም ወደነበረበት መልስ"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"የመስኮት መጠንን አሳድግ ወይም ወደነበረበት መልስ"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"የመተግበሪያ መስኮትን አሳንስ"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"በነባሪ ቅንብሮች ክፈት"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ለዚህ የድር መተግበሪያ አገናኙን እንዴት እንደሚከፍቱ ይምረጡ"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"በመተግበሪያው ውስጥ"</string>
diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml
index 9a6869a64f3f..60f27cfdee91 100644
--- a/libs/WindowManager/Shell/res/values-ar/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ar/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ضبط حجم النافذة اليسرى ليكون ٥٠%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ضبط حجم النافذة اليسرى ليكون ٣٠%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"عرض النافذة اليمنى بملء الشاشة"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"تبديل التطبيقات"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"عرض النافذة العلوية بملء الشاشة"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ضبط حجم النافذة العلوية ليكون ٧٠%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ضبط حجم النافذة العلوية ليكون ٥٠%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"استعادة"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"المحاذاة إلى اليسار"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"المحاذاة إلى اليمين"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"تغيير حجم نافذة التطبيق بمحاذاتها إلى اليمين"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"تغيير حجم نافذة التطبيق بمحاذاتها إلى اليسار"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"تكبير حجم النافذة أو استعادته"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"تفعيل \"وضع تقسيم الشاشة\""</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"تفعيل وضع عرض المحتوى في النافذة الحالية على سطح المكتب"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"تغيير حجم النافذة بمحاذاتها إلى اليمين"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"تغيير حجم النافذة بمحاذاتها إلى اليسار"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"تكبير حجم النافذة أو استعادته"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"تكبير حجم النافذة أو استعادته"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"تصغير نافذة التطبيق"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"إعدادات الفتح تلقائيًا"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"اختيار طريقة فتح روابط الويب لهذا التطبيق"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"في التطبيق"</string>
diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml
index 5181930edf57..aced354ac826 100644
--- a/libs/WindowManager/Shell/res/values-az/strings.xml
+++ b/libs/WindowManager/Shell/res/values-az/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Sol 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Sol 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Sağ tam ekran"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Tətbiqləri dəyişin"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Yuxarı tam ekran"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Yuxarı 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Yuxarı 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Bərpa edin"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Sola tərəf çəkin"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Sağa tərəf çəkin"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Tətbiq pəncərəsinin ölçüsünü sola dəyişin"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Tətbiq pəncərəsinin ölçüsünü sağa dəyişin"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Pəncərə ölçüsünü artırın və ya bərpa edin"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Bölünmüş ekran rejiminə daxil olun"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Masaüstü pəncərə rejiminə daxil olun"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Pəncərə ölçüsünü sola dəyişin"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Pəncərə ölçüsünü sağa dəyişin"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Pəncərə ölçüsünü artırın və ya bərpa edin"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Pəncərə ölçüsünü artırın və ya bərpa edin"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Tətbiq pəncərəsini kiçildin"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Defolt ayarlarla açın"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Bu tətbiq üçün veb-linklərin necə açılacağını seçin"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Tətbiqdə"</string>
diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
index 92580d39f12c..b07c61258f4e 100644
--- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
@@ -125,11 +125,11 @@
<string name="float_button_text" msgid="9221657008391364581">"Plutajuće"</string>
<string name="select_text" msgid="5139083974039906583">"Izaberite"</string>
<string name="screenshot_text" msgid="1477704010087786671">"Snimak ekrana"</string>
- <string name="open_in_browser_text" msgid="9181692926376072904">"Otvorite u pregledaču"</string>
+ <string name="open_in_browser_text" msgid="9181692926376072904">"Otvori u pregledaču"</string>
<string name="open_in_app_text" msgid="2874590745116268525">"Otvorite u aplikaciji"</string>
<string name="new_window_text" msgid="6318648868380652280">"Novi prozor"</string>
<string name="manage_windows_text" msgid="5567366688493093920">"Upravljajte prozorima"</string>
- <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Promenite razmeru"</string>
+ <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Promeni razmeru"</string>
<string name="close_text" msgid="4986518933445178928">"Zatvorite"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite meni"</string>
<string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otvorite meni"</string>
@@ -138,7 +138,7 @@
<string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikacija ne može da se premesti ovde"</string>
<string name="desktop_mode_maximize_menu_immersive_button_text" msgid="559492223133829481">"Imerzivne"</string>
<string name="desktop_mode_maximize_menu_immersive_restore_button_text" msgid="4900114367354709257">"Vrati"</string>
- <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Uvećajte"</string>
+ <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Uvećaj"</string>
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Vratite"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Prikačite levo"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Prikačite desno"</string>
diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml
index e7feb5b6fa8c..fcc4d83baf75 100644
--- a/libs/WindowManager/Shell/res/values-bg/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bg/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ляв екран: 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ляв екран: 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Десен екран: Показване на цял екран"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Размяна на приложенията"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Горен екран: Показване на цял екран"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Горен екран: 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Горен екран: 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Възстановяване"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Прилепване наляво"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Прилепване надясно"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Преоразмеряване на прозореца на приложението наляво"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Преоразмеряване на прозореца на приложението надясно"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Увеличаване или възстановяване на размера на прозореца"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Активиране на режима за разделен екран"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Активиране на режима за настолни компютри"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Преоразмеряване на прозореца наляво"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Преоразмеряване на прозореца надясно"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Увеличаване или възстановяване на размера на прозореца"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Увеличаване или възстановяване на размера на прозореца"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Намаляване на прозореца на приложението"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Отваряне на настройките по подразбиране"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Изберете как да се отварят уеб връзките за това приложение"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"В приложението"</string>
diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml
index f4f887771fd9..b2c435e5ef0e 100644
--- a/libs/WindowManager/Shell/res/values-bn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bn/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"৫০% বাকি আছে"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"৩০% বাকি আছে"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ডান দিকের অংশ নিয়ে পূর্ণ স্ক্রিন"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"অ্যাপ পাল্টান"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"উপর দিকের অংশ নিয়ে পূর্ণ স্ক্রিন"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"শীর্ষ ৭০%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"শীর্ষ ৫০%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ফিরিয়ে আনুন"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"বাঁদিকে স্ন্যাপ করুন"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ডানদিকে স্ন্যাপ করুন"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"বাঁদিকে অ্যাপ উইন্ডো রিসাইজ করুন"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ডানদিকে অ্যাপ উইন্ডো রিসাইজ করুন"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"উইন্ডো সাইজ বড় বা রিস্টোর করুন"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"স্প্লিট স্ক্রিন মোডে প্রবেশ করুন"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ডেস্কটপ উইন্ডোইং মোডে প্রবেশ করুন"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"বাঁদিকে উইন্ডো রিসাইজ করুন"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ডানদিকে উইন্ডো রিসাইজ করুন"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"উইন্ডো সাইজ বড় বা রিস্টোর করুন"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"উইন্ডো সাইজ বড় বা রিস্টোর করুন"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"অ্যাপ উইন্ডো ছোট করুন"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"ডিফল্ট হিসেবে থাকা সেটিংস খুলুন"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"এই অ্যাপের জন্য কীভাবে ওয়েব লিঙ্ক খুলবেন তা বেছে নিন"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"অ্যাপের মধ্যে"</string>
diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml
index 12e4fc2700ed..8c1619ce925c 100644
--- a/libs/WindowManager/Shell/res/values-bs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bs/strings.xml
@@ -43,7 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Lijevo 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Lijevo 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Desno cijeli ekran"</string>
- <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zamijeni aplikacije"</string>
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zamjena aplikacija"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Gore cijeli ekran"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Gore 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Gore 50%"</string>
@@ -138,20 +138,20 @@
<string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Ne možete premjestiti aplikaciju ovdje"</string>
<string name="desktop_mode_maximize_menu_immersive_button_text" msgid="559492223133829481">"Uvjerljivo"</string>
<string name="desktop_mode_maximize_menu_immersive_restore_button_text" msgid="4900114367354709257">"Vraćanje"</string>
- <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimiziranje"</string>
+ <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimiziraj"</string>
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Vraćanje"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pomicanje ulijevo"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pomicanje udesno"</string>
- <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Promijeni veličinu prozora aplikacije ulijevo"</string>
- <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Promijeni veličinu prozora aplikacije udesno"</string>
- <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimiziraj ili vrati veličinu prozora"</string>
- <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Pokreni način podijeljenog zaslona"</string>
- <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Pokreni način prikaza u prozorima na računalu"</string>
- <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Promijeni veličinu prozora ulijevo"</string>
- <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Promijeni veličinu prozora udesno"</string>
- <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimiziraj ili vrati veličinu prozora"</string>
- <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimiziraj ili vrati veličinu prozora"</string>
- <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimiziraj prozor aplikacije"</string>
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Promjena veličine prozora aplikacije lijevo"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Promjena veličine prozora aplikacije desno"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimiziranje ili vraćanje veličine prozora"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Pokretanje načina rada podijeljenog ekrana"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Pokretanje načina rada s prozorima na radnoj površini"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Promjena veličine prozora i poravnanje lijevo"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Promjena veličine prozora i poravnanje desno"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimiziranje ili vraćanje veličine prozora"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimiziranje ili vraćanje veličine prozora"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimiziranje prozora aplikacije"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Otvaranje prema zadanim postavkama"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Odaberite način otvaranja web linkova za ovu aplikaciju"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"U aplikaciji"</string>
diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml
index 1623954d1d7c..37802f4c7f94 100644
--- a/libs/WindowManager/Shell/res/values-ca/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ca/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Pantalla esquerra al 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Pantalla esquerra al 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pantalla dreta completa"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Canvia les aplicacions"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Pantalla superior completa"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Pantalla superior al 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Pantalla superior al 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaura"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajusta a l\'esquerra"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajusta a la dreta"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Canvia la mida de la finestra de l\'aplicació a l\'esquerra"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Canvia la mida de la finestra de l\'aplicació a la dreta"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximitza o restaura la mida de la finestra"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Entra al mode de pantalla dividida"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Entra al mode d\'enfinestrament a l\'escriptori"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Canvia la mida de la finestra a l\'esquerra"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Canvia la mida de la finestra a la dreta"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximitza o restaura la mida de la finestra"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximitza o restaura la mida de la finestra"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimitza la finestra de l\'aplicació"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Configuració d\'obertura predeterminada"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Tria com vols obrir els enllaços web per a aquesta aplicació"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"A l\'aplicació"</string>
diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml
index f6ac59ca24b7..c4514eb4ce8d 100644
--- a/libs/WindowManager/Shell/res/values-cs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-cs/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % vlevo"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30 % vlevo"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pravá část na celou obrazovku"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zaměnit aplikace"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Horní část na celou obrazovku"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70 % nahoře"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % nahoře"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Obnovit"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Přichytit vlevo"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Přichytit vpravo"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Změnit velikost okna aplikace vlevo"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Změnit velikost okna aplikace vpravo"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximalizovat nebo obnovit velikost okna"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Přechod do režimu rozdělené obrazovky"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Přejít do režimu okenního systému pro počítače"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Přichytit okno vlevo"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Přichytit okno vpravo"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximalizovat nebo obnovit velikost okna"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximalizovat nebo obnovit velikost okna"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimalizovat okno aplikace"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Otevírat podle výchozího nastavení"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Určete, jak se v této aplikaci mají otevírat webové odkazy"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"V aplikaci"</string>
diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml
index d7ee8a0cf8c3..7b21719bc880 100644
--- a/libs/WindowManager/Shell/res/values-de/strings.xml
+++ b/libs/WindowManager/Shell/res/values-de/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % links"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30 % links"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Vollbild rechts"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Apps austauschen"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Vollbild oben"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70 % oben"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % oben"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Wiederherstellen"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Links andocken"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Rechts andocken"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Größe des linken App-Fensters anpassen"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Größe des rechten App-Fensters anpassen"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Fenstergröße maximieren oder wiederherstellen"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Splitscreen-Modus aktivieren"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Desktop-Fenstermodus aktivieren"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Fenstergröße links anpassen"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Fenstergröße rechts anpassen"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Fenstergröße maximieren oder wiederherstellen"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Fenstergröße maximieren oder wiederherstellen"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"App-Fenster minimieren"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Einstellungen für die Option „Standardmäßig öffnen“"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Festlegen, wie Weblinks für diese App geöffnet werden"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"In der App"</string>
diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml
index 4ba68b4fc9db..eb45a31c5d8a 100644
--- a/libs/WindowManager/Shell/res/values-el/strings.xml
+++ b/libs/WindowManager/Shell/res/values-el/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Αριστερή 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Αριστερή 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Δεξιά πλήρης οθόνη"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Εναλλαγή εφαρμογών"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Πάνω πλήρης οθόνη"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Πάνω 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Πάνω 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Επαναφορά"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Κούμπωμα αριστερά"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Κούμπωμα δεξιά"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Αλλαγή μεγέθους παραθύρου εφαρμογής αριστερά"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Αλλαγή μεγέθους παραθύρου εφαρμογής δεξιά"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Μεγιστοποίηση ή επαναφορά μεγέθους παραθύρου"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Είσοδος στη λειτουργία διαχωρισμού οθόνης"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Είσοδος στη λειτουργία προσαρμογής σε παράθυρο υπολογιστή"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Αλλαγή μεγέθους παραθύρου προς τα αριστερά"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Αλλαγή μεγέθους παραθύρου προς τα δεξιά"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Μεγιστοποίηση ή επαναφορά μεγέθους παραθύρου"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Μεγιστοποίηση ή επαναφορά μεγέθους παραθύρου"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Ελαχιστοποίηση παραθύρου εφαρμογής"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Άνοιγμα ρυθμίσεων από προεπιλογή"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Επιλογή τρόπου ανοίγματος συνδέσμων ιστού για την εφαρμογή"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Στην εφαρμογή"</string>
diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
index 8b1a14f66195..8dc27dabfc2c 100644
--- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Left 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Right full screen"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Swap apps"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Top full screen"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Top 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Top 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restore"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Resize app window left"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Resize app window right"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximise or restore window size"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Enter split-screen mode"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Enter desktop windowing mode"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Resize window to left"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Resize window to right"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximise or restore window size"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximise or restore window size"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimise app window"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Open by default settings"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Choose how to open web links for this app"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"In the app"</string>
diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
index 8b1a14f66195..8dc27dabfc2c 100644
--- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Left 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Right full screen"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Swap apps"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Top full screen"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Top 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Top 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restore"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Resize app window left"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Resize app window right"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximise or restore window size"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Enter split-screen mode"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Enter desktop windowing mode"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Resize window to left"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Resize window to right"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximise or restore window size"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximise or restore window size"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimise app window"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Open by default settings"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Choose how to open web links for this app"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"In the app"</string>
diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
index 8b1a14f66195..8dc27dabfc2c 100644
--- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Left 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Left 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Right full screen"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Swap apps"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Top full screen"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Top 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Top 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restore"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Resize app window left"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Resize app window right"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximise or restore window size"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Enter split-screen mode"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Enter desktop windowing mode"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Resize window to left"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Resize window to right"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximise or restore window size"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximise or restore window size"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimise app window"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Open by default settings"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Choose how to open web links for this app"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"In the app"</string>
diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml
index f36135e1febd..dd9635dccfcb 100644
--- a/libs/WindowManager/Shell/res/values-es/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Izquierda 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Izquierda 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pantalla derecha completa"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Cambiar aplicaciones"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Pantalla superior completa"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Superior 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Superior 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaurar"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Acoplar a la izquierda"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Acoplar a la derecha"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Cambiar tamaño de la ventana de la aplicación izquierda"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Cambiar tamaño de la ventana de la aplicación derecha"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximizar o restaurar tamaño de la ventana"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Activar modo Pantalla dividida"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Activar modo Escritorio basado en ventanas"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Cambiar tamaño de la ventana a la izquierda"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Cambiar tamaño de la ventana a la derecha"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximizar o restaurar tamaño de la ventana"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximizar o restaurar tamaño de la ventana"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizar ventana de la aplicación"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Abrir con los ajustes predeterminados"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Elige cómo quieres abrir los enlaces web de esta aplicación"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"En la aplicación"</string>
diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml
index b77d0eb642f7..9898af0c394d 100644
--- a/libs/WindowManager/Shell/res/values-eu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-eu/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ezarri ezkerraldea % 50en"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ezarri ezkerraldea % 30en"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Ezarri eskuinaldea pantaila osoan"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Aldatu aplikazioz"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Ezarri goialdea pantaila osoan"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Ezarri goialdea % 70en"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Ezarri goialdea % 50en"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Leheneratu"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ezarri ezkerrean"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ezarri eskuinean"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Aldatu aplikazioaren leihoaren tamaina eta eraman ezkerrera"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Aldatu aplikazioaren leihoaren tamaina eta eraman eskuinera"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximizatu edo leheneratu leihoaren tamaina"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Sartu pantaila zatituaren moduan"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Sartu ordenagailuan leihoak erabiltzeko moduan"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Aldatu leihoaren tamaina eta eraman ezkerrera"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Aldatu leihoaren tamaina eta eraman eskuinera"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximizatu edo leheneratu leihoaren tamaina"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximizatu edo leheneratu leihoaren tamaina"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizatu aplikazioaren leihoa"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Modu lehenetsian irekitzearen ezarpenak"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Aukeratu nola ireki sareko estekak aplikazio honetan"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Aplikazioan"</string>
diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml
index 06ff6e74322c..b23c833fa453 100644
--- a/libs/WindowManager/Shell/res/values-fi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fi/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vasen 50 %"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Vasen 30 %"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Oikea koko näytölle"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Vaihda sovellusta"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Yläosa koko näytölle"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Yläosa 70 %"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Yläosa 50 %"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Palauta"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Siirrä vasemmalle"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Siirrä oikealle"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Muuta vasemmanpuoleisen sovellusikkunan kokoa"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Muuta oikeanpuoleisen sovellusikkunan kokoa"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Suurenna ikkuna tai palauta ikkunan koko"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Avaa kahtia jaettu näyttö"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Siirry työpöydän ikkunointitilaan"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Muuta vasemmanpuoleisen ikkunan kokoa"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Muuta vasemmanpuoleisen ikkunan kokoa"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Suurenna ikkuna tai palauta ikkunan koko"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Suurenna ikkuna tai palauta ikkunan koko"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Pienennä sovellusikkuna"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Avaa oletusasetusten mukaan"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Valitse, miten verkkolinkit avataan tässä sovelluksessa"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Sovelluksessa"</string>
diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
index 08ff1d35a8c7..34b5b0acf753 100644
--- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % à la gauche"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30 % à la gauche"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Plein écran à la droite"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Permuter des applis"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Plein écran dans le haut"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70 % dans le haut"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % dans le haut"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaurer"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Épingler à gauche"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Épingler à droite"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Redimensionner la fenêtre de l\'appli à gauche"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Redimensionner la fenêtre de l\'appli à droite"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Agrandir ou restaurer la taille de la fenêtre"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Entrer en mode Écran divisé"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Entrer en mode Fenêtrage bureau"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Redimensionner la fenêtre vers la gauche"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Redimensionner la fenêtre vers la droite"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Agrandir ou restaurer la taille de la fenêtre"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Agrandir ou restaurer la taille de la fenêtre"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Réduire la fenêtre de l\'appli"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Ouvrir les paramètres par défaut"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Choisissez comment ouvrir les liens Web pour cette appli"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Dans l\'appli"</string>
diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml
index 9ced5c7bafd4..be41bba34772 100644
--- a/libs/WindowManager/Shell/res/values-fr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Écran de gauche à 50 %"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Écran de gauche à 30 %"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Écran de droite en plein écran"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Échanger les applis"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Écran du haut en plein écran"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Écran du haut à 70 %"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Écran du haut à 50 %"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaurer"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ancrer à gauche"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ancrer à droite"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Redimensionner la fenêtre de l\'appli vers la gauche"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Redimensionner la fenêtre de l\'appli vers la droite"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Agrandir ou restaurer la taille de la fenêtre"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Passer en mode Écran partagé"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Activer le mode fenêtrage du bureau"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Redimensionner la fenêtre vers la gauche"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Redimensionner la fenêtre vers la droite"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Agrandir ou restaurer la taille de la fenêtre"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Agrandir ou restaurer la taille de la fenêtre"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Réduire la fenêtre de l\'application"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Ouvrir les paramètres par défaut"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Choisir comment ouvrir les liens Web pour cette appli"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Dans l\'application"</string>
diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml
index d8c422fd1bd2..dcd57385809f 100644
--- a/libs/WindowManager/Shell/res/values-gu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gu/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ડાબે 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ડાબે 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"જમણી સ્ક્રીન સ્ક્રીન"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ઍપને સ્વૉપ કરો"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"શીર્ષ પૂર્ણ સ્ક્રીન"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"શીર્ષ 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"શીર્ષ 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"રિસ્ટોર કરો"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ડાબે સ્નૅપ કરો"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"જમણે સ્નૅપ કરો"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ડાબી બાજુથી ઍપની વિન્ડોનું કદ બદલો"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"જમણી બાજુથી ઍપની વિન્ડોનું કદ બદલો"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"વિન્ડોનું કદ મહત્તમ કરો અથવા રિસ્ટોર કરો"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"સ્ક્રીન-વિભાજન મોડ દાખલ કરો"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ડેસ્કટૉપ વિન્ડો મોડ દાખલ કરો"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ડાબી બાજુ વિન્ડોનું કદ બદલો"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"જમણી બાજુ વિન્ડોનું કદ બદલો"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"વિન્ડોનું કદ મહત્તમ કરો અથવા રિસ્ટોર કરો"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"વિન્ડોનું કદ મહત્તમ કરો અથવા રિસ્ટોર કરો"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ઍપની વિન્ડોને નાની કરો"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"\'ડિફૉલ્ટ તરીકે ખોલો\' સેટિંગ"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"આ ઍપ માટે વેબ લિંક ખોલવાની રીત પસંદ કરો"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ઍપમાં"</string>
diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml
index f8215afb1c05..4bf2d92c1860 100644
--- a/libs/WindowManager/Shell/res/values-hi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hi/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"बाईं स्क्रीन को 50% बनाएं"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"बाईं स्क्रीन को 30% बनाएं"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"दाईं स्क्रीन को फ़ुल स्क्रीन बनाएं"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ऐप्लिकेशन स्वैप करें"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ऊपर की स्क्रीन को फ़ुल स्क्रीन बनाएं"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ऊपर की स्क्रीन को 70% बनाएं"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ऊपर की स्क्रीन को 50% बनाएं"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"पहले जैसा करें"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"बाईं ओर स्नैप करें"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"दाईं ओर स्नैप करें"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ऐप्लिकेशन विंडो का साइज़ बाईं ओर से बदलें"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ऐप्लिकेशन विंडो का साइज़ दाईं ओर से बदलें"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"विंडो को बड़ा करें या उसका साइज़ पहले जैसा करें"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"स्प्लिट स्क्रीन मोड में चालू करें"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"डेस्कटॉप विंडो मोड में जाएं"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"विंडो का साइज़ बाईं ओर से बदलें"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"विंडो का साइज़ दाईं ओर से बढ़ाएं"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"विंडो को बड़ा करें या उसका साइज़ पहले जैसा करें"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"विंडो को बड़ा करें या उसका साइज़ पहले जैसा करें"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ऐप्लिकेशन की विंडो को छोटा करें"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"डिफ़ॉल्ट सेटिंग के हिसाब से खोलें"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"इस ऐप्लिकेशन के लिए वेब लिंक खोलने का तरीका चुनें"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ऐप्लिकेशन में"</string>
diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml
index 76e7579232d9..546a465c8699 100644
--- a/libs/WindowManager/Shell/res/values-hu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hu/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Bal oldali 50%-ra"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Bal oldali 30%-ra"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Jobb oldali teljes képernyőre"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Váltás az alkalmazások között"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Felső teljes képernyőre"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Felső 70%-ra"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Felső 50%-ra"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Visszaállítás"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Balra igazítás"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Jobbra igazítás"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Alkalmazásablak átméretezése balra"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Alkalmazásablak átméretezése jobbra"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Ablak teljes méretre állítása vagy visszaállítása"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Belépés osztott képernyős módba"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Asztali ablakkezelési mód indítása"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ablak átméretezése balra"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ablak átméretezése jobbra"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Ablak teljes méretre állítása vagy visszaállítása"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Ablak teljes méretre állítása vagy visszaállítása"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Alkalmazásablak kis méretre állítása"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Alapértelmezett beállítások megnyitása"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Az app webes linkjeinek megnyitásához használt módszer"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Az alkalmazásban"</string>
diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml
index 0eb75c79e4b8..39a395f9add1 100644
--- a/libs/WindowManager/Shell/res/values-hy/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hy/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ձախ էկրանը՝ 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ձախ էկրանը՝ 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Աջ էկրանը՝ լիաէկրան"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Հավելվածները տեղերով փոխել"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Վերևի էկրանը՝ լիաէկրան"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Վերևի էկրանը՝ 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Վերևի էկրանը՝ 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Վերականգնել"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ամրացնել ձախ կողմում"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ամրացնել աջ կողմում"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Ձգել հավելվածի պատուհանը դեպի ձախ"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Ձգել հավելվածի պատուհանը դեպի աջ"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Ծավալել կամ վերականգնել պատուհանի չափսը"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Մտնել էկրանի տրոհման ռեժիմ"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Մտնել համակարգչի ռեժիմ"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ձգել պատուհանը դեպի ձախ"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ձգել պատուհանը դեպի աջ"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Ծավալել կամ վերականգնել պատուհանի չափսը"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Ծավալել կամ վերականգնել պատուհանի չափսը"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Ծալել հավելվածի պատուհանը"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Բացել կարգավորումներն ըստ կանխադրման"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Ընտրեք՝ ինչպես բացել այս հավելվածի վեբ հղումները"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Հավելվածում"</string>
diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml
index 813e9783f336..09ce5257c56e 100644
--- a/libs/WindowManager/Shell/res/values-in/strings.xml
+++ b/libs/WindowManager/Shell/res/values-in/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kiri 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kiri 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Layar penuh di kanan"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Ganti Aplikasi"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Layar penuh di atas"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Atas 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Atas 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Pulihkan"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Maksimalkan ke kiri"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Maksimalkan ke kanan"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Ubah ukuran jendela aplikasi ke kiri"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Ubah ukuran jendela aplikasi ke kanan"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimalkan atau pulihkan ukuran jendela"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Masuk ke mode layar terpisah"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Masuk ke mode windowing desktop"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ubah ukuran jendela ke kiri"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ubah ukuran jendela ke kanan"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimalkan atau pulihkan ukuran jendela"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimalkan atau pulihkan ukuran jendela"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimalkan jendela aplikasi"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Buka dengan setelan default"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Pilih cara membuka link web untuk aplikasi ini"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Di aplikasi"</string>
diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml
index 1cd89a615cb2..b164b1131ad2 100644
--- a/libs/WindowManager/Shell/res/values-iw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-iw/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"שמאלה 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"שמאלה 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"מסך ימני מלא"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"מעבר בין אפליקציות"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"מסך עליון מלא"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"עליון 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"עליון 50%"</string>
@@ -130,7 +129,7 @@
<string name="open_in_app_text" msgid="2874590745116268525">"פתיחה באפליקציה"</string>
<string name="new_window_text" msgid="6318648868380652280">"חלון חדש"</string>
<string name="manage_windows_text" msgid="5567366688493093920">"ניהול החלונות"</string>
- <string name="change_aspect_ratio_text" msgid="9104456064548212806">"שינוי של יחס גובה-רוחב"</string>
+ <string name="change_aspect_ratio_text" msgid="9104456064548212806">"שינוי יחס הגובה-רוחב"</string>
<string name="close_text" msgid="4986518933445178928">"סגירה"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"סגירת התפריט"</string>
<string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"פתיחת התפריט"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"שחזור"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"הצמדה לשמאל"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"הצמדה לימין"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"שינוי הגודל של חלון האפליקציה שמשמאל"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"שינוי הגודל של חלון האפליקציה שמימין"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"שחזור של גודל החלון או הגדלת החלון"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"כניסה למצב מסך מפוצל"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"כניסה למצב שינוי הגודל של החלונות בממשק המחשב"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"שינוי גודל החלון שמשמאל"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"שינוי גודל החלון שמימין"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"שחזור של גודל החלון או הגדלת החלון"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"שחזור של גודל החלון או הגדלת החלון"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"מזעור החלון של האפליקציה"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"הגדרות לפתיחה כברירת מחדל"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"כאן בוחרים איך לפתוח באפליקציה הזו קישורים לדפי אינטרנט"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"באפליקציה"</string>
diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml
index 02e0f320eea6..1be19af9b372 100644
--- a/libs/WindowManager/Shell/res/values-ka/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ka/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"მარცხენა ეკრანი — 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"მარცხენა ეკრანი — 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"მარჯვენა ნაწილის სრულ ეკრანზე გაშლა"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"აპების გადართვა"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ზედა ნაწილის სრულ ეკრანზე გაშლა"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ზედა ეკრანი — 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ზედა ეკრანი — 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"აღდგენა"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"მარცხნივ გადატანა"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"მარჯვნივ გადატანა"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"აპის მარცხენა ფანჯრის ზომის შეცვლა"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"აპის მარჯვენა ფანჯრის ზომის შეცვლა"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ფანჯრის მაქსიმალურ ზომამდე გაზრდა ან აღდგენა"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"გაყოფილი ეკრანის რეჟიმში შესვლა"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"დესკტოპის ფანჯრის რეჟიმში შესვლა"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ფანჯრის ზომის შეცვლა მარცხნივ"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ფანჯრის ზომის შეცვლა მარჯვნივ"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ფანჯრის მაქსიმალურ ზომამდე გაზრდა ან აღდგენა"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ფანჯრის მაქსიმალურ ზომამდე გაზრდა ან აღდგენა"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"აპის ფანჯრის ზომის შემცირება"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"პარამეტრების ნაგულისხმევად გახსნა"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ამ აპისთვის ვებ ბმულების გახსნის წესის არჩევა"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"აპში"</string>
diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml
index 61c331df7598..5bd85191ec65 100644
--- a/libs/WindowManager/Shell/res/values-kk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kk/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% сол жақта"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30% сол жақта"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Оң жағын толық экранға шығару"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Қолданбаларды ауыстыру"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Жоғарғы жағын толық экранға шығару"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70% жоғарғы жақта"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% жоғарғы жақта"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Қалпына келтіру"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Солға тіркеу"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Оңға тіркеу"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Қолданба терезесінің өлшемін сол жақтан өзгерту"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Қолданба терезесінің өлшемін оң жақтан өзгерту"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Терезе өлшемін ұлғайту не қалпына келтіру"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Экранды бөлу режиміне өту"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Жұмыс үстелінің терезе режиміне өту"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Терезе өлшемін сол жаққа өзгерту"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Терезе өлшемін оң жаққа өзгерту"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Терезе өлшемін ұлғайту не қалпына келтіру"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Терезе өлшемін ұлғайту не қалпына келтіру"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Қолданба терезесін кішірейту"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Әдепкісінше ашу параметрлері"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Осы қолданбадағы веб-сілтемелерді ашу жолын таңдаңыз"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Қолданбада"</string>
diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml
index 13c700952609..65add57a9e6b 100644
--- a/libs/WindowManager/Shell/res/values-ko/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ko/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"왼쪽 화면 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"왼쪽 화면 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"오른쪽 화면 전체화면"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"앱 전환"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"위쪽 화면 전체화면"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"위쪽 화면 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"위쪽 화면 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"복원"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"왼쪽으로 맞추기"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"오른쪽으로 맞추기"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"앱 창 크기 왼쪽으로 조절"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"앱 창 크기 오른쪽으로 조절"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"창 최대화 또는 크기 복원"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"화면 분할 모드 시작"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"데스크톱 창 모드 시작"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"창 크기 왼쪽으로 조절"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"창 크기 오른쪽으로 조절"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"창 최대화 또는 크기 복원"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"창 최대화 또는 크기 복원"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"앱 창 최소화"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"기본값으로 열기 설정"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"이 앱에서 웹 링크를 여는 방법을 선택하세요"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"앱에서"</string>
diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml
index eb990f142da8..96c2226daf58 100644
--- a/libs/WindowManager/Shell/res/values-ky/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ky/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Сол жактагы экранды 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Сол жактагы экранды 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Оң жактагы экранды толук экран режимине өткөрүү"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Колдонмолорду алмаштыруу"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Үстүнкү экранды толук экран режимине өткөрүү"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Үстүнкү экранды 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Үстүнкү экранды 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Калыбына келтирүү"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Солго жылдыруу"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Оңго жылдыруу"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Колдонмонун терезесинин өлчөмүн солго өзгөртүү"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Колдонмонун терезесинин өлчөмүн оңго өзгөртүү"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Терезенин өлчөмүн чоңойтуу же калыбына келтирүү"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Экранды бөлүү режимине өтүү"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Иш тактанын терезелери режимине өтүү"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Терезенин өлчөмүн солго өзгөртүү"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Терезенин өлчөмүн оңго өзгөртүү"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Терезенин өлчөмүн чоңойтуу же калыбына келтирүү"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Терезенин өлчөмүн чоңойтуу же калыбына келтирүү"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Колдонмонун терезесин кичирейтүү"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Демейки шартта ачылуучу шилтемелердин параметрлери"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Колдонмодо шилтемелер кантип ачыларын тандаңыз"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Колдонмодо"</string>
diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml
index 50164c081bb4..9337efc92606 100644
--- a/libs/WindowManager/Shell/res/values-lo/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lo/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ຊ້າຍ 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ຊ້າຍ 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ເຕັມໜ້າຈໍຂວາ"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ສະຫຼັບແອັບ"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ເຕັມໜ້າຈໍເທິງສຸດ"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ເທິງສຸດ 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ເທິງສຸດ 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ກູ້ຄືນ"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ແນບຊ້າຍ"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ແນບຂວາ"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ປັບຂະໜາດໜ້າຈໍແອັບໄປທາງຊ້າຍ"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ປັບຂະໜາດໜ້າຈໍແອັບໄປທາງຂວາ"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ຂະຫຍາຍ ຫຼື ຄືນຄ່າຂະໜາດໜ້າຈໍ"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"ເຂົ້າສູ່ໂໝດແບ່ງໜ້າຈໍ"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ເຂົ້າສູ່ໂໝດໜ້າຈໍເດັສທັອບ"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ປັບຂະໜາດໜ້າຈໍໄປທາງຊ້າຍ"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ປັບຂະໜາດໜ້າຈໍໄປທາງຂວາ"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ຂະຫຍາຍ ຫຼື ຄືນຄ່າຂະໜາດໜ້າຈໍ"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ຂະຫຍາຍ ຫຼື ຄືນຄ່າຂະໜາດໜ້າຈໍ"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ຫຍໍ້ໜ້າຈໍແອັບ"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"ເປີດຕາມການຕັ້ງຄ່າເລີ່ມຕົ້ນ"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ເລືອກວິທີເປີດລິ້ງເວັບສຳລັບແອັບນີ້"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ໃນແອັບ"</string>
diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml
index a5547b0f71ea..24a969bc8c1b 100644
--- a/libs/WindowManager/Shell/res/values-lv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lv/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Pa kreisi 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Pa kreisi 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Labā daļa pa visu ekrānu"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Apmainīt lietotnes"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Augšdaļa pa visu ekrānu"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Augšdaļa 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Augšdaļa 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Atjaunot"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Piestiprināt pa kreisi"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Piestiprināt pa labi"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Mainīt lietotnes loga lielumu uz kreiso pusi"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Mainīt lietotnes loga lielumu uz labo pusi"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimizēt vai atjaunot loga lielumu"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Ieslēgt ekrāna sadalīšanas režīmu"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Ieslēgt darbvirsmas logu režīmu"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Mainīt loga lielumu uz kreiso pusi"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Mainīt loga lielumu uz labo pusi"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimizēt vai atjaunot loga lielumu"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimizēt vai atjaunot loga lielumu"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizēt lietotnes logu"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Atvērt pēc noklusējuma iestatījumiem"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Izvēlieties, kā atvērt šajā lietotnē norādītās saites"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Lietotnē"</string>
diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml
index 6593e2d9e66b..f7177acc8681 100644
--- a/libs/WindowManager/Shell/res/values-mk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mk/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Левиот 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Левиот 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Десниот на цел екран"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Менувајте апликации"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Горниот на цел екран"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Горниот 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Горниот 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Врати"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Фотографирај лево"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Фотографирај десно"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Променете ја големината на прозорецот на апликацијата одлево"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Променете ја големината на прозорецот на апликацијата оддесно"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Максимизирајте или вратете ја големината на прозорецот"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Влезете во „Режим на поделен екран“"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Влезете во „Режим со прозорци на работната површина“"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Променете ја големината на прозорецот налево"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Променете ја големината на прозорецот надесно"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Максимизирајте или вратете ја големината на прозорецот"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Максимизирајте или вратете ја големината на прозорецот"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Минимизирајте го прозорецот на апликацијата"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Отвори според стандардните поставки"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Изберете како да се отвораат линковите за апликацијава"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Во апликацијата"</string>
diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml
index 8914e1fa782a..b38026cc5445 100644
--- a/libs/WindowManager/Shell/res/values-mn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mn/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Зүүн 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Зүүн 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Баруун талын бүтэн дэлгэц"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Аппуудыг солих"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Дээд талын бүтэн дэлгэц"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Дээд 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Дээд 50%"</string>
@@ -130,7 +129,7 @@
<string name="open_in_app_text" msgid="2874590745116268525">"Аппад нээх"</string>
<string name="new_window_text" msgid="6318648868380652280">"Шинэ цонх"</string>
<string name="manage_windows_text" msgid="5567366688493093920">"Windows-г удирдах"</string>
- <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Харьцааг өөрчлөх"</string>
+ <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Аспектын харьцааг өөрчлөх"</string>
<string name="close_text" msgid="4986518933445178928">"Хаах"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Цэсийг хаах"</string>
<string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Цэсийг нээх"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Сэргээх"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Зүүн тийш зэрэгцүүлэх"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Баруун тийш зэрэгцүүлэх"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Аппын цонхны хэмжээг зүүн тал руу өөрчлөх"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Аппын цонхны хэмжээг баруун тал руу өөрчлөх"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Цонхны хэмжээг томруулах эсвэл сэргээх"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Дэлгэц хуваах горимд орох"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Дэлгэцийн цонхны горимд орох"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Цонхны хэмжээг зүүн тал руу өөрчлөх"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Цонхны хэмжээг баруун тал руу өөрчлөх"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Цонхны хэмжээг томруулах эсвэл сэргээх"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Цонхны хэмжээг томруулах эсвэл сэргээх"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Аппын цонхыг жижгэрүүлэх"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Өгөгдмөл тохиргоогоор нээх"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Энэ аппад веб холбоосыг хэрхэн нээхийг сонгоно уу"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Аппад"</string>
diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml
index 81594798ef48..d9c1d1f45a55 100644
--- a/libs/WindowManager/Shell/res/values-mr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mr/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"डावी 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"डावी 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"उजवी फुल स्क्रीन"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"अ‍ॅप्स स्वॅप करा"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"शीर्ष फुल स्क्रीन"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"शीर्ष 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"शीर्ष 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"रिस्टोअर करा"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"डावीकडे स्नॅप करा"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"उजवीकडे स्नॅप करा"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"अ‍ॅप विंडोचा डावीकडून आकार बदला"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"अ‍ॅप विंडोचा उजवीकडून आकार बदला"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"विंडोचा आकार मोठा करा किंवा रिस्टोअर करा"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"स्प्लिट स्क्रीन मोड एंटर करा"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"डेस्कटॉप विंडोइंग मोड एंटर करा"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"अ‍ॅप विंडोचा डावीकडे आकार बदला"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"अ‍ॅप विंडोचा उजवीकडे आकार बदला"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"विंडोचा आकार मोठा करा किंवा रिस्टोअर करा"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"विंडोचा आकार मोठा करा किंवा रिस्टोअर करा"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"अ‍ॅप विंडो लहान करा"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"बाय डीफॉल्ट सेटिंग्ज उघडा"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"या अ‍ॅपसाठीच्या वेब लिंक कशा उघडाव्यात हे निवडा"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ॲपमध्ये"</string>
diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml
index b749b670f74d..1f4db6d9b872 100644
--- a/libs/WindowManager/Shell/res/values-my/strings.xml
+++ b/libs/WindowManager/Shell/res/values-my/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ဘယ်ဘက် မျက်နှာပြင် ၅၀%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ဘယ်ဘက် မျက်နှာပြင် ၃၀%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ညာဘက် မျက်နှာပြင်အပြည့်"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"အက်ပ်ပြောင်းရန်"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"အပေါ်ဘက် မျက်နှာပြင်အပြည့်"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"အပေါ်ဘက် မျက်နှာပြင် ၇၀%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"အပေါ်ဘက် မျက်နှာပြင် ၅၀%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ပြန်ပြောင်းရန်"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ဘယ်တွင် ချဲ့ရန်"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ညာတွင် ချဲ့ရန်"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"အက်ပ်ဝင်းဒိုး ဘယ်ဘက်ကို အရွယ်ပြင်ရန်"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"အက်ပ်ဝင်းဒိုး ညာဘက်ကို အရွယ်ပြင်ရန်"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ဝင်းဒိုးအရွယ်အစားကို ချဲ့ရန် (သို့) ပြန်ပြောင်းရန်"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"မျက်နှာပြင်ခွဲပြခြင်းမုဒ်သို့ ဝင်ရန်"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ဒက်စ်တော့ ဝင်းဒိုးမုဒ်သို့ ဝင်ရန်"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ဝင်းဒိုးကို ဘယ်ဘက်သို့ အရွယ်ပြင်ရန်"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ဝင်းဒိုးကို ညာဘက်သို့ အရွယ်ပြင်ရန်"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ဝင်းဒိုးအရွယ်အစားကို ချဲ့ရန် (သို့) ပြန်ပြောင်းရန်"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ဝင်းဒိုးအရွယ်အစားကို ချဲ့ရန် (သို့) ပြန်ပြောင်းရန်"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"အက်ပ်ဝင်းဒိုးကို ချုံ့ရန်"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"မူရင်းဆက်တင်ဖြင့် ဖွင့်ရန်"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ဤအက်ပ်အတွက် ဝဘ်လင့်ခ်များ မည်သို့ဖွင့်မည်ကို ရွေးပါ"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"အက်ပ်တွင်"</string>
diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml
index 86aa19650003..586a50f74f0d 100644
--- a/libs/WindowManager/Shell/res/values-nb/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nb/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Sett størrelsen på den venstre delen av skjermen til 50 %"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Sett størrelsen på den venstre delen av skjermen til 30 %"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Utvid den høyre delen av skjermen til hele skjermen"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Bytt apper"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Utvid den øverste delen av skjermen til hele skjermen"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Sett størrelsen på den øverste delen av skjermen til 70 %"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Sett størrelsen på den øverste delen av skjermen til 50 %"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Gjenopprett"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fest til venstre"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fest til høyre"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Endre størrelsen på appvinduet til venstre"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Endre størrelsen på appvinduet til høyre"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimer eller gjenopprett størrelsen på vinduet"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Start modusen for delt skjerm"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Start vindusmodus for skrivebordet"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Endre størrelsen på vinduet til venstre"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Endre størrelsen på vinduet til høyre"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimer eller gjenopprett størrelsen på vinduet"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimer eller gjenopprett størrelsen på vinduet"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimer appvinduet"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Innstillinger for åpning som standard"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Velg hvordan nettlinker skal åpnes for denne appen"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"I appen"</string>
diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml
index bc45b0f45750..f66fb1d30359 100644
--- a/libs/WindowManager/Shell/res/values-ne/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ne/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"बायाँ भाग ५०%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"बायाँ भाग ३०%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"दायाँ भाग फुल स्क्रिन"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"एपहरू अदलबदल गर्नुहोस्"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"माथिल्लो भाग फुल स्क्रिन"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"माथिल्लो भाग ७०%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"माथिल्लो भाग ५०%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"रिस्टोर गर्नुहोस्"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"बायाँतिर स्न्याप गर्नुहोस्"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"दायाँतिर स्न्याप गर्नुहोस्"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"एपको विन्डोको आकार बदलेर बायाँतिर लैजानुहोस्"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"एपको विन्डोको आकार बदलेर दायाँतिर लैजानुहोस्"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"विन्डोको आकार म्याक्सिमाइज गर्नुहोस् वा रिस्टोर गर्नुहोस्"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"स्प्लिट स्क्रिन मोड प्रयोग गर्नुहोस्"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"डेस्कटप विन्डोइङ मोड प्रयोग गर्नुहोस्"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"विन्डोको आकार बदलेर बायाँतिर लैजानुहोस्"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"विन्डोको आकार बदलेर दायाँतिर लैजानुहोस्"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"विन्डोको आकार म्याक्सिमाइज गर्नुहोस् वा रिस्टोर गर्नुहोस्"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"विन्डोको आकार म्याक्सिमाइज गर्नुहोस् वा रिस्टोर गर्नुहोस्"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"एपको विन्डो मिनिमाइज गर्नुहोस्"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"डिफल्ट सेटिङअनुसार खोल्नुहोस्"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"यो एपका वेब लिंकहरू खोल्ने तरिका छनौट गर्नुहोस्"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"एपमा"</string>
diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml
index b16092ec46f9..edb520872d1f 100644
--- a/libs/WindowManager/Shell/res/values-or/strings.xml
+++ b/libs/WindowManager/Shell/res/values-or/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ବାମ ପଟକୁ 50% କରନ୍ତୁ"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ବାମ ପଟେ 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ଡାହାଣ ପଟକୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍‍ କରନ୍ତୁ"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ଆପ୍ସ ସ୍ୱାପ କରନ୍ତୁ"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ଉପର ଆଡ଼କୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍‍ କରନ୍ତୁ"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ଉପର ଆଡ଼କୁ 70% କରନ୍ତୁ"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ଉପର ଆଡ଼କୁ 50% କରନ୍ତୁ"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ରିଷ୍ଟୋର କରନ୍ତୁ"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ବାମରେ ସ୍ନାପ କରନ୍ତୁ"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ଡାହାଣରେ ସ୍ନାପ କରନ୍ତୁ"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ଆପ ୱିଣ୍ଡୋ ରିସାଇଜ କରିବା ପାଇଁ ବାମ ବଟନ"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ଆପ ୱିଣ୍ଡୋ ରିସାଇଜ କରିବା ପାଇଁ ଡାହାଣ ବଟନ"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ୱିଣ୍ଡୋ ସାଇଜକୁ ମେକ୍ସିମାଇଜ କିମ୍ବା ରିଷ୍ଟୋର କରନ୍ତୁ"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ମୋଡରେ ପ୍ରବେଶ କରନ୍ତୁ"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ଡେସ୍କଟପ ୱିଣ୍ଡୋଇଂ ମୋଡରେ ପ୍ରବେଶ କରନ୍ତୁ"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ବାମପଟକୁ ୱିଣ୍ଡୋ ରିସାଇଜ କରନ୍ତୁ"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ଡାହାଣପଟକୁ ୱିଣ୍ଡୋ ରିସାଇଜ କରନ୍ତୁ"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ୱିଣ୍ଡୋ ସାଇଜକୁ ମେକ୍ସିମାଇଜ କିମ୍ବା ରିଷ୍ଟୋର କରନ୍ତୁ"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ୱିଣ୍ଡୋ ସାଇଜକୁ ମେକ୍ସିମାଇଜ କିମ୍ବା ରିଷ୍ଟୋର କରନ୍ତୁ"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ଆପ ୱିଣ୍ଡୋକୁ ମିନିମାଇଜ କରନ୍ତୁ"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"ଡିଫଲ୍ଟ ସେଟିଂସକୁ ଖୋଲନ୍ତୁ"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ଏହି ଆପ ପାଇଁ ୱେବ ଲିଙ୍କଗୁଡ଼ିକୁ କିପରି ଖୋଲିବେ, ତାହା ବାଛନ୍ତୁ"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ଆପରେ"</string>
diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml
index d06603fbe206..47ee80e6a4e8 100644
--- a/libs/WindowManager/Shell/res/values-pl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pl/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% lewej części ekranu"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30% lewej części ekranu"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Prawa część ekranu na pełnym ekranie"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zamień aplikacje"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Górna część ekranu na pełnym ekranie"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70% górnej części ekranu"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% górnej części ekranu"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Przywróć"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Przyciągnij do lewej"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Przyciągnij do prawej"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Zmień rozmiar okna aplikacji po lewej"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Zmień rozmiar okna aplikacji po prawej"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Zmaksymalizuj lub przywróć rozmiar okna"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Włącz tryb podzielonego ekranu"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Włącz tryb okien na pulpicie"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Zmień rozmiar okna do lewej"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Zmień rozmiar okna do prawej"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Zmaksymalizuj lub przywróć rozmiar okna"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Zmaksymalizuj lub przywróć rozmiar okna"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Zminimalizuj okno aplikacji"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Ustawienia domyślnego otwierania"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Wybierz, gdzie chcesz otwierać linki z tej aplikacji"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"W aplikacji"</string>
diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml
index 3039950e47ee..a3313b6496e0 100644
--- a/libs/WindowManager/Shell/res/values-ro/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ro/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Partea stângă: 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Partea stângă: 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Partea dreaptă pe ecran complet"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Comută între aplicații"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Partea de sus pe ecran complet"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Partea de sus: 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Partea de sus: 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restabilește"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Trage la stânga"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Trage la dreapta"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Redimensionează fereastra aplicației la stânga"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Redimensionează fereastra aplicației la dreapta"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximizează sau restabilește dimensiunea ferestrei"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Accesează modul ecran împărțit"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Accesează modul de windowing pe desktop"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Redimensionează fereastra la stânga"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Redimensionează fereastra la dreapta"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximizează sau restabilește dimensiunea ferestrei"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximizează sau restabilește dimensiunea ferestrei"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizează fereastra aplicației"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Setări de deschidere în mod prestabilit"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Alege modul de deschidere a linkurilor web pentru aplicație"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"În aplicație"</string>
diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml
index fe03feb901ed..fcb0aa6559fa 100644
--- a/libs/WindowManager/Shell/res/values-sq/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sq/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Majtas 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Majtas 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Ekrani i plotë djathtas"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Ndërro aplikacionet"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Ekrani i plotë lart"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Lart 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Lart 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restauro"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Zhvendos majtas"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Zhvendos djathtas"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Ndrysho përmasat e dritares së aplikacionit majtas"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Ndrysho përmasat e dritares së aplikacionit djathtas"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimizo ose restauro madhësinë e dritares"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Hyr në modalitetin e ekranit të ndarë"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Hyr në modalitetin e dritareve në desktop"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ndrysho përmasat e dritares në të majtë"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ndrysho përmasat e dritares në të djathtë"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimizo ose restauro madhësinë e dritares"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimizo ose restauro madhësinë e dritares"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizo dritaren e aplikacionit"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Hap sipas cilësimeve të parazgjedhura"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Zgjidh si do t\'i hapësh lidhjet e uebit për këtë aplikacion"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Në aplikacion"</string>
diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml
index 5163fc69dfb5..6a2ffcdf8e89 100644
--- a/libs/WindowManager/Shell/res/values-sr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sr/strings.xml
@@ -125,11 +125,11 @@
<string name="float_button_text" msgid="9221657008391364581">"Плутајуће"</string>
<string name="select_text" msgid="5139083974039906583">"Изаберите"</string>
<string name="screenshot_text" msgid="1477704010087786671">"Снимак екрана"</string>
- <string name="open_in_browser_text" msgid="9181692926376072904">"Отворите у прегледачу"</string>
+ <string name="open_in_browser_text" msgid="9181692926376072904">"Отвори у прегледачу"</string>
<string name="open_in_app_text" msgid="2874590745116268525">"Отворите у апликацији"</string>
<string name="new_window_text" msgid="6318648868380652280">"Нови прозор"</string>
<string name="manage_windows_text" msgid="5567366688493093920">"Управљајте прозорима"</string>
- <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Промените размеру"</string>
+ <string name="change_aspect_ratio_text" msgid="9104456064548212806">"Промени размеру"</string>
<string name="close_text" msgid="4986518933445178928">"Затворите"</string>
<string name="collapse_menu_text" msgid="7515008122450342029">"Затворите мени"</string>
<string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Отворите мени"</string>
@@ -138,7 +138,7 @@
<string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Апликација не може да се премести овде"</string>
<string name="desktop_mode_maximize_menu_immersive_button_text" msgid="559492223133829481">"Имерзивне"</string>
<string name="desktop_mode_maximize_menu_immersive_restore_button_text" msgid="4900114367354709257">"Врати"</string>
- <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Увећајте"</string>
+ <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Увећај"</string>
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Вратите"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Прикачите лево"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Прикачите десно"</string>
diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml
index 29f4aab0502a..a9df47650dad 100644
--- a/libs/WindowManager/Shell/res/values-sv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sv/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vänster 50 %"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Vänster 30 %"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Helskärm på höger skärm"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Byt appar"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Helskärm på övre skärm"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Övre 70 %"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Övre 50 %"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Återställ"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fäst till vänster"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fäst till höger"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Ändra storlek på appfönstret åt vänster"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Ändra storlek på appfönstret åt höger"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximera eller återställ fönsterstorleken"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Starta läget för delad skärm"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Starta datorläget"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ändra storlek på fönstret åt vänster"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ändra storlek på fönstret åt höger"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximera eller återställ fönsterstorleken"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximera eller återställ fönsterstorleken"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimera appfönstret"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Inställningar för Öppna som standard"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Välj hur webblänkar ska öppnas för den här appen"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"I appen"</string>
diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml
index 6471e3b723e0..a3c9a0d3989c 100644
--- a/libs/WindowManager/Shell/res/values-sw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sw/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kushoto 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kushoto 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Skrini nzima ya kulia"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Badilisha Programu"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Skrini nzima ya juu"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Juu 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Juu 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Rejesha"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Telezesha kushoto"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Telezesha kulia"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Badilisha ukubwa wa dirisha la programu kushoto"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Badilisha ukubwa wa dirisha la programu kulia"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Panua au urejeshe ukubwa wa dirisha"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Ingia katika hali ya skrini iliyogawanywa"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Ingia katika hali ya madirisha ya kompyuta ya mezani"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Badilisha ukubwa wa dirisha kushoto"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Badilisha ukubwa wa dirisha kulia"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Panua au urejeshe ukubwa wa dirisha"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Panua au urejeshe ukubwa wa dirisha"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Punguza dirisha la programu"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Fungua kwa mipangilio chaguomsingi"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Chagua jinsi ya kufungua viungo vya wavuti vya programu hii"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Kwenye programu"</string>
diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml
index 03e55c8dcf79..b1b8c7ff2075 100644
--- a/libs/WindowManager/Shell/res/values-ta/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ta/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"இடது புறம் 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"இடது புறம் 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"வலது புறம் முழுத் திரை"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ஆப்ஸை மாற்றும்"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"மேற்புறம் முழுத் திரை"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"மேலே 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"மேலே 50%"</string>
@@ -126,7 +125,7 @@
<string name="float_button_text" msgid="9221657008391364581">"மிதக்கும் சாளரம்"</string>
<string name="select_text" msgid="5139083974039906583">"தேர்ந்தெடுக்கும்"</string>
<string name="screenshot_text" msgid="1477704010087786671">"ஸ்கிரீன்ஷாட்"</string>
- <string name="open_in_browser_text" msgid="9181692926376072904">"உலாவியில் திறக்கும்"</string>
+ <string name="open_in_browser_text" msgid="9181692926376072904">"பிரவுசரில் திற"</string>
<string name="open_in_app_text" msgid="2874590745116268525">"ஆப்ஸில் திறக்கும்"</string>
<string name="new_window_text" msgid="6318648868380652280">"புதிய சாளரம்"</string>
<string name="manage_windows_text" msgid="5567366688493093920">"சாளரங்களை நிர்வகிக்கலாம்"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"மீட்டெடுக்கும்"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"இடதுபுறம் நகர்த்தும்"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"வலதுபுறம் நகர்த்தும்"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ஆப்ஸ் சாளரத்தின் இடதுபுறத்தில் அளவை மாற்றும்"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ஆப்ஸ் சாளரத்தின் வலதுபுறத்தில் அளவை மாற்றும்"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"சாளரத்தின் அளவைப் பெரிதாக்கும்/மீட்டெடுக்கும்"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"திரைப் பிரிப்புப் பயன்முறையில் உள்நுழையும்"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"டெஸ்க்டாப் சாளரப் பயன்முறையில் உள்நுழையும்"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"சாளரத்தை இடதுபுறமாக அளவு மாற்றும்"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"சாளரத்தை வலதுபுறமாக அளவு மாற்றும்"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"சாளரத்தின் அளவைப் பெரிதாக்கும்/மீட்டெடுக்கும்"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"சாளரத்தின் அளவைப் பெரிதாக்கும்/மீட்டெடுக்கும்"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ஆப்ஸ் சாளரத்தைச் சிறிதாக்கும்"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"இயல்பாக அமைப்புகளைத் திறக்கும்"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"இந்த ஆப்ஸில் வலை இணைப்புகளைத் திறக்கும் வழிமுறையைத் தேர்வுசெய்யுங்கள்"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ஆப்ஸில்"</string>
diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml
index 8d12e5437c62..6a5d1abebd25 100644
--- a/libs/WindowManager/Shell/res/values-tr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tr/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Solda %50"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Solda %30"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Sağda tam ekran"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Uygulamaların Yerini Değiştir"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Üstte tam ekran"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Üstte %70"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Üstte %50"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Geri yükle"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Sola tuttur"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Sağa tuttur"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Uygulama penceresini sola yeniden boyutlandır"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Uygulama penceresini sağa yeniden boyutlandır"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Pencereyi ekranı kaplayacak şekilde büyüt veya önceki boyutuna döndür"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Bölünmüş ekran moduna gir"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Masaüstü pencereleme moduna gir"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Pencereyi sola yeniden boyutlandır"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Pencereyi sağa yeniden boyutlandır"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Pencereyi ekranı kaplayacak şekilde büyüt veya önceki boyutuna döndür"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Pencereyi ekranı kaplayacak şekilde büyüt veya önceki boyutuna döndür"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Uygulama penceresini küçült"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Varsayılan olarak açma ayarları"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Bu uygulama için web bağlantılarının nasıl açılacağını seçin"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Uygulamada"</string>
diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml
index 66d8a62f6633..7f4e91d5dfc5 100644
--- a/libs/WindowManager/Shell/res/values-uk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uk/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ліве вікно на 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ліве вікно на 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Праве вікно на весь екран"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Поміняти додатки місцями"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Верхнє вікно на весь екран"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Верхнє вікно на 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Верхнє вікно на 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Відновити"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Закріпити ліворуч"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Закріпити праворуч"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Змінити розмір вікна додатка ліворуч"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Змінити розмір вікна додатка праворуч"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Розгорнути вікно або відновити його розмір"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Увімкнути режим розділення екрана"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Увімкнути режим вікон для комп’ютера"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Змінити розмір вікна ліворуч"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Змінити розмір вікна праворуч"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Розгорнути вікно або відновити його розмір"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Розгорнути вікно або відновити його розмір"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Згорнути вікно додатка"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Налаштування \"Відкривати за умовчанням\""</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Виберіть, як відкривати вебпосилання в цьому додатку"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"У додатку"</string>
diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml
index 653ba0e66984..f461d4077087 100644
--- a/libs/WindowManager/Shell/res/values-ur/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ur/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"بائیں %50"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"بائیں %30"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"دائیں فل اسکرین"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ایپس سویپ کریں"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"بالائی فل اسکرین"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"اوپر %70"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"اوپر %50"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"بحال کریں"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"دائیں منتقل کریں"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"بائیں منتقل کریں"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"دائیں طرف ایپ ونڈو کا سائز تبدیل کریں"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ایپ ونڈو کا سائز بائیں طرف تبدیل کریں"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ونڈو کا سائز زیادہ سے زیادہ یا بحال کریں"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"سپلٹ اسکرین موڈ میں داخل ہوں"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ڈیسک ٹاپ ونڈو وضع میں داخل ہوں"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"دائیں طرف ونڈو کا سائز تبدیل کریں"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ونڈو کا سائز بائیں طرف تبدیل کریں"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ونڈو کا سائز زیادہ سے زیادہ یا بحال کریں"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ونڈو کا سائز زیادہ سے زیادہ یا بحال کریں"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ایپ ونڈو کو چھوٹا کریں"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"بطور ڈیفالٹ ترتیبات کھولیں"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"اس ایپ کے لیے ویب لنکس کھولنے کا طریقہ منتخب کریں"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ایپ میں"</string>
diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml
index f1b728b1b64c..e7cacc345c2b 100644
--- a/libs/WindowManager/Shell/res/values-vi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-vi/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Trái 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Trái 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Toàn màn hình bên phải"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Hoán đổi ứng dụng"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Toàn màn hình phía trên"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Trên 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Trên 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Khôi phục"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Di chuyển nhanh sang trái"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Di chuyển nhanh sang phải"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Đổi kích thước và chuyển cửa sổ ứng dụng sang trái"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Đổi kích thước và chuyển cửa sổ ứng dụng sang phải"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Phóng to hoặc khôi phục kích thước cửa sổ"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Mở chế độ chia đôi màn hình"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Mở chế độ cửa sổ trên máy tính"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Đổi kích thước và chuyển cửa sổ sang trái"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Đổi kích thước và chuyển cửa sổ sang phải"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Phóng to hoặc khôi phục kích thước cửa sổ"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Phóng to hoặc khôi phục kích thước cửa sổ"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Thu nhỏ cửa sổ ứng dụng"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Mở các chế độ cài đặt theo mặc định"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Chọn cách mở đường liên kết trang web cho ứng dụng này"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Trong ứng dụng"</string>
diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
index 543780844060..562a0ee09bd6 100644
--- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"左侧 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"左侧 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"右侧全屏"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"交换应用位置"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"顶部全屏"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"顶部 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"顶部 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"恢复"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"贴靠左侧"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"贴靠右侧"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"调整应用窗口大小并贴靠左侧"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"调整应用窗口大小并贴靠右侧"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"将窗口最大化或恢复大小"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"进入分屏模式"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"进入桌面设备窗口化模式"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"调整窗口大小并贴靠左侧"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"调整窗口大小并贴靠右侧"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"将窗口最大化或恢复大小"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"将窗口最大化或恢复大小"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"将应用窗口最小化"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"默认打开设置"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"选择如何打开此应用中的网页链接"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"在此应用内"</string>
diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
index 938024d2cd1a..eecd9f21be57 100644
--- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"左邊 50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"左邊 30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"右邊全螢幕"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"切換應用程式"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"頂部全螢幕"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"頂部 70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"頂部 50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"還原"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"貼齊左邊"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"貼齊右邊"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"調整左邊應用程式視窗大小"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"調整右邊應用程式視窗大小"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"將視窗放到最大或者還原視窗大小"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"進入分割螢幕模式"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"進入桌面視窗模式"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"將視窗移去左邊調整大小"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"將視窗移去右邊調整大小"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"將視窗放到最大或者還原視窗大小"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"將視窗放到最大或者還原視窗大小"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"將應用程式視窗縮到最細"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"採用預設設定打開"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"選擇此應用程式開啟網絡連結的方式"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"在應用程式內"</string>
diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
index 3a5a87d9868e..c157c193fa14 100644
--- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"以 50% 的螢幕空間顯示左側畫面"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"以 30% 的螢幕空間顯示左側畫面"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"以全螢幕顯示右側畫面"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"切換應用程式"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"以全螢幕顯示頂端畫面"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"以 70% 的螢幕空間顯示頂端畫面"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"以 50% 的螢幕空間顯示頂端畫面"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"還原"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"靠左對齊"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"靠右對齊"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"調整應用程式視窗大小並向左貼齊"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"調整應用程式視窗大小並向右貼齊"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"將視窗最大化或還原大小"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"進入分割畫面模式"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"進入電腦視窗化模式"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"調整應用程式視窗大小並向左貼齊"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"調整應用程式視窗大小並向右貼齊"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"將視窗最大化或還原大小"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"將視窗最大化或還原大小"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"將應用程式視窗最小化"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"開啟連結的預設設定"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"選擇如何開啟這個應用程式的網頁連結"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"使用應用程式"</string>
diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml
index cba8e048ea3d..a7ba6d21234d 100644
--- a/libs/WindowManager/Shell/res/values-zu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zu/strings.xml
@@ -43,8 +43,7 @@
<string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kwesokunxele ngo-50%"</string>
<string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kwesokunxele ngo-30%"</string>
<string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Isikrini esigcwele esingakwesokudla"</string>
- <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) -->
- <skip />
+ <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Shintsha ama-app"</string>
<string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Isikrini esigcwele esiphezulu"</string>
<string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Okuphezulu okungu-70%"</string>
<string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Okuphezulu okungu-50%"</string>
@@ -143,26 +142,16 @@
<string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Buyisela"</string>
<string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Chofoza kwesobunxele"</string>
<string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Chofoza kwesokudla"</string>
- <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) -->
- <skip />
- <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) -->
- <skip />
- <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) -->
- <skip />
- <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) -->
- <skip />
- <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) -->
- <skip />
- <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) -->
- <skip />
+ <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Shintsha usayizi we-app yewindi ngakwesokunxele"</string>
+ <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Shintsha usayizi we-app yewindi ngakwesokudla"</string>
+ <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Khulisa noma buyisela usayizi wewindi"</string>
+ <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Faka imodi yokuhlukanisa isikrini"</string>
+ <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Faka imodi yokwenza iwindi yedeskithophu"</string>
+ <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Shintsha usayizi wewindi ngakwesokunxele"</string>
+ <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Shintsha usayizi wewindi ngakwesokudla"</string>
+ <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Khulisa noma buyisela usayizi wewindi"</string>
+ <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Khulisa noma buyisela usayizi wewindi"</string>
+ <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Nciphisa iwindi le-app"</string>
<string name="open_by_default_settings_text" msgid="2526548548598185500">"Vula amasethingi ngokuzenzakalela"</string>
<string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Khetha indlela yokuvula amalinki ewebhu ale app"</string>
<string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Ku-app"</string>
diff --git a/libs/WindowManager/Shell/res/values/attrs.xml b/libs/WindowManager/Shell/res/values/attrs.xml
index fbb5caa508de..4ba0468a740d 100644
--- a/libs/WindowManager/Shell/res/values/attrs.xml
+++ b/libs/WindowManager/Shell/res/values/attrs.xml
@@ -23,4 +23,11 @@
<declare-styleable name="MessageState">
<attr name="state_task_focused" format="boolean"/>
</declare-styleable>
+
+ <declare-styleable name="HandleMenuActionButton">
+ <attr name="android:text" format="string" />
+ <attr name="android:textColor" format="color" />
+ <attr name="android:src" format="reference" />
+ <attr name="android:drawableTint" format="color" />
+ </declare-styleable>
</resources>
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index e23d5725e9c3..96e008e42f1c 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -570,7 +570,7 @@
<dimen name="desktop_mode_handle_menu_corner_radius">26dp</dimen>
<!-- The radius of the caption menu icon. -->
- <dimen name="desktop_mode_caption_icon_radius">24dp</dimen>
+ <dimen name="desktop_mode_caption_icon_radius">32dp</dimen>
<!-- The radius of the caption menu shadow. -->
<dimen name="desktop_mode_handle_menu_shadow_radius">2dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values/strings.xml b/libs/WindowManager/Shell/res/values/strings.xml
index a2231dd64112..1b7daa87064a 100644
--- a/libs/WindowManager/Shell/res/values/strings.xml
+++ b/libs/WindowManager/Shell/res/values/strings.xml
@@ -290,7 +290,7 @@
<!-- Accessibility text for the handle fullscreen button [CHAR LIMIT=NONE] -->
<string name="fullscreen_text">Fullscreen</string>
<!-- Accessibility text for the handle desktop button [CHAR LIMIT=NONE] -->
- <string name="desktop_text">Desktop Mode</string>
+ <string name="desktop_text">Desktop View</string>
<!-- Accessibility text for the handle split screen button [CHAR LIMIT=NONE] -->
<string name="split_screen_text">Split Screen</string>
<!-- Accessibility text for the handle more options button [CHAR LIMIT=NONE] -->
@@ -316,7 +316,7 @@
<!-- Accessibility text for the handle menu close menu button [CHAR LIMIT=NONE] -->
<string name="collapse_menu_text">Close Menu</string>
<!-- Accessibility text for the App Header's App Chip [CHAR LIMIT=NONE] -->
- <string name="desktop_mode_app_header_chip_text">Open Menu</string>
+ <string name="desktop_mode_app_header_chip_text"><xliff:g id="app_name" example="Chrome">%1$s</xliff:g> (Desktop View)</string>
<!-- Maximize menu maximize button string. -->
<string name="desktop_mode_maximize_menu_maximize_text">Maximize Screen</string>
<!-- Maximize menu snap buttons string. -->
@@ -342,10 +342,10 @@
<!-- Accessibility text for the Maximize Menu's snap maximize/restore [CHAR LIMIT=NONE] -->
<string name="desktop_mode_a11y_action_maximize_restore">Maximize or restore window size</string>
- <!-- Accessibility action replacement for caption handle menu split screen button [CHAR LIMIT=NONE] -->
- <string name="app_handle_menu_talkback_split_screen_mode_button_text">Enter split screen mode</string>
- <!-- Accessibility action replacement for caption handle menu enter desktop mode button [CHAR LIMIT=NONE] -->
- <string name="app_handle_menu_talkback_desktop_mode_button_text">Enter desktop windowing mode</string>
+ <!-- Accessibility action replacement for caption handle app chip buttons [CHAR LIMIT=NONE] -->
+ <string name="app_handle_chip_accessibility_announce">Open Menu</string>
+ <!-- Accessibility action replacement for caption handle menu buttons [CHAR LIMIT=NONE] -->
+ <string name="app_handle_menu_accessibility_announce">Enter <xliff:g id="windowing_mode" example="Desktop View">%1$s</xliff:g></string>
<!-- Accessibility action replacement for maximize menu enter snap left button [CHAR LIMIT=NONE] -->
<string name="maximize_menu_talkback_action_snap_left_text">Resize window to left</string>
<!-- Accessibility action replacement for maximize menu enter snap right button [CHAR LIMIT=NONE] -->
diff --git a/libs/WindowManager/Shell/res/values/styles.xml b/libs/WindowManager/Shell/res/values/styles.xml
index 035004bfd322..637b47ab3ace 100644
--- a/libs/WindowManager/Shell/res/values/styles.xml
+++ b/libs/WindowManager/Shell/res/values/styles.xml
@@ -40,13 +40,11 @@
<item name="android:activityCloseExitAnimation">@anim/forced_resizable_exit</item>
</style>
- <style name="DesktopModeHandleMenuActionButtonLayout">
+ <style name="DesktopModeHandleMenuActionButton">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">52dp</item>
- <item name="android:layout_weight">1</item>
- <item name="android:gravity">start|center_vertical</item>
- <item name="android:paddingHorizontal">16dp</item>
- <item name="android:background">?android:selectableItemBackground</item>
+ <item name="android:textColor">@androidprv:color/materialColorOnSurface</item>
+ <item name="android:drawableTint">@androidprv:color/materialColorOnSurface</item>
</style>
<style name="DesktopModeHandleMenuActionButtonImage">
@@ -71,7 +69,6 @@
<style name="DesktopModeHandleMenuWindowingButton">
<item name="android:layout_width">48dp</item>
<item name="android:layout_height">48dp</item>
- <item name="android:padding">14dp</item>
<item name="android:scaleType">fitCenter</item>
<item name="android:background">?android:selectableItemBackgroundBorderless</item>
</style>
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt
index f234ff5c2c84..126ab3d74689 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicy.kt
@@ -21,6 +21,7 @@ import android.content.Context
import android.content.pm.ActivityInfo
import android.content.pm.ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED
import android.content.pm.ActivityInfo.OVERRIDE_ENABLE_INSETS_DECOUPLED_CONFIGURATION
+import android.content.pm.ActivityInfo.OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS
import android.window.DesktopModeFlags
import com.android.internal.R
import com.android.window.flags.Flags
@@ -49,7 +50,7 @@ class DesktopModeCompatPolicy(private val context: Context) {
numActivities: Int, isTopActivityNoDisplay: Boolean, isActivityStackTransparent: Boolean) =
DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODALS_POLICY.isTrue
&& ((isSystemUiTask(packageName)
- || isPartOfDefaultHomePackage(packageName)
+ || isPartOfDefaultHomePackageOrNoHomeAvailable(packageName)
|| isTransparentTask(isActivityStackTransparent, numActivities))
&& !isTopActivityNoDisplay)
@@ -59,13 +60,16 @@ class DesktopModeCompatPolicy(private val context: Context) {
* The treatment is enabled when all the of the following is true:
* * Any flags to forcibly consume caption insets are enabled.
* * Top activity have configuration coupled with insets.
- * * Task is not resizeable.
+ * * Task is not resizeable or [ActivityInfo.OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS]
+ * is enabled.
*/
fun shouldExcludeCaptionFromAppBounds(taskInfo: TaskInfo): Boolean =
Flags.excludeCaptionFromAppBounds()
&& isAnyForceConsumptionFlagsEnabled()
&& taskInfo.topActivityInfo?.let {
- isInsetsCoupledWithConfiguration(it) && !taskInfo.isResizeable
+ isInsetsCoupledWithConfiguration(it) && (!taskInfo.isResizeable || it.isChangeEnabled(
+ OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS
+ ))
} ?: false
/**
@@ -81,10 +85,11 @@ class DesktopModeCompatPolicy(private val context: Context) {
private fun isSystemUiTask(packageName: String?) = packageName == systemUiPackage
/**
- * Returns true if the tasks base activity is part of the default home package.
+ * Returns true if the tasks base activity is part of the default home package, or there is
+ * currently no default home package available.
*/
- private fun isPartOfDefaultHomePackage(packageName: String?) =
- packageName != null && packageName == defaultHomePackage
+ private fun isPartOfDefaultHomePackageOrNoHomeAvailable(packageName: String?) =
+ defaultHomePackage == null || (packageName != null && packageName == defaultHomePackage)
private fun isAnyForceConsumptionFlagsEnabled(): Boolean =
DesktopModeFlags.ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION_ALWAYS.isTrue
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index c7a0401c2b88..f51023fcaaf5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -22,6 +22,7 @@ import static android.service.notification.NotificationListenerService.REASON_CA
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+import static android.view.WindowManager.TRANSIT_CHANGE;
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES;
import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
@@ -1590,20 +1591,26 @@ public class BubbleController implements ConfigurationChangeListener,
* Expands and selects a bubble created from a running task in a different mode.
*
* @param taskInfo the task.
+ * @param dragData optional information about the task when it is being dragged into a bubble
*/
- public void expandStackAndSelectBubble(ActivityManager.RunningTaskInfo taskInfo) {
+ public void expandStackAndSelectBubble(ActivityManager.RunningTaskInfo taskInfo,
+ @Nullable BubbleTransitions.DragData dragData) {
if (!BubbleAnythingFlagHelper.enableBubbleToFullscreen()) return;
Bubble b = mBubbleData.getOrCreateBubble(taskInfo); // Removes from overflow
ProtoLog.v(WM_SHELL_BUBBLES, "expandStackAndSelectBubble - intent=%s", taskInfo.taskId);
if (b.isInflated()) {
mBubbleData.setSelectedBubbleAndExpandStack(b);
+ if (dragData != null && dragData.getPendingWct() != null) {
+ mTransitions.startTransition(TRANSIT_CHANGE,
+ dragData.getPendingWct(), /* handler= */ null);
+ }
} else {
b.enable(Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE);
// Lazy init stack view when a bubble is created
ensureBubbleViewsAndWindowCreated();
mBubbleTransitions.startConvertToBubble(b, taskInfo, mExpandedViewManager,
mBubbleTaskViewFactory, mBubblePositioner, mStackView, mLayerView,
- mBubbleIconFactory, mInflateSynchronously);
+ mBubbleIconFactory, dragData, mInflateSynchronously);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java
index df8b4fd12540..28227a1f8746 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java
@@ -22,6 +22,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.view.View.INVISIBLE;
import static android.view.WindowManager.TRANSIT_CHANGE;
+import static com.android.wm.shell.transition.Transitions.TRANSIT_CONVERT_TO_BUBBLE;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
@@ -92,10 +94,10 @@ public class BubbleTransitions {
BubbleExpandedViewManager expandedViewManager, BubbleTaskViewFactory factory,
BubblePositioner positioner, BubbleStackView stackView,
BubbleBarLayerView layerView, BubbleIconFactory iconFactory,
- boolean inflateSync) {
+ DragData dragData, boolean inflateSync) {
return new ConvertToBubble(bubble, taskInfo, mContext,
expandedViewManager, factory, positioner, stackView, layerView, iconFactory,
- inflateSync);
+ dragData, inflateSync);
}
/**
@@ -149,6 +151,39 @@ public class BubbleTransitions {
}
/**
+ * Information about the task when it is being dragged to a bubble
+ */
+ public static class DragData {
+ private final Rect mBounds;
+ private final WindowContainerTransaction mPendingWct;
+
+ /**
+ * @param bounds bounds of the dragged task when the drag was released
+ * @param wct pending operations to be applied when finishing the drag
+ */
+ public DragData(@Nullable Rect bounds, @Nullable WindowContainerTransaction wct) {
+ mBounds = bounds;
+ mPendingWct = wct;
+ }
+
+ /**
+ * @return bounds of the dragged task when the drag was released
+ */
+ @Nullable
+ public Rect getBounds() {
+ return mBounds;
+ }
+
+ /**
+ * @return pending operations to be applied when finishing the drag
+ */
+ @Nullable
+ public WindowContainerTransaction getPendingWct() {
+ return mPendingWct;
+ }
+ }
+
+ /**
* BubbleTransition that coordinates the process of a non-bubble task becoming a bubble. The
* steps are as follows:
*
@@ -167,6 +202,7 @@ public class BubbleTransitions {
class ConvertToBubble implements Transitions.TransitionHandler, BubbleTransition {
final BubbleBarLayerView mLayerView;
Bubble mBubble;
+ @Nullable DragData mDragData;
IBinder mTransition;
Transitions.TransitionFinishCallback mFinishCb;
WindowContainerTransaction mFinishWct = null;
@@ -182,10 +218,12 @@ public class BubbleTransitions {
ConvertToBubble(Bubble bubble, TaskInfo taskInfo, Context context,
BubbleExpandedViewManager expandedViewManager, BubbleTaskViewFactory factory,
BubblePositioner positioner, BubbleStackView stackView,
- BubbleBarLayerView layerView, BubbleIconFactory iconFactory, boolean inflateSync) {
+ BubbleBarLayerView layerView, BubbleIconFactory iconFactory,
+ @Nullable DragData dragData, boolean inflateSync) {
mBubble = bubble;
mTaskInfo = taskInfo;
mLayerView = layerView;
+ mDragData = dragData;
mBubble.setInflateSynchronously(inflateSync);
mBubble.setPreparingTransition(this);
mBubble.inflate(
@@ -208,6 +246,9 @@ public class BubbleTransitions {
final Rect launchBounds = new Rect();
mLayerView.getExpandedViewRestBounds(launchBounds);
WindowContainerTransaction wct = new WindowContainerTransaction();
+ if (mDragData != null && mDragData.getPendingWct() != null) {
+ wct.merge(mDragData.getPendingWct(), true);
+ }
if (mTaskInfo.getWindowingMode() == WINDOWING_MODE_MULTI_WINDOW) {
if (mTaskInfo.getParentTaskId() != INVALID_TASK_ID) {
wct.reparent(mTaskInfo.token, null, true);
@@ -226,7 +267,7 @@ public class BubbleTransitions {
state.mVisible = true;
}
mTaskViewTransitions.enqueueExternal(tv.getController(), () -> {
- mTransition = mTransitions.startTransition(TRANSIT_CHANGE, wct, this);
+ mTransition = mTransitions.startTransition(TRANSIT_CONVERT_TO_BUBBLE, wct, this);
return mTransition;
});
}
@@ -292,6 +333,11 @@ public class BubbleTransitions {
}
mFinishCb = finishCallback;
+ if (mDragData != null && mDragData.getBounds() != null) {
+ // Override start bounds with the dragged task bounds
+ mStartBounds.set(mDragData.getBounds());
+ }
+
// Now update state (and talk to launcher) in parallel with snapshot stuff
mBubbleData.notificationEntryUpdated(mBubble, /* suppressFlyout= */ true,
/* showInShade= */ false);
@@ -303,6 +349,13 @@ public class BubbleTransitions {
mStartBounds.left - info.getRoot(0).getOffset().x,
mStartBounds.top - info.getRoot(0).getOffset().y);
startTransaction.setLayer(mSnapshot, Integer.MAX_VALUE);
+
+ BubbleBarExpandedView bbev = mBubble.getBubbleBarExpandedView();
+ if (bbev != null) {
+ // Corners get reset during the animation. Add them back
+ startTransaction.setCornerRadius(mSnapshot, bbev.getRestingCornerRadius());
+ }
+
startTransaction.apply();
mTaskViewTransitions.onExternalDone(transition);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
index b6012378e4d4..84bb830af9a3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
@@ -915,14 +915,15 @@ public abstract class WMShellModule {
Transitions transitions,
RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer,
@DynamicOverride DesktopUserRepositories desktopUserRepositories,
- InteractionJankMonitor interactionJankMonitor) {
+ InteractionJankMonitor interactionJankMonitor,
+ Optional<BubbleController> bubbleController) {
return ENABLE_DESKTOP_WINDOWING_ENTER_TRANSITIONS_BUGFIX.isTrue()
? new SpringDragToDesktopTransitionHandler(
context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories,
- interactionJankMonitor)
+ interactionJankMonitor, bubbleController)
: new DefaultDragToDesktopTransitionHandler(
context, transitions, rootTaskDisplayAreaOrganizer, desktopUserRepositories,
- interactionJankMonitor);
+ interactionJankMonitor, bubbleController);
}
@WMSingleton
@@ -1306,7 +1307,8 @@ public abstract class WMShellModule {
WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository,
DesktopWindowingEducationTooltipController desktopWindowingEducationTooltipController,
@ShellMainThread CoroutineScope applicationScope,
- @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher) {
+ @ShellBackgroundThread MainCoroutineDispatcher backgroundDispatcher,
+ DesktopModeUiEventLogger desktopModeUiEventLogger) {
return new AppHandleEducationController(
context,
appHandleEducationFilter,
@@ -1314,7 +1316,8 @@ public abstract class WMShellModule {
windowDecorCaptionHandleRepository,
desktopWindowingEducationTooltipController,
applicationScope,
- backgroundDispatcher);
+ backgroundDispatcher,
+ desktopModeUiEventLogger);
}
@WMSingleton
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUiEventLogger.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUiEventLogger.kt
index b96b9d2adddf..b9cb32d8a14f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUiEventLogger.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUiEventLogger.kt
@@ -149,7 +149,25 @@ class DesktopModeUiEventLogger(
@UiEvent(doc = "Enter multi-instance by using the New Window button")
DESKTOP_WINDOW_MULTI_INSTANCE_NEW_WINDOW_CLICK(2069),
@UiEvent(doc = "Enter multi-instance by clicking an icon in the Manage Windows menu")
- DESKTOP_WINDOW_MULTI_INSTANCE_MANAGE_WINDOWS_ICON_CLICK(2070);
+ DESKTOP_WINDOW_MULTI_INSTANCE_MANAGE_WINDOWS_ICON_CLICK(2070),
+ @UiEvent(doc = "Education tooltip on the app handle is shown")
+ APP_HANDLE_EDUCATION_TOOLTIP_SHOWN(2097),
+ @UiEvent(doc = "Education tooltip on the app handle is clicked")
+ APP_HANDLE_EDUCATION_TOOLTIP_CLICKED(2098),
+ @UiEvent(doc = "Education tooltip on the app handle is dismissed by the user")
+ APP_HANDLE_EDUCATION_TOOLTIP_DISMISSED(2099),
+ @UiEvent(doc = "Enter desktop mode education tooltip on the app handle menu is shown")
+ ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN(2100),
+ @UiEvent(doc = "Enter desktop mode education tooltip on the app handle menu is clicked")
+ ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED(2101),
+ @UiEvent(doc = "Enter desktop mode education tooltip is dismissed by the user")
+ ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED(2102),
+ @UiEvent(doc = "Exit desktop mode education tooltip on the app header menu is shown")
+ EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN(2103),
+ @UiEvent(doc = "Exit desktop mode education tooltip on the app header menu is clicked")
+ EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED(2104),
+ @UiEvent(doc = "Exit desktop mode education tooltip is dismissed by the user")
+ EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED(2105);
override fun getId(): Int = mId
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
index 531304d6922a..3b2598450800 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
@@ -2689,15 +2689,22 @@ class DesktopTasksController(
}
/** Requests a task be transitioned from whatever mode it's in to a bubble. */
- fun requestFloat(taskInfo: RunningTaskInfo) {
+ @JvmOverloads
+ fun requestFloat(taskInfo: RunningTaskInfo, left: Boolean? = null) {
val isDragging = dragToDesktopTransitionHandler.inProgress
val shouldRequestFloat =
taskInfo.isFullscreen || taskInfo.isFreeform || isDragging || taskInfo.isMultiWindow
if (!shouldRequestFloat) return
if (isDragging) {
releaseVisualIndicator()
+ val cancelState =
+ if (left == true) DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_LEFT
+ else DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_RIGHT
+ dragToDesktopTransitionHandler.cancelDragToDesktopTransition(cancelState)
} else {
- bubbleController.ifPresent { it.expandStackAndSelectBubble(taskInfo) }
+ bubbleController.ifPresent {
+ it.expandStackAndSelectBubble(taskInfo, /* dragData= */ null)
+ }
}
}
@@ -2975,10 +2982,11 @@ class DesktopTasksController(
)
requestSplit(taskInfo, leftOrTop = false)
}
- IndicatorType.TO_BUBBLE_LEFT_INDICATOR,
+ IndicatorType.TO_BUBBLE_LEFT_INDICATOR -> {
+ requestFloat(taskInfo, left = true)
+ }
IndicatorType.TO_BUBBLE_RIGHT_INDICATOR -> {
- // TODO(b/388851898): move to bubble
- cancelDragToDesktop(taskInfo)
+ requestFloat(taskInfo, left = false)
}
}
return indicatorType
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
index 8194d3cab445..1aa081340bf9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
@@ -37,6 +37,8 @@ import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.protolog.ProtoLog
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.animation.FloatProperties
+import com.android.wm.shell.bubbles.BubbleController
+import com.android.wm.shell.bubbles.BubbleTransitions
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_CANCEL_DRAG_TO_DESKTOP
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP
@@ -49,10 +51,12 @@ import com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_UND
import com.android.wm.shell.shared.split.SplitScreenConstants.SplitPosition
import com.android.wm.shell.splitscreen.SplitScreenController
import com.android.wm.shell.transition.Transitions
+import com.android.wm.shell.transition.Transitions.TRANSIT_CONVERT_TO_BUBBLE
import com.android.wm.shell.transition.Transitions.TransitionHandler
import com.android.wm.shell.windowdecor.MoveToDesktopAnimator
import com.android.wm.shell.windowdecor.MoveToDesktopAnimator.Companion.DRAG_FREEFORM_SCALE
import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener
+import java.util.Optional
import java.util.function.Supplier
import kotlin.math.max
@@ -72,6 +76,7 @@ sealed class DragToDesktopTransitionHandler(
private val taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer,
private val desktopUserRepositories: DesktopUserRepositories,
protected val interactionJankMonitor: InteractionJankMonitor,
+ private val bubbleController: Optional<BubbleController>,
protected val transactionSupplier: Supplier<SurfaceControl.Transaction>,
) : TransitionHandler {
@@ -241,6 +246,20 @@ sealed class DragToDesktopTransitionHandler(
state.startTransitionFinishCb?.onTransitionFinished(/* wct= */ null)
requestSplitFromScaledTask(splitPosition, wct)
clearState()
+ } else if (
+ state.draggedTaskChange != null &&
+ (cancelState == CancelState.CANCEL_BUBBLE_LEFT ||
+ cancelState == CancelState.CANCEL_BUBBLE_RIGHT)
+ ) {
+ if (!bubbleController.isPresent) {
+ startCancelAnimation()
+ } else {
+ // Animation is handled by BubbleController
+ val wct = WindowContainerTransaction()
+ restoreWindowOrder(wct, state)
+ // TODO(b/388851898): pass along information about left or right side
+ requestBubbleFromScaledTask(wct)
+ }
} else {
// There's no dragged task, this can happen when the "cancel" happened too quickly
// before the "start" transition is even ready (like on a fling gesture). The
@@ -258,20 +277,25 @@ sealed class DragToDesktopTransitionHandler(
) {
val state = requireTransitionState()
val taskInfo = state.draggedTaskChange?.taskInfo ?: error("Expected non-null taskInfo")
+ val animatedTaskBounds = getAnimatedTaskBounds()
+ requestSplitSelect(wct, taskInfo, splitPosition, animatedTaskBounds)
+ }
+
+ private fun getAnimatedTaskBounds(): Rect {
+ val state = requireTransitionState()
+ val taskInfo = state.draggedTaskChange?.taskInfo ?: error("Expected non-null taskInfo")
val taskBounds = Rect(taskInfo.configuration.windowConfiguration.bounds)
val taskScale = state.dragAnimator.scale
val scaledWidth = taskBounds.width() * taskScale
val scaledHeight = taskBounds.height() * taskScale
val dragPosition = PointF(state.dragAnimator.position)
state.dragAnimator.cancelAnimator()
- val animatedTaskBounds =
- Rect(
- dragPosition.x.toInt(),
- dragPosition.y.toInt(),
- (dragPosition.x + scaledWidth).toInt(),
- (dragPosition.y + scaledHeight).toInt(),
- )
- requestSplitSelect(wct, taskInfo, splitPosition, animatedTaskBounds)
+ return Rect(
+ dragPosition.x.toInt(),
+ dragPosition.y.toInt(),
+ (dragPosition.x + scaledWidth).toInt(),
+ (dragPosition.y + scaledHeight).toInt(),
+ )
}
private fun requestSplitSelect(
@@ -294,6 +318,25 @@ sealed class DragToDesktopTransitionHandler(
splitScreenController.requestEnterSplitSelect(taskInfo, wct, splitPosition, taskBounds)
}
+ private fun requestBubbleFromScaledTask(wct: WindowContainerTransaction) {
+ // TODO(b/391928049): update density once we can drag from desktop to bubble
+ val state = requireTransitionState()
+ val taskInfo = state.draggedTaskChange?.taskInfo ?: error("Expected non-null taskInfo")
+ val taskBounds = getAnimatedTaskBounds()
+ state.dragAnimator.cancelAnimator()
+ requestBubble(wct, taskInfo, taskBounds)
+ }
+
+ private fun requestBubble(
+ wct: WindowContainerTransaction,
+ taskInfo: RunningTaskInfo,
+ taskBounds: Rect = Rect(taskInfo.configuration.windowConfiguration.bounds),
+ ) {
+ val controller =
+ bubbleController.orElseThrow { IllegalStateException("BubbleController not set") }
+ controller.expandStackAndSelectBubble(taskInfo, BubbleTransitions.DragData(taskBounds, wct))
+ }
+
override fun startAnimation(
transition: IBinder,
info: TransitionInfo,
@@ -446,6 +489,16 @@ sealed class DragToDesktopTransitionHandler(
state.startTransitionFinishTransaction?.apply()
state.startTransitionFinishCb?.onTransitionFinished(/* wct= */ null)
requestSplitSelect(wct, taskInfo, splitPosition)
+ } else if (
+ state.cancelState == CancelState.CANCEL_BUBBLE_LEFT ||
+ state.cancelState == CancelState.CANCEL_BUBBLE_RIGHT
+ ) {
+ val taskInfo =
+ state.draggedTaskChange?.taskInfo ?: error("Expected non-null task info.")
+ val wct = WindowContainerTransaction()
+ restoreWindowOrder(wct)
+ // TODO(b/388851898): pass along information about left or right side
+ requestBubble(wct, taskInfo)
}
return true
}
@@ -476,6 +529,13 @@ sealed class DragToDesktopTransitionHandler(
clearState()
return
}
+ // In case of bubble animation, finish the initial desktop drag animation, but keep the
+ // current animation running and have bubbles take over
+ if (info.type == TRANSIT_CONVERT_TO_BUBBLE) {
+ state.startTransitionFinishCb?.onTransitionFinished(/* wct= */ null)
+ clearState()
+ return
+ }
val isCancelTransition =
info.type == TRANSIT_DESKTOP_MODE_CANCEL_DRAG_TO_DESKTOP &&
transition == state.cancelTransitionToken &&
@@ -869,6 +929,10 @@ sealed class DragToDesktopTransitionHandler(
CANCEL_SPLIT_LEFT,
/** A cancel event where the task will request to enter split on the right side. */
CANCEL_SPLIT_RIGHT,
+ /** A cancel event where the task will request to bubble on the left side. */
+ CANCEL_BUBBLE_LEFT,
+ /** A cancel event where the task will request to bubble on the right side. */
+ CANCEL_BUBBLE_RIGHT,
}
companion object {
@@ -887,6 +951,7 @@ constructor(
taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer,
desktopUserRepositories: DesktopUserRepositories,
interactionJankMonitor: InteractionJankMonitor,
+ bubbleController: Optional<BubbleController>,
transactionSupplier: Supplier<SurfaceControl.Transaction> = Supplier {
SurfaceControl.Transaction()
},
@@ -897,6 +962,7 @@ constructor(
taskDisplayAreaOrganizer,
desktopUserRepositories,
interactionJankMonitor,
+ bubbleController,
transactionSupplier,
) {
@@ -925,6 +991,7 @@ constructor(
taskDisplayAreaOrganizer: RootTaskDisplayAreaOrganizer,
desktopUserRepositories: DesktopUserRepositories,
interactionJankMonitor: InteractionJankMonitor,
+ bubbleController: Optional<BubbleController>,
transactionSupplier: Supplier<SurfaceControl.Transaction> = Supplier {
SurfaceControl.Transaction()
},
@@ -935,6 +1002,7 @@ constructor(
taskDisplayAreaOrganizer,
desktopUserRepositories,
interactionJankMonitor,
+ bubbleController,
transactionSupplier,
) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
index 5d8355625b94..f66451462e43 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt
@@ -26,6 +26,8 @@ import android.view.View.LAYOUT_DIRECTION_RTL
import com.android.window.flags.Flags
import com.android.wm.shell.R
import com.android.wm.shell.desktopmode.CaptionState
+import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger
+import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger.DesktopUiEventEnum
import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository
import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository
import com.android.wm.shell.shared.annotations.ShellBackgroundThread
@@ -62,6 +64,7 @@ class AppHandleEducationController(
private val windowingEducationViewController: DesktopWindowingEducationTooltipController,
@ShellMainThread private val applicationCoroutineScope: CoroutineScope,
@ShellBackgroundThread private val backgroundDispatcher: MainCoroutineDispatcher,
+ private val desktopModeUiEventLogger: DesktopModeUiEventLogger,
) {
private lateinit var openHandleMenuCallback: (Int) -> Unit
private lateinit var toDesktopModeCallback: (Int, DesktopModeTransitionSource) -> Unit
@@ -171,6 +174,7 @@ class AppHandleEducationController(
private fun showEducation(captionState: CaptionState) {
val appHandleBounds = (captionState as CaptionState.AppHandle).globalAppHandleBounds
+ val taskInfo = captionState.runningTaskInfo
val tooltipGlobalCoordinates =
Point(appHandleBounds.left + appHandleBounds.width() / 2, appHandleBounds.bottom)
// Populate information important to inflate app handle education tooltip.
@@ -188,22 +192,34 @@ class AppHandleEducationController(
arrowDirection =
DesktopWindowingEducationTooltipController.TooltipArrowDirection.UP,
onEducationClickAction = {
- openHandleMenuCallback(captionState.runningTaskInfo.taskId)
+ openHandleMenuCallback(taskInfo.taskId)
+ desktopModeUiEventLogger.log(
+ taskInfo,
+ DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_CLICKED,
+ )
},
onDismissAction = {
- // TODO: b/341320146 - Log previous tooltip was dismissed
+ desktopModeUiEventLogger.log(
+ taskInfo,
+ DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_DISMISSED,
+ )
},
)
windowingEducationViewController.showEducationTooltip(
tooltipViewConfig = appHandleTooltipConfig,
- taskId = captionState.runningTaskInfo.taskId,
+ taskId = taskInfo.taskId,
+ )
+ desktopModeUiEventLogger.log(
+ taskInfo,
+ DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_SHOWN,
)
}
/** Show tooltip that points to windowing image button in app handle menu */
private suspend fun showWindowingImageButtonTooltip(captionState: CaptionState.AppHandle) {
val appInfoPillHeight = getSize(R.dimen.desktop_mode_handle_menu_app_info_pill_height)
+ val taskInfo = captionState.runningTaskInfo
val windowingOptionPillHeight =
getSize(R.dimen.desktop_mode_handle_menu_windowing_pill_height)
val appHandleMenuWidth =
@@ -245,24 +261,36 @@ class AppHandleEducationController(
DesktopWindowingEducationTooltipController.TooltipArrowDirection.HORIZONTAL,
onEducationClickAction = {
toDesktopModeCallback(
- captionState.runningTaskInfo.taskId,
+ taskInfo.taskId,
DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON,
)
+ desktopModeUiEventLogger.log(
+ taskInfo,
+ DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED,
+ )
},
onDismissAction = {
- // TODO: b/341320146 - Log previous tooltip was dismissed
+ desktopModeUiEventLogger.log(
+ taskInfo,
+ DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED,
+ )
},
)
windowingEducationViewController.showEducationTooltip(
- taskId = captionState.runningTaskInfo.taskId,
+ taskId = taskInfo.taskId,
tooltipViewConfig = windowingImageButtonTooltipConfig,
)
+ desktopModeUiEventLogger.log(
+ taskInfo,
+ DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN,
+ )
}
/** Show tooltip that points to app chip button and educates user on how to exit desktop mode */
private suspend fun showExitWindowingTooltip(captionState: CaptionState.AppHeader) {
val globalAppChipBounds = captionState.globalAppChipBounds
+ val taskInfo = captionState.runningTaskInfo
val tooltipGlobalCoordinates =
Point(
if (isRtl()) {
@@ -287,16 +315,27 @@ class AppHandleEducationController(
arrowDirection =
DesktopWindowingEducationTooltipController.TooltipArrowDirection.HORIZONTAL,
onDismissAction = {
- // TODO: b/341320146 - Log previous tooltip was dismissed
+ desktopModeUiEventLogger.log(
+ taskInfo,
+ DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_DISMISSED,
+ )
},
onEducationClickAction = {
- openHandleMenuCallback(captionState.runningTaskInfo.taskId)
+ openHandleMenuCallback(taskInfo.taskId)
+ desktopModeUiEventLogger.log(
+ taskInfo,
+ DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_CLICKED,
+ )
},
)
windowingEducationViewController.showEducationTooltip(
- taskId = captionState.runningTaskInfo.taskId,
+ taskId = taskInfo.taskId,
tooltipViewConfig = exitWindowingTooltipConfig,
)
+ desktopModeUiEventLogger.log(
+ taskInfo,
+ DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN,
+ )
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipAppIconOverlay.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipAppIconOverlay.java
index b4cf8905d02e..88ac865c24b9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipAppIconOverlay.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipAppIconOverlay.java
@@ -26,6 +26,7 @@ import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.hardware.HardwareBuffer;
import android.util.TypedValue;
import android.view.SurfaceControl;
@@ -39,7 +40,6 @@ public final class PipAppIconOverlay extends PipContentOverlay {
private final Context mContext;
private final int mAppIconSizePx;
- private final Rect mAppBounds;
private final int mOverlayHalfSize;
private final Matrix mTmpTransform = new Matrix();
private final float[] mTmpFloat9 = new float[9];
@@ -56,10 +56,6 @@ public final class PipAppIconOverlay extends PipContentOverlay {
final int overlaySize = getOverlaySize(appBounds, destinationBounds);
mOverlayHalfSize = overlaySize >> 1;
- // When the activity is in the secondary split, make sure the scaling center is not
- // offset.
- mAppBounds = new Rect(0, 0, appBounds.width(), appBounds.height());
-
mBitmap = Bitmap.createBitmap(overlaySize, overlaySize, Bitmap.Config.ARGB_8888);
prepareAppIconOverlay(appIcon);
mLeash = new SurfaceControl.Builder()
@@ -85,12 +81,17 @@ public final class PipAppIconOverlay extends PipContentOverlay {
@Override
public void attach(SurfaceControl.Transaction tx, SurfaceControl parentLeash) {
+ final HardwareBuffer buffer = mBitmap.getHardwareBuffer();
tx.show(mLeash);
tx.setLayer(mLeash, Integer.MAX_VALUE);
- tx.setBuffer(mLeash, mBitmap.getHardwareBuffer());
+ tx.setBuffer(mLeash, buffer);
tx.setAlpha(mLeash, 0f);
tx.reparent(mLeash, parentLeash);
tx.apply();
+ // Cleanup the bitmap and buffer after setting up the leash
+ mBitmap.recycle();
+ mBitmap = null;
+ buffer.close();
}
@Override
@@ -108,16 +109,6 @@ public final class PipAppIconOverlay extends PipContentOverlay {
.setAlpha(mLeash, fraction < 0.5f ? 0 : (fraction - 0.5f) * 2);
}
-
-
- @Override
- public void detach(SurfaceControl.Transaction tx) {
- super.detach(tx);
- if (mBitmap != null && !mBitmap.isRecycled()) {
- mBitmap.recycle();
- }
- }
-
private void prepareAppIconOverlay(Drawable appIcon) {
final Canvas canvas = new Canvas();
canvas.setBitmap(mBitmap);
@@ -139,6 +130,8 @@ public final class PipAppIconOverlay extends PipContentOverlay {
mOverlayHalfSize + mAppIconSizePx / 2);
appIcon.setBounds(appIconBounds);
appIcon.draw(canvas);
+ Bitmap oldBitmap = mBitmap;
mBitmap = mBitmap.copy(Bitmap.Config.HARDWARE, false /* mutable */);
+ oldBitmap.recycle();
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java
index bb9b479524e5..a57b4b948b42 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java
@@ -72,7 +72,6 @@ import com.android.wm.shell.pip2.animation.PipAlphaAnimator;
import com.android.wm.shell.pip2.animation.PipEnterAnimator;
import com.android.wm.shell.pip2.animation.PipExpandAnimator;
import com.android.wm.shell.shared.TransitionUtil;
-import com.android.wm.shell.shared.pip.PipContentOverlay;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.Transitions;
@@ -422,7 +421,7 @@ public class PipTransition extends PipTransitionController implements
final Rect destinationBounds = pipChange.getEndAbsBounds();
final SurfaceControl swipePipToHomeOverlay = mPipTransitionState.getSwipePipToHomeOverlay();
if (swipePipToHomeOverlay != null) {
- final int overlaySize = PipContentOverlay.PipAppIconOverlay.getOverlaySize(
+ final int overlaySize = PipAppIconOverlay.getOverlaySize(
mPipTransitionState.getSwipePipToHomeAppBounds(), destinationBounds);
// It is possible we reparent the PIP activity to a new PIP task (in multi-activity
// apps), so we should also reparent the overlay to the final PIP task.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index 15ac03ccaf30..a799b7f2580e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -2859,14 +2859,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
prepareExitSplitScreen(dismissTop, out, EXIT_REASON_APP_FINISHED);
mSplitTransitions.setDismissTransition(transition, dismissTop,
EXIT_REASON_APP_FINISHED);
- } else if (isOpening && !mPausingTasks.isEmpty()) {
- // One of the splitting task is opening while animating the split pair in
- // recents, which means to dismiss the split pair to this task.
- int dismissTop = getStageType(stage) == STAGE_TYPE_MAIN
- ? STAGE_TYPE_MAIN : STAGE_TYPE_SIDE;
- prepareExitSplitScreen(dismissTop, out, EXIT_REASON_APP_FINISHED);
- mSplitTransitions.setDismissTransition(transition, dismissTop,
- EXIT_REASON_APP_FINISHED);
} else if (!isSplitScreenVisible() && isOpening) {
// If split is running in the background and the trigger task is appearing into
// split, prepare to enter split screen.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
index a5a5fd73d5c0..01428e60582e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
@@ -149,8 +149,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
private Drawable mEnterpriseThumbnailDrawable;
- static final InteractionJankMonitor sInteractionJankMonitor =
- InteractionJankMonitor.getInstance();
+ final InteractionJankMonitor mInteractionJankMonitor;
private BroadcastReceiver mEnterpriseResourceUpdatedReceiver = new BroadcastReceiver() {
@Override
@@ -169,7 +168,8 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
@NonNull TransactionPool transactionPool,
@NonNull ShellExecutor mainExecutor, @NonNull Handler mainHandler,
@NonNull ShellExecutor animExecutor,
- @NonNull RootTaskDisplayAreaOrganizer rootTDAOrganizer) {
+ @NonNull RootTaskDisplayAreaOrganizer rootTDAOrganizer,
+ @NonNull InteractionJankMonitor interactionJankMonitor) {
mDisplayController = displayController;
mTransactionPool = transactionPool;
mContext = context;
@@ -181,6 +181,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
shellInit.addInitCallback(this::onInit, this);
mRootTDAOrganizer = rootTDAOrganizer;
+ mInteractionJankMonitor = interactionJankMonitor;
}
private void onInit() {
@@ -331,14 +332,14 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
final boolean isTaskTransition = isTaskTransition(info);
if (isTaskTransition) {
- sInteractionJankMonitor.begin(info.getRoot(0).getLeash(), mContext,
+ mInteractionJankMonitor.begin(info.getRoot(0).getLeash(), mContext,
mMainHandler, CUJ_DEFAULT_TASK_TO_TASK_ANIMATION);
}
final Runnable onAnimFinish = () -> {
if (!animations.isEmpty()) return;
if (isTaskTransition) {
- sInteractionJankMonitor.end(CUJ_DEFAULT_TASK_TO_TASK_ANIMATION);
+ mInteractionJankMonitor.end(CUJ_DEFAULT_TASK_TO_TASK_ANIMATION);
}
mAnimations.remove(transition);
finishCallback.onTransitionFinished(null /* wct */);
@@ -1031,6 +1032,6 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
@Override
public void onTransitionConsumed(@NonNull IBinder transition, boolean aborted,
@Nullable SurfaceControl.Transaction finishTransaction) {
- sInteractionJankMonitor.cancel(CUJ_DEFAULT_TASK_TO_TASK_ANIMATION);
+ mInteractionJankMonitor.cancel(CUJ_DEFAULT_TASK_TO_TASK_ANIMATION);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
index c90f6cf62b7e..e28a7fa159c5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
@@ -77,6 +77,7 @@ import androidx.annotation.BinderThread;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.protolog.ProtoLog;
import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
@@ -196,6 +197,9 @@ public class Transitions implements RemoteCallable<Transitions>,
/** Transition type for app compat reachability. */
public static final int TRANSIT_MOVE_LETTERBOX_REACHABILITY = TRANSIT_FIRST_CUSTOM + 23;
+ /** Transition type for converting a task to a bubble. */
+ public static final int TRANSIT_CONVERT_TO_BUBBLE = TRANSIT_FIRST_CUSTOM + 24;
+
/** Transition type for desktop mode transitions. */
public static final int TRANSIT_DESKTOP_MODE_TYPES =
WindowManager.TRANSIT_FIRST_CUSTOM + 100;
@@ -335,7 +339,8 @@ public class Transitions implements RemoteCallable<Transitions>,
mDisplayController = displayController;
mPlayerImpl = new TransitionPlayerImpl();
mDefaultTransitionHandler = new DefaultTransitionHandler(context, shellInit,
- displayController, pool, mainExecutor, mainHandler, animExecutor, rootTDAOrganizer);
+ displayController, pool, mainExecutor, mainHandler, animExecutor, rootTDAOrganizer,
+ InteractionJankMonitor.getInstance());
mRemoteTransitionHandler = new RemoteTransitionHandler(mMainExecutor);
mShellCommandHandler = shellCommandHandler;
mShellController = shellController;
@@ -1867,6 +1872,7 @@ public class Transitions implements RemoteCallable<Transitions>,
case TRANSIT_MINIMIZE -> "MINIMIZE";
case TRANSIT_START_RECENTS_TRANSITION -> "START_RECENTS_TRANSITION";
case TRANSIT_END_RECENTS_TRANSITION -> "END_RECENTS_TRANSITION";
+ case TRANSIT_CONVERT_TO_BUBBLE -> "CONVERT_TO_BUBBLE";
default -> "";
};
if (typeStr.isEmpty()) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt
index c92e67f1a0c0..ff50672953c9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt
@@ -35,9 +35,10 @@ import android.view.SurfaceControl
import android.view.View
import android.view.WindowInsets.Type.systemBars
import android.view.WindowManager
-import android.widget.Button
import android.widget.ImageButton
import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.Space
import android.widget.TextView
import android.window.DesktopModeFlags
import android.window.SurfaceSyncGroup
@@ -482,16 +483,23 @@ class HandleMenu(
private val splitscreenBtn = windowingPill.requireViewById<ImageButton>(
R.id.split_screen_button)
private val floatingBtn = windowingPill.requireViewById<ImageButton>(R.id.floating_button)
+ private val floatingBtnSpace = windowingPill.requireViewById<Space>(
+ R.id.floating_button_space)
+
private val desktopBtn = windowingPill.requireViewById<ImageButton>(R.id.desktop_button)
+ private val desktopBtnSpace = windowingPill.requireViewById<Space>(
+ R.id.desktop_button_space)
// More Actions Pill.
private val moreActionsPill = rootView.requireViewById<View>(R.id.more_actions_pill)
- private val screenshotBtn = moreActionsPill.requireViewById<View>(R.id.screenshot_button)
- private val newWindowBtn = moreActionsPill.requireViewById<View>(R.id.new_window_button)
+ private val screenshotBtn = moreActionsPill.requireViewById<HandleMenuActionButton>(
+ R.id.screenshot_button)
+ private val newWindowBtn = moreActionsPill.requireViewById<HandleMenuActionButton>(
+ R.id.new_window_button)
private val manageWindowBtn = moreActionsPill
- .requireViewById<View>(R.id.manage_windows_button)
+ .requireViewById<HandleMenuActionButton>(R.id.manage_windows_button)
private val changeAspectRatioBtn = moreActionsPill
- .requireViewById<View>(R.id.change_aspect_ratio_button)
+ .requireViewById<HandleMenuActionButton>(R.id.change_aspect_ratio_button)
// Open in Browser/App Pill.
private val openInAppOrBrowserPill = rootView.requireViewById<View>(
@@ -540,17 +548,35 @@ class HandleMenu(
return@setOnTouchListener true
}
- with(context.resources) {
- // Update a11y read out to say "double tap to enter desktop windowing mode"
+ with(context) {
+ // Update a11y announcement out to say "double tap to enter Fullscreen"
+ ViewCompat.replaceAccessibilityAction(
+ fullscreenBtn, ACTION_CLICK,
+ getString(
+ R.string.app_handle_menu_accessibility_announce,
+ getString(R.string.fullscreen_text)
+ ),
+ null,
+ )
+
+ // Update a11y announcement out to say "double tap to enter Desktop View"
ViewCompat.replaceAccessibilityAction(
desktopBtn, ACTION_CLICK,
- getString(R.string.app_handle_menu_talkback_desktop_mode_button_text), null
+ getString(
+ R.string.app_handle_menu_accessibility_announce,
+ getString(R.string.desktop_text)
+ ),
+ null,
)
- // Update a11y read out to say "double tap to enter split screen mode"
+ // Update a11y announcement to say "double tap to enter Split Screen"
ViewCompat.replaceAccessibilityAction(
splitscreenBtn, ACTION_CLICK,
- getString(R.string.app_handle_menu_talkback_split_screen_mode_button_text), null
+ getString(
+ R.string.app_handle_menu_accessibility_announce,
+ getString(R.string.split_screen_text)
+ ),
+ null,
)
}
}
@@ -666,6 +692,7 @@ class HandleMenu(
if (!BubbleAnythingFlagHelper.enableBubbleToFullscreen()) {
floatingBtn.visibility = View.GONE
+ floatingBtnSpace.visibility = View.GONE
}
fullscreenBtn.isSelected = taskInfo.isFullscreen
@@ -694,8 +721,10 @@ class HandleMenu(
).forEach {
val button = it.first
val shouldShow = it.second
- val label = button.requireViewById<MarqueedTextView>(R.id.label)
- val image = button.requireViewById<ImageView>(R.id.image)
+
+ val buttonRoot = button.requireViewById<LinearLayout>(R.id.action_button)
+ val label = buttonRoot.requireViewById<MarqueedTextView>(R.id.label)
+ val image = buttonRoot.requireViewById<ImageView>(R.id.image)
button.isGone = !shouldShow
label.apply {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuActionButton.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuActionButton.kt
new file mode 100644
index 000000000000..4b2e473d6ec2
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuActionButton.kt
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.wm.shell.windowdecor
+
+import android.annotation.ColorInt
+import android.annotation.IdRes
+import android.content.Context
+import android.content.res.ColorStateList
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.core.content.withStyledAttributes
+import androidx.core.view.isGone
+import com.android.wm.shell.R
+
+/**
+ * Button-like component used to display the "Additional options" elements of the Handle menu window
+ * decoration.
+ *
+ * The possible options for which this button is used for are "Screenshot", "New Window", "Manage
+ * Windows" and "Change Aspect Ratio".
+ */
+class HandleMenuActionButton @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : LinearLayout(context, attrs, defStyleAttr) {
+
+ private val rootElement: LinearLayout
+ private val iconView: ImageView
+ private val textView: MarqueedTextView
+
+ init {
+ val view = LayoutInflater.from(context).inflate(
+ R.layout.desktop_mode_window_decor_handle_menu_action_button, this, true)
+ rootElement = findViewById(R.id.action_button)
+ iconView = findViewById(R.id.image)
+ textView = findViewById(R.id.label)
+
+ context.withStyledAttributes(attrs, R.styleable.HandleMenuActionButton) {
+ textView.text = getString(R.styleable.HandleMenuActionButton_android_text)
+ textView.setTextColor(getColor(R.styleable.HandleMenuActionButton_android_textColor, 0))
+ iconView.setImageResource(getResourceId(
+ R.styleable.HandleMenuActionButton_android_src, 0))
+ iconView.imageTintList = getColorStateList(
+ R.styleable.HandleMenuActionButton_android_drawableTint)
+ }
+ }
+
+ /**
+ * Sets a listener to be invoked when this view is clicked.
+ *
+ * @param l the [OnClickListener] that receives click events.
+ */
+ override fun setOnClickListener(l: OnClickListener?) {
+ rootElement.setOnClickListener(l)
+ }
+
+ /**
+ * Sets the text color for the text inside the button.
+ *
+ * @param color the color to set for the text, as a color integer.
+ */
+ fun setTextColor(@ColorInt color: Int) {
+ textView.setTextColor(color)
+ }
+
+ /**
+ * Sets the icon for the button using a resource ID.
+ *
+ * @param resourceId the resource ID of the drawable to set as the icon.
+ */
+ fun setIconResource(@IdRes resourceId: Int) {
+ iconView.setImageResource(resourceId)
+ }
+
+ /**
+ * Sets the text to display inside the button.
+ *
+ * @param text the text to display.
+ */
+ fun setText(text: CharSequence?) {
+ textView.text = text
+ }
+
+ /**
+ * Sets the tint color for the icon.
+ *
+ * @param color the color to use for the tint, as a color integer.
+ */
+ fun setDrawableTint(@ColorInt color: Int) {
+ iconView.imageTintList = ColorStateList.valueOf(color)
+ }
+
+ /**
+ * Gets or sets the tint applied to the icon.
+ *
+ * @return The [ColorStateList] representing the tint, or null if no tint is applied.
+ */
+ var compoundDrawableTintList: ColorStateList?
+ get() = iconView.imageTintList
+ set(value) {
+ iconView.imageTintList = value
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
index 4762bc21d79c..90c865e502fc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt
@@ -93,9 +93,6 @@ class AppHeaderViewHolder(
private val lightColors = dynamicLightColorScheme(context)
private val darkColors = dynamicDarkColorScheme(context)
- private val headerButtonOpenMenuA11yText = context.resources
- .getString(R.string.desktop_mode_app_header_chip_text)
-
/**
* The corner radius to apply to the app chip, maximize and close button's background drawable.
**/
@@ -231,35 +228,29 @@ class AppHeaderViewHolder(
}
}
- val a11yActionOpenHeaderMenu = AccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK,
- headerButtonOpenMenuA11yText)
- openMenuButton.accessibilityDelegate = object : View.AccessibilityDelegate() {
- override fun onInitializeAccessibilityNodeInfo(
- host: View,
- info: AccessibilityNodeInfo
- ) {
- super.onInitializeAccessibilityNodeInfo(host, info)
- info.addAction(a11yActionOpenHeaderMenu)
- }
- }
+ // Update a11y announcement to say "double tap to open menu"
+ ViewCompat.replaceAccessibilityAction(
+ openMenuButton,
+ AccessibilityActionCompat.ACTION_CLICK,
+ context.getString(R.string.app_handle_chip_accessibility_announce),
+ null
+ )
- with(context.resources) {
- // Update a11y read out to say "double tap to maximize or restore window size"
- ViewCompat.replaceAccessibilityAction(
- maximizeWindowButton,
- AccessibilityActionCompat.ACTION_CLICK,
- getString(R.string.maximize_button_talkback_action_maximize_restore_text),
- null
- )
+ // Update a11y announcement to say "double tap to maximize or restore window size"
+ ViewCompat.replaceAccessibilityAction(
+ maximizeWindowButton,
+ AccessibilityActionCompat.ACTION_CLICK,
+ context.getString(R.string.maximize_button_talkback_action_maximize_restore_text),
+ null
+ )
- // Update a11y read out to say "double tap to minimize app window"
- ViewCompat.replaceAccessibilityAction(
- minimizeWindowButton,
- AccessibilityActionCompat.ACTION_CLICK,
- getString(R.string.minimize_button_talkback_action_maximize_restore_text),
- null
- )
- }
+ // Update a11y announcement out to say "double tap to minimize app window"
+ ViewCompat.replaceAccessibilityAction(
+ minimizeWindowButton,
+ AccessibilityActionCompat.ACTION_CLICK,
+ context.getString(R.string.minimize_button_talkback_action_maximize_restore_text),
+ null
+ )
}
override fun bindData(data: HeaderData) {
@@ -275,7 +266,8 @@ class AppHeaderViewHolder(
/** Sets the app's name in the header. */
fun setAppName(name: CharSequence) {
appNameTextView.text = name
- openMenuButton.contentDescription = name
+ openMenuButton.contentDescription =
+ context.getString(R.string.desktop_mode_app_header_chip_text, name)
}
/** Sets the app's icon in the header. */
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java
index 4198f5904566..b5911bfa54f2 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java
@@ -17,6 +17,10 @@ package com.android.wm.shell.bubbles;
import static android.view.WindowManager.TRANSIT_CHANGE;
+import static com.android.wm.shell.transition.Transitions.TRANSIT_CONVERT_TO_BUBBLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -31,12 +35,14 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.ActivityManager;
+import android.graphics.Rect;
import android.os.IBinder;
import android.view.SurfaceControl;
import android.view.ViewRootImpl;
import android.window.IWindowContainerToken;
import android.window.TransitionInfo;
import android.window.WindowContainerToken;
+import android.window.WindowContainerTransaction;
import androidx.test.filters.SmallTest;
@@ -65,6 +71,10 @@ import org.mockito.MockitoAnnotations;
*/
@SmallTest
public class BubbleTransitionsTest extends ShellTestCase {
+
+ private static final int FULLSCREEN_TASK_WIDTH = 200;
+ private static final int FULLSCREEN_TASK_HEIGHT = 100;
+
@Mock
private BubbleData mBubbleData;
@Mock
@@ -117,10 +127,7 @@ public class BubbleTransitionsTest extends ShellTestCase {
private ActivityManager.RunningTaskInfo setupBubble() {
ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo();
- final IWindowContainerToken itoken = mock(IWindowContainerToken.class);
- final IBinder asBinder = mock(IBinder.class);
- when(itoken.asBinder()).thenReturn(asBinder);
- WindowContainerToken token = new WindowContainerToken(itoken);
+ WindowContainerToken token = createMockToken();
taskInfo.token = token;
final TaskView tv = mock(TaskView.class);
final TaskViewTaskController tvtc = mock(TaskViewTaskController.class);
@@ -131,13 +138,32 @@ public class BubbleTransitionsTest extends ShellTestCase {
return taskInfo;
}
+ private TransitionInfo setupFullscreenTaskTransition(ActivityManager.RunningTaskInfo taskInfo) {
+ final TransitionInfo info = new TransitionInfo(TRANSIT_CONVERT_TO_BUBBLE, 0);
+ final TransitionInfo.Change chg = new TransitionInfo.Change(taskInfo.token,
+ mock(SurfaceControl.class));
+ chg.setTaskInfo(taskInfo);
+ chg.setMode(TRANSIT_CHANGE);
+ chg.setStartAbsBounds(new Rect(0, 0, FULLSCREEN_TASK_WIDTH, FULLSCREEN_TASK_HEIGHT));
+ info.addChange(chg);
+ info.addRoot(new TransitionInfo.Root(0, mock(SurfaceControl.class), 0, 0));
+ return info;
+ }
+
+ private WindowContainerToken createMockToken() {
+ final IWindowContainerToken itoken = mock(IWindowContainerToken.class);
+ final IBinder asBinder = mock(IBinder.class);
+ when(itoken.asBinder()).thenReturn(asBinder);
+ return new WindowContainerToken(itoken);
+ }
+
@Test
public void testConvertToBubble() {
// Basic walk-through of convert-to-bubble transition stages
ActivityManager.RunningTaskInfo taskInfo = setupBubble();
final BubbleTransitions.BubbleTransition bt = mBubbleTransitions.startConvertToBubble(
mBubble, taskInfo, mExpandedViewManager, mTaskViewFactory, mBubblePositioner,
- mStackView, mLayerView, mIconFactory, false);
+ mStackView, mLayerView, mIconFactory, null, false);
final BubbleTransitions.ConvertToBubble ctb = (BubbleTransitions.ConvertToBubble) bt;
ctb.onInflated(mBubble);
when(mLayerView.canExpandView(any())).thenReturn(true);
@@ -146,13 +172,7 @@ public class BubbleTransitionsTest extends ShellTestCase {
// Ensure we are communicating with the taskviewtransitions queue
assertTrue(mTaskViewTransitions.hasPending());
- final TransitionInfo info = new TransitionInfo(TRANSIT_CHANGE, 0);
- final TransitionInfo.Change chg = new TransitionInfo.Change(taskInfo.token,
- mock(SurfaceControl.class));
- chg.setTaskInfo(taskInfo);
- chg.setMode(TRANSIT_CHANGE);
- info.addChange(chg);
- info.addRoot(new TransitionInfo.Root(0, mock(SurfaceControl.class), 0, 0));
+ final TransitionInfo info = setupFullscreenTaskTransition(taskInfo);
SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
final boolean[] finishCalled = new boolean[]{false};
@@ -163,6 +183,8 @@ public class BubbleTransitionsTest extends ShellTestCase {
ctb.startAnimation(ctb.mTransition, info, startT, finishT, finishCb);
assertFalse(mTaskViewTransitions.hasPending());
+ verify(startT).setPosition(any(), eq(0f), eq(0f));
+
verify(mBubbleData).notificationEntryUpdated(eq(mBubble), anyBoolean(), anyBoolean());
ctb.continueExpand();
@@ -179,6 +201,46 @@ public class BubbleTransitionsTest extends ShellTestCase {
}
@Test
+ public void testConvertToBubble_drag() {
+ ActivityManager.RunningTaskInfo taskInfo = setupBubble();
+
+ Rect draggedTaskBounds = new Rect(10, 20, 30, 40);
+ WindowContainerTransaction pendingWct = new WindowContainerTransaction();
+ WindowContainerToken pendingDragOpToken = createMockToken();
+ pendingWct.reorder(pendingDragOpToken, /* onTop= */ false);
+
+ BubbleTransitions.DragData dragData = new BubbleTransitions.DragData(
+ draggedTaskBounds, pendingWct
+ );
+
+ final BubbleTransitions.BubbleTransition bt = mBubbleTransitions.startConvertToBubble(
+ mBubble, taskInfo, mExpandedViewManager, mTaskViewFactory, mBubblePositioner,
+ mStackView, mLayerView, mIconFactory, dragData, false);
+ final BubbleTransitions.ConvertToBubble ctb = (BubbleTransitions.ConvertToBubble) bt;
+
+ ArgumentCaptor<WindowContainerTransaction> wctCaptor = ArgumentCaptor.forClass(
+ WindowContainerTransaction.class);
+ ctb.onInflated(mBubble);
+ verify(mTransitions).startTransition(anyInt(), wctCaptor.capture(), eq(ctb));
+
+ // Verify that the WCT has the pending operation from drag data
+ WindowContainerTransaction transitionWct = wctCaptor.getValue();
+ assertThat(transitionWct.getHierarchyOps().stream().anyMatch(op -> op.getType()
+ == WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REORDER
+ && op.getContainer() == pendingDragOpToken.asBinder())).isTrue();
+
+ final TransitionInfo info = setupFullscreenTaskTransition(taskInfo);
+ SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
+ SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
+ Transitions.TransitionFinishCallback finishCb = wct -> {};
+ ctb.startAnimation(ctb.mTransition, info, startT, finishT, finishCb);
+
+ // Verify that dragged task bounds are used for the position
+ verify(startT).setPosition(any(), eq((float) draggedTaskBounds.left),
+ eq((float) draggedTaskBounds.top));
+ }
+
+ @Test
public void testConvertFromBubble() {
ActivityManager.RunningTaskInfo taskInfo = setupBubble();
final BubbleTransitions.BubbleTransition bt = mBubbleTransitions.startConvertFromBubble(
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
index 718bf322f6a9..be53272185b6 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
@@ -51,6 +51,7 @@ import android.os.UserManager
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.FlagsParameterization
+import android.testing.TestableContext
import android.view.Display.DEFAULT_DISPLAY
import android.view.DragEvent
import android.view.Gravity
@@ -147,6 +148,7 @@ import com.android.wm.shell.transition.TestRemoteTransition
import com.android.wm.shell.transition.Transitions
import com.android.wm.shell.transition.Transitions.ENABLE_SHELL_TRANSITIONS
import com.android.wm.shell.transition.Transitions.TransitionHandler
+import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModelTestsBase.Companion.HOME_LAUNCHER_PACKAGE_NAME
import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration
import com.android.wm.shell.windowdecor.tiling.DesktopTilingDecorViewModel
import com.google.common.truth.Truth.assertThat
@@ -186,7 +188,6 @@ import org.mockito.kotlin.anyOrNull
import org.mockito.kotlin.argThat
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.atLeastOnce
-import org.mockito.kotlin.capture
import org.mockito.kotlin.eq
import org.mockito.kotlin.whenever
import org.mockito.quality.Strictness
@@ -256,6 +257,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
@Mock private lateinit var desksOrganizer: DesksOrganizer
@Mock private lateinit var userProfileContexts: UserProfileContexts
@Mock private lateinit var desksTransitionsObserver: DesksTransitionObserver
+ @Mock private lateinit var packageManager: PackageManager
private lateinit var controller: DesktopTasksController
private lateinit var shellInit: ShellInit
@@ -265,6 +267,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
private lateinit var recentsTransitionStateListener: RecentsTransitionStateListener
private lateinit var testScope: CoroutineScope
private lateinit var desktopModeCompatPolicy: DesktopModeCompatPolicy
+ private lateinit var spyContext: TestableContext
private val shellExecutor = TestShellExecutor()
@@ -281,6 +284,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
private val UNRESIZABLE_LANDSCAPE_BOUNDS = Rect(25, 449, 1575, 1611)
private val UNRESIZABLE_PORTRAIT_BOUNDS = Rect(830, 75, 1730, 1275)
private val wallpaperToken = MockToken().token()
+ private val homeComponentName = ComponentName(HOME_LAUNCHER_PACKAGE_NAME, /* class */ "")
@Before
fun setUp() {
@@ -294,6 +298,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
doReturn(true).`when` { DesktopModeStatus.canEnterDesktopMode(any()) }
testScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob())
+ spyContext = spy(mContext)
shellInit = spy(ShellInit(testExecutor))
userRepositories =
DesktopUserRepositories(
@@ -315,7 +320,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
mContext,
mockHandler,
)
- desktopModeCompatPolicy = spy(DesktopModeCompatPolicy(context))
+ desktopModeCompatPolicy = spy(DesktopModeCompatPolicy(spyContext))
whenever(shellTaskOrganizer.getRunningTasks(anyInt())).thenAnswer { runningTasks }
whenever(transitions.startTransition(anyInt(), any(), isNull())).thenAnswer { Binder() }
@@ -373,6 +378,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
taskRepository = userRepositories.current
taskRepository.addDesk(displayId = DEFAULT_DISPLAY, deskId = DEFAULT_DISPLAY)
taskRepository.setActiveDesk(displayId = DEFAULT_DISPLAY, deskId = DEFAULT_DISPLAY)
+
+ spyContext.setMockPackageManager(packageManager)
+ whenever(packageManager.getHomeActivities(ArrayList())).thenReturn(homeComponentName)
}
private fun createController() =
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt
index 1732875f1d57..ba26d1df94f6 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt
@@ -25,6 +25,8 @@ import com.android.internal.jank.InteractionJankMonitor
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.TestRunningTaskInfoBuilder
+import com.android.wm.shell.bubbles.BubbleController
+import com.android.wm.shell.bubbles.BubbleTransitions
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_CANCEL_DRAG_TO_DESKTOP
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP
import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP
@@ -34,6 +36,7 @@ import com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_TOP
import com.android.wm.shell.splitscreen.SplitScreenController
import com.android.wm.shell.transition.Transitions
import com.android.wm.shell.windowdecor.MoveToDesktopAnimator
+import java.util.Optional
import java.util.function.Supplier
import junit.framework.Assert.assertEquals
import junit.framework.Assert.assertFalse
@@ -71,6 +74,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() {
@Mock private lateinit var draggedTaskLeash: SurfaceControl
@Mock private lateinit var homeTaskLeash: SurfaceControl
@Mock private lateinit var desktopUserRepositories: DesktopUserRepositories
+ @Mock private lateinit var bubbleController: BubbleController
private val transactionSupplier = Supplier { mock<SurfaceControl.Transaction>() }
@@ -87,6 +91,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() {
taskDisplayAreaOrganizer,
desktopUserRepositories,
mockInteractionJankMonitor,
+ Optional.of(bubbleController),
transactionSupplier,
)
.apply { setSplitScreenController(splitScreenController) }
@@ -97,6 +102,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() {
taskDisplayAreaOrganizer,
desktopUserRepositories,
mockInteractionJankMonitor,
+ Optional.of(bubbleController),
transactionSupplier,
)
.apply { setSplitScreenController(splitScreenController) }
@@ -169,6 +175,30 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() {
}
@Test
+ fun startDragToDesktop_cancelledBeforeReady_verifyBubbleLeftCancel() {
+ performEarlyCancel(
+ defaultHandler,
+ DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_LEFT,
+ )
+ verify(bubbleController).expandStackAndSelectBubble(
+ any<RunningTaskInfo>(),
+ any<BubbleTransitions.DragData>()
+ )
+ }
+
+ @Test
+ fun startDragToDesktop_cancelledBeforeReady_verifyBubbleRightCancel() {
+ performEarlyCancel(
+ defaultHandler,
+ DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_RIGHT,
+ )
+ verify(bubbleController).expandStackAndSelectBubble(
+ any<RunningTaskInfo>(),
+ any<BubbleTransitions.DragData>()
+ )
+ }
+
+ @Test
fun startDragToDesktop_aborted_finishDropped() {
val task = createTask()
// Simulate transition is started.
@@ -343,6 +373,38 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() {
}
@Test
+ fun cancelDragToDesktop_bubbleLeftCancelType_bubbleRequested() {
+ startDrag(defaultHandler)
+
+ // Then user cancelled it, requesting bubble.
+ defaultHandler.cancelDragToDesktopTransition(
+ DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_LEFT
+ )
+
+ // Verify the request went through bubble controller.
+ verify(bubbleController).expandStackAndSelectBubble(
+ any<RunningTaskInfo>(),
+ any<BubbleTransitions.DragData>()
+ )
+ }
+
+ @Test
+ fun cancelDragToDesktop_bubbleRightCancelType_bubbleRequested() {
+ startDrag(defaultHandler)
+
+ // Then user cancelled it, requesting bubble.
+ defaultHandler.cancelDragToDesktopTransition(
+ DragToDesktopTransitionHandler.CancelState.CANCEL_BUBBLE_RIGHT
+ )
+
+ // Verify the request went through bubble controller.
+ verify(bubbleController).expandStackAndSelectBubble(
+ any<RunningTaskInfo>(),
+ any<BubbleTransitions.DragData>()
+ )
+ }
+
+ @Test
fun cancelDragToDesktop_startWasNotReady_animateCancel() {
val task = createTask()
// Simulate transition is started and is ready to animate.
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt
index dfb1b0c8c642..9cb2a055e45d 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/compatui/SystemModalsTransitionHandlerTest.kt
@@ -16,9 +16,12 @@
package com.android.wm.shell.desktopmode.compatui
+import android.content.ComponentName
import android.content.Intent
+import android.content.pm.PackageManager
import android.os.Binder
import android.testing.AndroidTestingRunner
+import android.testing.TestableContext
import android.view.SurfaceControl
import android.view.WindowManager.TRANSIT_CHANGE
import android.view.WindowManager.TRANSIT_CLOSE
@@ -37,6 +40,7 @@ import com.android.wm.shell.shared.desktopmode.DesktopModeCompatPolicy
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.transition.TransitionInfoBuilder
import com.android.wm.shell.transition.Transitions
+import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModelTestsBase.Companion.HOME_LAUNCHER_PACKAGE_NAME
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -44,6 +48,7 @@ import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.kotlin.any
import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
@@ -62,16 +67,23 @@ class SystemModalsTransitionHandlerTest : ShellTestCase() {
private val desktopRepository = mock<DesktopRepository>()
private val startT = mock<SurfaceControl.Transaction>()
private val finishT = mock<SurfaceControl.Transaction>()
+ private val packageManager = mock<PackageManager>()
+ private val componentName = mock<ComponentName>()
+ private lateinit var spyContext: TestableContext
private lateinit var transitionHandler: SystemModalsTransitionHandler
private lateinit var desktopModeCompatPolicy: DesktopModeCompatPolicy
@Before
fun setUp() {
+ spyContext = spy(mContext)
// Simulate having one Desktop task so that we see Desktop Mode as active
whenever(desktopUserRepositories.current).thenReturn(desktopRepository)
whenever(desktopRepository.getVisibleTaskCount(anyInt())).thenReturn(1)
- desktopModeCompatPolicy = DesktopModeCompatPolicy(context)
+ whenever(spyContext.packageManager).thenReturn(packageManager)
+ whenever(componentName.packageName).thenReturn(HOME_LAUNCHER_PACKAGE_NAME)
+ whenever(packageManager.getHomeActivities(ArrayList())).thenReturn(componentName)
+ desktopModeCompatPolicy = DesktopModeCompatPolicy(spyContext)
transitionHandler = createTransitionHandler()
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt
index 86e8142b1aaa..08b9e0413e9d 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt
@@ -26,6 +26,8 @@ import com.android.modules.utils.testing.ExtendedMockitoRule
import com.android.window.flags.Flags
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.desktopmode.CaptionState
+import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger
+import com.android.wm.shell.desktopmode.DesktopModeUiEventLogger.DesktopUiEventEnum
import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository
import com.android.wm.shell.desktopmode.education.AppHandleEducationController.Companion.APP_HANDLE_EDUCATION_DELAY_MILLIS
import com.android.wm.shell.desktopmode.education.AppHandleEducationController.Companion.TOOLTIP_VISIBLE_DURATION_MILLIS
@@ -86,6 +88,7 @@ class AppHandleEducationControllerTest : ShellTestCase() {
@Mock private lateinit var mockDataStoreRepository: AppHandleEducationDatastoreRepository
@Mock private lateinit var mockCaptionHandleRepository: WindowDecorCaptionHandleRepository
@Mock private lateinit var mockTooltipController: DesktopWindowingEducationTooltipController
+ @Mock private lateinit var mockDesktopModeUiEventLogger: DesktopModeUiEventLogger
@Before
fun setUp() {
@@ -105,6 +108,7 @@ class AppHandleEducationControllerTest : ShellTestCase() {
mockTooltipController,
testScope.backgroundScope,
Dispatchers.Main,
+ mockDesktopModeUiEventLogger,
)
}
@@ -123,6 +127,8 @@ class AppHandleEducationControllerTest : ShellTestCase() {
verify(mockTooltipController, times(1)).showEducationTooltip(any(), any())
verify(mockDataStoreRepository, times(1))
.updateAppHandleHintViewedTimestampMillis(eq(true))
+ verify(mockDesktopModeUiEventLogger, times(1))
+ .log(any(), eq(DesktopUiEventEnum.APP_HANDLE_EDUCATION_TOOLTIP_SHOWN))
}
@Test
@@ -155,6 +161,8 @@ class AppHandleEducationControllerTest : ShellTestCase() {
verify(mockTooltipController, times(1)).showEducationTooltip(any(), any())
verify(mockDataStoreRepository, times(1))
.updateEnterDesktopModeHintViewedTimestampMillis(eq(true))
+ verify(mockDesktopModeUiEventLogger, times(1))
+ .log(any(), eq(DesktopUiEventEnum.ENTER_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN))
}
@Test
@@ -170,6 +178,8 @@ class AppHandleEducationControllerTest : ShellTestCase() {
verify(mockTooltipController, times(1)).showEducationTooltip(any(), any())
verify(mockDataStoreRepository, times(1))
.updateExitDesktopModeHintViewedTimestampMillis(eq(true))
+ verify(mockDesktopModeUiEventLogger, times(1))
+ .log(any(), eq(DesktopUiEventEnum.EXIT_DESKTOP_MODE_EDUCATION_TOOLTIP_SHOWN))
}
@Test
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt
index 55e9de5eff5f..f69bf34ea3f7 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeCompatPolicyTest.kt
@@ -30,6 +30,7 @@ import com.android.internal.R
import com.android.window.flags.Flags
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.desktopmode.DesktopTestHelpers.createFreeformTask
+import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModelTestsBase.Companion.HOME_LAUNCHER_PACKAGE_NAME
import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges
import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges
import org.junit.Assert.assertFalse
@@ -52,10 +53,14 @@ import org.mockito.kotlin.whenever
class DesktopModeCompatPolicyTest : ShellTestCase() {
@get:Rule val compatRule = PlatformCompatChangeRule()
private lateinit var desktopModeCompatPolicy: DesktopModeCompatPolicy
+ private val packageManager: PackageManager = mock()
+ private val homeActivities = ComponentName(HOME_LAUNCHER_PACKAGE_NAME, /* class */ "")
@Before
fun setUp() {
desktopModeCompatPolicy = DesktopModeCompatPolicy(mContext)
+ whenever(packageManager.getHomeActivities(any())).thenReturn(homeActivities)
+ mContext.setMockPackageManager(packageManager)
}
@Test
@@ -128,10 +133,6 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
@Test
fun testIsTopActivityExemptFromDesktopWindowing_defaultHomePackage() {
- val packageManager: PackageManager = mock()
- val homeActivities = ComponentName("defaultHomePackage", /* class */ "")
- whenever(packageManager.getHomeActivities(any())).thenReturn(homeActivities)
- mContext.setMockPackageManager(packageManager)
assertTrue(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
createFreeformTask(/* displayId */ 0)
.apply {
@@ -142,10 +143,6 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
@Test
fun testIsTopActivityExemptFromDesktopWindowing_defaultHomePackage_notDisplayed() {
- val packageManager: PackageManager = mock()
- val homeActivities = ComponentName("defaultHomePackage", /* class */ "")
- whenever(packageManager.getHomeActivities(any())).thenReturn(homeActivities)
- mContext.setMockPackageManager(packageManager)
assertFalse(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
createFreeformTask(/* displayId */ 0)
.apply {
@@ -155,6 +152,21 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
}
@Test
+ fun testIsTopActivityExemptFromDesktopWindowing_defaultHomePackage_notYetAvailable() {
+ val emptyHomeActivities: ComponentName = mock()
+ mContext.setMockPackageManager(packageManager)
+
+ whenever(emptyHomeActivities.packageName).thenReturn(null)
+ whenever(packageManager.getHomeActivities(any())).thenReturn(emptyHomeActivities)
+
+ assertTrue(desktopModeCompatPolicy.isTopActivityExemptFromDesktopWindowing(
+ createFreeformTask(/* displayId */ 0)
+ .apply {
+ isTopActivityNoDisplay = false
+ }))
+ }
+
+ @Test
@EnableFlags(Flags.FLAG_EXCLUDE_CAPTION_FROM_APP_BOUNDS)
@DisableCompatChanges(ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED)
fun testShouldExcludeCaptionFromAppBounds_resizeable_false() {
@@ -181,6 +193,17 @@ class DesktopModeCompatPolicyTest : ShellTestCase() {
)
}
+
+ @Test
+ @EnableFlags(Flags.FLAG_EXCLUDE_CAPTION_FROM_APP_BOUNDS)
+ @DisableCompatChanges(ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED)
+ @EnableCompatChanges(ActivityInfo.OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS)
+ fun testShouldExcludeCaptionFromAppBounds_resizeable_overridden_true() {
+ assertTrue(desktopModeCompatPolicy.shouldExcludeCaptionFromAppBounds(
+ setUpFreeformTask().apply { isResizeable = true })
+ )
+ }
+
fun setUpFreeformTask(): TaskInfo =
createFreeformTask().apply {
val componentName =
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java
index 82392e0e3bc0..18fdbeff40f4 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/DefaultTransitionHandlerTest.java
@@ -48,6 +48,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.internal.jank.InteractionJankMonitor;
import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestShellExecutor;
@@ -96,7 +97,7 @@ public class DefaultTransitionHandlerTest extends ShellTestCase {
mTransitionHandler = new DefaultTransitionHandler(
mContext, mShellInit, mDisplayController,
mTransactionPool, mMainExecutor, mMainHandler, mAnimExecutor,
- mRootTaskDisplayAreaOrganizer);
+ mRootTaskDisplayAreaOrganizer, mock(InteractionJankMonitor.class));
mShellInit.init();
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
index 49812d381178..da41a23f066c 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt
@@ -28,7 +28,6 @@ import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.Intent.ACTION_MAIN
-import android.content.pm.PackageManager
import android.graphics.Rect
import android.graphics.Region
import android.hardware.display.DisplayManager
@@ -310,14 +309,10 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest
@Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY)
fun testDecorationIsNotCreatedForDefaultHomePackage() {
- val packageManager: PackageManager = org.mockito.kotlin.mock()
- val homeActivities = ComponentName("defaultHomePackage", /* class */ "")
val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN).apply {
- baseActivity = homeActivities
+ baseActivity = homeComponentName
isTopActivityNoDisplay = false
}
- mContext.setMockPackageManager(packageManager)
- whenever(packageManager.getHomeActivities(any())).thenReturn(homeActivities)
onTaskOpening(task)
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt
index 9f106da9f4b9..e40034b09f39 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTestsBase.kt
@@ -20,7 +20,9 @@ import android.app.ActivityManager.RunningTaskInfo
import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD
import android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW
import android.app.WindowConfiguration.WindowingMode
+import android.content.ComponentName
import android.content.pm.ActivityInfo
+import android.content.pm.PackageManager
import android.graphics.Rect
import android.hardware.input.InputManager
import android.os.Handler
@@ -146,8 +148,10 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() {
protected val mockDesktopRepository: DesktopRepository = mock<DesktopRepository>()
protected val mockRecentsTransitionHandler = mock<RecentsTransitionHandler>()
protected val motionEvent = mock<MotionEvent>()
- val displayLayout = mock<DisplayLayout>()
- val display = mock<Display>()
+ private val displayLayout = mock<DisplayLayout>()
+ private val display = mock<Display>()
+ private val packageManager = mock<PackageManager>()
+ protected val homeComponentName = ComponentName(HOME_LAUNCHER_PACKAGE_NAME, /* class */ "")
protected lateinit var spyContext: TestableContext
private lateinit var desktopModeEventLogger: DesktopModeEventLogger
@@ -178,7 +182,7 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() {
whenever(mockDisplayController.getDisplay(any())).thenReturn(display)
whenever(mockDesktopUserRepositories.getProfile(anyInt()))
.thenReturn(mockDesktopRepository)
- desktopModeCompatPolicy = DesktopModeCompatPolicy(context)
+ desktopModeCompatPolicy = DesktopModeCompatPolicy(spyContext)
desktopModeWindowDecorViewModel = DesktopModeWindowDecorViewModel(
spyContext,
testShellExecutor,
@@ -273,6 +277,8 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() {
whenever(displayLayout.getStableBounds(any())).thenAnswer { i ->
(i.arguments.first() as Rect).set(STABLE_BOUNDS)
}
+ spyContext.setMockPackageManager(packageManager)
+ whenever(packageManager.getHomeActivities(ArrayList())).thenReturn(homeComponentName)
}
@After
@@ -354,5 +360,6 @@ open class DesktopModeWindowDecorViewModelTestsBase : ShellTestCase() {
val STABLE_INSETS = Rect(0, 100, 0, 0)
val INITIAL_BOUNDS = Rect(0, 0, 100, 100)
val STABLE_BOUNDS = Rect(0, 0, 1000, 1000)
+ val HOME_LAUNCHER_PACKAGE_NAME = "com.android.launcher"
}
}
diff --git a/libs/hwui/FrameInfo.cpp b/libs/hwui/FrameInfo.cpp
index a958a091a830..36feabde07eb 100644
--- a/libs/hwui/FrameInfo.cpp
+++ b/libs/hwui/FrameInfo.cpp
@@ -32,8 +32,9 @@ const std::array FrameInfoNames{"Flags",
"PerformTraversalsStart",
"DrawStart",
"FrameDeadline",
- "FrameInterval",
"FrameStartTime",
+ "FrameInterval",
+ "WorkloadTarget",
"SyncQueued",
"SyncStart",
"IssueDrawCommandsStart",
@@ -48,7 +49,7 @@ const std::array FrameInfoNames{"Flags",
};
-static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 23,
+static_assert(static_cast<int>(FrameInfoIndex::NumIndexes) == 24,
"Must update value in FrameMetrics.java#FRAME_STATS_COUNT (and here)");
void FrameInfo::importUiThreadInfo(int64_t* info) {
diff --git a/libs/hwui/FrameInfo.h b/libs/hwui/FrameInfo.h
index f7ad13978a30..61c30b803b00 100644
--- a/libs/hwui/FrameInfo.h
+++ b/libs/hwui/FrameInfo.h
@@ -30,7 +30,8 @@
namespace android {
namespace uirenderer {
-static constexpr size_t UI_THREAD_FRAME_INFO_SIZE = 12;
+// This value must be in sync with `FRAME_INFO_SIZE` in FrameInfo.Java
+static constexpr size_t UI_THREAD_FRAME_INFO_SIZE = 13;
enum class FrameInfoIndex {
Flags = 0,
@@ -47,6 +48,11 @@ enum class FrameInfoIndex {
FrameInterval,
// End of UI frame info
+ // The target workload duration based on the original frame deadline and
+ // and intended vsync. Counted in UI_THREAD_FRAME_INFO_SIZE so its value
+ // can be set in setVsync().
+ WorkloadTarget,
+
SyncQueued,
SyncStart,
@@ -109,6 +115,7 @@ public:
set(FrameInfoIndex::FrameStartTime) = vsyncTime;
set(FrameInfoIndex::FrameDeadline) = frameDeadline;
set(FrameInfoIndex::FrameInterval) = frameInterval;
+ set(FrameInfoIndex::WorkloadTarget) = frameDeadline - intendedVsync;
return *this;
}
diff --git a/libs/hwui/JankTracker.cpp b/libs/hwui/JankTracker.cpp
index 638a060bdb1c..80eb6bc986d6 100644
--- a/libs/hwui/JankTracker.cpp
+++ b/libs/hwui/JankTracker.cpp
@@ -201,7 +201,7 @@ void JankTracker::finishFrame(FrameInfo& frame, std::unique_ptr<FrameMetricsRepo
// If we are in triple buffering, we have enough buffers in queue to sustain a single frame
// drop without jank, so adjust the frame interval to the deadline.
if (isTripleBuffered) {
- int64_t originalDeadlineDuration = deadline - frame[FrameInfoIndex::IntendedVsync];
+ int64_t originalDeadlineDuration = frame[FrameInfoIndex::WorkloadTarget];
deadline = mNextFrameStartUnstuffed + originalDeadlineDuration;
frame.set(FrameInfoIndex::FrameDeadline) = deadline;
}
diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp
index 7d01dfbb446f..21430f7e6777 100644
--- a/libs/hwui/Properties.cpp
+++ b/libs/hwui/Properties.cpp
@@ -57,6 +57,9 @@ constexpr bool query_global_priority() {
constexpr bool early_preload_gl_context() {
return false;
}
+constexpr bool calc_workload_orig_deadline() {
+ return false;
+}
} // namespace hwui_flags
#endif
@@ -299,5 +302,10 @@ bool Properties::earlyPreloadGlContext() {
hwui_flags::early_preload_gl_context());
}
+bool Properties::calcWorkloadOrigDeadline() {
+ static bool sCalcWorkloadOrigDeadline = base::GetBoolProperty(
+ "debug.hwui.calc_workload_orig_deadline", hwui_flags::calc_workload_orig_deadline());
+ return sCalcWorkloadOrigDeadline;
+}
} // namespace uirenderer
} // namespace android
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index 280a75a28e65..a7a564428636 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -384,6 +384,7 @@ public:
static bool initializeGlAlways();
static bool resampleGainmapRegions();
static bool earlyPreloadGlContext();
+ static bool calcWorkloadOrigDeadline();
private:
static StretchEffectBehavior stretchEffectBehavior;
diff --git a/libs/hwui/aconfig/hwui_flags.aconfig b/libs/hwui/aconfig/hwui_flags.aconfig
index 2851dd8b1003..62fd7d358123 100644
--- a/libs/hwui/aconfig/hwui_flags.aconfig
+++ b/libs/hwui/aconfig/hwui_flags.aconfig
@@ -176,4 +176,15 @@ flag {
namespace: "core_graphics"
description: "Initialize GL context and GraphicBufferAllocater init on renderThread preload. This improves app startup time for apps using GL."
bug: "383612849"
+}
+
+flag {
+ name: "calc_workload_orig_deadline"
+ namespace: "window_surfaces"
+ description: "Use original frame deadline to calculate the workload target deadline for jank tracking"
+ bug: "389939827"
+ is_fixed_read_only: true
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
} \ No newline at end of file
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index b36b8be10779..e3e393c4fdfb 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -789,7 +789,13 @@ void CanvasContext::draw(bool solelyTextureViewUpdates) {
int64_t frameDeadline = mCurrentFrameInfo->get(FrameInfoIndex::FrameDeadline);
int64_t dequeueBufferDuration = mCurrentFrameInfo->get(FrameInfoIndex::DequeueBufferDuration);
- mHintSessionWrapper->updateTargetWorkDuration(frameDeadline - intendedVsync);
+ if (Properties::calcWorkloadOrigDeadline()) {
+ // Uses the unmodified frame deadline in calculating workload target duration
+ mHintSessionWrapper->updateTargetWorkDuration(
+ mCurrentFrameInfo->get(FrameInfoIndex::WorkloadTarget));
+ } else {
+ mHintSessionWrapper->updateTargetWorkDuration(frameDeadline - intendedVsync);
+ }
if (didDraw) {
int64_t frameStartTime = mCurrentFrameInfo->get(FrameInfoIndex::FrameStartTime);
diff --git a/libs/hwui/tests/unit/JankTrackerTests.cpp b/libs/hwui/tests/unit/JankTrackerTests.cpp
index b67e419e7d4a..c289d67fbef6 100644
--- a/libs/hwui/tests/unit/JankTrackerTests.cpp
+++ b/libs/hwui/tests/unit/JankTrackerTests.cpp
@@ -45,6 +45,7 @@ TEST(JankTracker, noJank) {
info->set(FrameInfoIndex::FrameCompleted) = 115_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 120_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
info = jankTracker.startFrame();
@@ -55,6 +56,7 @@ TEST(JankTracker, noJank) {
info->set(FrameInfoIndex::FrameCompleted) = 131_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 136_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(2, container.get()->totalFrameCount());
@@ -79,6 +81,7 @@ TEST(JankTracker, jank) {
info->set(FrameInfoIndex::FrameCompleted) = 121_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 120_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(1, container.get()->totalFrameCount());
@@ -102,6 +105,7 @@ TEST(JankTracker, legacyJankButNoRealJank) {
info->set(FrameInfoIndex::FrameCompleted) = 118_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 120_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(1, container.get()->totalFrameCount());
@@ -127,6 +131,7 @@ TEST(JankTracker, doubleStuffed) {
info->set(FrameInfoIndex::FrameCompleted) = 121_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 120_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(1, container.get()->jankFrameCount());
@@ -140,6 +145,7 @@ TEST(JankTracker, doubleStuffed) {
info->set(FrameInfoIndex::FrameCompleted) = 137_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 136_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(2, container.get()->totalFrameCount());
@@ -164,6 +170,7 @@ TEST(JankTracker, doubleStuffedThenPauseThenJank) {
info->set(FrameInfoIndex::FrameCompleted) = 121_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 120_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(1, container.get()->jankFrameCount());
@@ -177,6 +184,7 @@ TEST(JankTracker, doubleStuffedThenPauseThenJank) {
info->set(FrameInfoIndex::FrameCompleted) = 137_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 136_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(1, container.get()->jankFrameCount());
@@ -190,6 +198,7 @@ TEST(JankTracker, doubleStuffedThenPauseThenJank) {
info->set(FrameInfoIndex::FrameCompleted) = 169_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 168_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 20_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(3, container.get()->totalFrameCount());
@@ -214,6 +223,7 @@ TEST(JankTracker, doubleStuffedTwoIntervalBehind) {
info->set(FrameInfoIndex::FrameCompleted) = 117_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 116_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 16_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(1, container.get()->jankFrameCount());
@@ -228,6 +238,7 @@ TEST(JankTracker, doubleStuffedTwoIntervalBehind) {
info->set(FrameInfoIndex::FrameCompleted) = 133_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 132_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 16_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(1, container.get()->jankFrameCount());
@@ -242,6 +253,7 @@ TEST(JankTracker, doubleStuffedTwoIntervalBehind) {
info->set(FrameInfoIndex::FrameCompleted) = 165_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 148_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 16_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(2, container.get()->jankFrameCount());
@@ -256,6 +268,7 @@ TEST(JankTracker, doubleStuffedTwoIntervalBehind) {
info->set(FrameInfoIndex::FrameCompleted) = 181_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 164_ms;
+ info->set(FrameInfoIndex::WorkloadTarget) = 16_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(2, container.get()->jankFrameCount());
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index f09dc7218d7d..6b7217358b6e 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -25,8 +25,6 @@ cc_library_shared {
min_sdk_version: "",
srcs: [
- "android_media_ImageWriter.cpp",
- "android_media_ImageReader.cpp",
"android_media_JetPlayer.cpp",
"android_media_MediaCrypto.cpp",
"android_media_MediaCodec.cpp",
@@ -42,7 +40,6 @@ cc_library_shared {
"android_media_MediaProfiles.cpp",
"android_media_MediaRecorder.cpp",
"android_media_MediaSync.cpp",
- "android_media_PublicFormatUtils.cpp",
"android_media_ResampleInputStream.cpp",
"android_media_Streams.cpp",
"android_media_SyncParams.cpp",
@@ -64,7 +61,6 @@ cc_library_shared {
"libbinder",
"libmedia",
"libmedia_codeclist",
- "libmedia_jni_utils",
"libmedia_omx",
"libmediametrics",
"libmediadrm",
@@ -133,38 +129,6 @@ cc_library_shared {
}
cc_library_shared {
- name: "libmedia_jni_utils",
- srcs: [
- ":libgui_frame_event_aidl",
- "android_media_Utils.cpp",
- ],
-
- header_libs: [
- "libgui_headers",
- ],
-
- shared_libs: [
- "liblog",
- "libui",
- "libutils",
- ],
-
- include_dirs: [
- "system/media/camera/include",
- ],
-
- export_include_dirs: ["."],
-
- cflags: [
- "-Wall",
- "-Werror",
- "-Wno-error=deprecated-declarations",
- "-Wunused",
- "-Wunreachable-code",
- ],
-}
-
-cc_library_shared {
name: "libmedia_tv_tuner",
min_sdk_version: "",
srcs: [
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index a94230014437..647b55353257 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -1476,8 +1476,6 @@ static int register_android_media_MediaPlayer(JNIEnv *env)
return AndroidRuntime::registerNativeMethods(env,
"android/media/MediaPlayer", gMethods, NELEM(gMethods));
}
-extern int register_android_media_ImageReader(JNIEnv *env);
-extern int register_android_media_ImageWriter(JNIEnv *env);
extern int register_android_media_JetPlayer(JNIEnv *env);
extern int register_android_media_Crypto(JNIEnv *env);
extern int register_android_media_Drm(JNIEnv *env);
@@ -1490,7 +1488,6 @@ extern int register_android_media_MediaMetadataRetriever(JNIEnv *env);
extern int register_android_media_MediaMuxer(JNIEnv *env);
extern int register_android_media_MediaRecorder(JNIEnv *env);
extern int register_android_media_MediaSync(JNIEnv *env);
-extern int register_android_media_PublicFormatUtils(JNIEnv *env);
extern int register_android_media_ResampleInputStream(JNIEnv *env);
extern int register_android_media_MediaProfiles(JNIEnv *env);
extern int register_android_mtp_MtpDatabase(JNIEnv *env);
@@ -1508,16 +1505,6 @@ jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
}
assert(env != NULL);
- if (register_android_media_ImageWriter(env) != JNI_OK) {
- ALOGE("ERROR: ImageWriter native registration failed");
- goto bail;
- }
-
- if (register_android_media_ImageReader(env) < 0) {
- ALOGE("ERROR: ImageReader native registration failed");
- goto bail;
- }
-
if (register_android_media_JetPlayer(env) < 0) {
ALOGE("ERROR: JetPlayer native registration failed");
goto bail;
@@ -1538,11 +1525,6 @@ jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
goto bail;
}
- if (register_android_media_PublicFormatUtils(env) < 0) {
- ALOGE("ERROR: PublicFormatUtils native registration failed\n");
- goto bail;
- }
-
if (register_android_media_ResampleInputStream(env) < 0) {
ALOGE("ERROR: ResampleInputStream native registration failed\n");
goto bail;
diff --git a/nfc-non-updatable/OWNERS b/nfc-non-updatable/OWNERS
index f46dccd97974..47f209ffa9fa 100644
--- a/nfc-non-updatable/OWNERS
+++ b/nfc-non-updatable/OWNERS
@@ -1,2 +1,2 @@
# Bug component: 48448
-include platform/packages/apps/Nfc:/OWNERS \ No newline at end of file
+include platform/packages/modules/Nfc:/OWNERS \ No newline at end of file
diff --git a/nfc-non-updatable/java/android/nfc/cardemulation/ApduServiceInfo.java b/nfc-non-updatable/java/android/nfc/cardemulation/ApduServiceInfo.java
index e83b9f1afddb..d0de1fc14b0e 100644
--- a/nfc-non-updatable/java/android/nfc/cardemulation/ApduServiceInfo.java
+++ b/nfc-non-updatable/java/android/nfc/cardemulation/ApduServiceInfo.java
@@ -817,7 +817,7 @@ public final class ApduServiceInfo implements Parcelable {
if (!mOnHost && !autoTransact) {
return;
}
- mAutoTransact.put(pollingLoopFilter, autoTransact);
+ mAutoTransact.put(pollingLoopFilter.toUpperCase(Locale.ROOT), autoTransact);
}
/**
@@ -845,7 +845,8 @@ public final class ApduServiceInfo implements Parcelable {
if (!mOnHost && !autoTransact) {
return;
}
- mAutoTransactPatterns.put(Pattern.compile(pollingLoopPatternFilter), autoTransact);
+ mAutoTransactPatterns.put(Pattern.compile(
+ pollingLoopPatternFilter.toUpperCase(Locale.ROOT)), autoTransact);
}
/**
diff --git a/packages/CredentialManager/res/values-pl/strings.xml b/packages/CredentialManager/res/values-pl/strings.xml
index 651488776c22..86dd090dc7c1 100644
--- a/packages/CredentialManager/res/values-pl/strings.xml
+++ b/packages/CredentialManager/res/values-pl/strings.xml
@@ -42,7 +42,7 @@
<string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Utworzyć klucz dostępu do logowania w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="choose_create_option_password_title" msgid="4481366993598649224">"Zapisać hasło do logowania w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Zapisać dane używane do logowania w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <string name="passkey" msgid="632353688396759522">"klucz"</string>
+ <string name="passkey" msgid="632353688396759522">"klucz dostępu"</string>
<string name="password" msgid="6738570945182936667">"hasło"</string>
<string name="passkeys" msgid="5733880786866559847">"klucze dostępu"</string>
<string name="passwords" msgid="5419394230391253816">"hasła"</string>
@@ -61,7 +61,7 @@
<string name="more_options_usage_passwords" msgid="1632047277723187813">"Hasła: <xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g>"</string>
<string name="more_options_usage_passkeys" msgid="5390320437243042237">"Klucze dostępu: <xliff:g id="PASSKEYSNUMBER">%1$s</xliff:g>"</string>
<string name="more_options_usage_credentials" msgid="1785697001787193984">"Dane logowania: <xliff:g id="TOTALCREDENTIALSNUMBER">%1$s</xliff:g>"</string>
- <string name="passkey_before_subtitle" msgid="2448119456208647444">"Klucz"</string>
+ <string name="passkey_before_subtitle" msgid="2448119456208647444">"Klucz dostępu"</string>
<string name="another_device" msgid="5147276802037801217">"Inne urządzenie"</string>
<string name="other_password_manager" msgid="565790221427004141">"Inne menedżery haseł"</string>
<string name="close_sheet" msgid="1393792015338908262">"Zamknij arkusz"</string>
diff --git a/packages/InputDevices/res/raw/keyboard_layout_english_india.kcm b/packages/InputDevices/res/raw/keyboard_layout_english_india.kcm
new file mode 100644
index 000000000000..0059d0040be4
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_english_india.kcm
@@ -0,0 +1,400 @@
+# Copyright 2025 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# English (India) keyboard layout.
+#
+
+type OVERLAY
+
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+ label: '`'
+ base: '`'
+ shift: '~'
+ ralt: '\u0300'
+ ralt+shift: '\u0303'
+}
+
+key 1 {
+ label: '1'
+ base: '1'
+ shift: '!'
+}
+
+key 2 {
+ label: '2'
+ base: '2'
+ shift: '@'
+}
+
+key 3 {
+ label: '3'
+ base: '3'
+ shift: '#'
+}
+
+key 4 {
+ label: '4'
+ base: '4'
+ shift: '$'
+ ralt, ctrl+shift: '\u20b9'
+}
+
+key 5 {
+ label: '5'
+ base: '5'
+ shift: '%'
+}
+
+key 6 {
+ label: '6'
+ base: '6'
+ shift: '^'
+ ralt+shift: '\u0302'
+}
+
+key 7 {
+ label: '7'
+ base: '7'
+ shift: '&'
+}
+
+key 8 {
+ label: '8'
+ base: '8'
+ shift: '*'
+}
+
+key 9 {
+ label: '9'
+ base: '9'
+ shift: '('
+ ralt+shift: '\u0306'
+}
+
+key 0 {
+ label: '0'
+ base: '0'
+ shift: ')'
+}
+
+key MINUS {
+ label: '-'
+ base: '-'
+ shift: '_'
+ ralt+shift: '\u0331'
+}
+
+key EQUALS {
+ label: '='
+ base: '='
+ shift: '+'
+ ralt: '\u2013'
+ ralt+shift: '\u2014'
+}
+
+### ROW 2
+
+key Q {
+ label: 'Q'
+ base: 'q'
+ shift, capslock: 'Q'
+ capslock+shift: 'q'
+ ralt: '\u00e6'
+ ralt+shift, ralt+capslock: '\u00c6'
+ ralt+shift+capslock: '\u00e6'
+}
+
+key W {
+ label: 'W'
+ base: 'w'
+ shift, capslock: 'W'
+ capslock+shift: 'w'
+}
+
+key E {
+ label: 'E'
+ base: 'e'
+ shift, capslock: 'E'
+ capslock+shift: 'e'
+ ralt: '\u0113'
+ ralt+shift, ralt+capslock: '\u0112'
+ ralt+shift+capslock: '\u0113'
+}
+
+key R {
+ label: 'R'
+ base: 'r'
+ shift, capslock: 'R'
+ capslock+shift: 'r'
+}
+
+key T {
+ label: 'T'
+ base: 't'
+ shift, capslock: 'T'
+ capslock+shift: 't'
+ ralt: '\u1e6d'
+ ralt+shift, ralt+capslock: '\u1e6c'
+ ralt+shift+capslock: '\u1e6d'
+}
+
+key Y {
+ label: 'Y'
+ base: 'y'
+ shift, capslock: 'Y'
+ capslock+shift: 'y'
+ ralt: '\u00f1'
+ ralt+shift, ralt+capslock: '\u00d1'
+ ralt+shift+capslock: '\u00f1'
+}
+
+key U {
+ label: 'U'
+ base: 'u'
+ shift, capslock: 'U'
+ capslock+shift: 'u'
+ ralt: '\u016b'
+ ralt+shift, ralt+capslock: '\u016a'
+ ralt+shift+capslock: '\u016b'
+}
+
+key I {
+ label: 'I'
+ base: 'i'
+ shift, capslock: 'I'
+ capslock+shift: 'i'
+ ralt: '\u012b'
+ ralt+shift, ralt+capslock: '\u012a'
+ ralt+shift+capslock: '\u012b'
+}
+
+key O {
+ label: 'O'
+ base: 'o'
+ shift, capslock: 'O'
+ capslock+shift: 'o'
+ ralt: '\u014d'
+ ralt+shift, ralt+capslock: '\u014c'
+ ralt+shift+capslock: '\u014d'
+}
+
+key P {
+ label: 'P'
+ base: 'p'
+ shift, capslock: 'P'
+ capslock+shift: 'p'
+}
+
+key LEFT_BRACKET {
+ label: '['
+ base: '['
+ shift: '{'
+}
+
+key RIGHT_BRACKET {
+ label: ']'
+ base: ']'
+ shift: '}'
+}
+
+### ROW 3
+
+key A {
+ label: 'A'
+ base: 'a'
+ shift, capslock: 'A'
+ capslock+shift: 'a'
+ ralt: '\u0101'
+ ralt+shift, ralt+capslock: '\u0100'
+ ralt+shift+capslock: '\u0101'
+}
+
+key S {
+ label: 'S'
+ base: 's'
+ shift, capslock: 'S'
+ capslock+shift: 's'
+ ralt: '\u015b'
+ ralt+shift, ralt+capslock: '\u015a'
+ ralt+shift+capslock: '\u015b'
+}
+
+key D {
+ label: 'D'
+ base: 'd'
+ shift, capslock: 'D'
+ capslock+shift: 'd'
+ ralt: '\u1e0d'
+ ralt+shift, ralt+capslock: '\u1e0c'
+ ralt+shift+capslock: '\u1e0d'
+}
+
+key F {
+ label: 'F'
+ base: 'f'
+ shift, capslock: 'F'
+ capslock+shift: 'f'
+}
+
+key G {
+ label: 'G'
+ base: 'g'
+ shift, capslock: 'G'
+ capslock+shift: 'g'
+ ralt: '\u1e45'
+ ralt+shift, ralt+capslock: '\u1e44'
+ ralt+shift+capslock: '\u1e45'
+}
+
+key H {
+ label: 'H'
+ base: 'h'
+ shift, capslock: 'H'
+ capslock+shift: 'h'
+ ralt: '\u1e25'
+ ralt+shift, ralt+capslock: '\u1e24'
+ ralt+shift+capslock: '\u1e25'
+}
+
+key J {
+ label: 'J'
+ base: 'j'
+ shift, capslock: 'J'
+ capslock+shift: 'j'
+}
+
+key K {
+ label: 'K'
+ base: 'k'
+ shift, capslock: 'K'
+ capslock+shift: 'k'
+}
+
+key L {
+ label: 'L'
+ base: 'l'
+ shift, capslock: 'L'
+ capslock+shift: 'l'
+}
+
+key SEMICOLON {
+ label: ';'
+ base: ';'
+ shift: ':'
+}
+
+key APOSTROPHE {
+ label: '\''
+ base: '\''
+ shift: '\u0022'
+ ralt: '\u030d'
+ ralt+shift: '\u030e'
+}
+
+key BACKSLASH {
+ label: '\\'
+ base: '\\'
+ shift: '|'
+}
+
+### ROW 4
+
+key PLUS {
+ label: '\\'
+ base: '\\'
+ shift: '|'
+}
+
+key Z {
+ label: 'Z'
+ base: 'z'
+ shift, capslock: 'Z'
+ capslock+shift: 'z'
+}
+
+key X {
+ label: 'X'
+ base: 'x'
+ shift, capslock: 'X'
+ capslock+shift: 'x'
+ ralt: '\u1e63'
+ ralt+shift, ralt+capslock: '\u1e62'
+ ralt+shift+capslock: '\u1e63'
+}
+
+key C {
+ label: 'C'
+ base: 'c'
+ shift, capslock: 'C'
+ capslock+shift: 'c'
+}
+
+key V {
+ label: 'V'
+ base: 'v'
+ shift, capslock: 'V'
+ capslock+shift: 'v'
+}
+
+key B {
+ label: 'B'
+ base: 'b'
+ shift, capslock: 'B'
+ capslock+shift: 'b'
+}
+
+key N {
+ label: 'N'
+ base: 'n'
+ shift, capslock: 'N'
+ capslock+shift: 'n'
+ ralt: '\u1e47'
+ ralt+shift, ralt+capslock: '\u1e46'
+ ralt+shift+capslock: '\u1e47'
+}
+
+key M {
+ label: 'M'
+ base: 'm'
+ shift, capslock: 'M'
+ capslock+shift: 'm'
+ ralt: '\u1e41'
+ ralt+shift, ralt+capslock: '\u1e40'
+ ralt+shift+capslock: '\u1e41'
+}
+
+key COMMA {
+ label: ','
+ base: ','
+ shift: '<'
+ ralt+shift: '\u030C'
+}
+
+key PERIOD {
+ label: '.'
+ base: '.'
+ shift: '>'
+ ralt: '\u0323'
+}
+
+key SLASH {
+ label: '/'
+ base: '/'
+ shift: '?'
+}
diff --git a/packages/InputDevices/res/values/strings.xml b/packages/InputDevices/res/values/strings.xml
index bd7cdc481524..8a397a5e9d18 100644
--- a/packages/InputDevices/res/values/strings.xml
+++ b/packages/InputDevices/res/values/strings.xml
@@ -167,4 +167,7 @@
<!-- Romanian keyboard layout label. [CHAR LIMIT=35] -->
<string name="keyboard_layout_romanian">Romanian</string>
+
+ <!-- English (India) keyboard layout label. [CHAR LIMIT=35] -->
+ <string name="keyboard_layout_english_india">English (India)</string>
</resources>
diff --git a/packages/InputDevices/res/xml/keyboard_layouts.xml b/packages/InputDevices/res/xml/keyboard_layouts.xml
index 9ce9a87a1f9f..fa0ed13fb32c 100644
--- a/packages/InputDevices/res/xml/keyboard_layouts.xml
+++ b/packages/InputDevices/res/xml/keyboard_layouts.xml
@@ -367,4 +367,11 @@
android:keyboardLayout="@raw/keyboard_layout_romanian"
android:keyboardLocale="ro-Latn-RO"
android:keyboardLayoutType="qwerty" />
+
+ <keyboard-layout
+ android:name="keyboard_layout_english_india"
+ android:label="@string/keyboard_layout_english_india"
+ android:keyboardLayout="@raw/keyboard_layout_english_india"
+ android:keyboardLocale="en-Latn-IN"
+ android:keyboardLayoutType="qwerty" />
</keyboard-layouts>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/widget/PreviewPageFrame.java b/packages/PrintSpooler/src/com/android/printspooler/widget/PreviewPageFrame.java
index 95bdb093aafe..e735610a81ac 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/widget/PreviewPageFrame.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/widget/PreviewPageFrame.java
@@ -16,6 +16,8 @@
package com.android.printspooler.widget;
+import static android.view.accessibility.Flags.triStateChecked;
+
import android.content.Context;
import android.util.AttributeSet;
import android.view.accessibility.AccessibilityEvent;
@@ -38,6 +40,20 @@ public final class PreviewPageFrame extends LinearLayout {
}
@Override
+ public boolean performClick() {
+ final boolean result = super.performClick();
+ // This widget is incorrectly using the notion of "selection"
+ // to represent checked state. We can't send this event in
+ // setSelected() because setSelected() is called when this widget
+ // is not attached.
+ if (triStateChecked()) {
+ notifyViewAccessibilityStateChangedIfNeeded(
+ AccessibilityEvent.CONTENT_CHANGE_TYPE_CHECKED);
+ }
+ return result;
+ }
+
+ @Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
event.setChecked(isSelected());
@@ -48,6 +64,11 @@ public final class PreviewPageFrame extends LinearLayout {
super.onInitializeAccessibilityNodeInfo(info);
info.setSelected(false);
info.setCheckable(true);
- info.setChecked(isSelected());
+ if (triStateChecked()) {
+ info.setChecked(isSelected() ? AccessibilityNodeInfo.CHECKED_STATE_TRUE :
+ AccessibilityNodeInfo.CHECKED_STATE_FALSE);
+ } else {
+ info.setChecked(isSelected());
+ }
}
}
diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml
index e4eb72d0bf82..c4ba7eb03ae8 100644
--- a/packages/SettingsLib/res/values-af/arrays.xml
+++ b/packages/SettingsLib/res/values-af/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Slegs toestelskerm (verstek)"</item>
- <item msgid="9161645858025071955">"Eksterne skerm"</item>
- <item msgid="114384731934682483">"Fokusgebaseer"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Wys skakering net op toestelskerm"</item>
- <item msgid="7795034287069726554">"Wys skerm op enkele eksterne skerm"</item>
- <item msgid="5280431949814340475">"Wys toestel op laaste gefokusde skerm"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index f6364ffb9116..3a7e45209562 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Laai vinnig"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Beheer deur administrateur"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Beheer deur Beperkte Instellings"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Onbeskikbaar tydens oproepe"</string>
<string name="disabled" msgid="8017887509554714950">"Gedeaktiveer"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Toegelaat"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nie toegelaat nie"</string>
diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml
index 805f0d3c9189..a151f837a8a4 100644
--- a/packages/SettingsLib/res/values-am/arrays.xml
+++ b/packages/SettingsLib/res/values-am/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"የመሣሪያ ማሳያ ብቻ (ነባሪ)"</item>
- <item msgid="9161645858025071955">"ውጫዊ ማሳያ"</item>
- <item msgid="114384731934682483">"ትኩረት ላይ የተመሰረተ"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"በመሣሪያ ማሳያ ላይ ብቻ ጥላ አሳይ"</item>
- <item msgid="7795034287069726554">"መሣሪያን በአንድ ውጫዊ ማሳያ ላይ አሳይ"</item>
- <item msgid="5280431949814340475">"በመጨረሻ ትኩረት የተደረገበት ማሳያ ላይ መሣሪያን አሳይ"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index d374a9a10b3e..25e9c5e3b2a9 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ፈጣን መሙያ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"በአስተዳዳሪ ቁጥጥር የተደረገበት"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"በተገደበ ቅንብር ቁጥጥር የሚደረግበት"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"በጥሪዎች ጊዜ አይገኝም"</string>
<string name="disabled" msgid="8017887509554714950">"ቦዝኗል"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ይፈቀዳል"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"አይፈቀድም"</string>
diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml
index 3ff5dc642be8..ebdb0c70cd3f 100644
--- a/packages/SettingsLib/res/values-ar/arrays.xml
+++ b/packages/SettingsLib/res/values-ar/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"شاشة الجهاز فقط (الإعداد التلقائي)"</item>
- <item msgid="9161645858025071955">"الشاشة الخارجية"</item>
- <item msgid="114384731934682483">"على الشاشة التي يتم التركيز عليها"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"عرض الظل على شاشة الجهاز فقط"</item>
- <item msgid="7795034287069726554">"عرض الظل على شاشة خارجية واحدة"</item>
- <item msgid="5280431949814340475">"عرض الظل على آخر شاشة تم التركيز عليها"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 675a6a6077ba..8956c44ec09e 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -251,7 +251,7 @@
<string name="enable_adb_summary" msgid="3711526030096574316">"‏وضع تصحيح الأخطاء عند توصيل USB"</string>
<string name="clear_adb_keys" msgid="3010148733140369917">"‏إلغاء عمليات تفويض تصحيح أخطاء USB"</string>
<string name="enable_adb_wireless" msgid="6973226350963971018">"تصحيح الأخطاء اللاسلكي"</string>
- <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"‏وضع تصحيح الأخطاء عندما يتم الاتصال بشبكة Wi‑Fi"</string>
+ <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"‏بدء تصحيح الأخطاء عند الاتصال بشبكة Wi‑Fi"</string>
<string name="adb_wireless_error" msgid="721958772149779856">"خطأ"</string>
<string name="adb_wireless_settings" msgid="2295017847215680229">"تصحيح الأخطاء اللاسلكي"</string>
<string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"لعرض الأجهزة المتاحة واستخدامها، فعِّل ميزة \"تصحيح الأخطاء اللاسلكي\"."</string>
@@ -674,7 +674,7 @@
<string name="not_grant_admin" msgid="3557849576157702485">"لا أريد منح هذا المستخدم امتيازات المشرف."</string>
<string name="guest_exit_dialog_button" msgid="1736401897067442044">"خروج"</string>
<string name="guest_exit_dialog_title_non_ephemeral" msgid="7675327443743162986">"هل تريد حفظ النشاط في وضع الضيف؟"</string>
- <string name="guest_exit_dialog_message_non_ephemeral" msgid="223385323235719442">"يمكنك حفظ نشاط من الجلسة الحالية أو حذف كلّ التطبيقات والبيانات."</string>
+ <string name="guest_exit_dialog_message_non_ephemeral" msgid="223385323235719442">"يمكنك حفظ نشاطك من الجلسة الحالية أو حذف كلّ التطبيقات والبيانات."</string>
<string name="guest_exit_clear_data_button" msgid="3425812652180679014">"حذف"</string>
<string name="guest_exit_save_data_button" msgid="3690974510644963547">"حِفظ"</string>
<string name="guest_exit_button" msgid="5774985819191803960">"الخروج من وضع الضيف"</string>
diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml
index 4b5d5a07e120..451b47ab352f 100644
--- a/packages/SettingsLib/res/values-as/arrays.xml
+++ b/packages/SettingsLib/res/values-as/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"কেৱল ডিভাইচৰ ডিছপ্লে’ (ডিফ’ল্ট)"</item>
<item msgid="9161645858025071955">"বাহ্যিক ডিছপ্লে’"</item>
- <item msgid="114384731934682483">"ফ’কাছ-আধাৰিত"</item>
+ <item msgid="23651860565814477">"শেহতীয়া স্থিতি দণ্ড স্পৰ্শ"</item>
+ <item msgid="7521112827893653392">"ফ’কাছ-আধাৰিত"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"কেৱল ডিভাইচৰ ডিছপ্লে’তহে শ্বেড দেখুৱাওক"</item>
- <item msgid="7795034287069726554">"ডিভাইচটো এখনেই বাহ্যিক ডিছপ্লে’ত দেখুৱাওক"</item>
- <item msgid="5280431949814340475">"ডিভাইচটো অন্তিম ফ’কাছ কৰা ডিছপ্লে’ত দেখুৱাওক"</item>
+ <item msgid="1955398604822147783">"কেৱল এখনেই বাহ্যিক ডিছপ্লে’ত শ্বেড দেখুৱাওক"</item>
+ <item msgid="391477482416751568">"যিখন ডিছপ্লে’ই অন্তিমবাৰ ইয়াৰ স্থিতি দণ্ডৰ সৈতে ভাৱ-বিনিময় কৰিছে সেইখনত শ্বেড দেখুৱাওক"</item>
+ <item msgid="1746820128097981528">"অন্তিম ফ’কাছ কৰা ডিছপ্লে’ত শ্বেড দেখুৱাওক"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index c98d3dec33f1..bfacbb248c0e 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"দ্ৰুত চাৰ্জিং"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"এডমিনৰ দ্বাৰা নিয়ন্ত্ৰিত"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"প্ৰতিবন্ধিত ছেটিঙৰ দ্বাৰা নিয়ন্ত্ৰিত"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"কল চলি থকাৰ সময়ত উপলব্ধ নহয়"</string>
<string name="disabled" msgid="8017887509554714950">"নিষ্ক্ৰিয়"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"অনুমতি দিয়া হৈছে"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"অনুমতি দিয়া হোৱা নাই"</string>
diff --git a/packages/SettingsLib/res/values-az/arrays.xml b/packages/SettingsLib/res/values-az/arrays.xml
index 511e9701cd71..52cf498e00ab 100644
--- a/packages/SettingsLib/res/values-az/arrays.xml
+++ b/packages/SettingsLib/res/values-az/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Yalnız cihaz displeyi (defolt)"</item>
- <item msgid="9161645858025071955">"Xarici displey"</item>
- <item msgid="114384731934682483">"Fokus əsaslı"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Kölgəni yalnız cihaz displeyində göstərin"</item>
- <item msgid="7795034287069726554">"Cihazı bir xarici displeydə göstərin"</item>
- <item msgid="5280431949814340475">"Cihazı son fokuslanmış displeydə göstərin"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index db7d162b9ccd..9013fb5bc324 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Sürətli şarj"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Admin tərəfindən nəzarət olunur"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Məhdudlaşdırılmış Ayar ilə nəzarət edilir"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Zənglər zamanı əlçatan deyil"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktiv"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"İcazə verilib"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"İcazə verilməyib"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
index 452831453acf..3622808a3318 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Prikaz samo na uređaju (podrazumevano)"</item>
<item msgid="9161645858025071955">"Spoljni ekran"</item>
- <item msgid="114384731934682483">"Zasnovano na fokusu"</item>
+ <item msgid="23651860565814477">"Dodir na najnovijoj statusnoj traci"</item>
+ <item msgid="7521112827893653392">"Zasnovano na fokusu"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Prikaži senku samo na ekranu uređaja"</item>
- <item msgid="7795034287069726554">"Prikaži uređaj na jednom spoljnom ekranu"</item>
- <item msgid="5280431949814340475">"Prikaži uređaj na poslednjem ekranu u fokusu"</item>
+ <item msgid="1955398604822147783">"Prikaži senku na jednom spoljnom ekranu"</item>
+ <item msgid="391477482416751568">"Prikaži senku na ekranu sa kojim je statusna traka poslednji put bila u interakciji"</item>
+ <item msgid="1746820128097981528">"Prikaži senku na poslednjem ekranu u fokusu"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml
index 33393610fae2..48c362768a8f 100644
--- a/packages/SettingsLib/res/values-be/arrays.xml
+++ b/packages/SettingsLib/res/values-be/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Толькі дысплэй прылады (стандартна)"</item>
- <item msgid="9161645858025071955">"Знешні дысплэй"</item>
- <item msgid="114384731934682483">"У залежнасці ад выкарыстання"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Паказваць шчыток толькі на дысплэі прылады"</item>
- <item msgid="7795034287069726554">"Паказваць прыладу на адным знешнім дысплэі"</item>
- <item msgid="5280431949814340475">"Паказваць прыладу на дысплэі, які выкарыстоўваўся апошнім"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index eb6e0a559ce4..0ad8ac7502b0 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Ідзе хуткая зарадка"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Кантралюецца адміністратарам"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Пад кіраваннем Абмежаванага наладжвання"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Недаступна падчас выклікаў"</string>
<string name="disabled" msgid="8017887509554714950">"Адключанае"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Дазволена"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Забаронена"</string>
diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml
index c3bc26f30dbf..21dfa06644a3 100644
--- a/packages/SettingsLib/res/values-bg/arrays.xml
+++ b/packages/SettingsLib/res/values-bg/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Само на екрана на устройството (по подразбиране)"</item>
- <item msgid="9161645858025071955">"Външен екран"</item>
- <item msgid="114384731934682483">"Въз основа на фокуса"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Показване на падащия панел само на екрана на устройството"</item>
- <item msgid="7795034287069726554">"Показване на устройството на един външен екран"</item>
- <item msgid="5280431949814340475">"Показване на устройството на екрана, върху който последно е бил поставен фокусът"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index ede0a3a69a1a..8a87e57ffe93 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Зарежда се бързо"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролира се от администратор"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Управлява се чрез ограничена настройка"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Заето по време на обаждания"</string>
<string name="disabled" msgid="8017887509554714950">"Деактивирано"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Има разрешение"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Няма разрешение"</string>
diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml
index 6d5da27f3c36..b27264d5541b 100644
--- a/packages/SettingsLib/res/values-bn/arrays.xml
+++ b/packages/SettingsLib/res/values-bn/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"শুধুমাত্র ডিভাইসের ডিসপ্লে (ডিফল্ট)"</item>
- <item msgid="9161645858025071955">"এক্সটার্নাল ডিসপ্লে"</item>
- <item msgid="114384731934682483">"ফোকাস অনুযায়ী"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"শুধুমাত্র ডিভাইসের ডিসপ্লেতে শেড দেখুন"</item>
- <item msgid="7795034287069726554">"শেড একটি এক্সটার্নাল ডিসপ্লেতে দেখুন"</item>
- <item msgid="5280431949814340475">"ফোকাস করা শেষ ডিসপ্লেতে ডিভাইস দেখুন"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index ab9c34ac6f73..1e7c7a227b8e 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ফাস্ট চার্জিং"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"প্রশাসকের দ্বারা নিয়ন্ত্রিত"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"এটি বিধিনিষেধ সেটিং থেকে নিয়ন্ত্রণ করা হয়"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"কল চলাকালীন উপলভ্য হবে না"</string>
<string name="disabled" msgid="8017887509554714950">"অক্ষম হয়েছে"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"অনুমোদিত"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"অনুমোদিত নয়"</string>
diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml
index 625112ce873d..44bbfaf4d56e 100644
--- a/packages/SettingsLib/res/values-bs/arrays.xml
+++ b/packages/SettingsLib/res/values-bs/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Samo zaslon uređaja (zadano)"</item>
<item msgid="9161645858025071955">"Vanjski ekran"</item>
- <item msgid="114384731934682483">"Na osnovu fokusa"</item>
+ <item msgid="23651860565814477">"Najnoviji dodir trake statusa"</item>
+ <item msgid="7521112827893653392">"Na temelju fokusa"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Prikaži sjenu samo na ekranu uređaja"</item>
- <item msgid="7795034287069726554">"Prikaži uređaj na jednom vanjskom ekranu"</item>
- <item msgid="5280431949814340475">"Prikaži uređaj na posljednjem fokusiranom ekranu"</item>
+ <item msgid="1955398604822147783">"Prikaži sjenčanje na jednom vanjskom zaslonu"</item>
+ <item msgid="391477482416751568">"Prikaži sjenčanje na zaslonu na kojem je posljednje stupljeno u interakciju s trakom statusa"</item>
+ <item msgid="1746820128097981528">"Prikaži sjenčanje na posljednjem fokusiranom zaslonu"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 98e07b9e8749..756a3268ec98 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -482,7 +482,7 @@
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Zamjenjuje <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_charging_on_hold_settings_home_page" msgid="7690464049464805856">"<xliff:g id="LEVEL">%1$s</xliff:g> – punjenje je na čekanju radi zaštite baterije"</string>
- <string name="power_incompatible_charging_settings_home_page" msgid="1322050766135126880">"<xliff:g id="LEVEL">%1$s</xliff:g> – provjerite opremu za punjenje"</string>
+ <string name="power_incompatible_charging_settings_home_page" msgid="1322050766135126880">"<xliff:g id="LEVEL">%1$s</xliff:g> – provjerite dodatak za punjenje"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
<string name="power_discharging_duration" msgid="1076561255466053220">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string>
<string name="power_remaining_duration_only_enhanced" msgid="2527842780666073218">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g> na osnovu vaše potrošnje"</string>
@@ -523,7 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Brzo punjenje"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Pod kontrolom administratora"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolira ograničena postavka"</string>
- <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nije dostupno tijekom poziva"</string>
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nije dostupno tokom poziva"</string>
<string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dozvoljeno"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nije dozvoljeno"</string>
diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml
index e9b437e717d9..f19551c5194b 100644
--- a/packages/SettingsLib/res/values-ca/arrays.xml
+++ b/packages/SettingsLib/res/values-ca/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Només a la pantalla del dispositiu (opció predeterminada)"</item>
- <item msgid="9161645858025071955">"Pantalla externa"</item>
- <item msgid="114384731934682483">"Basat en l\'enfocament"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Mostra l\'ombra només a la pantalla del dispositiu"</item>
- <item msgid="7795034287069726554">"Mostra el dispositiu en una sola pantalla externa"</item>
- <item msgid="5280431949814340475">"Mostra el dispositiu a la darrera pantalla en què s\'hagi posat el focus"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index ef2920d2a28e..05480999b3e0 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Càrrega ràpida"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlat per l\'administrador"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlat per l\'opció de configuració restringida"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"No està disponible durant les trucades"</string>
<string name="disabled" msgid="8017887509554714950">"Desactivat"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Amb permís"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Sense permís"</string>
diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml
index 4bfdaf47ea9b..ad1cafd2dd2d 100644
--- a/packages/SettingsLib/res/values-cs/arrays.xml
+++ b/packages/SettingsLib/res/values-cs/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Pouze zobrazení zařízení (výchozí)"</item>
- <item msgid="9161645858025071955">"Externí displej"</item>
- <item msgid="114384731934682483">"Výběr"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Zobrazovat panel pouze na displeji zařízení"</item>
- <item msgid="7795034287069726554">"Zobrazovat panel na jednom externím displeji"</item>
- <item msgid="5280431949814340475">"Zobrazovat panel na naposledy vybraném displeji"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml
index 69497555fae7..ed457756abfa 100644
--- a/packages/SettingsLib/res/values-da/arrays.xml
+++ b/packages/SettingsLib/res/values-da/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Kun på enhedens skærm (standard)"</item>
- <item msgid="9161645858025071955">"Ekstern skærm"</item>
- <item msgid="114384731934682483">"Fokusbaseret"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Vis kun skygge på enhedens skærm"</item>
- <item msgid="7795034287069726554">"Vis enheden på en enkelt ekstern skærm"</item>
- <item msgid="5280431949814340475">"Vis enheden på den skærm, der sidst var i fokus"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 71c6be17eb94..d7aa9b1dd71a 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Lynopladning"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolleret af administratoren"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Styres af en begrænset indstilling"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Kan ikke bruges under opkald"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktiveret"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Tilladt"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Ikke tilladt"</string>
diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml
index adddd7706617..924718a37a4d 100644
--- a/packages/SettingsLib/res/values-de/arrays.xml
+++ b/packages/SettingsLib/res/values-de/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Nur Gerätedisplay (Standard)"</item>
- <item msgid="9161645858025071955">"Externes Display"</item>
- <item msgid="114384731934682483">"Fokusbasiert"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Leiste nur auf dem Display des Geräts anzeigen"</item>
- <item msgid="7795034287069726554">"Gerät auf einem einzigen externen Display anzeigen"</item>
- <item msgid="5280431949814340475">"Gerät auf zuletzt fokussiertem Display anzeigen"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 1955da0b80e0..73268c5aa6b2 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -56,7 +56,7 @@
<string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Authentifizierungsproblem"</string>
<string name="wifi_cant_connect" msgid="5718417542623056783">"Verbindung nicht möglich"</string>
<string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"Keine Verbindung zu \"<xliff:g id="AP_NAME">%1$s</xliff:g>\" möglich"</string>
- <string name="wifi_check_password_try_again" msgid="8817789642851605628">"Prüfe das Passwort und versuch es noch einmal"</string>
+ <string name="wifi_check_password_try_again" msgid="8817789642851605628">"Prüfe das Passwort und versuche es noch einmal"</string>
<string name="wifi_not_in_range" msgid="1541760821805777772">"Nicht in Reichweite"</string>
<string name="wifi_no_internet_no_reconnect" msgid="821591791066497347">"Kein automatischer Verbindungsaufbau"</string>
<string name="wifi_no_internet" msgid="1774198889176926299">"Kein Internetzugriff"</string>
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Schnelles Laden"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Durch den Administrator verwaltet"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Gesteuert durch eingeschränkte Einstellung"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Während Anrufen nicht verfügbar"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktiviert"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Zugelassen"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nicht zugelassen"</string>
diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml
index 9d7612ca8df1..41aefc097bcd 100644
--- a/packages/SettingsLib/res/values-el/arrays.xml
+++ b/packages/SettingsLib/res/values-el/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Μόνο οθόνη συσκευής (Προεπιλογή)"</item>
- <item msgid="9161645858025071955">"Εξωτερική οθόνη"</item>
- <item msgid="114384731934682483">"Με εστίαση"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Εμφάνιση σκίασης μόνο στην οθόνη συσκευής"</item>
- <item msgid="7795034287069726554">"Εμφάνιση συσκευής σε μία εξωτερική οθόνη"</item>
- <item msgid="5280431949814340475">"Εμφάνιση συσκευής στην τελευταία οθόνη με εστίαση"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 7f9f646b0eaf..209b7820b59a 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Γρήγορη φόρτιση"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Ελέγχονται από το διαχειριστή"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Ελέγχεται από τη Ρύθμιση με περιορισμό"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Μη διαθέσιμη κατά τη διάρκεια κλήσεων"</string>
<string name="disabled" msgid="8017887509554714950">"Απενεργοποιημένη"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Επιτρέπεται"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Δεν επιτρέπεται"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml
index 8c27ec6315c9..6c7a7ffb58ed 100644
--- a/packages/SettingsLib/res/values-en-rAU/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Device display only (default)"</item>
- <item msgid="9161645858025071955">"External display"</item>
- <item msgid="114384731934682483">"Focus-based"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Show shade on device display only"</item>
- <item msgid="7795034287069726554">"Show device on single external display"</item>
- <item msgid="5280431949814340475">"Show device on last focused display"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 58bb7d8b951a..d965c6522a9d 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Fast charging"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlled by restricted setting"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Unavailable during calls"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Not allowed"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/arrays.xml b/packages/SettingsLib/res/values-en-rCA/arrays.xml
index cfe77ca538bd..48f2f5a2c00f 100644
--- a/packages/SettingsLib/res/values-en-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rCA/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Device display only (Default)"</item>
<item msgid="9161645858025071955">"External display"</item>
- <item msgid="114384731934682483">"Focus-based"</item>
+ <item msgid="23651860565814477">"Latest status bar touch"</item>
+ <item msgid="7521112827893653392">"Focus-based"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Show shade on device display only"</item>
- <item msgid="7795034287069726554">"Show device on single external display"</item>
- <item msgid="5280431949814340475">"Show device on last focused display"</item>
+ <item msgid="1955398604822147783">"Show shade on single external display"</item>
+ <item msgid="391477482416751568">"Show shade on display which last had its status bar interacted with"</item>
+ <item msgid="1746820128097981528">"Show shade on last focused display"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml
index 8c27ec6315c9..6c7a7ffb58ed 100644
--- a/packages/SettingsLib/res/values-en-rGB/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Device display only (default)"</item>
- <item msgid="9161645858025071955">"External display"</item>
- <item msgid="114384731934682483">"Focus-based"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Show shade on device display only"</item>
- <item msgid="7795034287069726554">"Show device on single external display"</item>
- <item msgid="5280431949814340475">"Show device on last focused display"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 58bb7d8b951a..d965c6522a9d 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Fast charging"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlled by restricted setting"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Unavailable during calls"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Not allowed"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml
index 8c27ec6315c9..6c7a7ffb58ed 100644
--- a/packages/SettingsLib/res/values-en-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Device display only (default)"</item>
- <item msgid="9161645858025071955">"External display"</item>
- <item msgid="114384731934682483">"Focus-based"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Show shade on device display only"</item>
- <item msgid="7795034287069726554">"Show device on single external display"</item>
- <item msgid="5280431949814340475">"Show device on last focused display"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 58bb7d8b951a..d965c6522a9d 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Fast charging"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlled by restricted setting"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Unavailable during calls"</string>
<string name="disabled" msgid="8017887509554714950">"Disabled"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Not allowed"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml
index daf9ab98996d..5894975de1ba 100644
--- a/packages/SettingsLib/res/values-es-rUS/arrays.xml
+++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Solo en la pantalla del dispositivo (predeterminado)"</item>
- <item msgid="9161645858025071955">"Pantalla externa"</item>
- <item msgid="114384731934682483">"Basado en el enfoque"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Mostrar sobra solo en la pantalla del dispositivo"</item>
- <item msgid="7795034287069726554">"Mostrar dispositivo en una sola pantalla externa"</item>
- <item msgid="5280431949814340475">"Mostrar dispositivo en la última pantalla enfocada"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml
index a4bb49ee145a..1e8c6614280c 100644
--- a/packages/SettingsLib/res/values-es/arrays.xml
+++ b/packages/SettingsLib/res/values-es/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Solo en la pantalla del dispositivo (predeterminado)"</item>
- <item msgid="9161645858025071955">"Pantalla externa"</item>
- <item msgid="114384731934682483">"Basado en el enfoque"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Mostrar el panel solo en la pantalla del dispositivo"</item>
- <item msgid="7795034287069726554">"Mostrar el dispositivo en una sola pantalla externa"</item>
- <item msgid="5280431949814340475">"Mostrar el dispositivo en la última pantalla enfocada"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index b881994d911f..00b987c75602 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carga rápida"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlado por ajustes restringidos"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"No disponible durante las llamadas"</string>
<string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorizadas"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"No autorizadas"</string>
diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml
index 9a77991309a2..88b8b98cc3dc 100644
--- a/packages/SettingsLib/res/values-et/arrays.xml
+++ b/packages/SettingsLib/res/values-et/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Ainult seadme ekraan (vaikimisi)"</item>
<item msgid="9161645858025071955">"Väline ekraan"</item>
- <item msgid="114384731934682483">"Fookusepõhine"</item>
+ <item msgid="23651860565814477">"Viimane olekuriba puudutus"</item>
+ <item msgid="7521112827893653392">"Fookusepõhine"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Kuva menüü ainult seadme ekraanil"</item>
- <item msgid="7795034287069726554">"Kuva seade ühe välisel ekraanil"</item>
- <item msgid="5280431949814340475">"Kuva seade viimati esile tõstetud ekraanil"</item>
+ <item msgid="1955398604822147783">"Kuva menüü ühel välisel ekraanil"</item>
+ <item msgid="391477482416751568">"Kuva menüü ekraanil, mille olekuriba viimati kasutati"</item>
+ <item msgid="1746820128097981528">"Kuva menüü viimati esile tõstetud ekraanil"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml
index 3d59a279d3c0..a1528c2a1e7d 100644
--- a/packages/SettingsLib/res/values-eu/arrays.xml
+++ b/packages/SettingsLib/res/values-eu/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Gailuaren pantailan soilik (lehenetsia)"</item>
- <item msgid="9161645858025071955">"Kanpoko pantailan"</item>
- <item msgid="114384731934682483">"Fokuaren arabera"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Erakutsi itzalak gailuaren pantailan soilik"</item>
- <item msgid="7795034287069726554">"Erakutsi gailua kanpoko pantaila bakarrean"</item>
- <item msgid="5280431949814340475">"Erakutsi gailua fokuratutako azken pantailan"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index a5235cf5336a..1c422b656347 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Kargatze bizkorra"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Administratzaileak kontrolatzen du"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Ezarpen mugatuak kontrolatzen du"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Ez dago erabilgarri deiak egin bitartean"</string>
<string name="disabled" msgid="8017887509554714950">"Desgaituta"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Baimenduta"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Baimendu gabe"</string>
diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml
index 9e1da41e6edc..d7face8672af 100644
--- a/packages/SettingsLib/res/values-fa/arrays.xml
+++ b/packages/SettingsLib/res/values-fa/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"۲"</item>
<item msgid="4779928470672877922">"۳"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"فقط نمایشگر دستگاه (پیش‌فرض)"</item>
- <item msgid="9161645858025071955">"نمایشگر خارجی"</item>
- <item msgid="114384731934682483">"کانونی‌محور"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"نمایش سایه فقط در نمایشگر دستگاه"</item>
- <item msgid="7795034287069726554">"نمایش دستگاه در یک نمایشگر خارجی"</item>
- <item msgid="5280431949814340475">"نمایش دستگاه در آخرین نمایشگر کانونی‌شده"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"نمایشگر_پیش‌فرض"</item>
- <item msgid="774789415968826925">"هر_نمایشگر_خارجی"</item>
- <item msgid="7880769915418638436">"آخرین_لمس_نوار_وضعیت"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 6d5e42b976f5..b1f76fb5a787 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"درحال شارژ سریع"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"توسط سرپرست سیستم کنترل می‌شود"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"با تنظیم «حالت محدود» کنترل می‌شود"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"درطول تماس دردسترس نیست"</string>
<string name="disabled" msgid="8017887509554714950">"غیر فعال شد"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"مجاز بودن"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"مجاز نبودن"</string>
diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml
index 0c970ec5fbbd..a10dfbe7a2f9 100644
--- a/packages/SettingsLib/res/values-fi/arrays.xml
+++ b/packages/SettingsLib/res/values-fi/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Vain laitteen näyttö (oletus)"</item>
- <item msgid="9161645858025071955">"Ulkoinen näyttö"</item>
- <item msgid="114384731934682483">"Kohdistusperustainen"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Näytä ilmoitusalue vain laitteen näytöllä"</item>
- <item msgid="7795034287069726554">"Näytä laite yhdellä ulkoisella näytöllä"</item>
- <item msgid="5280431949814340475">"Näytä laite viimeksi kohdistetulla näytöllä"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 1e2db99f14d7..b59aa3019f67 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Nopea lataus"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Järjestelmänvalvoja hallinnoi tätä asetusta."</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Rajoitettujen asetusten mukaisesti"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Ei käytettävissä puhelujen aikana"</string>
<string name="disabled" msgid="8017887509554714950">"Pois päältä"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Sallittu"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Ei sallittu"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
index 6fc0ed9a1e3c..9eec65d3119c 100644
--- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Écran de l\'appareil seulement (par défaut)"</item>
- <item msgid="9161645858025071955">"Écran externe"</item>
- <item msgid="114384731934682483">"Affichage mis en évidence"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Afficher le volet sur l\'écran de l\'appareil seulement"</item>
- <item msgid="7795034287069726554">"Afficher l\'appareil sur un seul écran externe"</item>
- <item msgid="5280431949814340475">"Afficher l\'appareil sur le dernier affichage mis en évidence"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index f2a3454268c0..99ba8b0ba5df 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Recharge rapide"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Contrôlé par l\'administrateur"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Contrôlé par les paramètres restreints"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Indisponible pendant les appels"</string>
<string name="disabled" msgid="8017887509554714950">"Désactivée"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorisée"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Non autorisée"</string>
diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml
index 36eb52d66ef2..37875095b6dc 100644
--- a/packages/SettingsLib/res/values-fr/arrays.xml
+++ b/packages/SettingsLib/res/values-fr/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Écran de l\'appareil uniquement (par défaut)"</item>
- <item msgid="9161645858025071955">"Écran externe"</item>
- <item msgid="114384731934682483">"Basé sur la sélection"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Afficher le volet sur l\'écran de l\'appareil uniquement"</item>
- <item msgid="7795034287069726554">"Afficher l\'appareil sur un seul écran externe"</item>
- <item msgid="5280431949814340475">"Afficher l\'appareil sur le dernier écran avec lequel l\'utilisateur a interagi"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index a017fa74e658..ba77d87100c2 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Recharge rapide"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Contrôlé par l\'administrateur"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Contrôlé par les paramètres restreints"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Indisponible pendant les appels"</string>
<string name="disabled" msgid="8017887509554714950">"Désactivée"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorisé"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Non autorisé"</string>
diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml
index cd085fa65275..9307ba7e747a 100644
--- a/packages/SettingsLib/res/values-gl/arrays.xml
+++ b/packages/SettingsLib/res/values-gl/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Só pantalla do dispositivo (opción predeterminada)"</item>
- <item msgid="9161645858025071955">"Pantalla externa"</item>
- <item msgid="114384731934682483">"En función do enfoque"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Mostrar panel despregable só na pantalla do dispositivo"</item>
- <item msgid="7795034287069726554">"Mostrar dispositivo nunha única pantalla externa"</item>
- <item msgid="5280431949814340475">"Mostrar dispositivo na última pantalla enfocada"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"pantalla_predeterminada"</item>
- <item msgid="774789415968826925">"calquera_pantalla_externa"</item>
- <item msgid="7880769915418638436">"último_toque_barra_estado"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 6b2801938173..3d5a9bdfedae 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carga rápida"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Opción controlada polo administrador"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Baixo o control de opcións restrinxidas"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Non dispoñible durante as chamadas"</string>
<string name="disabled" msgid="8017887509554714950">"Desactivada"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permiso concedido"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Permiso non concedido"</string>
diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml
index 912df2d85988..6026663ba4df 100644
--- a/packages/SettingsLib/res/values-gu/arrays.xml
+++ b/packages/SettingsLib/res/values-gu/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"માત્ર ડિવાઇસનું ડિસ્પ્લે (ડિફૉલ્ટ)"</item>
- <item msgid="9161645858025071955">"બાહ્ય ડિસ્પ્લે"</item>
- <item msgid="114384731934682483">"ફોકસ-આધારિત"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"માત્ર ડિવાઇસના ડિસ્પ્લે પર શેડ બતાવો"</item>
- <item msgid="7795034287069726554">"માત્ર એક બાહ્ય ડિસ્પ્લે પર ડિવાઇસ બતાવો"</item>
- <item msgid="5280431949814340475">"છેલ્લે ફોકસ કરેલા ડિસ્પ્લે પર ડિવાઇસ બતાવો"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index fbf9afc0a8a4..57ecad80e7e9 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -107,7 +107,7 @@
<string name="tv_bluetooth_battery_level_untethered_right" msgid="8610019317279155595">"જમણી બાજુ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"સક્રિય"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"સાચવેલું"</string>
- <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"ચાલુ છે (માત્ર ડાબી બાજુ)"</string>
+ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"સક્રિય (માત્ર ડાબી બાજુ)"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"ચાલુ છે (માત્ર જમણી બાજુ)"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"ચાલુ છે (ડાબી અને જમણી બાજુ)"</string>
<string name="bluetooth_hearing_device_ambient_error" msgid="6035857289108813878">"આસપાસના અવાજો અપડેટ કરી શક્યા નથી"</string>
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ઝડપી ચાર્જિંગ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"વ્યવસ્થાપક દ્વારા નિયંત્રિત"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"પ્રતિબંધિત સેટિંગ દ્વારા નિયંત્રિત"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"કૉલ દરમિયાન અનુપલબ્ધ"</string>
<string name="disabled" msgid="8017887509554714950">"બંધ કરી"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"મંજૂરી છે"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"મંજૂરી નથી"</string>
diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml
index 25d638897f96..67de2aea289a 100644
--- a/packages/SettingsLib/res/values-hi/arrays.xml
+++ b/packages/SettingsLib/res/values-hi/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"सिर्फ़ डिवाइस का डिसप्ले (डिफ़ॉल्ट)"</item>
- <item msgid="9161645858025071955">"बाहरी डिसप्ले पर"</item>
- <item msgid="114384731934682483">"फ़ोकस के हिसाब से"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"सिर्फ़ डिवाइस के डिसप्ले पर शेड दिखाएं"</item>
- <item msgid="7795034287069726554">"शेड को बाहरी डिसप्ले पर दिखाएं"</item>
- <item msgid="5280431949814340475">"फ़ोकस किए गए पिछले डिसप्ले पर शेड दिखाएं"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index e883615477fe..c1f4fe25f4aa 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -107,7 +107,7 @@
<string name="tv_bluetooth_battery_level_untethered_right" msgid="8610019317279155595">"दाएं ईयरबड में <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> बैटरी बची है"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"चालू"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"सेव किया गया"</string>
- <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"सिर्फ़ बाईं तरफ़ वाला चालू है"</string>
+ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"सिर्फ़ बाईं ओर की मशीन चालू है"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"सिर्फ़ दाईं तरफ़ वाला चालू है"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"बाईं और दाईं तरफ़ वाला चालू है"</string>
<string name="bluetooth_hearing_device_ambient_error" msgid="6035857289108813878">"वॉल्यूम को मैनेज करने की सेटिंग नहीं बदली जा सकी"</string>
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"फ़ास्ट चार्जिंग"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"इसका नियंत्रण एडमिन के पास है"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"इसे पाबंदी मोड वाली सेटिंग से कंट्रोल किया जाता है"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"कॉल के दौरान उपलब्ध नहीं है"</string>
<string name="disabled" msgid="8017887509554714950">"बंद किया गया"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"अनुमति है"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"अनुमति नहीं है"</string>
diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml
index 639e39ec1410..d0ab9fd45fa7 100644
--- a/packages/SettingsLib/res/values-hr/arrays.xml
+++ b/packages/SettingsLib/res/values-hr/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Samo zaslon uređaja (zadano)"</item>
<item msgid="9161645858025071955">"Vanjski zaslon"</item>
- <item msgid="114384731934682483">"Na temelju fokusa"</item>
+ <item msgid="23651860565814477">"Najnoviji dodir trake statusa"</item>
+ <item msgid="7521112827893653392">"Na temelju fokusa"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Prikaži sjenu samo na zaslonu uređaja"</item>
- <item msgid="7795034287069726554">"Prikaži uređaj na jednom vanjskom zaslonu"</item>
- <item msgid="5280431949814340475">"Prikaži uređaj na posljednjem fokusiranom zaslonu"</item>
+ <item msgid="1955398604822147783">"Prikaži sjenčanje na jednom vanjskom zaslonu"</item>
+ <item msgid="391477482416751568">"Prikaži sjenčanje na zaslonu na kojem je posljednje stupljeno u interakciju s trakom statusa"</item>
+ <item msgid="1746820128097981528">"Prikaži sjenčanje na posljednjem fokusiranom zaslonu"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml
index d1319665bf0b..d8d42f952734 100644
--- a/packages/SettingsLib/res/values-hu/arrays.xml
+++ b/packages/SettingsLib/res/values-hu/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Csak az eszköz kijelzője (alapértelmezett)"</item>
- <item msgid="9161645858025071955">"Külső kijelző"</item>
- <item msgid="114384731934682483">"Fókusz alapján"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Felület megjelenítése csak az eszköz kijelzőjén"</item>
- <item msgid="7795034287069726554">"Felület megjelenítése egyetlen külső kijelzőn"</item>
- <item msgid="5280431949814340475">"Felület megjelenítése a legutóbb fókuszban lévő kijelzőn"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 6627cb140777..fa321555075f 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Gyors töltés…"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Rendszergazda által irányítva"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Korlátozott beállítás vezérli"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nem áll rendelkezésre hívások közben"</string>
<string name="disabled" msgid="8017887509554714950">"Letiltva"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Engedélyezett"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nem engedélyezett"</string>
diff --git a/packages/SettingsLib/res/values-hy/arrays.xml b/packages/SettingsLib/res/values-hy/arrays.xml
index 56545014e60f..b2133fbafb26 100644
--- a/packages/SettingsLib/res/values-hy/arrays.xml
+++ b/packages/SettingsLib/res/values-hy/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Միայն սարքի էկրանը (կանխադրված)"</item>
- <item msgid="9161645858025071955">"Արտաքին էկրան"</item>
- <item msgid="114384731934682483">"Ֆոկուսի հիման վրա"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Ցույց տալ երանգը միայն սարքի էկրանին"</item>
- <item msgid="7795034287069726554">"Ցույց տալ սարքը մեկ արտաքին էկրանին"</item>
- <item msgid="5280431949814340475">"Ցույց տալ սարքը վերջին ֆոկուսավորված էկրանին"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 2248b7bd59f0..fa87813cc122 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Արագ լիցքավորում"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Վերահսկվում է ադմինիստրատորի կողմից"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Կառավարվում է սահմանափակ ռեժիմի կարգավորումներով"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Զանգի ընթացքում հասանելի չէ"</string>
<string name="disabled" msgid="8017887509554714950">"Կասեցված է"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Թույլատրված է"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Արգելված"</string>
diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml
index c256e8cd72d0..fa2fa9e3d56c 100644
--- a/packages/SettingsLib/res/values-in/arrays.xml
+++ b/packages/SettingsLib/res/values-in/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Hanya layar perangkat (Default)"</item>
- <item msgid="9161645858025071955">"Layar eksternal"</item>
- <item msgid="114384731934682483">"Berbasis fokus"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Tampilkan shade hanya di layar perangkat"</item>
- <item msgid="7795034287069726554">"Tampilkan perangkat di satu layar eksternal"</item>
- <item msgid="5280431949814340475">"Tampilkan perangkat di layar yang terakhir difokuskan"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 5798f8d4931b..1ff4b29ddaa0 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Pengisian daya cepat"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Dikontrol oleh admin"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Dikontrol oleh Setelan Terbatas"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Tidak tersedia selama panggilan berlangsung"</string>
<string name="disabled" msgid="8017887509554714950">"Dinonaktifkan"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Diizinkan"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Tidak diizinkan"</string>
diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml
index 1d81344ba7b2..851a7a4929ea 100644
--- a/packages/SettingsLib/res/values-is/arrays.xml
+++ b/packages/SettingsLib/res/values-is/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Aðeins skjár tækis (sjálfgefið)"</item>
- <item msgid="9161645858025071955">"Ytri skjár"</item>
- <item msgid="114384731934682483">"Byggt á fókus"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Aðeins skyggja skjá tækis"</item>
- <item msgid="7795034287069726554">"Sýna tæki á einum ytri skjá"</item>
- <item msgid="5280431949814340475">"Sýna tæki á skjá sem var síðast í fókus"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index e8e49d072ef7..804ea6318400 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Hraðhleðsla"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Stjórnað af kerfisstjóra"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Stýrt af takmarkaði stillingu"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Ekki í boði á meðan á símtölum stendur"</string>
<string name="disabled" msgid="8017887509554714950">"Óvirkt"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Heimilað"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Ekki heimilað"</string>
diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml
index 331410cada30..48777a398b83 100644
--- a/packages/SettingsLib/res/values-it/arrays.xml
+++ b/packages/SettingsLib/res/values-it/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Solo display del dispositivo (impostazione predefinita)"</item>
<item msgid="9161645858025071955">"Display esterno"</item>
- <item msgid="114384731934682483">"In base alla selezione"</item>
+ <item msgid="23651860565814477">"Ultimo tocco alla barra di stato"</item>
+ <item msgid="7521112827893653392">"In base alla selezione"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Mostra l\'area delle notifiche solo sul display del dispositivo"</item>
- <item msgid="7795034287069726554">"Mostra il dispositivo su un singolo display esterno"</item>
- <item msgid="5280431949814340475">"Mostra il dispositivo sull\'ultimo display selezionato"</item>
+ <item msgid="1955398604822147783">"Mostra l\'area delle notifiche su un singolo display esterno"</item>
+ <item msgid="391477482416751568">"Mostra l\'area delle notifiche sul display in cui è avvenuta l\'ultima interazione con la barra di stato"</item>
+ <item msgid="1746820128097981528">"Mostra l\'area delle notifiche sull\'ultimo display selezionato"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index b2404cf7a305..09ec5ccaf23f 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -107,7 +107,7 @@
<string name="tv_bluetooth_battery_level_untethered_right" msgid="8610019317279155595">"Destra: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Attivo"</string>
<string name="bluetooth_saved_device" msgid="4895871321722311428">"Dispositivo salvato"</string>
- <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Attivo (solo sinistro)"</string>
+ <string name="bluetooth_hearing_aid_left_active" msgid="8330226430756799572">"Attiva (solo sinistra)"</string>
<string name="bluetooth_hearing_aid_right_active" msgid="2244728507170385397">"Attivo (solo destro)"</string>
<string name="bluetooth_hearing_aid_left_and_right_active" msgid="4294571497939983181">"Attivi (destro e sinistro)"</string>
<string name="bluetooth_hearing_device_ambient_error" msgid="6035857289108813878">"Impossibile aggiornare audio ambientale"</string>
@@ -505,8 +505,8 @@
<string name="power_charging_limited" msgid="4144004473976005214">"<xliff:g id="LEVEL">%1$s</xliff:g> - Ricarica in sospeso per proteggere la batteria"</string>
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> ‑ In carica"</string>
<string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Ricarica completa entro <xliff:g id="TIME">%3$s</xliff:g>"</string>
- <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Batteria completamente carica entro <xliff:g id="TIME">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Batteria completamente carica entro <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Batteria completamente carica entro: <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Batteria completamente carica entro: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Ricarica completa entro le ore <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Sconosciuta"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"In carica"</string>
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Ricarica rapida"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Gestita dall\'amministratore"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Gestita tramite impostazioni con restrizioni"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Non disponibile durante le chiamate"</string>
<string name="disabled" msgid="8017887509554714950">"Disattivato"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Autorizzazione concessa"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Autorizzazione non concessa"</string>
diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml
index 5c1845f6dca9..9d176c03cdfb 100644
--- a/packages/SettingsLib/res/values-iw/arrays.xml
+++ b/packages/SettingsLib/res/values-iw/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"מסך המכשיר בלבד (ברירת המחדל)"</item>
- <item msgid="9161645858025071955">"מסך חיצוני"</item>
- <item msgid="114384731934682483">"לפי התמקדות"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"הצגת הצללה במסך המכשיר בלבד"</item>
- <item msgid="7795034287069726554">"הצגת המכשיר במסך חיצוני אחד"</item>
- <item msgid="5280431949814340475">"הצגת ההתראות במסך האחרון שהשתמשת בו"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index b5201058a439..361dd1804e0b 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"טעינה מהירה"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"נמצא בשליטת מנהל מערכת"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"בשליטה של הגדרה מוגבלת"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"ההעדפה הזו לא זמינה במהלך שיחות"</string>
<string name="disabled" msgid="8017887509554714950">"מושבת"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"מורשה"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"לא מורשה"</string>
@@ -617,7 +616,7 @@
<string name="help_label" msgid="3528360748637781274">"עזרה ומשוב"</string>
<string name="storage_category" msgid="2287342585424631813">"אחסון"</string>
<string name="shared_data_title" msgid="1017034836800864953">"נתונים משותפים"</string>
- <string name="shared_data_summary" msgid="5516326713822885652">"הצגה ושינוי של נתונים משותפים"</string>
+ <string name="shared_data_summary" msgid="5516326713822885652">"צפייה בנתונים המשותפים ושינוי שלהם"</string>
<string name="shared_data_no_blobs_text" msgid="3108114670341737434">"אין נתונים משותפים למשתמש הזה."</string>
<string name="shared_data_query_failure_text" msgid="3489828881998773687">"אירעה שגיאה באחזור הנתונים המשותפים. צריך לנסות שוב."</string>
<string name="blob_id_text" msgid="8680078988996308061">"מזהה נתונים משותפים: <xliff:g id="BLOB_ID">%d</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml
index 9dc234b8758d..d5d5ff1330ef 100644
--- a/packages/SettingsLib/res/values-ja/arrays.xml
+++ b/packages/SettingsLib/res/values-ja/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"デバイスのディスプレイのみ(デフォルト)"</item>
<item msgid="9161645858025071955">"外部ディスプレイ"</item>
- <item msgid="114384731934682483">"フォーカスに基づく"</item>
+ <item msgid="23651860565814477">"ステータスバーの最新のタップ"</item>
+ <item msgid="7521112827893653392">"フォーカスに基づく"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"デバイスのディスプレイにのみシェードを表示する"</item>
- <item msgid="7795034287069726554">"1 台の外部ディスプレイにデバイスを表示する"</item>
- <item msgid="5280431949814340475">"最後にフォーカスされたディスプレイにデバイスを表示する"</item>
+ <item msgid="1955398604822147783">"1 台の外部ディスプレイにシェードを表示する"</item>
+ <item msgid="391477482416751568">"最後にステータスバーが操作されたディスプレイにシェードを表示する"</item>
+ <item msgid="1746820128097981528">"最後にフォーカスされたディスプレイにシェードを表示する"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 320c707a92a0..1170cd1db76a 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -123,7 +123,7 @@
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"有効(メディアのみ)、左のみ"</string>
<string name="bluetooth_hearing_aid_media_only_right_active" msgid="3854140683042617230">"有効(メディアのみ)、右のみ"</string>
<string name="bluetooth_hearing_aid_media_only_left_and_right_active" msgid="1299913413062528417">"有効(メディアのみ)、左右"</string>
- <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"メディアの音声"</string>
+ <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"メディアのオーディオ"</string>
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"電話"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"ファイル転送"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"入力デバイス"</string>
diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml
index 8d1adf653f97..8ee333835a06 100644
--- a/packages/SettingsLib/res/values-ka/arrays.xml
+++ b/packages/SettingsLib/res/values-ka/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"მხოლოდ მოწყობილობის ეკრანი (ნაგულისხმევი)"</item>
- <item msgid="9161645858025071955">"გარე ეკრანი"</item>
- <item msgid="114384731934682483">"ფოკუსის მიხედვით"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"ჩრდილის ჩვენება მხოლოდ მოწყობილობის ეკრანზე"</item>
- <item msgid="7795034287069726554">"ჩრდილის ჩვენება ერთ გარე ეკრანზე"</item>
- <item msgid="5280431949814340475">"მოწყობილობის ჩვენება ბოლო ფოკუსირებულ ეკრანზე"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml
index e8996de87cb0..6aa5f2b1c4e5 100644
--- a/packages/SettingsLib/res/values-kk/arrays.xml
+++ b/packages/SettingsLib/res/values-kk/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Тек құрылғы дисплейі (әдепкі)"</item>
- <item msgid="9161645858025071955">"Сыртқы дисплей"</item>
- <item msgid="114384731934682483">"Назарға негізделген"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Құрылғы дисплейінде ғана реңк көрсету"</item>
- <item msgid="7795034287069726554">"Жалғыз сыртқы дисплейі бар құрылғыны көрсету"</item>
- <item msgid="5280431949814340475">"Соңғы рет назарда болған дисплейдегі құрылғыны көрсету"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index ebb723ce87c2..9082a5665f92 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -506,7 +506,7 @@
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> – Зарядталып жатыр"</string>
<string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - Зарядталып болады: <xliff:g id="TIME">%3$s</xliff:g>"</string>
<string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - Толық заряд алуға қалған уақыт: <xliff:g id="TIME">%2$s</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Толық заряд алуға қалған уақыт: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"Толықтай зарядталып болады: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"Заряд толуына қалған уақыт: <xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Белгісіз"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"Зарядталуда"</string>
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Жылдам зарядтау"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Әкімші басқарады"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Шектелген параметрлер арқылы басқарылады."</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Қоңырау шалу кезінде қолжетімді емес."</string>
<string name="disabled" msgid="8017887509554714950">"Өшірілген"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Рұқсат берілген"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Рұқсат етілмеген"</string>
diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml
index ee6ee565fbae..e9a21e87312f 100644
--- a/packages/SettingsLib/res/values-km/arrays.xml
+++ b/packages/SettingsLib/res/values-km/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"ផ្ទាំងអេក្រង់ឧបករណ៍តែប៉ុណ្ណោះ (លំនាំដើម)"</item>
- <item msgid="9161645858025071955">"ផ្ទាំង​អេក្រង់​ខាង​ក្រៅ"</item>
- <item msgid="114384731934682483">"ផ្អែកលើការផ្ដោត"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"បង្ហាញផ្ទាំងនៅលើផ្ទាំងអេក្រង់ឧបករណ៍តែប៉ុណ្ណោះ"</item>
- <item msgid="7795034287069726554">"បង្ហាញឧបករណ៍នៅលើផ្ទាំងអេក្រង់ខាងក្រៅតែមួយ"</item>
- <item msgid="5280431949814340475">"បង្ហាញឧបករណ៍នៅលើផ្ទាំងអេក្រង់ដែលផ្ដោតចុងក្រោយ"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml
index 51e6e15a3e1b..dc9c7e096ab3 100644
--- a/packages/SettingsLib/res/values-kn/arrays.xml
+++ b/packages/SettingsLib/res/values-kn/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"ಸಾಧನದ ಡಿಸ್‌ಪ್ಲೇ ಮಾತ್ರ (ಡೀಫಾಲ್ಟ್)"</item>
- <item msgid="9161645858025071955">"ಬಾಹ್ಯ ಡಿಸ್‌ಪ್ಲೇ"</item>
- <item msgid="114384731934682483">"ಫೋಕಸ್-ಆಧಾರಿತ"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"ಸಾಧನದ ಡಿಸ್‌ಪ್ಲೇನಲ್ಲಿ ಮಾತ್ರ ಶೇಡ್ ತೋರಿಸಿ"</item>
- <item msgid="7795034287069726554">"ಒಂದೇ ಬಾಹ್ಯ ಡಿಸ್‌ಪ್ಲೇನಲ್ಲಿ ಸಾಧನವನ್ನು ತೋರಿಸಿ"</item>
- <item msgid="5280431949814340475">"ಕೊನೆಯ ಕೇಂದ್ರೀಕೃತ ಡಿಸ್‌ಪ್ಲೇನಲ್ಲಿ ಸಾಧನವನ್ನು ತೋರಿಸಿ"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index b0b6fcac6cf9..d2b217683d41 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ಫಾಸ್ಟ್ ಚಾರ್ಜಿಂಗ್"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ನಿರ್ವಾಹಕರ ಮೂಲಕ ನಿಯಂತ್ರಿಸಲಾಗಿದೆ"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ನಿರ್ಬಂಧಿಸಲಾದ ಸೆಟ್ಟಿಂಗ್ ಮೂಲಕ ನಿಯಂತ್ರಿಸಲಾಗುತ್ತದೆ"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"ಕರೆಗಳ ಸಮಯದಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="disabled" msgid="8017887509554714950">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ಅನುಮತಿಸಲಾಗಿದೆ"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ಅನುಮತಿ ಇಲ್ಲ"</string>
diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml
index dd1121f55c04..1477497197c0 100644
--- a/packages/SettingsLib/res/values-ko/arrays.xml
+++ b/packages/SettingsLib/res/values-ko/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"기기 디스플레이만(기본값)"</item>
- <item msgid="9161645858025071955">"외부 디스플레이"</item>
- <item msgid="114384731934682483">"포커스 기반"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"기기 디스플레이에만 음영 표시"</item>
- <item msgid="7795034287069726554">"단일 외부 디스플레이에 기기 표시"</item>
- <item msgid="5280431949814340475">"마지막으로 포커스된 디스플레이에 기기 표시"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 9a2af376bdc6..bece63792ecb 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"급속 충전"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"관리자가 제어"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"제한된 설정으로 제어됨"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"통화 중에는 사용할 수 없습니다."</string>
<string name="disabled" msgid="8017887509554714950">"사용 안함"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"허용됨"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"허용되지 않음"</string>
diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml
index fe44fe066e46..54d9ecd5fbae 100644
--- a/packages/SettingsLib/res/values-ky/arrays.xml
+++ b/packages/SettingsLib/res/values-ky/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Түзмөктүн экраны гана (демейки)"</item>
- <item msgid="9161645858025071955">"Тышкы экран"</item>
- <item msgid="114384731934682483">"Focus-based"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Көлөкөнү түзмөктүн экранында гана көрсөтүү"</item>
- <item msgid="7795034287069726554">"Түзмөктү бир тышкы экранда көрсөтүү"</item>
- <item msgid="5280431949814340475">"Түзмөктү акыркы активдүү экранда көрсөтүү"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index a756d57b1e96..b6baf38df4d3 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Ыкчам кубаттоо"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Администратор тарабынан көзөмөлдөнөт"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Чектелген параметр аркылуу көзөмөлдөнөт"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Сүйлөшүп жаткан учурда жеткиликсиз"</string>
<string name="disabled" msgid="8017887509554714950">"Өчүрүлгөн"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Уруксат берилген"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Тыюу салынган"</string>
diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml
index d9da45b40f99..ccf645b2d77c 100644
--- a/packages/SettingsLib/res/values-lo/arrays.xml
+++ b/packages/SettingsLib/res/values-lo/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"ຈໍສະແດງຜົນຂອງອຸປະກອນເທົ່ານັ້ນ (ຄ່າເລີ່ມຕົ້ນ)"</item>
- <item msgid="9161645858025071955">"ຈໍສະແດງຜົນພາຍນອກ"</item>
- <item msgid="114384731934682483">"ອີງຕາມການໂຟກັສ"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"ສະແດງເສດສີໃນຈໍສະແດງຜົນຂອງອຸປະກອນເທົ່ານັ້ນ"</item>
- <item msgid="7795034287069726554">"ສະແດງອຸປະກອນໃນຈໍສະແດງຜົນພາຍນອກເຄື່ອງດຽວ"</item>
- <item msgid="5280431949814340475">"ສະແດງອຸປະກອນໃນຈໍສະແດງຜົນທີ່ໂຟກັສຫຼ້າສຸດ"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml
index 6129af9b5a15..1f40b1a6ed9b 100644
--- a/packages/SettingsLib/res/values-lt/arrays.xml
+++ b/packages/SettingsLib/res/values-lt/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Tik įrenginio ekranas (numatytasis nustatymas)"</item>
<item msgid="9161645858025071955">"Išorinis ekranas"</item>
- <item msgid="114384731934682483">"Pagal fokusavimą"</item>
+ <item msgid="23651860565814477">"Naujausias būsenos juostos palietimas"</item>
+ <item msgid="7521112827893653392">"Pagal fokusavimą"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Rodyti šešėlį tik įrenginio ekrane"</item>
- <item msgid="7795034287069726554">"Rodyti įrenginį viename išoriniame ekrane"</item>
- <item msgid="5280431949814340475">"Rodyti įrenginį paskutiniame fokusuotame ekrane"</item>
+ <item msgid="1955398604822147783">"Rodyti šešėlį viename išoriniame ekrane"</item>
+ <item msgid="391477482416751568">"Rodyti šešėlį ekrane, kuriame paskutinį kartą buvo sąveikaujama su būsenos juosta"</item>
+ <item msgid="1746820128097981528">"Rodyti šešėlį paskutiniame fokusuotame ekrane"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index caa5b18855a8..f81caa830ddd 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Spartusis įkrovimas"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Valdo administratorius"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Valdoma pagal apribotą nustatymą"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nepasiekiama per skambučius"</string>
<string name="disabled" msgid="8017887509554714950">"Neleidžiama"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Leidžiama"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Neleidžiama"</string>
diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml
index 92d141e1723b..6d293be28a4e 100644
--- a/packages/SettingsLib/res/values-lv/arrays.xml
+++ b/packages/SettingsLib/res/values-lv/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Tikai ierīces displejs (noklusējums)"</item>
- <item msgid="9161645858025071955">"Ārējais displejs"</item>
- <item msgid="114384731934682483">"Saskaņā ar fokusu"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Rādīt ēnu tikai ierīces displejā"</item>
- <item msgid="7795034287069726554">"Rādīt ierīci vienā ārējā displejā"</item>
- <item msgid="5280431949814340475">"Rādīt ierīci pēdējā fokusētajā displejā"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 84bf6929ca03..987857b9a6bd 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Ātrā uzlāde"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolē administrators"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolē ierobežots iestatījums"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Ierīce nav pieejama zvanu laikā"</string>
<string name="disabled" msgid="8017887509554714950">"Atspējots"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Atļauts"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nav atļauts"</string>
diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml
index 8e9bb21ff520..0490f2822c5f 100644
--- a/packages/SettingsLib/res/values-mk/arrays.xml
+++ b/packages/SettingsLib/res/values-mk/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Само на екранот на уредот (стандардно)"</item>
- <item msgid="9161645858025071955">"Надворешен екран"</item>
- <item msgid="114384731934682483">"Засновано на фокус"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Прикажувај сенка само на екранот на уредот"</item>
- <item msgid="7795034287069726554">"Прикажувај сенка на еден надворешен екран"</item>
- <item msgid="5280431949814340475">"Прикажувај сенка на последниот фокусиран екран"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"стандарден_екран"</item>
- <item msgid="774789415968826925">"кој_било_надворешен_екран"</item>
- <item msgid="7880769915418638436">"последен_допир_на_статусната_лента"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index a06da85e0041..fa654379f7ee 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Се полни брзо"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролирано од администраторот"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Контролирано со ограничени поставки"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Недостапно при повици"</string>
<string name="disabled" msgid="8017887509554714950">"Оневозможено"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Со дозвола"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Без дозвола"</string>
diff --git a/packages/SettingsLib/res/values-ml/arrays.xml b/packages/SettingsLib/res/values-ml/arrays.xml
index 4b8dbce2a523..811c03d5ddcc 100644
--- a/packages/SettingsLib/res/values-ml/arrays.xml
+++ b/packages/SettingsLib/res/values-ml/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"ഉപകരണ ഡിസ്പ്ലേ മാത്രം (ഡിഫോൾട്ട്)"</item>
<item msgid="9161645858025071955">"ബാഹ്യ ഡിസ്പ്ലേ"</item>
- <item msgid="114384731934682483">"ഫോക്കസ്-അടിസ്ഥാനമാക്കിയുള്ളത്"</item>
+ <item msgid="23651860565814477">"ഏറ്റവും പുതിയ സ്റ്റാറ്റസ് ബാർ ടച്ച്"</item>
+ <item msgid="7521112827893653392">"ഫോക്കസ്-അടിസ്ഥാനമാക്കിയുള്ളത്"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"ഉപകരണ ഡിസ്പ്ലേയിൽ മാത്രം ഷെയ്‌ഡ് കാണിക്കുക"</item>
- <item msgid="7795034287069726554">"ഒരൊറ്റ ബാഹ്യ ഡിസ്പ്ലേയിൽ ഉപകരണം കാണിക്കുക"</item>
- <item msgid="5280431949814340475">"അവസാനം ഫോക്കസ് ചെയ്ത ഡിസ്പ്ലേയിൽ ഉപകരണം കാണിക്കുക"</item>
+ <item msgid="1955398604822147783">"ഒരൊറ്റ ബാഹ്യ ഡിസ്പ്ലേയിൽ ഷെയ്‌ഡ് കാണിക്കുക"</item>
+ <item msgid="391477482416751568">"അവസാനം അതിന്റെ സ്റ്റാറ്റസ് ബാർ ഇടപഴകിയ ഡിസ്പ്ലേയിൽ ഷെയ്‌ഡ് കാണിക്കുക"</item>
+ <item msgid="1746820128097981528">"അവസാനം ഫോക്കസ് ചെയ്ത ഡിസ്പ്ലേയിൽ ഷേഡ് കാണിക്കുക"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml
index 5d5b8f9af59c..ca103afc9bbc 100644
--- a/packages/SettingsLib/res/values-mn/arrays.xml
+++ b/packages/SettingsLib/res/values-mn/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Зөвхөн төхөөрөмжийн дэлгэц (өгөгдмөл)"</item>
- <item msgid="9161645858025071955">"Гаднын дэлгэц"</item>
- <item msgid="114384731934682483">"Төвлөрөлд тулгуурласан"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Зөвхөн төхөөрөмж дээрх дэлгэцэд сүүдрийг харуулах"</item>
- <item msgid="7795034287069726554">"Зөвхөн гаднын нэг дэлгэц дээр төхөөрөмжийг харуулах"</item>
- <item msgid="5280431949814340475">"Сүүлд төвлөрсөн дэлгэц дээр төхөөрөмжийг харуулах"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index c165213214da..e8e9e0caf08a 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Шуурхай цэнэглэх"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Админ удирдсан"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Хязгаарлагдсан тохиргоогоор хянадаг"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Дуудлагын үер боломжгүй"</string>
<string name="disabled" msgid="8017887509554714950">"Идэвхгүйжүүлсэн"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Зөвшөөрсөн"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Зөвшөөрөөгүй"</string>
diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml
index 959499c931f3..1437a2cd8660 100644
--- a/packages/SettingsLib/res/values-mr/arrays.xml
+++ b/packages/SettingsLib/res/values-mr/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"फक्त डिव्हाइस डिस्प्ले (डीफॉल्ट)"</item>
- <item msgid="9161645858025071955">"बाह्य डिस्प्ले"</item>
- <item msgid="114384731934682483">"फोकसवर आधारित"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"फक्त डिव्हाइस डिस्प्लेवर शेड दाखवा"</item>
- <item msgid="7795034287069726554">"एकल बाह्य डिस्प्लेवर डिव्हाइस दाखवा"</item>
- <item msgid="5280431949814340475">"शेवटच्या फोकस केलेल्या डिस्प्लेवर डिव्हाइस दाखवा"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index d47f8ffd3c99..f1f5cab8d6a7 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"फास्ट चार्जिंग"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"प्रशासकाने नियंत्रित केलेले"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"प्रतिबंधित केलेल्या सेटिंग द्वारे नियंत्रित"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"कॉल दरम्‍यान उपलब्ध नाही"</string>
<string name="disabled" msgid="8017887509554714950">"अक्षम"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"अनुमती आहे"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"अनुमती नाही"</string>
diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml
index 7b6cbe17b5d0..464a0c73c734 100644
--- a/packages/SettingsLib/res/values-ms/arrays.xml
+++ b/packages/SettingsLib/res/values-ms/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Paparan peranti sahaja (Lalai)"</item>
<item msgid="9161645858025071955">"Paparan luaran"</item>
- <item msgid="114384731934682483">"Berasaskan fokus"</item>
+ <item msgid="23651860565814477">"Sentuhan bar status terbaharu"</item>
+ <item msgid="7521112827893653392">"Berasaskan fokus"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Tunjukkan rona warna pada paparan peranti sahaja"</item>
- <item msgid="7795034287069726554">"Tunjukkan peranti pada satu paparan luaran"</item>
- <item msgid="5280431949814340475">"Tunjukkan peranti pada paparan terakhir yang difokuskan"</item>
+ <item msgid="1955398604822147783">"Tunjukkan rona warna pada satu paparan luaran"</item>
+ <item msgid="391477482416751568">"Tunjukkan rona warna pada paparan yang terakhir berinteraksi dengan bar status"</item>
+ <item msgid="1746820128097981528">"Tunjukkan rona warna pada paparan fokus terakhir"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml
index 71a1c7c5649b..aef22b2203de 100644
--- a/packages/SettingsLib/res/values-my/arrays.xml
+++ b/packages/SettingsLib/res/values-my/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"စက်ဖန်သားပြင် သီးသန့် (မူရင်း)"</item>
- <item msgid="9161645858025071955">"ပြင်ပဖန်သားပြင်"</item>
- <item msgid="114384731934682483">"ပြသမှုအခြေပြု"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"စက်ဖန်သားပြင်တွင်သာ အရိပ်ပြပါ"</item>
- <item msgid="7795034287069726554">"ပြင်ပဖန်သားပြင်တစ်ခုတွင် စက်ကိုပြပါ"</item>
- <item msgid="5280431949814340475">"နောက်ဆုံးပြသထားသော ဖန်သားပြင်တွင် စက်ကိုပြပါ"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"မူရင်းဖန်သားပြင်"</item>
- <item msgid="774789415968826925">"မည်သည့်ပြင်ပဖန်သားပြင်မဆို"</item>
- <item msgid="7880769915418638436">"အခြေအနေပြဘား နောက်ဆုံးထိတွေ့မှု"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 4ba82fdd8a1d..cf493cf40a9c 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"အမြန်အားသွင်းခြင်း"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"စီမံခန့်ခွဲသူမှ ထိန်းချုပ်ပါသည်"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ကန့်သတ်ဆက်တင်ဖြင့် ထိန်းချုပ်ထားသည်"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"ဖုန်းခေါ်ဆိုနေချိန်တွင် မရနိုင်ပါ"</string>
<string name="disabled" msgid="8017887509554714950">"ပိတ်ထားပြီး"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ခွင့်ပြုထားသည်"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ခွင့်မပြုပါ"</string>
diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml
index 8d52693a5f16..88f193c119fc 100644
--- a/packages/SettingsLib/res/values-nb/arrays.xml
+++ b/packages/SettingsLib/res/values-nb/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Bare enhetsskjermen (standard)"</item>
- <item msgid="9161645858025071955">"Ekstern skjerm"</item>
- <item msgid="114384731934682483">"Fokusbasert"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Vis skyggen bare på enhetsskjermen"</item>
- <item msgid="7795034287069726554">"Vis enheten på én ekstern skjerm"</item>
- <item msgid="5280431949814340475">"Vis enheten på den sist fokuserte skjermen"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"Standardskjerm"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index f6de3466a816..045318a765b7 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Hurtiglading"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrollert av administratoren"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrollert av en begrenset innstilling"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Utilgjengelig under samtaler"</string>
<string name="disabled" msgid="8017887509554714950">"Deaktivert"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Tillatt"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Ikke tillatt"</string>
diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml
index cd8448f684dd..1989994a289c 100644
--- a/packages/SettingsLib/res/values-ne/arrays.xml
+++ b/packages/SettingsLib/res/values-ne/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"२"</item>
<item msgid="4779928470672877922">"३"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"डिभाइसको डिस्प्ले मात्र (डिफल्ट)"</item>
- <item msgid="9161645858025071955">"बाह्य डिस्प्ले"</item>
- <item msgid="114384731934682483">"फोकसमा आधारित"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"यो सेड डिभाइसकै डिस्प्लेमा मात्र देखाउनुहोस्"</item>
- <item msgid="7795034287069726554">"यो डिभाइस एकल बाह्य डिस्प्लेमा देखाउनुहोस्"</item>
- <item msgid="5280431949814340475">"यो डिभाइस पछिल्लो पटक फोकस गरिएको डिस्प्लेमा देखाउनुहोस्"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 28d02a14c484..d637a4bb9640 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -262,7 +262,7 @@
<string name="adb_paired_devices_title" msgid="5268997341526217362">"कनेक्ट गरिएका डिभाइस"</string>
<string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"हाल जोडिएको छ"</string>
<string name="adb_wireless_device_details_title" msgid="7129369670526565786">"डिभाइसको विवरण"</string>
- <string name="adb_device_forget" msgid="193072400783068417">"बिर्सनुहोस्"</string>
+ <string name="adb_device_forget" msgid="193072400783068417">"हटाउनुहोस्"</string>
<string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"डिभाइसको फिंगरप्रिन्ट: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string>
<string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"वायरलेसमा जोड्न सकिएन"</string>
<string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> सही नेटवर्कमा जोडिएको कुरा सुनिश्चित गर्नुहोस्"</string>
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"फास्ट चार्जिङ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"प्रशासकद्वारा नियन्त्रित"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"प्रतिबन्धित सेटिङले नियन्त्रण गरेको"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"कल चलिरहेका बेला उपलब्ध छैन"</string>
<string name="disabled" msgid="8017887509554714950">"असक्षम पारियो"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"अनुमति छ"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"अनुमति छैन"</string>
diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml
index d92b806acf49..12c9551d850f 100644
--- a/packages/SettingsLib/res/values-nl/arrays.xml
+++ b/packages/SettingsLib/res/values-nl/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Alleen apparaatscherm (standaard)"</item>
- <item msgid="9161645858025071955">"Extern scherm"</item>
- <item msgid="114384731934682483">"Op focus gebaseerd"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Alleen paneel tonen op apparaatscherm"</item>
- <item msgid="7795034287069726554">"Apparaat tonen op één extern scherm"</item>
- <item msgid="5280431949814340475">"Apparaat tonen op laatste gefocuste scherm"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-or/arrays.xml b/packages/SettingsLib/res/values-or/arrays.xml
index f9beb8afd4d0..97823036d96a 100644
--- a/packages/SettingsLib/res/values-or/arrays.xml
+++ b/packages/SettingsLib/res/values-or/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"କେବଳ ଡିଭାଇସ ଡିସପ୍ଲେ (ଡିଫଲ୍ଟ)"</item>
- <item msgid="9161645858025071955">"ଏକ୍ସଟର୍ନଲ ଡିସପ୍ଲେ"</item>
- <item msgid="114384731934682483">"ଫୋକସ-ଆଧାରିତ"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"କେବଳ ଡିଭାଇସରେ ଡିସପ୍ଲେ ସେଡ ଦେଖାନ୍ତୁ"</item>
- <item msgid="7795034287069726554">"ସିଙ୍ଗଲ ଏକ୍ସଟର୍ନଲ ଡିସପ୍ଲେରେ ଡିଭାଇସ ଦେଖାନ୍ତୁ"</item>
- <item msgid="5280431949814340475">"ଫୋକସ କରାଯାଇଥିବା ଗତ ଡିସପ୍ଲେରେ ଡିଭାଇସ ଦେଖାନ୍ତୁ"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 69d57a6803d0..bcde4e9bb831 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -129,7 +129,7 @@
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"ଇନପୁଟ ଡିଭାଇସ"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"ଇଣ୍ଟରନେଟ ଆକ୍ସେସ"</string>
<string name="bluetooth_profile_pbap" msgid="2103406516858653017">"କଣ୍ଟାକ୍ଟ ଓ କଲ ଇତିହାସକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
- <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"ସୂଚନାକୁ କଲ ଘୋଷଣା ଏବଂ ଆହୁରି ଅଧିକ ପାଇଁ ବ୍ୟବହାର କରାଯିବ"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"ସୂଚନାକୁ କଲ ଘୋଷଣା ଏବଂ ଆହୁରି ଅନେକ କିଛି ପାଇଁ ବ୍ୟବହାର କରାଯିବ"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"ଇଣ୍ଟର୍‌ନେଟ୍‌ ସଂଯୋଗ ଶେୟାରିଙ୍ଗ"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"ଟେକ୍ସଟ୍ ମେସେଜ୍"</string>
<string name="bluetooth_profile_sap" msgid="8304170950447934386">"SIM ଆକ୍ସେସ"</string>
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ଫାଷ୍ଟ ଚାର୍ଜିଂ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ଆଡ୍‌ମିନ୍‌ ଦ୍ୱାରା ନିୟନ୍ତ୍ରିତ"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ପ୍ରତିବନ୍ଧିତ ସେଟିଂ ଦ୍ୱାରା ନିୟନ୍ତ୍ରଣ କରାଯାଇଛି"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"କଲ କରିବାବେଳେ ଉପଲବ୍ଧ ନଥାଏ"</string>
<string name="disabled" msgid="8017887509554714950">"ଅକ୍ଷମ ହୋଇଛି"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ଅନୁମତି ଦିଆଯାଇଛି"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ଅନୁମତି ନାହିଁ"</string>
diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml
index 1e7f05512d33..afb85cae2d1e 100644
--- a/packages/SettingsLib/res/values-pa/arrays.xml
+++ b/packages/SettingsLib/res/values-pa/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"ਸਿਰਫ਼ ਡੀਵਾਈਸ ਦੀ ਡਿਸਪਲੇ (ਪੂਰਵ-ਨਿਰਧਾਰਿਤ)"</item>
- <item msgid="9161645858025071955">"ਬਾਹਰੀ ਡਿਸਪਲੇ"</item>
- <item msgid="114384731934682483">"ਫੋਕਸ-ਆਧਾਰਿਤ"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"ਸਿਰਫ਼ ਡੀਵਾਈਸ ਦੀ ਡਿਸਪਲੇ \'ਤੇ ਸ਼ੇਡ ਦਿਖਾਓ"</item>
- <item msgid="7795034287069726554">"ਇਕਹਿਰੀ ਬਾਹਰੀ ਡਿਸਪਲੇ \'ਤੇ ਡੀਵਾਈਸ ਦਿਖਾਓ"</item>
- <item msgid="5280431949814340475">"ਫੋਕਸ ਕੀਤੀ ਗਈ ਪਿਛਲੀ ਡਿਸਪਲੇ \'ਤੇ ਡੀਵਾਈਸ ਦਿਖਾਓ"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index e12c2c01e6ae..821c84e20901 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -128,7 +128,7 @@
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"ਇਨਪੁੱਟ ਡੀਵਾਈਸ"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ"</string>
- <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"ਸੰਪਰਕਾਂ ਅਤੇ ਕਾਲ ਇਤਿਹਾਸ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+ <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"ਸੰਪਰਕਾਂ ਅਤੇ ਕਾਲ ਇਤਿਹਾਸ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
<string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"ਜਾਣਕਾਰੀ ਦੀ ਵਰਤੋਂ ਕਾਲ ਘੋਸ਼ਣਾਵਾਂ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਲਈ ਕੀਤੀ ਜਾਵੇਗੀ"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਸਾਂਝਾਕਰਨ"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"ਲਿਖਤ ਸੁਨੇਹੇ"</string>
diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml
index a9892b3688c8..59791c0e70b6 100644
--- a/packages/SettingsLib/res/values-pl/arrays.xml
+++ b/packages/SettingsLib/res/values-pl/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Tylko wyświetlanie na urządzeniu (domyślnie)"</item>
- <item msgid="9161645858025071955">"Wyświetlacz zewnętrzny"</item>
- <item msgid="114384731934682483">"Na podstawie zaznaczenia"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Pokaż cień tylko na wyświetlaczu urządzenia"</item>
- <item msgid="7795034287069726554">"Pokaż urządzenie na pojedynczym wyświetlaczu zewnętrznym"</item>
- <item msgid="5280431949814340475">"Pokaż urządzenie na ostatnim aktywnym wyświetlaczu"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 9fc2765ba59c..9f6eb4c6a7c7 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Szybkie ładowanie"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolowane przez administratora"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Obowiązują ustawienia z ograniczonym dostępem"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Niedostępne w trakcie połączeń"</string>
<string name="disabled" msgid="8017887509554714950">"Wyłączona"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dozwolone"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Niedozwolone"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
index 35aa3b0834c3..2e61272269a0 100644
--- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Somente a tela do dispositivo (padrão)"</item>
<item msgid="9161645858025071955">"Tela externa"</item>
- <item msgid="114384731934682483">"Com base no foco"</item>
+ <item msgid="23651860565814477">"Toque mais recente na barra de status"</item>
+ <item msgid="7521112827893653392">"Com base no foco"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Mostrar sombra apenas na tela do dispositivo"</item>
- <item msgid="7795034287069726554">"Mostrar o dispositivo em uma única tela externa"</item>
- <item msgid="5280431949814340475">"Mostrar o dispositivo na última tela focada"</item>
+ <item msgid="1955398604822147783">"Mostrar sombra em uma única tela externa"</item>
+ <item msgid="391477482416751568">"Mostrar sombra na tela que teve a última interação na barra de status"</item>
+ <item msgid="1746820128097981528">"Mostrar sombra na última tela focada"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 1e45965df421..72f25be8e66f 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -123,13 +123,13 @@
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Ativo (apenas mídia), apenas esquerdo"</string>
<string name="bluetooth_hearing_aid_media_only_right_active" msgid="3854140683042617230">"Ativo (apenas mídia), somente direito"</string>
<string name="bluetooth_hearing_aid_media_only_left_and_right_active" msgid="1299913413062528417">"Ativo (apenas mídia), esquerdo e direito"</string>
- <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Áudio da mídia"</string>
+ <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Áudio de mídia"</string>
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"Chamadas telefônicas"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferência de arquivo"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Dispositivo de entrada"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Acesso à Internet"</string>
<string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Permitir acesso a contatos e ao histórico de ligações"</string>
- <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"As informações serão usadas para fazer o anúncio de ligações e mais"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"As informações serão usadas para avisar sobre ligações e mais"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Compartilhamento de conexão à Internet"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"Mensagens de texto"</string>
<string name="bluetooth_profile_sap" msgid="8304170950447934386">"Acesso ao chip"</string>
@@ -515,7 +515,7 @@
<string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Carregando sem fio"</string>
<string name="battery_info_status_charging_dock" msgid="8573274094093364791">"Carregando"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Não está carregando"</string>
- <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Conectado, mas não está carregando"</string>
+ <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Dispositivo conectado, mas não está carregando"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Carregada"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Carga completa"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Carregamento suspenso"</string>
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carregamento rápido"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada pelo admin"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlada pelas configurações restritas"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Indisponível durante ligações"</string>
<string name="disabled" msgid="8017887509554714950">"Desativado"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permitido"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Não permitido"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
index 2829f20722f7..64fad64ff9c4 100644
--- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Apenas no ecrã do dispositivo (predefinição)"</item>
<item msgid="9161645858025071955">"Ecrã externo"</item>
- <item msgid="114384731934682483">"Com base no foco"</item>
+ <item msgid="23651860565814477">"Toque mais recente na barra de estado"</item>
+ <item msgid="7521112827893653392">"Com base no foco"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Mostrar a sombra apenas no ecrã do dispositivo"</item>
- <item msgid="7795034287069726554">"Mostrar o dispositivo num único ecrã externo"</item>
- <item msgid="5280431949814340475">"Apresente o dispositivo no último ecrã focado"</item>
+ <item msgid="1955398604822147783">"Mostrar a sombra num único ecrã externo"</item>
+ <item msgid="391477482416751568">"Mostrar a sombra no ecrã em que ocorreu a última interação com a barra de estado"</item>
+ <item msgid="1746820128097981528">"Mostrar a sombra no último ecrã focado"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml
index 35aa3b0834c3..2e61272269a0 100644
--- a/packages/SettingsLib/res/values-pt/arrays.xml
+++ b/packages/SettingsLib/res/values-pt/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Somente a tela do dispositivo (padrão)"</item>
<item msgid="9161645858025071955">"Tela externa"</item>
- <item msgid="114384731934682483">"Com base no foco"</item>
+ <item msgid="23651860565814477">"Toque mais recente na barra de status"</item>
+ <item msgid="7521112827893653392">"Com base no foco"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Mostrar sombra apenas na tela do dispositivo"</item>
- <item msgid="7795034287069726554">"Mostrar o dispositivo em uma única tela externa"</item>
- <item msgid="5280431949814340475">"Mostrar o dispositivo na última tela focada"</item>
+ <item msgid="1955398604822147783">"Mostrar sombra em uma única tela externa"</item>
+ <item msgid="391477482416751568">"Mostrar sombra na tela que teve a última interação na barra de status"</item>
+ <item msgid="1746820128097981528">"Mostrar sombra na última tela focada"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 1e45965df421..72f25be8e66f 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -123,13 +123,13 @@
<string name="bluetooth_hearing_aid_media_only_left_active" msgid="1632152540901488645">"Ativo (apenas mídia), apenas esquerdo"</string>
<string name="bluetooth_hearing_aid_media_only_right_active" msgid="3854140683042617230">"Ativo (apenas mídia), somente direito"</string>
<string name="bluetooth_hearing_aid_media_only_left_and_right_active" msgid="1299913413062528417">"Ativo (apenas mídia), esquerdo e direito"</string>
- <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Áudio da mídia"</string>
+ <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Áudio de mídia"</string>
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"Chamadas telefônicas"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferência de arquivo"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Dispositivo de entrada"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Acesso à Internet"</string>
<string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Permitir acesso a contatos e ao histórico de ligações"</string>
- <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"As informações serão usadas para fazer o anúncio de ligações e mais"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"As informações serão usadas para avisar sobre ligações e mais"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Compartilhamento de conexão à Internet"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"Mensagens de texto"</string>
<string name="bluetooth_profile_sap" msgid="8304170950447934386">"Acesso ao chip"</string>
@@ -515,7 +515,7 @@
<string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Carregando sem fio"</string>
<string name="battery_info_status_charging_dock" msgid="8573274094093364791">"Carregando"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"Não está carregando"</string>
- <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Conectado, mas não está carregando"</string>
+ <string name="battery_info_status_not_charging" msgid="1103084691314264664">"Dispositivo conectado, mas não está carregando"</string>
<string name="battery_info_status_full" msgid="1339002294876531312">"Carregada"</string>
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Carga completa"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Carregamento suspenso"</string>
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carregamento rápido"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada pelo admin"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlada pelas configurações restritas"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Indisponível durante ligações"</string>
<string name="disabled" msgid="8017887509554714950">"Desativado"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permitido"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Não permitido"</string>
diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml
index dba734c588aa..8bfeb70d0fe4 100644
--- a/packages/SettingsLib/res/values-ro/arrays.xml
+++ b/packages/SettingsLib/res/values-ro/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Numai pe ecranul dispozitivului (prestabilit)"</item>
- <item msgid="9161645858025071955">"Ecran extern"</item>
- <item msgid="114384731934682483">"În funcție de focalizare"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Afișează umbra doar pe ecranul dispozitivului"</item>
- <item msgid="7795034287069726554">"Afișează dispozitivul pe un singur ecran extern"</item>
- <item msgid="5280431949814340475">"Afișează dispozitivul pe ultimul ecran focalizat"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index af09734842c1..26fdce813a04 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Încărcare rapidă"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlată de administrator"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlată de setarea restricționată"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Indisponibil în timpul apelurilor"</string>
<string name="disabled" msgid="8017887509554714950">"Dezactivată"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Permise"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nepermise"</string>
diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml
index f0782eb04b7e..52b2549dd60e 100644
--- a/packages/SettingsLib/res/values-ru/arrays.xml
+++ b/packages/SettingsLib/res/values-ru/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Только экран устройства (по умолчанию)"</item>
- <item msgid="9161645858025071955">"Внешний дисплей"</item>
- <item msgid="114384731934682483">"Активный дисплей"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Показывать тень только на экране устройства"</item>
- <item msgid="7795034287069726554">"Показывать устройство на одном внешнем дисплее"</item>
- <item msgid="5280431949814340475">"Показывать устройство на последнем активном дисплее"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml
index 855bbc9842a8..66f1ba757a68 100644
--- a/packages/SettingsLib/res/values-si/arrays.xml
+++ b/packages/SettingsLib/res/values-si/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"උපාංග සංදර්ශකය පමණි (පෙරනිමි)"</item>
- <item msgid="9161645858025071955">"බාහිර සංදර්ශකය"</item>
- <item msgid="114384731934682483">"නාභිගත කිරීම-පාදක"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"උපාංග සංදර්ශකයේ පමණක් සෙවන පෙන්වන්න"</item>
- <item msgid="7795034287069726554">"උපාංගය තනි බාහිර සංදර්ශකයක පෙන්වන්න"</item>
- <item msgid="5280431949814340475">"අවසන් වරට නාභිගත කළ සංදර්ශකයේ උපාංගය පෙන්වන්න"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 1b02d28e8685..94e1ed429de6 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"වේගවත් ආරෝපණය"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"පරිපාලක විසින් පාලනය කරන ලදී"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"සීමා කළ සැකසීම මගින් පාලනය වේ"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"ඇමතුම් අතරතුර නොපවතී"</string>
<string name="disabled" msgid="8017887509554714950">"අබල කර ඇත"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ඉඩ දුන්"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ඉඩ නොදෙන"</string>
diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml
index 3473e282e59c..f8363cdfc447 100644
--- a/packages/SettingsLib/res/values-sk/arrays.xml
+++ b/packages/SettingsLib/res/values-sk/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Iba obrazovka zariadenia (predvolené)"</item>
- <item msgid="9161645858025071955">"Externá obrazovka"</item>
- <item msgid="114384731934682483">"Na základe označenia"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Zobraziť panel iba na obrazovke zariadenia"</item>
- <item msgid="7795034287069726554">"Zobraziť zariadenie na jednej externej obrazovke"</item>
- <item msgid="5280431949814340475">"Zobraziť zariadenie na poslednej označenej obrazovke"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml
index c3bf79c34ea6..2a128efde3bc 100644
--- a/packages/SettingsLib/res/values-sl/arrays.xml
+++ b/packages/SettingsLib/res/values-sl/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Prikaz samo v napravi (privzeto)"</item>
- <item msgid="9161645858025071955">"Zunanji zaslon"</item>
- <item msgid="114384731934682483">"Na podlagi fokusa"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Prikaz podokna samo na zaslonu naprave"</item>
- <item msgid="7795034287069726554">"Prikaz naprave na enem zunanjem zaslonu"</item>
- <item msgid="5280431949814340475">"Prikaz naprave na zadnjem zaslonu s fokusom"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml
index 7136bf75eaee..3b0994a7d93f 100644
--- a/packages/SettingsLib/res/values-sq/arrays.xml
+++ b/packages/SettingsLib/res/values-sq/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Vetëm ekrani i pajisjes (parazgjedhja)"</item>
- <item msgid="9161645858025071955">"Ekrani i jashtëm"</item>
- <item msgid="114384731934682483">"Bazuar te fokusi"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Shfaq hijen vetëm në ekranin e pajisjes"</item>
- <item msgid="7795034287069726554">"Shfaq pajisjen në një ekran të vetëm të jashtëm"</item>
- <item msgid="5280431949814340475">"Shfaq pajisjen në ekranin e fundit të fokusuar"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index e98046ea9a8b..2d2c02b31df3 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Karikim i shpejtë"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolluar nga administratori"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrollohet nga \"Cilësimet e kufizuara\""</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nuk ofrohet gjatë telefonatave"</string>
<string name="disabled" msgid="8017887509554714950">"Çaktivizuar"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Lejohet"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Nuk lejohet"</string>
diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml
index 84d0a7e055c1..fd23a64b98f6 100644
--- a/packages/SettingsLib/res/values-sr/arrays.xml
+++ b/packages/SettingsLib/res/values-sr/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Приказ само на уређају (подразумевано)"</item>
<item msgid="9161645858025071955">"Спољни екран"</item>
- <item msgid="114384731934682483">"Засновано на фокусу"</item>
+ <item msgid="23651860565814477">"Додир на најновијој статусној траци"</item>
+ <item msgid="7521112827893653392">"Засновано на фокусу"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Прикажи сенку само на екрану уређаја"</item>
- <item msgid="7795034287069726554">"Прикажи уређај на једном спољном екрану"</item>
- <item msgid="5280431949814340475">"Прикажи уређај на последњем екрану у фокусу"</item>
+ <item msgid="1955398604822147783">"Прикажи сенку на једном спољном екрану"</item>
+ <item msgid="391477482416751568">"Прикажи сенку на екрану са којим је статусна трака последњи пут била у интеракцији"</item>
+ <item msgid="1746820128097981528">"Прикажи сенку на последњем екрану у фокусу"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml
index b5ae7ddf7a31..8a77fdd11742 100644
--- a/packages/SettingsLib/res/values-sv/arrays.xml
+++ b/packages/SettingsLib/res/values-sv/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Endast enhetens skärm (standard)"</item>
<item msgid="9161645858025071955">"Extern skärm"</item>
- <item msgid="114384731934682483">"Fokusbaserad"</item>
+ <item msgid="23651860565814477">"Senaste interaktion med statusfältet"</item>
+ <item msgid="7521112827893653392">"Fokusbaserad"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Visa endast skugga på enhetens skärm"</item>
- <item msgid="7795034287069726554">"Visa skugga på en enda extern skärm"</item>
- <item msgid="5280431949814340475">"Visa enheten på skärmen som sist var i fokus"</item>
+ <item msgid="1955398604822147783">"Visa skugga på en enda extern skärm"</item>
+ <item msgid="391477482416751568">"Visa skugga på skärmen där statusfältet senast interagerades med"</item>
+ <item msgid="1746820128097981528">"Visa skugga på skärmen som sist var i fokus"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 4f8ea1e03219..e0897cb87e54 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Snabbladdning"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Strys av administratören"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Styrs av spärrad inställning"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Ej tillgänglig under samtal"</string>
<string name="disabled" msgid="8017887509554714950">"Inaktiverad"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Tillåts"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Tillåts inte"</string>
diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml
index 145b56c354cf..652c3588d694 100644
--- a/packages/SettingsLib/res/values-sw/arrays.xml
+++ b/packages/SettingsLib/res/values-sw/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Kwenye skrini ya kifaa pekee (Chaguomsingi)"</item>
- <item msgid="9161645858025071955">"Skrini ya nje"</item>
- <item msgid="114384731934682483">"Inayoangaziwa"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Onyesha kiwango kwenye skrini ya kifaa pekee"</item>
- <item msgid="7795034287069726554">"Onyesha kifaa kwenye skrini moja ya nje"</item>
- <item msgid="5280431949814340475">"Onyesha kifaa kwenye skrini ya mwisho iliyoangaziwa"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 2b175f5939a6..f12597f640a5 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Inachaji kwa kasi"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Imedhibitiwa na msimamizi"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Imedhibitiwa na Mpangilio wenye Mipaka"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Haipatikani wakati unaongea kwa simu"</string>
<string name="disabled" msgid="8017887509554714950">"Imezimwa"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Imeruhusiwa"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Hairuhusiwi"</string>
diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml
index 68812894386b..503cd8f97046 100644
--- a/packages/SettingsLib/res/values-ta/arrays.xml
+++ b/packages/SettingsLib/res/values-ta/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"சாதனக் காட்சி மட்டும் (இயல்பு)"</item>
- <item msgid="9161645858025071955">"வெளிப்புறக் காட்சி"</item>
- <item msgid="114384731934682483">"ஃபோகஸ் அடிப்படையிலானது"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"சாதனக் காட்சியில் மட்டும் ஷேடைக் காட்டும்"</item>
- <item msgid="7795034287069726554">"ஒற்றை வெளிப்புறக் காட்சியில் சாதனத்தைக் காட்டும்"</item>
- <item msgid="5280431949814340475">"கடைசியாக ஃபோகஸ் செய்யப்பட்ட காட்சியில் சாதனத்தைக் காட்டும்"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index dd5a5a4b7d8f..1bd2c3419860 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"விரைவு சார்ஜிங்"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"நிர்வாகி கட்டுப்படுத்துகிறார்"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"வரையறுக்கப்பட்ட அமைப்பால் கட்டுப்படுத்தப்படுகிறது"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"அழைப்புகளின்போது பயன்படுத்த முடியாது"</string>
<string name="disabled" msgid="8017887509554714950">"முடக்கப்பட்டது"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"அனுமதிக்கப்பட்டது"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"அனுமதிக்கப்படவில்லை"</string>
diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml
index 8dea6ed2d013..f72e4cd9f9fe 100644
--- a/packages/SettingsLib/res/values-te/arrays.xml
+++ b/packages/SettingsLib/res/values-te/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"పరికర డిస్‌ప్లేలో మాత్రమే (ఆటోమేటిక్ సెట్టింగ్)"</item>
- <item msgid="9161645858025071955">"ఎక్స్‌టర్నల్ డిస్‌ప్లే"</item>
- <item msgid="114384731934682483">"ఫోకస్-ఆధారిత"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"షేడ్‌ను పరికర డిస్‌ప్లేలో మాత్రమే చూపండి"</item>
- <item msgid="7795034287069726554">"పరికరాన్ని ఒక ఎక్స్‌టర్నల్ డిస్‌ప్లేలో మాత్రమే చూపండి"</item>
- <item msgid="5280431949814340475">"పరికరాన్ని చివరగా యాక్టివ్‌గా ఉన్న స్క్రీన్‌లో చూపండి"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 12e45c2b824d..010344f2e103 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ఫాస్ట్ ఛార్జింగ్"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"నిర్వాహకుని ద్వారా నియంత్రించబడింది"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"పరిమితం చేసిన సెట్టింగ్ ద్వారా నియంత్రించబడుతుంది"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"కాల్స్ సమయంలో అందుబాటులో ఉండదు"</string>
<string name="disabled" msgid="8017887509554714950">"డిజేబుల్ చేయబడింది"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"అనుమతించినవి"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"అనుమతించబడలేదు"</string>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index 11cb2ec4e161..adb274d26f9c 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"จอแสดงผลของอุปกรณ์เท่านั้น (ค่าเริ่มต้น)"</item>
- <item msgid="9161645858025071955">"จอแสดงผลภายนอก"</item>
- <item msgid="114384731934682483">"Focus-based"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"แสดงเฉดสีในจอแสดงผลของอุปกรณ์เท่านั้น"</item>
- <item msgid="7795034287069726554">"แสดงอุปกรณ์ในจอแสดงผลภายนอกเครื่องเดียว"</item>
- <item msgid="5280431949814340475">"แสดงอุปกรณ์ในจอแสดงผลที่โฟกัสล่าสุด"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml
index eae269cc4972..0153375a5c2c 100644
--- a/packages/SettingsLib/res/values-tl/arrays.xml
+++ b/packages/SettingsLib/res/values-tl/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Display ng device lang (Default)"</item>
- <item msgid="9161645858025071955">"External na display"</item>
- <item msgid="114384731934682483">"Focus-based"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Ipakita ang shade sa display ng device lang"</item>
- <item msgid="7795034287069726554">"Ipakita ang device sa isang external na display"</item>
- <item msgid="5280431949814340475">"Ipakita ang device sa huling na-focus na display"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml
index fdb9d217e611..6fbbb129b56b 100644
--- a/packages/SettingsLib/res/values-tr/arrays.xml
+++ b/packages/SettingsLib/res/values-tr/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Yalnızca cihaz ekranı (Varsayılan)"</item>
- <item msgid="9161645858025071955">"Harici ekran"</item>
- <item msgid="114384731934682483">"Odaklanmaya dayalı"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Gölgeyi yalnızca cihaz ekranında göster"</item>
- <item msgid="7795034287069726554">"Cihazı tek bir harici ekranda göster"</item>
- <item msgid="5280431949814340475">"Cihazı son odaklanılan ekranda göster"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 8dcc48f556fd..c99322324a66 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Hızlı şarj"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Yönetici tarafından denetleniyor"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kısıtlanmış ayar tarafından kontrol ediliyor"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Telefon aramaları sırasında kullanılamaz"</string>
<string name="disabled" msgid="8017887509554714950">"Devre dışı"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"İzin verildi"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"İzin verilmiyor"</string>
diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml
index 29494716bbb9..a371c9c5d0f5 100644
--- a/packages/SettingsLib/res/values-uk/arrays.xml
+++ b/packages/SettingsLib/res/values-uk/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Лише екран пристрою (за умовчанням)"</item>
- <item msgid="9161645858025071955">"Зовнішній дисплей"</item>
- <item msgid="114384731934682483">"На основі фокусування"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Показувати панель лише на екрані пристрою"</item>
- <item msgid="7795034287069726554">"Показувати панель на одному зовнішньому дисплеї"</item>
- <item msgid="5280431949814340475">"Показувати панель на останньому активному дисплеї"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 259cf6c3a0f0..fd1ade641d95 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Швидке заряджання"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Керується адміністратором"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Керується налаштуваннями з обмеженнями"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Недоступно під час викликів"</string>
<string name="disabled" msgid="8017887509554714950">"Вимкнено"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Дозволено"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Заборонено"</string>
diff --git a/packages/SettingsLib/res/values-ur/arrays.xml b/packages/SettingsLib/res/values-ur/arrays.xml
index a9eadb83bbfa..5ce9fb41dcb7 100644
--- a/packages/SettingsLib/res/values-ur/arrays.xml
+++ b/packages/SettingsLib/res/values-ur/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"صرف آلے کا ڈسپلے (ڈیفالٹ)"</item>
<item msgid="9161645858025071955">"بیرونی ڈسپلے"</item>
- <item msgid="114384731934682483">"فوکس پر مبنی"</item>
+ <item msgid="23651860565814477">"تازہ ترین اسٹیٹس بار ٹچ"</item>
+ <item msgid="7521112827893653392">"فوکس پر مبنی"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"صرف آلے کے ڈسپلے پر شیڈ دکھائیں"</item>
- <item msgid="7795034287069726554">"آلے کو واحد بیرونی ڈسپلے پر دکھائیں"</item>
- <item msgid="5280431949814340475">"آلے کو آخری فوکس کردہ ڈسپلے پر دکھائیں"</item>
+ <item msgid="1955398604822147783">"واحد بیرونی ڈسپلے پر شیڈ دکھائیں"</item>
+ <item msgid="391477482416751568">"اس ڈسپلے پر شیڈ دکھائیں جس کے اسٹیٹس بار کے ساتھ آخری بار تعامل کیا گیا تھا"</item>
+ <item msgid="1746820128097981528">"شیڈ کو آخری فوکس کردہ ڈسپلے پر دکھائیں"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 425a0ede22a3..13ffeb125972 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"فاسٹ چارجنگ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"کنٹرول کردہ بذریعہ منتظم"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"محدود کردہ ترتیب کے زیر انتظام ہے"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"کالز کے دوران غیر دستیاب"</string>
<string name="disabled" msgid="8017887509554714950">"غیر فعال"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"اجازت ہے"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"اجازت نہیں ہے"</string>
diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml
index f3cae4192180..cf1a0965935f 100644
--- a/packages/SettingsLib/res/values-uz/arrays.xml
+++ b/packages/SettingsLib/res/values-uz/arrays.xml
@@ -291,16 +291,19 @@
<string-array name="shade_display_awareness_entries">
<item msgid="816770658383209617">"Faqat qurilma displeyi (birlamchi)"</item>
<item msgid="9161645858025071955">"Tashqi displey"</item>
- <item msgid="114384731934682483">"Fokusga asoslangan"</item>
+ <item msgid="23651860565814477">"Holat qatori bilan oxirgi oʻzaro aloqa"</item>
+ <item msgid="7521112827893653392">"Fokusga asoslangan"</item>
</string-array>
<string-array name="shade_display_awareness_summaries">
<item msgid="2964753205732912921">"Faqat qurilma displeyida soyani koʻrsatish"</item>
- <item msgid="7795034287069726554">"Qurilmani alohida tashqi displeyda koʻrsatish"</item>
- <item msgid="5280431949814340475">"Qurilmani oxirgi fokuslangan displeyda koʻrsatish"</item>
+ <item msgid="1955398604822147783">"Soyani alohida tashqi displeyda koʻrsatish"</item>
+ <item msgid="391477482416751568">"Oxirgi marta holat qatori qaysi soya bilan munosabatga kirishganini koʻrsatish"</item>
+ <item msgid="1746820128097981528">"Soyani oxirgi fokuslangan displeyda koʻrsatish"</item>
</string-array>
<string-array name="shade_display_awareness_values">
<item msgid="3055776101992426514">"default_display"</item>
<item msgid="774789415968826925">"any_external_display"</item>
<item msgid="7880769915418638436">"status_bar_latest_touch"</item>
+ <item msgid="4313165186636015195">"focused_display"</item>
</string-array>
</resources>
diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml
index e0ebc9faab9c..8e4cf53cfc39 100644
--- a/packages/SettingsLib/res/values-vi/arrays.xml
+++ b/packages/SettingsLib/res/values-vi/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Chỉ hiển thị trên thiết bị (Mặc định)"</item>
- <item msgid="9161645858025071955">"Màn hình ngoài"</item>
- <item msgid="114384731934682483">"Theo tiêu điểm"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Chỉ hiện ngăn thông báo trên màn hình thiết bị"</item>
- <item msgid="7795034287069726554">"Hiện thiết bị trên một màn hình ngoài"</item>
- <item msgid="5280431949814340475">"Hiện thiết bị trên màn hình được lấy tiêu điểm gần đây nhất"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 59d4b4d587ce..2763c017398b 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Đang sạc nhanh"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Do quản trị viên kiểm soát"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Do chế độ Cài đặt hạn chế kiểm soát"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Không dùng được khi có cuộc gọi"</string>
<string name="disabled" msgid="8017887509554714950">"Đã tắt"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Được phép"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Không được phép"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
index c2147c7aba70..5c82865d3d52 100644
--- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"仅设备显示屏(默认)"</item>
- <item msgid="9161645858025071955">"外接显示屏"</item>
- <item msgid="114384731934682483">"基于焦点"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"仅在设备显示屏上显示通知栏"</item>
- <item msgid="7795034287069726554">"在单个外接显示屏上显示设备"</item>
- <item msgid="5280431949814340475">"在最近一次获得焦点的显示屏上显示设备"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 08e931b80e1b..934c525661e5 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"正在快速充电"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"由管理员控制"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由受限设置控制"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"通话期间无法使用"</string>
<string name="disabled" msgid="8017887509554714950">"已停用"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"允许"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"不允许"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
index 37d7b2930d3e..2e060595b299 100644
--- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"只限裝置顯示屏 (預設)"</item>
- <item msgid="9161645858025071955">"外部顯示屏"</item>
- <item msgid="114384731934682483">"突顯"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"只在裝置顯示屏上顯示陰影"</item>
- <item msgid="7795034287069726554">"在單獨外部顯示屏上顯示裝置"</item>
- <item msgid="5280431949814340475">"在上一次突顯的顯示屏上顯示裝置"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 8cc65c86cc3e..037f531b7c02 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -506,7 +506,7 @@
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> ‑ 充電中"</string>
<string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - 在 <xliff:g id="TIME">%3$s</xliff:g>前充滿電"</string>
<string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> • 在 <xliff:g id="TIME">%2$s</xliff:g>前充滿電"</string>
- <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"在 <xliff:g id="TIME">%1$s</xliff:g>前充滿電"</string>
+ <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"在<xliff:g id="TIME">%1$s</xliff:g> 前充滿電"</string>
<string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"<xliff:g id="TIME">%1$s</xliff:g> 前充滿電"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"未知"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"充電中"</string>
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"快速充電"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"已由管理員停用"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由「受限設定」控制"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"通話時無法使用"</string>
<string name="disabled" msgid="8017887509554714950">"已停用"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"允許"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"不允許"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
index c4d820c50549..5b48ad40c63c 100644
--- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"僅裝置螢幕 (預設)"</item>
- <item msgid="9161645858025071955">"外接螢幕"</item>
- <item msgid="114384731934682483">"使用中的螢幕"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"只在裝置螢幕顯示通知欄"</item>
- <item msgid="7795034287069726554">"在單一外接螢幕顯示通知欄"</item>
- <item msgid="5280431949814340475">"在最新使用的螢幕顯示通知欄"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"預設螢幕"</item>
- <item msgid="774789415968826925">"任何外接螢幕"</item>
- <item msgid="7880769915418638436">"最新觸控狀態列"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index d639e71f1a06..0ef65e6151d1 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"快速充電"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"已由管理員停用"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由受限制的設定控管"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"通話時無法使用"</string>
<string name="disabled" msgid="8017887509554714950">"已停用"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"允許"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"不允許"</string>
diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml
index 27ca40c4a66b..1a61f8b3d326 100644
--- a/packages/SettingsLib/res/values-zu/arrays.xml
+++ b/packages/SettingsLib/res/values-zu/arrays.xml
@@ -288,19 +288,10 @@
<item msgid="3753634915787796632">"2"</item>
<item msgid="4779928470672877922">"3"</item>
</string-array>
- <string-array name="shade_display_awareness_entries">
- <item msgid="816770658383209617">"Ukuboniswa kwedivayisi kuphela (Okuzenzakalelayo)"</item>
- <item msgid="9161645858025071955">"Ukubonisa Kwangaphandle"</item>
- <item msgid="114384731934682483">"Kusekelwe ekugxileni"</item>
- </string-array>
- <string-array name="shade_display_awareness_summaries">
- <item msgid="2964753205732912921">"Bonisa umthunzi esibonisini sedivayisi kuphela"</item>
- <item msgid="7795034287069726554">"Bonisa idivayisi esibonisini sangaphandle esisodwa"</item>
- <item msgid="5280431949814340475">"Bonisa idivayisi esibonisini sokugcina esigxilile"</item>
- </string-array>
- <string-array name="shade_display_awareness_values">
- <item msgid="3055776101992426514">"default_display"</item>
- <item msgid="774789415968826925">"any_external_display"</item>
- <item msgid="7880769915418638436">"status_bar_latest_touch"</item>
- </string-array>
+ <!-- no translation found for shade_display_awareness_entries:2 (23651860565814477) -->
+ <!-- no translation found for shade_display_awareness_entries:3 (7521112827893653392) -->
+ <!-- no translation found for shade_display_awareness_summaries:1 (1955398604822147783) -->
+ <!-- no translation found for shade_display_awareness_summaries:2 (391477482416751568) -->
+ <!-- no translation found for shade_display_awareness_summaries:3 (1746820128097981528) -->
+ <!-- no translation found for shade_display_awareness_values:3 (4313165186636015195) -->
</resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 4fd2c8d1e843..de626284ff87 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -523,8 +523,7 @@
<string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Ishaja ngokushesha"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kulawulwa umqondisi"</string>
<string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kulawulwe Isethingi Elikhawulelwe"</string>
- <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) -->
- <skip />
+ <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Akutholakali ngesikhathi samakholi"</string>
<string name="disabled" msgid="8017887509554714950">"Akusebenzi"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Kuvumelekile"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Akuvumelekile"</string>
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/display/DisplayDensityUtilsTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/display/DisplayDensityUtilsTest.java
new file mode 100644
index 000000000000..bba278a0a661
--- /dev/null
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/display/DisplayDensityUtilsTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayManagerGlobal;
+import android.os.RemoteException;
+import android.view.Display;
+import android.view.DisplayAdjustments;
+import android.view.DisplayInfo;
+import android.view.IWindowManager;
+import android.view.WindowManagerGlobal;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settingslib.R;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class DisplayDensityUtilsTest {
+
+ private static final float MAX_SCALE = 1.33f;
+ private static final float MIN_SCALE = 0.85f;
+ private static final float MIN_INTERVAL = 0.09f;
+ @Mock
+ private Context mContext;
+ @Mock
+ private Resources mResources;
+ @Mock
+ private DisplayManager mDisplayManager;
+ @Mock
+ private DisplayManagerGlobal mDisplayManagerGlobal;
+ @Mock
+ private IWindowManager mIWindowManager;
+ private IWindowManager mWindowManagerToRestore;
+ private DisplayDensityUtils mDisplayDensityUtils;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ doReturn(mDisplayManager).when(mContext).getSystemService((Class<Object>) any());
+ mWindowManagerToRestore = WindowManagerGlobal.getWindowManagerService();
+ WindowManagerGlobal.setWindowManagerServiceForSystemProcess(mIWindowManager);
+ when(mContext.getResources()).thenReturn(mResources);
+ when(mResources.getFraction(R.fraction.display_density_max_scale, 1, 1)).thenReturn(
+ MAX_SCALE);
+ when(mResources.getFraction(R.fraction.display_density_min_scale, 1, 1)).thenReturn(
+ MIN_SCALE);
+ when(mResources.getFraction(R.fraction.display_density_min_scale_interval, 1,
+ 1)).thenReturn(MIN_INTERVAL);
+ when(mResources.getString(anyInt())).thenReturn("summary");
+ }
+
+ @After
+ public void teardown() {
+ WindowManagerGlobal.setWindowManagerServiceForSystemProcess(mWindowManagerToRestore);
+ }
+
+ @Test
+ public void createDisplayDensityUtil_onlyDefaultDisplay() throws RemoteException {
+ var info = createDisplayInfoForDisplay(Display.DEFAULT_DISPLAY, Display.TYPE_INTERNAL, 2560,
+ 1600, 320);
+ var display = new Display(mDisplayManagerGlobal, info.displayId, info,
+ (DisplayAdjustments) null);
+ doReturn(new Display[]{display}).when(mDisplayManager).getDisplays(any());
+ doReturn(display).when(mDisplayManager).getDisplay(info.displayId);
+
+ mDisplayDensityUtils = new DisplayDensityUtils(mContext);
+
+ assertThat(mDisplayDensityUtils.getValues()).isEqualTo(new int[]{272, 320, 354, 390, 424});
+ }
+
+ @Test
+ public void createDisplayDensityUtil_multipleInternalDisplays() throws RemoteException {
+ // Default display
+ var defaultDisplayInfo = createDisplayInfoForDisplay(Display.DEFAULT_DISPLAY,
+ Display.TYPE_INTERNAL, 2000, 2000, 390);
+ var defaultDisplay = new Display(mDisplayManagerGlobal, defaultDisplayInfo.displayId,
+ defaultDisplayInfo,
+ (DisplayAdjustments) null);
+ doReturn(defaultDisplay).when(mDisplayManager).getDisplay(defaultDisplayInfo.displayId);
+
+ // Create another internal display
+ var internalDisplayInfo = createDisplayInfoForDisplay(1, Display.TYPE_INTERNAL,
+ 2000, 1000, 390);
+ var internalDisplay = new Display(mDisplayManagerGlobal, internalDisplayInfo.displayId,
+ internalDisplayInfo,
+ (DisplayAdjustments) null);
+ doReturn(internalDisplay).when(mDisplayManager).getDisplay(internalDisplayInfo.displayId);
+
+ doReturn(new Display[]{defaultDisplay, internalDisplay}).when(mDisplayManager).getDisplays(
+ anyString());
+
+ mDisplayDensityUtils = new DisplayDensityUtils(mContext);
+
+ assertThat(mDisplayDensityUtils.getValues()).isEqualTo(new int[]{330, 390, 426, 462, 500});
+ }
+
+ private DisplayInfo createDisplayInfoForDisplay(int displayId, int displayType,
+ int width, int height, int density) throws RemoteException {
+ var displayInfo = new DisplayInfo();
+ displayInfo.displayId = displayId;
+ displayInfo.type = displayType;
+ displayInfo.logicalWidth = width;
+ displayInfo.logicalHeight = height;
+ displayInfo.logicalDensityDpi = density;
+
+ doReturn(displayInfo).when(mDisplayManagerGlobal).getDisplayInfo(displayInfo.displayId);
+ doReturn(displayInfo.logicalDensityDpi).when(mIWindowManager).getInitialDisplayDensity(
+ displayInfo.displayId);
+ return displayInfo;
+ }
+}
+
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index 27a3cf1198b2..60fe15662980 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -124,6 +124,7 @@ public class SecureSettings {
Settings.Secure.POWER_MENU_LOCKED_SHOW_CONTENT,
Settings.Secure.DOZE_ENABLED,
Settings.Secure.DOZE_ALWAYS_ON,
+ Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED,
Settings.Secure.DOZE_PICK_UP_GESTURE,
Settings.Secure.DOZE_DOUBLE_TAP_GESTURE,
Settings.Secure.DOZE_TAP_SCREEN_GESTURE,
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index 9591b4354678..3d941e82727f 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -184,6 +184,7 @@ public class SecureSettingsValidators {
VALIDATORS.put(Secure.STATUS_BAR_SHOW_VIBRATE_ICON, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.DOZE_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.DOZE_ALWAYS_ON, BOOLEAN_VALIDATOR);
+ VALIDATORS.put(Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.DOZE_PICK_UP_GESTURE, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.DOZE_DOUBLE_TAP_GESTURE, BOOLEAN_VALIDATOR);
VALIDATORS.put(Secure.DOZE_TAP_SCREEN_GESTURE, BOOLEAN_VALIDATOR);
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index 246aa7158cab..85617bad1a91 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -809,7 +809,9 @@ public class SettingsBackupTest {
Settings.Secure.DND_CONFIGS_MIGRATED,
Settings.Secure.NAVIGATION_MODE_RESTORE,
Settings.Secure.V_TO_U_RESTORE_ALLOWLIST,
- Settings.Secure.V_TO_U_RESTORE_DENYLIST);
+ Settings.Secure.V_TO_U_RESTORE_DENYLIST,
+ Settings.Secure.REDACT_OTP_NOTIFICATION_WHILE_CONNECTED_TO_WIFI,
+ Settings.Secure.REDACT_OTP_NOTIFICATION_IMMEDIATELY);
@Test
public void systemSettingsBackedUpOrDenied() {
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt
index fad8ae7e3ba2..2f38dc2a825e 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt
@@ -24,6 +24,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
import com.android.compose.animation.scene.ContentScope
import com.android.compose.animation.scene.ElementKey
import com.android.compose.animation.scene.UserAction
@@ -102,6 +103,8 @@ private fun ContentScope.BouncerScene(
viewModel,
dialogFactory,
Modifier.element(Bouncer.Elements.Content)
+ // TODO(b/393516240): Use the same sysuiResTag() as views instead.
+ .testTag(Bouncer.Elements.Content.testTag)
.overscroll(verticalOverscrollEffect)
.sysuiResTag(Bouncer.TestTags.Root)
.fillMaxSize(),
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt
index 2ca70558f18b..0b17a3f71bda 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalContainer.kt
@@ -200,8 +200,9 @@ fun CommunalContainer(
scene(
CommunalScenes.Blank,
userActions =
- if (viewModel.v2FlagEnabled()) emptyMap()
- else mapOf(Swipe.Start(fromSource = Edge.End) to CommunalScenes.Communal),
+ if (viewModel.swipeToHubEnabled())
+ mapOf(Swipe.Start(fromSource = Edge.End) to CommunalScenes.Communal)
+ else emptyMap(),
) {
// This scene shows nothing only allowing for transitions to the communal scene.
Box(modifier = Modifier.fillMaxSize())
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
index 9c57efc24a22..835dd7aa9f24 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
@@ -76,7 +76,7 @@ import androidx.compose.foundation.lazy.grid.rememberLazyGridState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.selection.selectable
import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.foundation.text.AutoSize
+import androidx.compose.foundation.text.TextAutoSize
import androidx.compose.foundation.text.BasicText
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
@@ -1045,7 +1045,7 @@ private fun EmptyStateCta(contentPadding: PaddingValues, viewModel: BaseCommunal
color = colors.onPrimary,
textAlign = TextAlign.Center,
),
- autoSize = AutoSize.StepBased(maxFontSize = 36.sp, stepSize = 0.1.sp),
+ autoSize = TextAutoSize.StepBased(maxFontSize = 36.sp, stepSize = 0.1.sp),
modifier =
Modifier.focusable().semantics(mergeDescendants = true) {
contentDescription = titleForEmptyStateCTA
@@ -1705,15 +1705,38 @@ private fun Umo(
contentScope: ContentScope?,
modifier: Modifier = Modifier,
) {
- if (SceneContainerFlag.isEnabled && contentScope != null) {
- contentScope.MediaCarousel(
- modifier = modifier.fillMaxSize(),
- isVisible = true,
- mediaHost = viewModel.mediaHost,
- carouselController = viewModel.mediaCarouselController,
- )
- } else {
- UmoLegacy(viewModel, modifier)
+ val showNextActionLabel = stringResource(R.string.accessibility_action_label_umo_show_next)
+ val showPreviousActionLabel =
+ stringResource(R.string.accessibility_action_label_umo_show_previous)
+
+ Box(
+ modifier =
+ modifier.thenIf(!viewModel.isEditMode) {
+ Modifier.semantics {
+ customActions =
+ listOf(
+ CustomAccessibilityAction(showNextActionLabel) {
+ viewModel.onShowNextMedia()
+ true
+ },
+ CustomAccessibilityAction(showPreviousActionLabel) {
+ viewModel.onShowPreviousMedia()
+ true
+ },
+ )
+ }
+ }
+ ) {
+ if (SceneContainerFlag.isEnabled && contentScope != null) {
+ contentScope.MediaCarousel(
+ modifier = modifier.fillMaxSize(),
+ isVisible = true,
+ mediaHost = viewModel.mediaHost,
+ carouselController = viewModel.mediaCarouselController,
+ )
+ } else {
+ UmoLegacy(viewModel, modifier)
+ }
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt
index 16002bc709fd..8ad96a5bcb37 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ContentListState.kt
@@ -57,7 +57,8 @@ class ContentListState
internal constructor(
communalContent: List<CommunalContentModel>,
private val onAddWidget: (componentName: ComponentName, user: UserHandle, rank: Int) -> Unit,
- private val onDeleteWidget: (id: Int, componentName: ComponentName, rank: Int) -> Unit,
+ private val onDeleteWidget:
+ (id: Int, key: String, componentName: ComponentName, rank: Int) -> Unit,
private val onReorderWidgets: (widgetIdToRankMap: Map<Int, Int>) -> Unit,
private val onResizeWidget:
(
@@ -81,7 +82,7 @@ internal constructor(
if (list[indexToRemove].isWidgetContent()) {
val widget = list[indexToRemove] as CommunalContentModel.WidgetContent
list.apply { removeAt(indexToRemove) }
- onDeleteWidget(widget.appWidgetId, widget.componentName, widget.rank)
+ onDeleteWidget(widget.appWidgetId, widget.key, widget.componentName, widget.rank)
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt
index 5e61af634bbc..aa07370aa9cf 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt
@@ -19,6 +19,7 @@ package com.android.systemui.keyguard.ui.composable
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
import com.android.compose.animation.scene.ContentScope
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
@@ -55,7 +56,11 @@ constructor(
@Composable
override fun ContentScope.Content(modifier: Modifier) {
- LockscreenScene(lockscreenContent = lockscreenContent, modifier = modifier)
+ LockscreenScene(
+ lockscreenContent = lockscreenContent,
+ // TODO(b/393516240): Use the same sysuiResTag() as views instead.
+ modifier = modifier.testTag(key.rootElementKey.testTag),
+ )
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
index aa0d474ba41c..0c502e6f492d 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt
@@ -109,6 +109,13 @@ fun SceneContainer(
rememberMutableSceneTransitionLayoutState(
initialScene = initialSceneKey,
canChangeScene = { toScene -> viewModel.canChangeScene(toScene) },
+ canShowOverlay = { overlay -> viewModel.canShowOrReplaceOverlay(overlay) },
+ canReplaceOverlay = { beingReplaced, newlyShown ->
+ viewModel.canShowOrReplaceOverlay(
+ newlyShown = newlyShown,
+ beingReplaced = beingReplaced,
+ )
+ },
transitions = sceneTransitions,
onTransitionStart = { transition ->
sceneJankMonitor.onTransitionStart(
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneTransitionLayoutDataSource.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneTransitionLayoutDataSource.kt
index 6d906bd4aa66..8aa5bc7b7c6f 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneTransitionLayoutDataSource.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneTransitionLayoutDataSource.kt
@@ -68,7 +68,7 @@ class SceneTransitionLayoutDataSource(
}
override fun snapToScene(toScene: SceneKey) {
- state.snapToScene(scene = toScene)
+ state.snapTo(scene = toScene)
}
override fun showOverlay(overlay: OverlayKey, transitionKey: TransitionKey?) {
@@ -97,16 +97,10 @@ class SceneTransitionLayoutDataSource(
}
override fun instantlyShowOverlay(overlay: OverlayKey) {
- state.snapToScene(
- scene = state.transitionState.currentScene,
- currentOverlays = state.currentOverlays + overlay,
- )
+ state.snapTo(overlays = state.currentOverlays + overlay)
}
override fun instantlyHideOverlay(overlay: OverlayKey) {
- state.snapToScene(
- scene = state.transitionState.currentScene,
- currentOverlays = state.currentOverlays - overlay,
- )
+ state.snapTo(overlays = state.currentOverlays - overlay)
}
}
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt
index 907b5bc2143a..05958a212f47 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt
@@ -169,7 +169,7 @@ internal fun Modifier.element(
Modifier.maybeElevateInContent(layoutImpl, content, key, currentTransitionStates)
}
.then(ElementModifier(layoutImpl, currentTransitionStates, content, key))
- .testTag(key.testTag)
+ .thenIf(layoutImpl.implicitTestTags) { Modifier.testTag(key.testTag) }
}
/**
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
index 72bb82bd41bb..d47210cfc428 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt
@@ -65,6 +65,8 @@ fun SceneTransitionLayout(
swipeSourceDetector: SwipeSourceDetector = DefaultEdgeDetector,
swipeDetector: SwipeDetector = DefaultSwipeDetector,
@FloatRange(from = 0.0, to = 0.5) transitionInterceptionThreshold: Float = 0.05f,
+ // TODO(b/240432457) Remove this once test utils can access the internal STLForTesting().
+ implicitTestTags: Boolean = false,
builder: SceneTransitionLayoutScope<ContentScope>.() -> Unit,
) {
SceneTransitionLayoutForTesting(
@@ -73,6 +75,7 @@ fun SceneTransitionLayout(
swipeSourceDetector,
swipeDetector,
transitionInterceptionThreshold,
+ implicitTestTags = implicitTestTags,
onLayoutImpl = null,
builder = builder,
)
@@ -725,10 +728,8 @@ class FixedDistance(private val distance: Dp) : UserActionDistance {
}
/**
- * An internal version of [SceneTransitionLayout] to be used for tests.
- *
- * Important: You should use this only in tests and if you need to access the underlying
- * [SceneTransitionLayoutImpl]. In other cases, you should use [SceneTransitionLayout].
+ * An internal version of [SceneTransitionLayout] to be used for tests, that provides access to the
+ * internal [SceneTransitionLayoutImpl] and implicitly tags all scenes and elements.
*/
@Composable
internal fun SceneTransitionLayoutForTesting(
@@ -741,6 +742,7 @@ internal fun SceneTransitionLayoutForTesting(
sharedElementMap: MutableMap<ElementKey, Element> = remember { mutableMapOf() },
ancestors: List<Ancestor> = remember { emptyList() },
lookaheadScope: LookaheadScope? = null,
+ implicitTestTags: Boolean = true,
builder: SceneTransitionLayoutScope<InternalContentScope>.() -> Unit,
) {
val density = LocalDensity.current
@@ -765,6 +767,7 @@ internal fun SceneTransitionLayoutForTesting(
directionChangeSlop = directionChangeSlop,
defaultEffectFactory = defaultEffectFactory,
decayAnimationSpec = decayAnimationSpec,
+ implicitTestTags = implicitTestTags,
)
.also { onLayoutImpl?.invoke(it) }
}
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
index 53996d25afdb..e3c4eb0f8bea 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt
@@ -122,6 +122,9 @@ internal class SceneTransitionLayoutImpl(
* This is used to enable transformations and shared elements across NestedSTLs.
*/
internal val ancestors: List<Ancestor> = emptyList(),
+
+ /** Whether elements and scene should be tagged using `Modifier.testTag`. */
+ internal val implicitTestTags: Boolean = false,
lookaheadScope: LookaheadScope? = null,
defaultEffectFactory: OverscrollFactory,
) {
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt
index 5b275a556f93..56e8c458ad67 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt
@@ -138,10 +138,13 @@ sealed interface MutableSceneTransitionLayoutState : SceneTransitionLayoutState
transitionKey: TransitionKey? = null,
): Pair<TransitionState.Transition, Job>?
- /** Immediately snap to the given [scene]. */
- fun snapToScene(
- scene: SceneKey,
- currentOverlays: Set<OverlayKey> = transitionState.currentOverlays,
+ /**
+ * Immediately snap to the given [scene] and/or [overlays], instantly interrupting all ongoing
+ * transitions and settling to a [TransitionState.Idle] state.
+ */
+ fun snapTo(
+ scene: SceneKey = transitionState.currentScene,
+ overlays: Set<OverlayKey> = transitionState.currentOverlays,
)
/**
@@ -554,7 +557,7 @@ internal class MutableSceneTransitionLayoutStateImpl(
this.transitionStates = listOf(idle)
}
- override fun snapToScene(scene: SceneKey, currentOverlays: Set<OverlayKey>) {
+ override fun snapTo(scene: SceneKey, overlays: Set<OverlayKey>) {
checkThread()
// Force finish all transitions.
@@ -562,7 +565,7 @@ internal class MutableSceneTransitionLayoutStateImpl(
check(transitionStates.size == 1)
check(currentTransitions.isEmpty())
- transitionStates = listOf(TransitionState.Idle(scene, currentOverlays))
+ transitionStates = listOf(TransitionState.Idle(scene, overlays))
}
override fun showOverlay(
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt
index 95d6440d585e..64cfe38d3dd5 100644
--- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt
+++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt
@@ -171,7 +171,7 @@ internal sealed class Content(
.thenIf(layoutImpl.state.isElevationPossible(content = key, element = null)) {
Modifier.container(containerState)
}
- .testTag(key.testTag)
+ .thenIf(layoutImpl.implicitTestTags) { Modifier.testTag(key.testTag) }
) {
CompositionLocalProvider(LocalOverscrollFactory provides lastFactory) {
scope.content()
@@ -290,6 +290,7 @@ internal class ContentScopeImpl(
sharedElementMap = layoutImpl.elements,
ancestors = ancestors,
lookaheadScope = layoutImpl.lookaheadScope,
+ implicitTestTags = layoutImpl.implicitTestTags,
)
}
}
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt
index f625add0648b..8fce7087dba6 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/ElementTest.kt
@@ -227,7 +227,7 @@ class ElementTest {
to = SceneB,
transitionLayout = { state ->
coroutineScope = rememberCoroutineScope()
- SceneTransitionLayout(state) {
+ SceneTransitionLayoutForTesting(state) {
scene(SceneA) {
Box(Modifier.size(layoutSize)) {
// Transformed element
@@ -247,7 +247,7 @@ class ElementTest {
rule.runOnUiThread {
// We snap to scene B so that the transition A => B is removed from the list of
// transitions.
- state.snapToScene(SceneB)
+ state.snapTo(SceneB)
state.setTargetScene(SceneC, coroutineScope)
}
}
@@ -633,7 +633,7 @@ class ElementTest {
val scope =
rule.setContentAndCreateMainScope {
- SceneTransitionLayout(state) {
+ SceneTransitionLayoutForTesting(state) {
scene(SceneA) { Box(Modifier.element(TestElements.Foo).size(20.dp)) }
scene(SceneB) {}
}
@@ -674,7 +674,7 @@ class ElementTest {
CompositionLocalProvider(
LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory()
) {
- SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(layoutWidth, layoutHeight)) {
scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) {
Spacer(Modifier.fillMaxSize())
}
@@ -734,7 +734,7 @@ class ElementTest {
CompositionLocalProvider(
LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory()
) {
- SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(layoutWidth, layoutHeight)) {
scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) {
Spacer(
Modifier.overscroll(verticalOverscrollEffect)
@@ -834,7 +834,7 @@ class ElementTest {
CompositionLocalProvider(
LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory()
) {
- SceneTransitionLayout(state, Modifier.size(layoutWidth, layoutHeight)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(layoutWidth, layoutHeight)) {
scene(key = SceneA, userActions = mapOf(Swipe.Down to SceneB)) {
Spacer(Modifier.fillMaxSize())
}
@@ -893,7 +893,7 @@ class ElementTest {
CompositionLocalProvider(
LocalOverscrollFactory provides rememberOffsetOverscrollEffectFactory()
) {
- SceneTransitionLayout(
+ SceneTransitionLayoutForTesting(
state = state,
modifier = Modifier.size(layoutWidth, layoutHeight),
) {
@@ -970,7 +970,7 @@ class ElementTest {
rule.setContent {
touchSlop = LocalViewConfiguration.current.touchSlop
- SceneTransitionLayout(
+ SceneTransitionLayoutForTesting(
state = state,
modifier = Modifier.size(layoutWidth, layoutHeight),
) {
@@ -1057,7 +1057,7 @@ class ElementTest {
rule.setContent {
coroutineScope = rememberCoroutineScope()
- SceneTransitionLayout(state) {
+ SceneTransitionLayoutForTesting(state) {
scene(SceneA) {
Box(Modifier.size(layoutSize)) {
Box(
@@ -1374,7 +1374,7 @@ class ElementTest {
val scope =
rule.setContentAndCreateMainScope {
- SceneTransitionLayout(state, Modifier.size(layoutSize)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(layoutSize)) {
scene(SceneA) {
Box(Modifier.fillMaxSize()) { Foo(Modifier.align(Alignment.TopStart)) }
}
@@ -1742,7 +1742,7 @@ class ElementTest {
val scope =
rule.setContentAndCreateMainScope {
- SceneTransitionLayout(state, Modifier.size(200.dp)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
scene(SceneA) { Foo(offset = 0.dp) }
scene(SceneB) { Foo(offset = 20.dp) }
scene(SceneC) { Foo(offset = 40.dp) }
@@ -1828,7 +1828,7 @@ class ElementTest {
val scope =
rule.setContentAndCreateMainScope {
- SceneTransitionLayout(state) {
+ SceneTransitionLayoutForTesting(state) {
scene(SceneB) { Foo(Modifier.offset(40.dp, 60.dp)) }
// Define A after B so that Foo is placed in A during A <=> B.
@@ -1887,7 +1887,7 @@ class ElementTest {
val scope =
rule.setContentAndCreateMainScope {
- SceneTransitionLayout(state) {
+ SceneTransitionLayoutForTesting(state) {
scene(SceneA) { Foo() }
scene(SceneB) { Foo(Modifier.offset(40.dp, 60.dp)) }
}
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt
index 04c762f43907..98ecb644878b 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/OverlayTest.kt
@@ -90,7 +90,7 @@ class OverlayTest {
lateinit var coroutineScope: CoroutineScope
rule.setContent {
coroutineScope = rememberCoroutineScope()
- SceneTransitionLayout(state, Modifier.size(200.dp)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
scene(SceneA) { Box(Modifier.fillMaxSize()) { Foo() } }
overlay(OverlayA) { Foo() }
}
@@ -132,7 +132,7 @@ class OverlayTest {
lateinit var coroutineScope: CoroutineScope
rule.setContent {
coroutineScope = rememberCoroutineScope()
- SceneTransitionLayout(state, Modifier.size(200.dp)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
scene(SceneA) { Box(Modifier.fillMaxSize()) { Foo() } }
overlay(OverlayA) { Foo() }
overlay(OverlayB) { Foo() }
@@ -230,7 +230,7 @@ class OverlayTest {
lateinit var coroutineScope: CoroutineScope
rule.setContent {
coroutineScope = rememberCoroutineScope()
- SceneTransitionLayout(state, Modifier.size(200.dp)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
scene(SceneA) { Box(Modifier.fillMaxSize()) { MovableBar() } }
overlay(OverlayA) { MovableBar() }
overlay(OverlayB) { MovableBar() }
@@ -302,7 +302,7 @@ class OverlayTest {
}
var alignment by mutableStateOf(Alignment.Center)
rule.setContent {
- SceneTransitionLayout(state, Modifier.size(200.dp)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
scene(SceneA) { Box(Modifier.fillMaxSize()) { Foo() } }
overlay(OverlayA, alignment = alignment) { Foo() }
}
@@ -761,7 +761,7 @@ class OverlayTest {
val movableElementChildTag = "movableElementChildTag"
val scope =
rule.setContentAndCreateMainScope {
- SceneTransitionLayout(state) {
+ SceneTransitionLayoutForTesting(state) {
scene(SceneA) {
MovableElement(key, Modifier) {
content { Box(Modifier.testTag(movableElementChildTag).size(100.dp)) }
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt
index 2bf235846b32..366b11d9fabd 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/PredictiveBackHandlerTest.kt
@@ -250,7 +250,7 @@ class PredictiveBackHandlerTest {
}
rule.setContent {
- SceneTransitionLayout(state, Modifier.size(200.dp)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(200.dp)) {
scene(SceneA) { Box(Modifier.fillMaxSize()) }
overlay(OverlayA) { Box(Modifier.fillMaxSize()) }
overlay(OverlayB) { Box(Modifier.fillMaxSize()) }
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt
index 26f3c259dca9..eea6595cdf5e 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt
@@ -255,7 +255,7 @@ class SceneTransitionLayoutStateTest {
assertThat(transition).hasCurrentScene(SceneB)
// Snap to C.
- state.snapToScene(SceneC)
+ state.snapTo(SceneC)
assertThat(state.transitionState).isIdle()
assertThat(state.transitionState).hasCurrentScene(SceneC)
}
@@ -272,7 +272,7 @@ class SceneTransitionLayoutStateTest {
assertThat(transition).hasToScene(SceneB)
// Snap to C.
- state.snapToScene(SceneC)
+ state.snapTo(SceneC)
assertThat(state.transitionState).isIdle()
assertThat(state.transitionState).hasCurrentScene(SceneC)
}
@@ -375,7 +375,7 @@ class SceneTransitionLayoutStateTest {
val job = transition.coroutineScope.launch { awaitCancellation() }
// Force snap state to SceneB to force finish all current transitions.
- state.snapToScene(SceneB)
+ state.snapTo(SceneB)
assertThat(state.transitionState).isIdle()
assertThat(job.isCancelled).isTrue()
}
@@ -411,7 +411,7 @@ class SceneTransitionLayoutStateTest {
val state = MutableSceneTransitionLayoutStateForTests(SceneA)
state.startTransitionImmediately(this, transition(SceneA, SceneB))
state.startTransitionImmediately(this, transition(SceneB, SceneC))
- state.snapToScene(SceneC)
+ state.snapTo(SceneC)
assertThat(state.transitionState).isIdle()
assertThat(state.transitionState).hasCurrentScene(SceneC)
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt
index 3c490ae614a3..5cbc98fa4c9d 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt
@@ -97,7 +97,7 @@ class SceneTransitionLayoutTest {
MutableSceneTransitionLayoutStateForTests(SceneA, EmptyTestTransitions)
}
- SceneTransitionLayout(state = layoutState, modifier = Modifier.size(LayoutSize)) {
+ SceneTransitionLayoutForTesting(state = layoutState, modifier = Modifier.size(LayoutSize)) {
scene(SceneA, userActions = mapOf(Back to SceneB)) {
Box(Modifier.fillMaxSize()) {
SharedFoo(size = 50.dp, childOffset = 0.dp, Modifier.align(Alignment.TopEnd))
@@ -457,9 +457,9 @@ class SceneTransitionLayoutTest {
}
// Snap to B then C to compose these scenes at least once.
- rule.runOnUiThread { state.snapToScene(SceneB) }
+ rule.runOnUiThread { state.snapTo(SceneB) }
rule.waitForIdle()
- rule.runOnUiThread { state.snapToScene(SceneC) }
+ rule.runOnUiThread { state.snapTo(SceneC) }
rule.waitForIdle()
assertThat(keyInA).isEqualTo(SceneA)
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
index 751b31481e3a..11abbbec79bf 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SwipeToSceneTest.kt
@@ -763,7 +763,7 @@ class SwipeToSceneTest {
var touchSlop = 0f
rule.setContent {
touchSlop = LocalViewConfiguration.current.touchSlop
- SceneTransitionLayout(state, Modifier.size(layoutSize)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(layoutSize)) {
scene(SceneA, userActions = mapOf(Swipe.Start to SceneB, Swipe.End to SceneC)) {
Box(Modifier.fillMaxSize())
}
@@ -837,7 +837,7 @@ class SwipeToSceneTest {
rule.setContent {
touchSlop = LocalViewConfiguration.current.touchSlop
CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
- SceneTransitionLayout(state, Modifier.size(layoutSize)) {
+ SceneTransitionLayoutForTesting(state, Modifier.size(layoutSize)) {
scene(SceneA, userActions = mapOf(Swipe.Start to SceneB, Swipe.End to SceneC)) {
Box(Modifier.fillMaxSize())
}
diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt
index bb511bc27317..8b568928bde0 100644
--- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt
+++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/transformation/NestedElementTransformationTest.kt
@@ -40,7 +40,7 @@ import com.android.compose.animation.scene.MutableSceneTransitionLayoutState
import com.android.compose.animation.scene.MutableSceneTransitionLayoutStateForTests
import com.android.compose.animation.scene.Scale
import com.android.compose.animation.scene.SceneKey
-import com.android.compose.animation.scene.SceneTransitionLayout
+import com.android.compose.animation.scene.SceneTransitionLayoutForTesting
import com.android.compose.animation.scene.SceneTransitions
import com.android.compose.animation.scene.TestScenes
import com.android.compose.animation.scene.testNestedTransition
@@ -114,7 +114,7 @@ class NestedElementTransformationTest {
@Composable
(states: List<MutableSceneTransitionLayoutState>) -> Unit =
{ states ->
- SceneTransitionLayout(states[0]) {
+ SceneTransitionLayoutForTesting(states[0]) {
scene(TestScenes.SceneA, content = { TestElement(elementVariant0A) })
scene(
TestScenes.SceneB,
diff --git a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt
index 6d47babd716a..e56d1bed4c25 100644
--- a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt
+++ b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestContentScope.kt
@@ -30,5 +30,7 @@ fun TestContentScope(
content: @Composable ContentScope.() -> Unit,
) {
val state = rememberMutableSceneTransitionLayoutState(currentScene)
- SceneTransitionLayout(state, modifier) { scene(currentScene, content = content) }
+ SceneTransitionLayout(state, modifier, implicitTestTags = true) {
+ scene(currentScene, content = content)
+ }
}
diff --git a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt
index f94a7ed77341..a362a370328a 100644
--- a/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt
+++ b/packages/SystemUI/compose/scene/tests/utils/src/com/android/compose/animation/scene/TestTransition.kt
@@ -137,7 +137,7 @@ fun ComposeContentTestRule.testTransition(
},
changeState = changeState,
transitionLayout = { state ->
- SceneTransitionLayout(state, layoutModifier) {
+ SceneTransitionLayout(state, layoutModifier, implicitTestTags = true) {
scene(fromScene, content = fromSceneContent)
scene(toScene, content = toSceneContent)
}
@@ -163,7 +163,7 @@ fun ComposeContentTestRule.testShowOverlayTransition(
)
},
transitionLayout = { state ->
- SceneTransitionLayout(state) {
+ SceneTransitionLayout(state, implicitTestTags = true) {
scene(fromScene) { fromSceneContent() }
overlay(overlay) { overlayContent() }
}
@@ -191,7 +191,7 @@ fun ComposeContentTestRule.testHideOverlayTransition(
)
},
transitionLayout = { state ->
- SceneTransitionLayout(state) {
+ SceneTransitionLayout(state, implicitTestTags = true) {
scene(toScene) { toSceneContent() }
overlay(overlay) { overlayContent() }
}
@@ -223,7 +223,7 @@ fun ComposeContentTestRule.testReplaceOverlayTransition(
)
},
transitionLayout = { state ->
- SceneTransitionLayout(state) {
+ SceneTransitionLayout(state, implicitTestTags = true) {
scene(currentScene) { currentSceneContent() }
overlay(from, alignment = fromAlignment) { fromContent() }
overlay(to, alignment = toAlignment) { toContent() }
@@ -273,7 +273,7 @@ fun MotionTestRule<ComposeToolkit>.recordTransition(
}
}
- SceneTransitionLayout(state, layoutModifier) {
+ SceneTransitionLayout(state, layoutModifier, implicitTestTags = true) {
scene(fromScene, content = fromSceneContent)
scene(toScene, content = toSceneContent)
}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
index 9bd533a80606..b9a5f1f18210 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
@@ -197,7 +197,43 @@ open class SimpleDigitalClockTextView(
)
}
- setInterpolatedViewBounds(getInterpolatedTextBounds(), widthMeasureSpec, heightMeasureSpec)
+ var expectedWidth: Int
+ var expectedHeight: Int
+
+ if (MeasureSpec.getMode(heightMeasureSpec) == EXACTLY) {
+ // For view which has fixed height, e.g. small clock,
+ // we should always return the size required from parent view
+ expectedHeight = heightMeasureSpec
+ } else {
+ expectedHeight =
+ MeasureSpec.makeMeasureSpec(
+ if (isSingleDigit()) {
+ maxSingleDigitHeight
+ } else {
+ textBounds.height() + 2 * lockScreenPaint.strokeWidth.toInt()
+ },
+ MeasureSpec.getMode(measuredHeightAndState),
+ )
+ }
+
+ if (MeasureSpec.getMode(widthMeasureSpec) == EXACTLY) {
+ expectedWidth = widthMeasureSpec
+ } else {
+ expectedWidth =
+ MeasureSpec.makeMeasureSpec(
+ if (isSingleDigit()) {
+ maxSingleDigitWidth
+ } else {
+ max(
+ textBounds.width() + 2 * lockScreenPaint.strokeWidth.toInt(),
+ MeasureSpec.getSize(measuredWidthAndState),
+ )
+ },
+ MeasureSpec.getMode(measuredWidthAndState),
+ )
+ }
+
+ setMeasuredDimension(expectedWidth, expectedHeight)
}
override fun onDraw(canvas: Canvas) {
@@ -323,7 +359,7 @@ open class SimpleDigitalClockTextView(
id == R.id.MINUTE_SECOND_DIGIT
}
- private fun getInterpolatedTextBounds(): Rect {
+ private fun updateInterpolatedTextBounds(): Rect {
val interpolatedTextBounds = Rect()
if (textAnimator.animator.animatedFraction != 1.0f && textAnimator.animator.isRunning) {
interpolatedTextBounds.left =
@@ -363,41 +399,7 @@ open class SimpleDigitalClockTextView(
return interpolatedTextBounds
}
- private fun setInterpolatedViewBounds(
- interpBounds: Rect,
- widthMeasureSpec: Int = measuredWidthAndState,
- heightMeasureSpec: Int = measuredHeightAndState,
- ) {
- val heightMode = MeasureSpec.getMode(heightMeasureSpec)
- val widthMode = MeasureSpec.getMode(widthMeasureSpec)
-
- val heightSpec =
- if (heightMode == EXACTLY) {
- heightMeasureSpec
- } else {
- MeasureSpec.makeMeasureSpec(
- if (isSingleDigit()) maxSingleDigitHeight
- else interpBounds.height() + 2 * lockScreenPaint.strokeWidth.toInt(),
- heightMode,
- )
- }
-
- val widthSpec =
- if (widthMode == EXACTLY) {
- widthMeasureSpec
- } else {
- MeasureSpec.makeMeasureSpec(
- if (isSingleDigit()) maxSingleDigitWidth
- else interpBounds.width() + 2 * lockScreenPaint.strokeWidth.toInt(),
- widthMode,
- )
- }
-
- setMeasuredDimension(widthSpec, heightSpec)
- parent?.requestLayout()
- }
-
- private fun updateXTranslation(inPoint: Point, interpolatedTextBounds: Rect): Point {
+ private fun updateXtranslation(inPoint: Point, interpolatedTextBounds: Rect): Point {
when (horizontalAlignment) {
HorizontalAlignment.LEFT -> {
inPoint.x = lockScreenPaint.strokeWidth.toInt() - interpolatedTextBounds.left
@@ -420,9 +422,7 @@ open class SimpleDigitalClockTextView(
// translation of reference point of text
// used for translation when calling textInterpolator
private fun getLocalTranslation(): Point {
- val interpolatedTextBounds = getInterpolatedTextBounds()
- setInterpolatedViewBounds(interpolatedTextBounds)
-
+ val interpolatedTextBounds = updateInterpolatedTextBounds()
val localTranslation = Point(0, 0)
val correctedBaseline = if (baseline != -1) baseline else baselineFromMeasure
// get the change from current baseline to expected baseline
@@ -452,7 +452,7 @@ open class SimpleDigitalClockTextView(
}
}
- return updateXTranslation(localTranslation, interpolatedTextBounds)
+ return updateXtranslation(localTranslation, interpolatedTextBounds)
}
fun applyStyles(textStyle: FontTextStyle, aodStyle: FontTextStyle?) {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
index fe665e658feb..24b9e847d621 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
@@ -84,6 +84,7 @@ import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.GlobalSettings
import com.android.systemui.util.time.FakeSystemClock
+import com.android.systemui.window.domain.interactor.windowRootViewBlurInteractor
import com.google.common.truth.Truth
import junit.framework.Assert
import kotlinx.coroutines.flow.MutableStateFlow
@@ -280,9 +281,9 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
kosmos.keyguardDismissTransitionInteractor,
{ primaryBouncerInteractor },
executor,
- ) {
- deviceEntryInteractor
- }
+ { deviceEntryInteractor },
+ { kosmos.windowRootViewBlurInteractor },
+ )
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt
index 6f2082b35fa7..7051f81cfc88 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/CommunalSceneStartableTest.kt
@@ -24,53 +24,47 @@ import android.provider.Settings
import androidx.test.filters.SmallTest
import com.android.internal.logging.uiEventLoggerFake
import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
+import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
import com.android.systemui.SysuiTestCase
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.communal.domain.interactor.communalSceneInteractor
import com.android.systemui.communal.domain.interactor.communalSettingsInteractor
import com.android.systemui.communal.domain.interactor.setCommunalAvailable
+import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnabled
import com.android.systemui.communal.shared.log.CommunalUiEvent
import com.android.systemui.communal.shared.model.CommunalScenes
-import com.android.systemui.communal.shared.model.EditModeState
-import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.dock.dockManager
-import com.android.systemui.dock.fakeDockManager
import com.android.systemui.flags.Flags.COMMUNAL_SERVICE_ENABLED
import com.android.systemui.flags.andSceneContainer
import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
-import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
-import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.kosmos.collectLastValue
+import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testScope
+import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.statusbar.notificationShadeWindowController
-import com.android.systemui.statusbar.phone.centralSurfaces
-import com.android.systemui.statusbar.phone.centralSurfacesOptional
import com.android.systemui.testKosmos
import com.android.systemui.util.settings.fakeSettings
import com.google.common.truth.Truth.assertThat
+import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.advanceTimeBy
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
import org.junit.Before
-import org.junit.Ignore
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.kotlin.whenever
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters
+@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(ParameterizedAndroidJunit4::class)
@EnableFlags(FLAG_COMMUNAL_HUB)
@@ -82,7 +76,8 @@ class CommunalSceneStartableTest(flags: FlagsParameterization) : SysuiTestCase()
@JvmStatic
@Parameters(name = "{0}")
fun getParams(): List<FlagsParameterization> {
- return FlagsParameterization.allCombinationsOf().andSceneContainer()
+ return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
+ .andSceneContainer()
}
}
@@ -90,9 +85,22 @@ class CommunalSceneStartableTest(flags: FlagsParameterization) : SysuiTestCase()
mSetFlagsRule.setFlagsParameterization(flags)
}
- private val kosmos = testKosmos()
-
- private lateinit var underTest: CommunalSceneStartable
+ private val kosmos = testKosmos().useUnconfinedTestDispatcher()
+
+ private val Kosmos.underTest by
+ Kosmos.Fixture {
+ CommunalSceneStartable(
+ communalInteractor = communalInteractor,
+ communalSettingsInteractor = communalSettingsInteractor,
+ communalSceneInteractor = communalSceneInteractor,
+ keyguardInteractor = keyguardInteractor,
+ systemSettings = fakeSettings,
+ notificationShadeWindowController = notificationShadeWindowController,
+ bgScope = applicationCoroutineScope,
+ mainDispatcher = testDispatcher,
+ uiEventLogger = uiEventLoggerFake,
+ )
+ }
@Before
fun setUp() {
@@ -102,646 +110,314 @@ class CommunalSceneStartableTest(flags: FlagsParameterization) : SysuiTestCase()
SCREEN_TIMEOUT,
UserHandle.USER_CURRENT,
)
- kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, true)
-
- underTest =
- CommunalSceneStartable(
- dockManager = dockManager,
- communalInteractor = communalInteractor,
- communalSettingsInteractor = communalSettingsInteractor,
- communalSceneInteractor = communalSceneInteractor,
- keyguardTransitionInteractor = keyguardTransitionInteractor,
- keyguardInteractor = keyguardInteractor,
- systemSettings = fakeSettings,
- notificationShadeWindowController = notificationShadeWindowController,
- applicationScope = applicationCoroutineScope,
- bgScope = applicationCoroutineScope,
- mainDispatcher = testDispatcher,
- centralSurfacesOpt = centralSurfacesOptional,
- uiEventLogger = uiEventLoggerFake,
- )
- .apply { start() }
+ fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, true)
+
+ underTest.start()
// Make communal available so that communalInteractor.desiredScene accurately reflects
// scene changes instead of just returning Blank.
- with(kosmos.testScope) {
- launch { setCommunalAvailable(true) }
- testScheduler.runCurrent()
- }
+ runBlocking { setCommunalAvailable(true) }
+ setCommunalV2ConfigEnabled(true)
}
}
@Test
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
- fun keyguardGoesAway_whenLaunchingEditMode_doNotForceBlankScene() =
- with(kosmos) {
- testScope.runTest {
- val scene by collectLastValue(communalSceneInteractor.currentScene)
-
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- communalSceneInteractor.setEditModeState(EditModeState.STARTING)
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.PRIMARY_BOUNCER,
- to = KeyguardState.GONE,
- testScope = this,
- )
-
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
- }
- }
-
- @Test
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
- fun keyguardGoesAway_whenLaunchingWidget_doNotForceBlankScene() =
- with(kosmos) {
- testScope.runTest {
- val scene by collectLastValue(communalSceneInteractor.currentScene)
-
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- communalSceneInteractor.setIsLaunchingWidget(true)
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.PRIMARY_BOUNCER,
- to = KeyguardState.GONE,
- testScope = this,
- )
-
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
- }
- }
-
- @Test
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
- fun keyguardGoesAway_whenNotLaunchingWidget_forceBlankScene() =
- with(kosmos) {
- testScope.runTest {
- val scene by collectLastValue(communalSceneInteractor.currentScene)
-
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
+ @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
+ fun hubTimeout_whenDreaming_goesToBlank() =
+ kosmos.runTest {
+ // Device is dreaming and on communal.
+ fakeKeyguardRepository.setDreaming(true)
+ communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- communalSceneInteractor.setIsLaunchingWidget(false)
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.PRIMARY_BOUNCER,
- to = KeyguardState.GONE,
- testScope = this,
- )
+ val scene by collectLastValue(communalSceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- }
+ // Scene times out back to blank after the screen timeout.
+ advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+ assertThat(scene).isEqualTo(CommunalScenes.Blank)
}
@Test
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
- fun keyguardGoesAway_whenInEditMode_doesNotChangeScene() =
- with(kosmos) {
- testScope.runTest {
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- communalInteractor.setEditModeOpen(true)
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.ALTERNATE_BOUNCER,
- to = KeyguardState.GONE,
- testScope = this,
- )
- // Scene change will be handled in EditWidgetsActivity not here
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
- }
- }
-
- @Ignore("Ignored until custom animations are implemented in b/322787129")
- @Test
- @DisableFlags(FLAG_SCENE_CONTAINER)
- fun deviceDocked_forceCommunalScene() =
- with(kosmos) {
- testScope.runTest {
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
-
- updateDocked(true)
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.GONE,
- to = KeyguardState.LOCKSCREEN,
- testScope = this,
- )
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
- }
+ @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
+ fun hubTimeout_notDreaming_staysOnCommunal() =
+ kosmos.runTest {
+ // Device is not dreaming and on communal.
+ fakeKeyguardRepository.setDreaming(false)
+ communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
+
+ // Scene stays as Communal
+ advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+ val scene by collectLastValue(communalSceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
}
@Test
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
- fun occluded_forceBlankScene() =
- with(kosmos) {
- testScope.runTest {
- whenever(centralSurfaces.isLaunchingActivityOverLockscreen).thenReturn(false)
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- updateDocked(true)
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.OCCLUDED,
- testScope = this,
- )
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- }
+ @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
+ fun hubTimeout_dreamStopped_staysOnCommunal() =
+ kosmos.runTest {
+ // Device is dreaming and on communal.
+ fakeKeyguardRepository.setDreaming(true)
+ communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
+
+ val scene by collectLastValue(communalSceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
+
+ // Wait a bit, but not long enough to timeout.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
+
+ // Dream stops, timeout is cancelled and device stays on hub, because the regular
+ // screen timeout will take effect at this point.
+ fakeKeyguardRepository.setDreaming(false)
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
}
@Test
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
- fun occluded_doesNotForceBlankSceneIfLaunchingActivityOverLockscreen() =
- with(kosmos) {
- testScope.runTest {
- whenever(centralSurfaces.isLaunchingActivityOverLockscreen).thenReturn(true)
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- updateDocked(true)
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.OCCLUDED,
- testScope = this,
- )
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
- }
+ @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
+ fun hubTimeout_dreamStartedHalfway_goesToCommunal() =
+ kosmos.runTest {
+ // Device is on communal, but not dreaming.
+ fakeKeyguardRepository.setDreaming(false)
+ communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
+
+ val scene by collectLastValue(communalSceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
+
+ // Wait a bit, but not long enough to timeout, then start dreaming.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ fakeKeyguardRepository.setDreaming(true)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
+
+ // Device times out after one screen timeout interval, dream doesn't reset timeout.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ assertThat(scene).isEqualTo(CommunalScenes.Blank)
}
@Test
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
- fun deviceDocked_doesNotForceCommunalIfTransitioningFromCommunal() =
- with(kosmos) {
- testScope.runTest {
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
-
- updateDocked(true)
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.LOCKSCREEN,
- testScope = this,
- )
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- }
- }
+ @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
+ fun hubTimeout_dreamAfterInitialTimeout_goesToBlank() =
+ kosmos.runTest {
+ // Device is on communal.
+ communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- @Test
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
- fun deviceAsleep_forceBlankSceneAfterTimeout() =
- with(kosmos) {
- testScope.runTest {
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.OFF,
- testScope = this,
- )
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- advanceTimeBy(CommunalSceneStartable.AWAKE_DEBOUNCE_DELAY)
-
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- }
- }
+ // Device stays on the hub after the timeout since we're not dreaming.
+ testScope.advanceTimeBy(SCREEN_TIMEOUT.milliseconds * 2)
+ val scene by collectLastValue(communalSceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
- @Test
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
- fun deviceAsleep_wakesUpBeforeTimeout_noChangeInScene() =
- with(kosmos) {
- testScope.runTest {
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.OFF,
- testScope = this,
- )
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
- advanceTimeBy(CommunalSceneStartable.AWAKE_DEBOUNCE_DELAY / 2)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.OFF,
- to = KeyguardState.GLANCEABLE_HUB,
- testScope = this,
- )
-
- advanceTimeBy(CommunalSceneStartable.AWAKE_DEBOUNCE_DELAY)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
- }
- }
+ // Start dreaming.
+ fakeKeyguardRepository.setDreaming(true)
+ advanceTimeBy(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS.milliseconds)
- @Ignore("Ignored until custom animations are implemented in b/322787129")
- @Test
- @DisableFlags(FLAG_SCENE_CONTAINER)
- fun dockingOnLockscreen_forcesCommunal() =
- with(kosmos) {
- testScope.runTest {
- communalSceneInteractor.changeScene(CommunalScenes.Blank, "test")
- val scene by collectLastValue(communalSceneInteractor.currentScene)
-
- // device is docked while on the lockscreen
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.LOCKSCREEN,
- testScope = this,
- )
- updateDocked(true)
-
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- advanceTimeBy(CommunalSceneStartable.DOCK_DEBOUNCE_DELAY)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
- }
+ // Hub times out immediately.
+ assertThat(scene).isEqualTo(CommunalScenes.Blank)
}
- @Ignore("Ignored until custom animations are implemented in b/322787129")
@Test
- @DisableFlags(FLAG_SCENE_CONTAINER)
- fun dockingOnLockscreen_doesNotForceCommunalIfDreamStarts() =
- with(kosmos) {
- testScope.runTest {
- communalSceneInteractor.changeScene(CommunalScenes.Blank, "test")
- val scene by collectLastValue(communalSceneInteractor.currentScene)
-
- // device is docked while on the lockscreen
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.LOCKSCREEN,
- testScope = this,
- )
- updateDocked(true)
-
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- advanceTimeBy(CommunalSceneStartable.DOCK_DEBOUNCE_DELAY / 2)
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
-
- // dream starts shortly after docking
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.LOCKSCREEN,
- to = KeyguardState.DREAMING,
- testScope = this,
- )
- advanceTimeBy(CommunalSceneStartable.DOCK_DEBOUNCE_DELAY)
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- }
- }
+ @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
+ fun hubTimeout_userActivityTriggered_resetsTimeout() =
+ kosmos.runTest {
+ // Device is dreaming and on communal.
+ fakeKeyguardRepository.setDreaming(true)
+ communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- @Test
- @DisableFlags(FLAG_SCENE_CONTAINER)
- fun hubTimeout_whenDreaming_goesToBlank() =
- with(kosmos) {
- testScope.runTest {
- // Device is dreaming and on communal.
- updateDreaming(true)
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- // Scene times out back to blank after the screen timeout.
- advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- }
- }
+ val scene by collectLastValue(communalSceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
- @Test
- @DisableFlags(FLAG_SCENE_CONTAINER)
- fun hubTimeout_notDreaming_staysOnCommunal() =
- with(kosmos) {
- testScope.runTest {
- // Device is not dreaming and on communal.
- updateDreaming(false)
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-
- // Scene stays as Communal
- advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
- }
- }
+ // Wait a bit, but not long enough to timeout.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- @Test
- @DisableFlags(FLAG_SCENE_CONTAINER)
- fun hubTimeout_dreamStopped_staysOnCommunal() =
- with(kosmos) {
- testScope.runTest {
- // Device is dreaming and on communal.
- updateDreaming(true)
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- // Wait a bit, but not long enough to timeout.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- // Dream stops, timeout is cancelled and device stays on hub, because the regular
- // screen timeout will take effect at this point.
- updateDreaming(false)
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
- }
- }
+ // Send user interaction to reset timeout.
+ communalInteractor.signalUserInteraction()
- @Test
- @DisableFlags(FLAG_SCENE_CONTAINER)
- fun hubTimeout_dreamStartedHalfway_goesToCommunal() =
- with(kosmos) {
- testScope.runTest {
- // Device is on communal, but not dreaming.
- updateDreaming(false)
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- // Wait a bit, but not long enough to timeout, then start dreaming.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- updateDreaming(true)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- // Device times out after one screen timeout interval, dream doesn't reset timeout.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- }
- }
+ // If user activity didn't reset timeout, we would have gone back to Blank by now.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
- @Test
- @DisableFlags(FLAG_SCENE_CONTAINER)
- fun hubTimeout_dreamAfterInitialTimeout_goesToBlank() =
- with(kosmos) {
- testScope.runTest {
- // Device is on communal.
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-
- // Device stays on the hub after the timeout since we're not dreaming.
- advanceTimeBy(SCREEN_TIMEOUT.milliseconds * 2)
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- // Start dreaming.
- updateDreaming(true)
- advanceTimeBy(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS)
-
- // Hub times out immediately.
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- }
+ // Timeout happens one interval after the user interaction.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ assertThat(scene).isEqualTo(CommunalScenes.Blank)
}
@Test
- @DisableFlags(FLAG_SCENE_CONTAINER)
- fun hubTimeout_userActivityTriggered_resetsTimeout() =
- with(kosmos) {
- testScope.runTest {
- // Device is dreaming and on communal.
- updateDreaming(true)
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
+ @DisableFlags(FLAG_SCENE_CONTAINER, FLAG_GLANCEABLE_HUB_V2)
+ fun hubTimeout_screenTimeoutChanged() =
+ kosmos.runTest {
+ fakeSettings.putInt(Settings.System.SCREEN_OFF_TIMEOUT, SCREEN_TIMEOUT * 2)
- // Wait a bit, but not long enough to timeout.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ // Device is dreaming and on communal.
+ fakeKeyguardRepository.setDreaming(true)
+ communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
- // Send user interaction to reset timeout.
- communalInteractor.signalUserInteraction()
+ val scene by collectLastValue(communalSceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
- // If user activity didn't reset timeout, we would have gone back to Blank by now.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
+ // Scene times out back to blank after the screen timeout.
+ advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+ assertThat(scene).isEqualTo(CommunalScenes.Communal)
- // Timeout happens one interval after the user interaction.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- }
- }
-
- @Test
- @DisableFlags(FLAG_SCENE_CONTAINER)
- fun hubTimeout_screenTimeoutChanged() =
- with(kosmos) {
- testScope.runTest {
- fakeSettings.putInt(Settings.System.SCREEN_OFF_TIMEOUT, SCREEN_TIMEOUT * 2)
-
- // Device is dreaming and on communal.
- updateDreaming(true)
- communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
-
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- // Scene times out back to blank after the screen timeout.
- advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
-
- advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
- assertThat(uiEventLoggerFake.logs.first().eventId)
- .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT.id)
- assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
- }
+ advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+ assertThat(scene).isEqualTo(CommunalScenes.Blank)
+ assertThat(uiEventLoggerFake.logs.first().eventId)
+ .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT.id)
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
}
@Test
@EnableFlags(FLAG_SCENE_CONTAINER)
+ @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
fun hubTimeout_withSceneContainer_whenDreaming_goesToBlank() =
- with(kosmos) {
- testScope.runTest {
- // Device is dreaming and on communal.
- updateDreaming(true)
- sceneInteractor.changeScene(Scenes.Communal, "test")
-
- val scene by collectLastValue(sceneInteractor.currentScene)
- assertThat(scene).isEqualTo(Scenes.Communal)
-
- // Scene times out back to blank after the screen timeout.
- advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
- assertThat(scene).isEqualTo(Scenes.Dream)
- }
+ kosmos.runTest {
+ // Device is dreaming and on communal.
+ fakeKeyguardRepository.setDreaming(true)
+ sceneInteractor.changeScene(Scenes.Communal, "test")
+
+ val scene by collectLastValue(sceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(Scenes.Communal)
+
+ // Scene times out back to blank after the screen timeout.
+ advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+ assertThat(scene).isEqualTo(Scenes.Dream)
}
@Test
@EnableFlags(FLAG_SCENE_CONTAINER)
+ @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
fun hubTimeout_withSceneContainer_notDreaming_staysOnCommunal() =
- with(kosmos) {
- testScope.runTest {
- // Device is not dreaming and on communal.
- updateDreaming(false)
- sceneInteractor.changeScene(Scenes.Communal, "test")
-
- // Scene stays as Communal
- advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
- val scene by collectLastValue(sceneInteractor.currentScene)
- assertThat(scene).isEqualTo(Scenes.Communal)
- }
+ kosmos.runTest {
+ // Device is not dreaming and on communal.
+ fakeKeyguardRepository.setDreaming(false)
+ sceneInteractor.changeScene(Scenes.Communal, "test")
+
+ // Scene stays as Communal
+ advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+ val scene by collectLastValue(sceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(Scenes.Communal)
}
@Test
@EnableFlags(FLAG_SCENE_CONTAINER)
+ @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
fun hubTimeout_withSceneContainer_dreamStopped_staysOnCommunal() =
- with(kosmos) {
- testScope.runTest {
- // Device is dreaming and on communal.
- updateDreaming(true)
- sceneInteractor.changeScene(Scenes.Communal, "test")
-
- val scene by collectLastValue(sceneInteractor.currentScene)
- assertThat(scene).isEqualTo(Scenes.Communal)
-
- // Wait a bit, but not long enough to timeout.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- assertThat(scene).isEqualTo(Scenes.Communal)
-
- // Dream stops, timeout is cancelled and device stays on hub, because the regular
- // screen timeout will take effect at this point.
- updateDreaming(false)
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- assertThat(scene).isEqualTo(Scenes.Communal)
- }
+ kosmos.runTest {
+ // Device is dreaming and on communal.
+ fakeKeyguardRepository.setDreaming(true)
+ sceneInteractor.changeScene(Scenes.Communal, "test")
+
+ val scene by collectLastValue(sceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(Scenes.Communal)
+
+ // Wait a bit, but not long enough to timeout.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ assertThat(scene).isEqualTo(Scenes.Communal)
+
+ // Dream stops, timeout is cancelled and device stays on hub, because the regular
+ // screen timeout will take effect at this point.
+ fakeKeyguardRepository.setDreaming(false)
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ assertThat(scene).isEqualTo(Scenes.Communal)
}
@Test
@EnableFlags(FLAG_SCENE_CONTAINER)
+ @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
fun hubTimeout_withSceneContainer_dreamStartedHalfway_goesToCommunal() =
- with(kosmos) {
- testScope.runTest {
- // Device is on communal, but not dreaming.
- updateDreaming(false)
- sceneInteractor.changeScene(Scenes.Communal, "test")
-
- val scene by collectLastValue(sceneInteractor.currentScene)
- assertThat(scene).isEqualTo(Scenes.Communal)
-
- // Wait a bit, but not long enough to timeout, then start dreaming.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- updateDreaming(true)
- assertThat(scene).isEqualTo(Scenes.Communal)
-
- // Device times out after one screen timeout interval, dream doesn't reset timeout.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- assertThat(scene).isEqualTo(Scenes.Dream)
- }
+ kosmos.runTest {
+ // Device is on communal, but not dreaming.
+ fakeKeyguardRepository.setDreaming(false)
+ sceneInteractor.changeScene(Scenes.Communal, "test")
+
+ val scene by collectLastValue(sceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(Scenes.Communal)
+
+ // Wait a bit, but not long enough to timeout, then start dreaming.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ fakeKeyguardRepository.setDreaming(true)
+ assertThat(scene).isEqualTo(Scenes.Communal)
+
+ // Device times out after one screen timeout interval, dream doesn't reset timeout.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ assertThat(scene).isEqualTo(Scenes.Dream)
}
@Test
@EnableFlags(FLAG_SCENE_CONTAINER)
+ @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
fun hubTimeout_withSceneContainer_dreamAfterInitialTimeout_goesToBlank() =
- with(kosmos) {
- testScope.runTest {
- // Device is on communal.
- sceneInteractor.changeScene(Scenes.Communal, "test")
-
- // Device stays on the hub after the timeout since we're not dreaming.
- advanceTimeBy(SCREEN_TIMEOUT.milliseconds * 2)
- val scene by collectLastValue(sceneInteractor.currentScene)
- assertThat(scene).isEqualTo(Scenes.Communal)
-
- // Start dreaming.
- updateDreaming(true)
- advanceTimeBy(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS)
-
- // Hub times out immediately.
- assertThat(scene).isEqualTo(Scenes.Dream)
- }
+ kosmos.runTest {
+ // Device is on communal.
+ sceneInteractor.changeScene(Scenes.Communal, "test")
+
+ // Device stays on the hub after the timeout since we're not dreaming.
+ advanceTimeBy(SCREEN_TIMEOUT.milliseconds * 2)
+ val scene by collectLastValue(sceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(Scenes.Communal)
+
+ // Start dreaming.
+ fakeKeyguardRepository.setDreaming(true)
+ advanceTimeBy(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS.milliseconds)
+
+ // Hub times out immediately.
+ assertThat(scene).isEqualTo(Scenes.Dream)
}
@Test
@EnableFlags(FLAG_SCENE_CONTAINER)
+ @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
fun hubTimeout_withSceneContainer_userActivityTriggered_resetsTimeout() =
- with(kosmos) {
- testScope.runTest {
- // Device is dreaming and on communal.
- updateDreaming(true)
- sceneInteractor.changeScene(Scenes.Communal, "test")
+ kosmos.runTest {
+ // Device is dreaming and on communal.
+ fakeKeyguardRepository.setDreaming(true)
+ sceneInteractor.changeScene(Scenes.Communal, "test")
- val scene by collectLastValue(sceneInteractor.currentScene)
- assertThat(scene).isEqualTo(Scenes.Communal)
+ val scene by collectLastValue(sceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(Scenes.Communal)
- // Wait a bit, but not long enough to timeout.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ // Wait a bit, but not long enough to timeout.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- // Send user interaction to reset timeout.
- communalInteractor.signalUserInteraction()
+ // Send user interaction to reset timeout.
+ communalInteractor.signalUserInteraction()
- // If user activity didn't reset timeout, we would have gone back to Blank by now.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- assertThat(scene).isEqualTo(Scenes.Communal)
+ // If user activity didn't reset timeout, we would have gone back to Blank by now.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ assertThat(scene).isEqualTo(Scenes.Communal)
- // Timeout happens one interval after the user interaction.
- advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
- assertThat(scene).isEqualTo(Scenes.Dream)
- }
+ // Timeout happens one interval after the user interaction.
+ advanceTimeBy((SCREEN_TIMEOUT / 2).milliseconds)
+ assertThat(scene).isEqualTo(Scenes.Dream)
}
@Test
@EnableFlags(FLAG_SCENE_CONTAINER)
+ @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
fun hubTimeout_withSceneContainer_screenTimeoutChanged() =
- with(kosmos) {
- testScope.runTest {
- fakeSettings.putInt(Settings.System.SCREEN_OFF_TIMEOUT, SCREEN_TIMEOUT * 2)
-
- // Device is dreaming and on communal.
- updateDreaming(true)
- sceneInteractor.changeScene(Scenes.Communal, "test")
-
- val scene by collectLastValue(sceneInteractor.currentScene)
- assertThat(scene).isEqualTo(Scenes.Communal)
-
- // Scene times out back to blank after the screen timeout.
- advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
- assertThat(scene).isEqualTo(Scenes.Communal)
-
- advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
- assertThat(scene).isEqualTo(Scenes.Dream)
- assertThat(uiEventLoggerFake.logs.first().eventId)
- .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT.id)
- assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
- }
- }
+ kosmos.runTest {
+ fakeSettings.putInt(Settings.System.SCREEN_OFF_TIMEOUT, SCREEN_TIMEOUT * 2)
- @Test
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_SCENE_CONTAINER)
- fun transitionFromDozingToGlanceableHub_forcesCommunal() =
- with(kosmos) {
- testScope.runTest {
- val scene by collectLastValue(communalSceneInteractor.currentScene)
- communalSceneInteractor.changeScene(CommunalScenes.Blank, "test")
- assertThat(scene).isEqualTo(CommunalScenes.Blank)
-
- fakeKeyguardTransitionRepository.sendTransitionSteps(
- from = KeyguardState.DOZING,
- to = KeyguardState.GLANCEABLE_HUB,
- testScope = this,
- )
-
- assertThat(scene).isEqualTo(CommunalScenes.Communal)
- }
- }
+ // Device is dreaming and on communal.
+ fakeKeyguardRepository.setDreaming(true)
+ sceneInteractor.changeScene(Scenes.Communal, "test")
- private fun TestScope.updateDocked(docked: Boolean) =
- with(kosmos) {
- runCurrent()
- fakeDockManager.setIsDocked(docked)
- // TODO(b/322787129): uncomment once custom animations are in place
- // fakeDockManager.setDockEvent(DockManager.STATE_DOCKED)
- runCurrent()
- }
+ val scene by collectLastValue(sceneInteractor.currentScene)
+ assertThat(scene).isEqualTo(Scenes.Communal)
- private fun TestScope.updateDreaming(dreaming: Boolean) =
- with(kosmos) {
- fakeKeyguardRepository.setDreaming(dreaming)
- runCurrent()
+ // Scene times out back to blank after the screen timeout.
+ advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+ assertThat(scene).isEqualTo(Scenes.Communal)
+
+ advanceTimeBy(SCREEN_TIMEOUT.milliseconds)
+ assertThat(scene).isEqualTo(Scenes.Dream)
+ assertThat(uiEventLoggerFake.logs.first().eventId)
+ .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT.id)
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
}
+
+ /**
+ * Advances time by duration + 1 millisecond, to ensure that tasks scheduled to run at
+ * currentTime + duration are scheduled.
+ */
+ private fun Kosmos.advanceTimeBy(duration: Duration) =
+ testScope.advanceTimeBy(duration + 1.milliseconds)
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt
index ff722bf602bc..aa96073c03bb 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractorTest.kt
@@ -22,7 +22,6 @@ import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.compose.animation.scene.ObservableTransitionState.Idle
import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
import com.android.systemui.SysuiTestCase
import com.android.systemui.communal.data.repository.communalSceneRepository
import com.android.systemui.communal.shared.model.CommunalScenes
@@ -64,7 +63,7 @@ import org.junit.runner.RunWith
@SmallTest
@RunWith(AndroidJUnit4::class)
-@EnableFlags(FLAG_COMMUNAL_HUB, FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
+@EnableFlags(FLAG_COMMUNAL_HUB)
@DisableSceneContainer
class CommunalSceneTransitionInteractorTest : SysuiTestCase() {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelTest.kt
index 1a3606e413cc..da25bcac6c95 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelTest.kt
@@ -35,6 +35,7 @@ import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
@@ -44,6 +45,7 @@ import org.junit.runner.RunWith
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters
+@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(ParameterizedAndroidJunit4::class)
class CommunalTransitionViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
@@ -65,7 +67,7 @@ class CommunalTransitionViewModelTest(flags: FlagsParameterization) : SysuiTestC
private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
private val communalSceneRepository = kosmos.fakeCommunalSceneRepository
- private val sceneInteractor = kosmos.sceneInteractor
+ private val sceneInteractor by lazy { kosmos.sceneInteractor }
private val underTest: CommunalTransitionViewModel by lazy {
kosmos.communalTransitionViewModel
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt
index 18cc8bf5f0d3..f5f5dd8f81f9 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalEditModeViewModelTest.kt
@@ -23,24 +23,19 @@ import android.content.pm.PackageManager
import android.content.pm.UserInfo
import android.provider.Settings
import android.view.accessibility.AccessibilityEvent
-import android.view.accessibility.AccessibilityManager
import android.view.accessibility.accessibilityManager
import android.widget.RemoteViews
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.internal.logging.UiEventLogger
+import com.android.internal.logging.uiEventLogger
+import com.android.internal.logging.uiEventLoggerFake
import com.android.systemui.SysuiTestCase
import com.android.systemui.communal.data.model.CommunalSmartspaceTimer
-import com.android.systemui.communal.data.repository.FakeCommunalMediaRepository
-import com.android.systemui.communal.data.repository.FakeCommunalSmartspaceRepository
-import com.android.systemui.communal.data.repository.FakeCommunalTutorialRepository
-import com.android.systemui.communal.data.repository.FakeCommunalWidgetRepository
import com.android.systemui.communal.data.repository.fakeCommunalMediaRepository
import com.android.systemui.communal.data.repository.fakeCommunalSmartspaceRepository
import com.android.systemui.communal.data.repository.fakeCommunalTutorialRepository
import com.android.systemui.communal.data.repository.fakeCommunalWidgetRepository
import com.android.systemui.communal.domain.interactor.CommunalInteractor
-import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.communal.domain.interactor.communalSceneInteractor
import com.android.systemui.communal.domain.interactor.communalSettingsInteractor
@@ -49,12 +44,15 @@ import com.android.systemui.communal.shared.log.CommunalMetricsLogger
import com.android.systemui.communal.shared.log.CommunalUiEvent
import com.android.systemui.communal.shared.model.EditModeState
import com.android.systemui.communal.ui.viewmodel.CommunalEditModeViewModel
-import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.Flags
import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.collectLastValue
+import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testScope
+import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.log.logcatLogBuffer
import com.android.systemui.media.controls.ui.controller.mediaCarouselController
import com.android.systemui.media.controls.ui.view.MediaHost
@@ -62,73 +60,45 @@ import com.android.systemui.settings.fakeUserTracker
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.fakeUserRepository
import com.google.common.truth.Truth.assertThat
+import kotlin.time.Duration.Companion.milliseconds
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.advanceTimeBy
-import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
-import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
-import org.mockito.kotlin.spy
import org.mockito.kotlin.whenever
+@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class CommunalEditModeViewModelTest : SysuiTestCase() {
- @Mock private lateinit var mediaHost: MediaHost
- @Mock private lateinit var uiEventLogger: UiEventLogger
- @Mock private lateinit var packageManager: PackageManager
- @Mock private lateinit var metricsLogger: CommunalMetricsLogger
-
- private val kosmos = testKosmos()
- private val testScope = kosmos.testScope
-
- private lateinit var tutorialRepository: FakeCommunalTutorialRepository
- private lateinit var widgetRepository: FakeCommunalWidgetRepository
- private lateinit var smartspaceRepository: FakeCommunalSmartspaceRepository
- private lateinit var mediaRepository: FakeCommunalMediaRepository
- private lateinit var communalSceneInteractor: CommunalSceneInteractor
- private lateinit var communalInteractor: CommunalInteractor
- private lateinit var accessibilityManager: AccessibilityManager
+ private val kosmos = testKosmos().useUnconfinedTestDispatcher()
private val testableResources = context.orCreateTestableResources
- private lateinit var underTest: CommunalEditModeViewModel
+ private val Kosmos.packageManager by Kosmos.Fixture { mock<PackageManager>() }
- @Before
- fun setUp() {
- MockitoAnnotations.initMocks(this)
-
- tutorialRepository = kosmos.fakeCommunalTutorialRepository
- widgetRepository = kosmos.fakeCommunalWidgetRepository
- smartspaceRepository = kosmos.fakeCommunalSmartspaceRepository
- mediaRepository = kosmos.fakeCommunalMediaRepository
- communalSceneInteractor = kosmos.communalSceneInteractor
- communalInteractor = spy(kosmos.communalInteractor)
- kosmos.fakeUserRepository.setUserInfos(listOf(MAIN_USER_INFO))
- kosmos.fakeUserTracker.set(userInfos = listOf(MAIN_USER_INFO), selectedUserIndex = 0)
- kosmos.fakeFeatureFlagsClassic.set(Flags.COMMUNAL_SERVICE_ENABLED, true)
- accessibilityManager = kosmos.accessibilityManager
+ private val Kosmos.metricsLogger by Kosmos.Fixture { mock<CommunalMetricsLogger>() }
- underTest =
+ private val Kosmos.underTest by
+ Kosmos.Fixture {
CommunalEditModeViewModel(
communalSceneInteractor,
communalInteractor,
- kosmos.communalSettingsInteractor,
- kosmos.keyguardTransitionInteractor,
- mediaHost,
+ communalSettingsInteractor,
+ keyguardTransitionInteractor,
+ mock<MediaHost>(),
uiEventLogger,
logcatLogBuffer("CommunalEditModeViewModelTest"),
- kosmos.testDispatcher,
+ testDispatcher,
metricsLogger,
context,
accessibilityManager,
@@ -136,19 +106,28 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
WIDGET_PICKER_PACKAGE_NAME,
kosmos.mediaCarouselController,
)
+ }
+
+ @Before
+ fun setUp() {
+ kosmos.fakeUserRepository.setUserInfos(listOf(MAIN_USER_INFO))
+ kosmos.fakeUserTracker.set(userInfos = listOf(MAIN_USER_INFO), selectedUserIndex = 0)
+ kosmos.fakeFeatureFlagsClassic.set(Flags.COMMUNAL_SERVICE_ENABLED, true)
}
@Test
fun communalContent_onlyWidgetsAndCtaTileAreShownInEditMode() =
- testScope.runTest {
- tutorialRepository.setTutorialSettingState(Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED)
+ kosmos.runTest {
+ fakeCommunalTutorialRepository.setTutorialSettingState(
+ Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED
+ )
// Widgets available.
- widgetRepository.addWidget(appWidgetId = 0, rank = 30)
- widgetRepository.addWidget(appWidgetId = 1, rank = 20)
+ fakeCommunalWidgetRepository.addWidget(appWidgetId = 0, rank = 30)
+ fakeCommunalWidgetRepository.addWidget(appWidgetId = 1, rank = 20)
// Smartspace available.
- smartspaceRepository.setTimers(
+ fakeCommunalSmartspaceRepository.setTimers(
listOf(
CommunalSmartspaceTimer(
smartspaceTargetId = "target",
@@ -159,7 +138,7 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
)
// Media playing.
- mediaRepository.mediaActive()
+ fakeCommunalMediaRepository.mediaActive()
val communalContent by collectLastValue(underTest.communalContent)
@@ -173,7 +152,7 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
@Test
fun selectedKey_onReorderWidgets_isSet() =
- testScope.runTest {
+ kosmos.runTest {
val selectedKey by collectLastValue(underTest.selectedKey)
underTest.setSelectedKey(null)
@@ -186,7 +165,7 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
@Test
fun isCommunalContentVisible_isTrue_whenEditModeShowing() =
- testScope.runTest {
+ kosmos.runTest {
val isCommunalContentVisible by collectLastValue(underTest.isCommunalContentVisible)
communalSceneInteractor.setEditModeState(EditModeState.SHOWING)
assertThat(isCommunalContentVisible).isEqualTo(true)
@@ -194,7 +173,7 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
@Test
fun isCommunalContentVisible_isFalse_whenEditModeNotShowing() =
- testScope.runTest {
+ kosmos.runTest {
val isCommunalContentVisible by collectLastValue(underTest.isCommunalContentVisible)
communalSceneInteractor.setEditModeState(null)
assertThat(isCommunalContentVisible).isEqualTo(false)
@@ -202,12 +181,14 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
@Test
fun deleteWidget() =
- testScope.runTest {
- tutorialRepository.setTutorialSettingState(Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED)
+ kosmos.runTest {
+ fakeCommunalTutorialRepository.setTutorialSettingState(
+ Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED
+ )
// Widgets available.
- widgetRepository.addWidget(appWidgetId = 0, rank = 30)
- widgetRepository.addWidget(appWidgetId = 1, rank = 20)
+ fakeCommunalWidgetRepository.addWidget(appWidgetId = 0, rank = 30)
+ fakeCommunalWidgetRepository.addWidget(appWidgetId = 1, rank = 20)
val communalContent by collectLastValue(underTest.communalContent)
@@ -220,6 +201,7 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
underTest.onDeleteWidget(
id = 0,
+ key = "key_0",
componentName = ComponentName("test_package", "test_class"),
rank = 30,
)
@@ -233,26 +215,56 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
}
@Test
- fun reorderWidget_uiEventLogging_start() {
- underTest.onReorderWidgetStart(CommunalContentModel.KEY.widget(123))
- verify(uiEventLogger).log(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_START)
- }
+ fun deleteWidget_clearsSelectedKey() =
+ kosmos.runTest {
+ val selectedKey by collectLastValue(underTest.selectedKey)
+ underTest.setSelectedKey("test_key")
+ assertThat(selectedKey).isEqualTo("test_key")
+
+ // Selected key is deleted.
+ underTest.onDeleteWidget(
+ id = 0,
+ key = "test_key",
+ componentName = ComponentName("test_package", "test_class"),
+ rank = 30,
+ )
+
+ assertThat(selectedKey).isNull()
+ }
@Test
- fun reorderWidget_uiEventLogging_end() {
- underTest.onReorderWidgetEnd()
- verify(uiEventLogger).log(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_FINISH)
- }
+ fun reorderWidget_uiEventLogging_start() =
+ kosmos.runTest {
+ underTest.onReorderWidgetStart(CommunalContentModel.KEY.widget(123))
+
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
+ assertThat(uiEventLoggerFake.logs[0].eventId)
+ .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_START.id)
+ }
@Test
- fun reorderWidget_uiEventLogging_cancel() {
- underTest.onReorderWidgetCancel()
- verify(uiEventLogger).log(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_CANCEL)
- }
+ fun reorderWidget_uiEventLogging_end() =
+ kosmos.runTest {
+ underTest.onReorderWidgetEnd()
+
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
+ assertThat(uiEventLoggerFake.logs[0].eventId)
+ .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_FINISH.id)
+ }
+
+ @Test
+ fun reorderWidget_uiEventLogging_cancel() =
+ kosmos.runTest {
+ underTest.onReorderWidgetCancel()
+
+ assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1)
+ assertThat(uiEventLoggerFake.logs[0].eventId)
+ .isEqualTo(CommunalUiEvent.COMMUNAL_HUB_REORDER_WIDGET_CANCEL.id)
+ }
@Test
fun onOpenWidgetPicker_launchesWidgetPickerActivity() {
- testScope.runTest {
+ kosmos.runTest {
var activityStarted = false
val success =
underTest.onOpenWidgetPicker(testableResources.resources) { _ ->
@@ -266,7 +278,7 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
@Test
fun onOpenWidgetPicker_activityLaunchThrowsException_failure() {
- testScope.runTest {
+ kosmos.runTest {
val success =
underTest.onOpenWidgetPicker(testableResources.resources) { _ ->
run { throw ActivityNotFoundException() }
@@ -278,7 +290,7 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
@Test
fun showDisclaimer_trueAfterEditModeShowing() =
- testScope.runTest {
+ kosmos.runTest {
val showDisclaimer by collectLastValue(underTest.showDisclaimer)
assertThat(showDisclaimer).isFalse()
@@ -288,9 +300,9 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
@Test
fun showDisclaimer_falseWhenDismissed() =
- testScope.runTest {
+ kosmos.runTest {
underTest.setEditModeState(EditModeState.SHOWING)
- kosmos.fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
+ fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
val showDisclaimer by collectLastValue(underTest.showDisclaimer)
@@ -301,63 +313,67 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
@Test
fun showDisclaimer_trueWhenTimeout() =
- testScope.runTest {
+ kosmos.runTest {
underTest.setEditModeState(EditModeState.SHOWING)
- kosmos.fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
+ fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
val showDisclaimer by collectLastValue(underTest.showDisclaimer)
assertThat(showDisclaimer).isTrue()
underTest.onDisclaimerDismissed()
assertThat(showDisclaimer).isFalse()
- advanceTimeBy(CommunalInteractor.DISCLAIMER_RESET_MILLIS)
+ testScope.advanceTimeBy(CommunalInteractor.DISCLAIMER_RESET_MILLIS + 1.milliseconds)
assertThat(showDisclaimer).isTrue()
}
@Test
- fun scrollPosition_persistedOnEditCleanup() {
- val index = 2
- val offset = 30
- underTest.onScrollPositionUpdated(index, offset)
- underTest.cleanupEditModeState()
-
- verify(communalInteractor).setScrollPosition(eq(index), eq(offset))
- }
+ fun scrollPosition_persistedOnEditCleanup() =
+ kosmos.runTest {
+ val index = 2
+ val offset = 30
+ underTest.onScrollPositionUpdated(index, offset)
+ underTest.cleanupEditModeState()
+
+ assertThat(communalInteractor.firstVisibleItemIndex).isEqualTo(index)
+ assertThat(communalInteractor.firstVisibleItemOffset).isEqualTo(offset)
+ }
@Test
- fun onNewWidgetAdded_accessibilityDisabled_doNothing() {
- whenever(accessibilityManager.isEnabled).thenReturn(false)
+ fun onNewWidgetAdded_accessibilityDisabled_doNothing() =
+ kosmos.runTest {
+ whenever(accessibilityManager.isEnabled).thenReturn(false)
- val provider =
- mock<AppWidgetProviderInfo> {
- on { loadLabel(packageManager) }.thenReturn("Test Clock")
- }
- underTest.onNewWidgetAdded(provider)
+ val provider =
+ mock<AppWidgetProviderInfo> {
+ on { loadLabel(packageManager) }.thenReturn("Test Clock")
+ }
+ underTest.onNewWidgetAdded(provider)
- verify(accessibilityManager, never()).sendAccessibilityEvent(any())
- }
+ verify(accessibilityManager, never()).sendAccessibilityEvent(any())
+ }
@Test
- fun onNewWidgetAdded_accessibilityEnabled_sendAccessibilityAnnouncement() {
- whenever(accessibilityManager.isEnabled).thenReturn(true)
+ fun onNewWidgetAdded_accessibilityEnabled_sendAccessibilityAnnouncement() =
+ kosmos.runTest {
+ whenever(accessibilityManager.isEnabled).thenReturn(true)
- val provider =
- mock<AppWidgetProviderInfo> {
- on { loadLabel(packageManager) }.thenReturn("Test Clock")
- }
- underTest.onNewWidgetAdded(provider)
+ val provider =
+ mock<AppWidgetProviderInfo> {
+ on { loadLabel(packageManager) }.thenReturn("Test Clock")
+ }
+ underTest.onNewWidgetAdded(provider)
- val captor = argumentCaptor<AccessibilityEvent>()
- verify(accessibilityManager).sendAccessibilityEvent(captor.capture())
+ val captor = argumentCaptor<AccessibilityEvent>()
+ verify(accessibilityManager).sendAccessibilityEvent(captor.capture())
- val event = captor.firstValue
- assertThat(event.eventType).isEqualTo(AccessibilityEvent.TYPE_ANNOUNCEMENT)
- assertThat(event.contentDescription).isEqualTo("Test Clock widget added to lock screen")
- }
+ val event = captor.firstValue
+ assertThat(event.eventType).isEqualTo(AccessibilityEvent.TYPE_ANNOUNCEMENT)
+ assertThat(event.contentDescription).isEqualTo("Test Clock widget added to lock screen")
+ }
@Test
fun onResizeWidget_logsMetrics() =
- testScope.runTest {
+ kosmos.runTest {
val appWidgetId = 123
val spanY = 2
val widgetIdToRankMap = mapOf(appWidgetId to 1)
@@ -372,7 +388,6 @@ class CommunalEditModeViewModelTest : SysuiTestCase() {
rank = rank,
)
- verify(communalInteractor).resizeWidget(appWidgetId, spanY, widgetIdToRankMap)
verify(metricsLogger)
.logResizeWidget(
componentName = componentName.flattenToString(),
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt
index 85155157eda2..799054a92bee 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/view/viewmodel/CommunalViewModelTest.kt
@@ -78,6 +78,7 @@ import com.android.systemui.kosmos.testScope
import com.android.systemui.log.logcatLogBuffer
import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
import com.android.systemui.media.controls.ui.controller.mediaCarouselController
+import com.android.systemui.media.controls.ui.view.MediaCarouselScrollHandler
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
import com.android.systemui.power.domain.interactor.powerInteractor
@@ -120,6 +121,7 @@ import platform.test.runner.parameterized.Parameters
@RunWith(ParameterizedAndroidJunit4::class)
class CommunalViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
@Mock private lateinit var mediaHost: MediaHost
+ @Mock private lateinit var mediaCarouselScrollHandler: MediaCarouselScrollHandler
@Mock private lateinit var metricsLogger: CommunalMetricsLogger
private val kosmos = testKosmos()
@@ -161,6 +163,8 @@ class CommunalViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
kosmos.fakeUserTracker.set(userInfos = listOf(MAIN_USER_INFO), selectedUserIndex = 0)
whenever(mediaHost.visible).thenReturn(true)
+ whenever(kosmos.mediaCarouselController.mediaCarouselScrollHandler)
+ .thenReturn(mediaCarouselScrollHandler)
kosmos.powerInteractor.setAwakeForTest()
@@ -187,6 +191,7 @@ class CommunalViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
metricsLogger,
kosmos.mediaCarouselController,
kosmos.blurConfig,
+ false,
)
}
@@ -903,6 +908,20 @@ class CommunalViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
}
@Test
+ fun onShowPreviousMedia_scrollHandler_isCalled() =
+ testScope.runTest {
+ underTest.onShowPreviousMedia()
+ verify(mediaCarouselScrollHandler).scrollByStep(-1)
+ }
+
+ @Test
+ fun onShowNextMedia_scrollHandler_isCalled() =
+ testScope.runTest {
+ underTest.onShowNextMedia()
+ verify(mediaCarouselScrollHandler).scrollByStep(1)
+ }
+
+ @Test
@EnableFlags(FLAG_BOUNCER_UI_REVAMP)
fun uiIsBlurred_whenPrimaryBouncerIsShowing() =
testScope.runTest {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorTest.kt
index 329627af8ec2..e36d2455d316 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryFaceAuthInteractorTest.kt
@@ -61,6 +61,7 @@ import com.android.systemui.user.data.model.SelectionStatus
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.util.mockito.eq
import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.TestScope
@@ -73,6 +74,7 @@ import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
+@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
@@ -80,21 +82,26 @@ class DeviceEntryFaceAuthInteractorTest : SysuiTestCase() {
private val testScope: TestScope = kosmos.testScope
private lateinit var underTest: SystemUIDeviceEntryFaceAuthInteractor
+
private val bouncerRepository = kosmos.fakeKeyguardBouncerRepository
private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
- private val keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor
private val faceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository
private val fakeUserRepository = kosmos.fakeUserRepository
private val facePropertyRepository = kosmos.facePropertyRepository
- private val fakeDeviceEntryFingerprintAuthInteractor =
- kosmos.deviceEntryFingerprintAuthInteractor
- private val powerInteractor = kosmos.powerInteractor
private val fakeBiometricSettingsRepository = kosmos.fakeBiometricSettingsRepository
- private val keyguardUpdateMonitor = kosmos.keyguardUpdateMonitor
+ private val keyguardUpdateMonitor by lazy { kosmos.keyguardUpdateMonitor }
private val faceWakeUpTriggersConfig = kosmos.fakeFaceWakeUpTriggersConfig
private val trustManager = kosmos.trustManager
- private val deviceEntryFaceAuthStatusInteractor = kosmos.deviceEntryFaceAuthStatusInteractor
+
+ private val keyguardTransitionInteractor by lazy { kosmos.keyguardTransitionInteractor }
+ private val fakeDeviceEntryFingerprintAuthInteractor by lazy {
+ kosmos.deviceEntryFingerprintAuthInteractor
+ }
+ private val powerInteractor by lazy { kosmos.powerInteractor }
+ private val deviceEntryFaceAuthStatusInteractor by lazy {
+ kosmos.deviceEntryFaceAuthStatusInteractor
+ }
@Before
fun setup() {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialNotificationCoordinatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialNotificationCoordinatorTest.kt
index e0082dadee26..ff5fa3959c6d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialNotificationCoordinatorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialNotificationCoordinatorTest.kt
@@ -18,6 +18,7 @@ package com.android.systemui.inputdevice.tutorial.domain.interactor
import android.app.Notification
import android.app.NotificationManager
+import android.service.notification.StatusBarNotification
import androidx.annotation.StringRes
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -28,6 +29,7 @@ import com.android.systemui.inputdevice.tutorial.ui.TutorialNotificationCoordina
import com.android.systemui.keyboard.data.repository.FakeKeyboardRepository
import com.android.systemui.kosmos.backgroundScope
import com.android.systemui.kosmos.testScope
+import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.res.R
import com.android.systemui.settings.userTracker
import com.android.systemui.statusbar.commandline.commandRegistry
@@ -35,6 +37,7 @@ import com.android.systemui.testKosmos
import com.android.systemui.touchpad.data.repository.FakeTouchpadRepository
import com.google.common.truth.Truth.assertThat
import kotlin.time.Duration.Companion.hours
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runTest
import org.junit.Before
@@ -44,23 +47,29 @@ import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.Captor
import org.mockito.Mock
+import org.mockito.Mockito.times
import org.mockito.junit.MockitoJUnit
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
+import org.mockito.kotlin.firstValue
import org.mockito.kotlin.never
+import org.mockito.kotlin.secondValue
import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class TutorialNotificationCoordinatorTest : SysuiTestCase() {
private lateinit var underTest: TutorialNotificationCoordinator
- private val kosmos = testKosmos()
+ private val kosmos = testKosmos().useUnconfinedTestDispatcher()
private val testScope = kosmos.testScope
private val keyboardRepository = FakeKeyboardRepository()
private val touchpadRepository = FakeTouchpadRepository()
private lateinit var repository: TutorialSchedulerRepository
@Mock private lateinit var notificationManager: NotificationManager
+ @Mock private lateinit var notification: StatusBarNotification
@Captor private lateinit var notificationCaptor: ArgumentCaptor<Notification>
@get:Rule val rule = MockitoJUnit.rule()
@@ -107,6 +116,7 @@ class TutorialNotificationCoordinatorTest : SysuiTestCase() {
fun showTouchpadNotification() = runTestAndClear {
touchpadRepository.setIsAnyTouchpadConnected(true)
testScope.advanceTimeBy(LAUNCH_DELAY)
+ mockExistingNotification()
verifyNotification(
R.string.launch_touchpad_tutorial_notification_title,
R.string.launch_touchpad_tutorial_notification_content,
@@ -131,6 +141,45 @@ class TutorialNotificationCoordinatorTest : SysuiTestCase() {
.notifyAsUser(eq(TAG), eq(NOTIFICATION_ID), any(), any())
}
+ @Test
+ fun showKeyboardNotificationThenDisconnectKeyboard() = runTestAndClear {
+ keyboardRepository.setIsAnyKeyboardConnected(true)
+ testScope.advanceTimeBy(LAUNCH_DELAY)
+ verifyNotification(
+ R.string.launch_keyboard_tutorial_notification_title,
+ R.string.launch_keyboard_tutorial_notification_content,
+ )
+ mockExistingNotification()
+
+ // After the keyboard is disconnected, i.e. there is nothing connected, the notification
+ // should be cancelled
+ keyboardRepository.setIsAnyKeyboardConnected(false)
+ verify(notificationManager).cancelAsUser(eq(TAG), eq(NOTIFICATION_ID), any())
+ }
+
+ @Test
+ fun showKeyboardTouchpadNotificationThenDisconnectKeyboard() = runTestAndClear {
+ keyboardRepository.setIsAnyKeyboardConnected(true)
+ touchpadRepository.setIsAnyTouchpadConnected(true)
+ testScope.advanceTimeBy(LAUNCH_DELAY)
+ mockExistingNotification()
+ keyboardRepository.setIsAnyKeyboardConnected(false)
+
+ verify(notificationManager, times(2))
+ .notifyAsUser(eq(TAG), eq(NOTIFICATION_ID), notificationCaptor.capture(), any())
+ // Connect both device and the first notification is for both
+ notificationCaptor.firstValue.verify(
+ R.string.launch_keyboard_touchpad_tutorial_notification_title,
+ R.string.launch_keyboard_touchpad_tutorial_notification_content,
+ )
+ // After the keyboard is disconnected, i.e. with only the touchpad left, the notification
+ // should be update to the one for only touchpad
+ notificationCaptor.secondValue.verify(
+ R.string.launch_touchpad_tutorial_notification_title,
+ R.string.launch_touchpad_tutorial_notification_content,
+ )
+ }
+
private fun runTestAndClear(block: suspend () -> Unit) =
testScope.runTest {
try {
@@ -140,12 +189,21 @@ class TutorialNotificationCoordinatorTest : SysuiTestCase() {
}
}
+ // Assume that there's an existing notification when the updater checks activeNotifications
+ private fun mockExistingNotification() {
+ whenever(notification.id).thenReturn(NOTIFICATION_ID)
+ whenever(notificationManager.activeNotifications).thenReturn(arrayOf(notification))
+ }
+
private fun verifyNotification(@StringRes titleResId: Int, @StringRes contentResId: Int) {
verify(notificationManager)
.notifyAsUser(eq(TAG), eq(NOTIFICATION_ID), notificationCaptor.capture(), any())
- val notification = notificationCaptor.value
- val actualTitle = notification.getString(Notification.EXTRA_TITLE)
- val actualContent = notification.getString(Notification.EXTRA_TEXT)
+ notificationCaptor.value.verify(titleResId, contentResId)
+ }
+
+ private fun Notification.verify(@StringRes titleResId: Int, @StringRes contentResId: Int) {
+ val actualTitle = getString(Notification.EXTRA_TITLE)
+ val actualContent = getString(Notification.EXTRA_TEXT)
assertThat(actualTitle).isEqualTo(context.getString(titleResId))
assertThat(actualContent).isEqualTo(context.getString(contentResId))
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
index 7e93f5a8c9a8..9be786fab34d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt
@@ -25,7 +25,6 @@ import android.service.dream.dreamManager
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
import com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR
import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
@@ -39,7 +38,6 @@ import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository
import com.android.systemui.communal.domain.interactor.setCommunalAvailable
import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnabled
import com.android.systemui.communal.shared.model.CommunalScenes
-import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
@@ -70,7 +68,6 @@ import junit.framework.Assert.assertEquals
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.advanceTimeBy
-import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -103,10 +100,7 @@ class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiT
@JvmStatic
@Parameters(name = "{0}")
fun getParams(): List<FlagsParameterization> {
- return FlagsParameterization.allCombinationsOf(
- FLAG_COMMUNAL_SCENE_KTF_REFACTOR,
- FLAG_GLANCEABLE_HUB_V2,
- )
+ return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
}
}
@@ -174,22 +168,6 @@ class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiT
@Test
@EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR)
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_GLANCEABLE_HUB_V2)
- fun testTransitionToLockscreen_onWake_canDream_glanceableHubAvailable() =
- kosmos.runTest {
- whenever(dreamManager.canStartDreaming(anyBoolean())).thenReturn(true)
- setCommunalAvailable(true)
-
- powerInteractor.setAwakeForTest()
-
- // If dreaming is possible and communal is available, then we should transition to
- // GLANCEABLE_HUB when waking up due to power button press.
- assertThat(transitionRepository)
- .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.GLANCEABLE_HUB)
- }
-
- @Test
- @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR, FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
fun testTransitionToLockscreen_onWake_canDream_ktfRefactor() =
kosmos.runTest {
setCommunalAvailable(true)
@@ -243,24 +221,7 @@ class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiT
}
@Test
- @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR)
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun testTransitionToGlanceableHub_onWakeup_ifIdleOnCommunal_noOccludingActivity() =
- kosmos.runTest {
- fakeCommunalSceneRepository.setTransitionState(
- flowOf(ObservableTransitionState.Idle(CommunalScenes.Communal))
- )
-
- powerInteractor.setAwakeForTest()
-
- // Under default conditions, we should transition to LOCKSCREEN when waking up.
- assertThat(transitionRepository)
- .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.GLANCEABLE_HUB)
- }
-
- @Test
@DisableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR, FLAG_SCENE_CONTAINER)
- @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
fun testTransitionToGlanceableHub_onWakeup_ifAvailable() =
kosmos.runTest {
setCommunalAvailable(true)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt
index 5882cff74eb6..898a5c1863df 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorTest.kt
@@ -23,7 +23,6 @@ import android.provider.Settings
import android.service.dream.dreamManager
import androidx.test.filters.SmallTest
import com.android.systemui.Flags
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
import com.android.systemui.Flags.glanceableHubV2
import com.android.systemui.SysuiTestCase
@@ -74,10 +73,7 @@ class FromDreamingTransitionInteractorTest(flags: FlagsParameterization?) : Sysu
@JvmStatic
@Parameters(name = "{0}")
fun getParams(): List<FlagsParameterization> {
- return FlagsParameterization.allCombinationsOf(
- FLAG_COMMUNAL_SCENE_KTF_REFACTOR,
- FLAG_GLANCEABLE_HUB_V2,
- )
+ return FlagsParameterization.allCombinationsOf(FLAG_GLANCEABLE_HUB_V2)
.andSceneContainer()
}
}
@@ -202,7 +198,6 @@ class FromDreamingTransitionInteractorTest(flags: FlagsParameterization?) : Sysu
}
@Test
- @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
@DisableFlags(Flags.FLAG_SCENE_CONTAINER)
fun testTransitionToGlanceableHubOnWake() =
kosmos.runTest {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt
index 63ed0402b633..9a8e0952e433 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractorTest.kt
@@ -32,16 +32,11 @@
package com.android.systemui.keyguard.domain.interactor
-import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.compose.animation.scene.ObservableTransitionState
import com.android.systemui.Flags
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
import com.android.systemui.SysuiTestCase
-import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository
-import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy
import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository
import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
@@ -51,7 +46,6 @@ import com.android.systemui.kosmos.testScope
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.testKosmos
-import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
@@ -101,21 +95,4 @@ class FromOccludedTransitionInteractorTest : SysuiTestCase() {
assertThat(transitionRepository)
.startedTransition(from = KeyguardState.OCCLUDED, to = KeyguardState.LOCKSCREEN)
}
-
- @Test
- @EnableFlags(Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR)
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun testShowWhenLockedActivity_noLongerOnTop_transitionsToGlanceableHub_ifIdleOnCommunal() =
- testScope.runTest {
- kosmos.fakeCommunalSceneRepository.setTransitionState(
- flowOf(ObservableTransitionState.Idle(CommunalScenes.Communal))
- )
- runCurrent()
-
- kosmos.keyguardOcclusionRepository.setShowWhenLockedActivityInfo(onTop = false)
- runCurrent()
-
- assertThat(transitionRepository)
- .startedTransition(from = KeyguardState.OCCLUDED, to = KeyguardState.GLANCEABLE_HUB)
- }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt
index 29e95cd911f8..fee2dfc88020 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt
@@ -46,6 +46,7 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import junit.framework.Assert.assertEquals
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
@@ -53,13 +54,15 @@ import org.junit.Assert.assertThrows
import org.junit.Test
import org.junit.runner.RunWith
+@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class KeyguardTransitionInteractorTest : SysuiTestCase() {
val kosmos = testKosmos()
- val underTest = kosmos.keyguardTransitionInteractor
- val repository = kosmos.fakeKeyguardTransitionRepository
val testScope = kosmos.testScope
+ val repository = kosmos.fakeKeyguardTransitionRepository
+
+ val underTest by lazy { kosmos.keyguardTransitionInteractor }
@Test
fun transitionCollectorsReceivesOnlyAppropriateEvents() =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
index d057f7a0e8f2..a090faba5bf7 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt
@@ -17,7 +17,6 @@
package com.android.systemui.keyguard.domain.interactor
import android.app.StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP
-import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.FlagsParameterization
import androidx.test.filters.SmallTest
@@ -26,7 +25,6 @@ import com.android.keyguard.KeyguardSecurityModel
import com.android.keyguard.KeyguardSecurityModel.SecurityMode.PIN
import com.android.systemui.Flags
import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
-import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_V2
import com.android.systemui.Flags.glanceableHubV2
import com.android.systemui.SysuiTestCase
@@ -135,8 +133,7 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
@JvmStatic
@Parameters(name = "{0}")
fun getParams(): List<FlagsParameterization> {
- return FlagsParameterization.allCombinationsOf(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- .andSceneContainer()
+ return FlagsParameterization.allCombinationsOf().andSceneContainer()
}
}
@@ -468,38 +465,6 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
@Test
@DisableSceneContainer
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun dozingToGlanceableHub() =
- testScope.runTest {
- // GIVEN a prior transition has run to DOZING
- runTransitionAndSetWakefulness(KeyguardState.GLANCEABLE_HUB, KeyguardState.DOZING)
- runCurrent()
-
- // GIVEN the device is idle on the glanceable hub
- val idleTransitionState =
- MutableStateFlow<ObservableTransitionState>(
- ObservableTransitionState.Idle(CommunalScenes.Communal)
- )
- communalInteractor.setTransitionState(idleTransitionState)
- runCurrent()
-
- // WHEN the device begins to wake
- keyguardRepository.setKeyguardShowing(true)
- powerInteractor.setAwakeForTest()
- advanceTimeBy(60L)
-
- assertThat(transitionRepository)
- .startedTransition(
- from = KeyguardState.DOZING,
- to = KeyguardState.GLANCEABLE_HUB,
- animatorAssertion = { it.isNotNull() },
- )
-
- coroutineContext.cancelChildren()
- }
-
- @Test
- @DisableSceneContainer
fun goneToDozing() =
testScope.runTest {
// GIVEN a device with AOD not available
@@ -625,40 +590,6 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
@Test
@BrokenWithSceneContainer(339465026)
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun goneToGlanceableHub() =
- testScope.runTest {
- // GIVEN a prior transition has run to GONE
- runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GONE)
-
- // GIVEN the device is idle on the glanceable hub
- val idleTransitionState =
- MutableStateFlow<ObservableTransitionState>(
- ObservableTransitionState.Idle(CommunalScenes.Communal)
- )
- communalInteractor.setTransitionState(idleTransitionState)
- runCurrent()
-
- // WHEN the keyguard starts to show
- keyguardRepository.setKeyguardShowing(true)
- runCurrent()
-
- assertThat(transitionRepository)
- .startedTransition(
- to = KeyguardState.GLANCEABLE_HUB,
- from = KeyguardState.GONE,
- ownerName =
- FromGoneTransitionInteractor::class.simpleName +
- "(keyguard interactor says keyguard is showing)",
- animatorAssertion = { it.isNotNull() },
- )
-
- coroutineContext.cancelChildren()
- }
-
- @Test
- @BrokenWithSceneContainer(339465026)
- @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
fun goneToGlanceableHub_communalKtfRefactor() =
testScope.runTest {
// GIVEN a prior transition has run to GONE
@@ -1070,84 +1001,6 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
@Test
@BrokenWithSceneContainer(339465026)
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun occludedToGlanceableHub() =
- testScope.runTest {
- // GIVEN a device on lockscreen
- keyguardRepository.setKeyguardShowing(true)
- runCurrent()
-
- // GIVEN the device is idle on the glanceable hub
- val idleTransitionState =
- MutableStateFlow<ObservableTransitionState>(
- ObservableTransitionState.Idle(CommunalScenes.Communal)
- )
- communalInteractor.setTransitionState(idleTransitionState)
- runCurrent()
-
- // GIVEN a prior transition has run to OCCLUDED
- runTransitionAndSetWakefulness(KeyguardState.GLANCEABLE_HUB, KeyguardState.OCCLUDED)
- keyguardRepository.setKeyguardOccluded(true)
- runCurrent()
-
- // WHEN occlusion ends
- keyguardRepository.setKeyguardOccluded(false)
- runCurrent()
-
- // THEN a transition to GLANCEABLE_HUB should occur
- assertThat(transitionRepository)
- .startedTransition(
- ownerName = FromOccludedTransitionInteractor::class.simpleName,
- from = KeyguardState.OCCLUDED,
- to = KeyguardState.GLANCEABLE_HUB,
- animatorAssertion = { it.isNotNull() },
- )
-
- coroutineContext.cancelChildren()
- }
-
- @Test
- @BrokenWithSceneContainer(339465026)
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun occludedToGlanceableHubWhenInitiallyOnHub() =
- testScope.runTest {
- // GIVEN a device on lockscreen and communal is available
- keyguardRepository.setKeyguardShowing(true)
- kosmos.setCommunalAvailable(true)
- runCurrent()
-
- // GIVEN a prior transition has run to OCCLUDED from GLANCEABLE_HUB
- runTransitionAndSetWakefulness(KeyguardState.GLANCEABLE_HUB, KeyguardState.OCCLUDED)
- keyguardRepository.setKeyguardOccluded(true)
- runCurrent()
-
- // GIVEN on blank scene
- val idleTransitionState =
- MutableStateFlow<ObservableTransitionState>(
- ObservableTransitionState.Idle(CommunalScenes.Blank)
- )
- communalInteractor.setTransitionState(idleTransitionState)
- runCurrent()
-
- // WHEN occlusion ends
- keyguardRepository.setKeyguardOccluded(false)
- runCurrent()
-
- // THEN a transition to GLANCEABLE_HUB should occur
- assertThat(transitionRepository)
- .startedTransition(
- ownerName = FromOccludedTransitionInteractor::class.simpleName,
- from = KeyguardState.OCCLUDED,
- to = KeyguardState.GLANCEABLE_HUB,
- animatorAssertion = { it.isNotNull() },
- )
-
- coroutineContext.cancelChildren()
- }
-
- @Test
- @BrokenWithSceneContainer(339465026)
- @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
fun occludedToGlanceableHub_communalKtfRefactor() =
testScope.runTest {
// GIVEN a device on lockscreen and communal is available
@@ -1390,48 +1243,6 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
@Test
@DisableSceneContainer
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun dreamingToGlanceableHub() =
- testScope.runTest {
- // GIVEN a prior transition has run to DREAMING
- keyguardRepository.setDreaming(true)
- runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.DREAMING)
- runCurrent()
-
- // WHEN a transition to the glanceable hub starts
- val currentScene = CommunalScenes.Blank
- val targetScene = CommunalScenes.Communal
-
- val progress = MutableStateFlow(0f)
- val transitionState =
- MutableStateFlow<ObservableTransitionState>(
- ObservableTransitionState.Transition(
- fromScene = currentScene,
- toScene = targetScene,
- currentScene = flowOf(targetScene),
- progress = progress,
- isInitiatedByUserInput = false,
- isUserInputOngoing = flowOf(false),
- )
- )
- communalInteractor.setTransitionState(transitionState)
- progress.value = .1f
- runCurrent()
-
- assertThat(transitionRepository)
- .startedTransition(
- ownerName = FromDreamingTransitionInteractor::class.simpleName,
- from = KeyguardState.DREAMING,
- to = KeyguardState.GLANCEABLE_HUB,
- animatorAssertion = { it.isNull() }, // transition should be manually animated
- )
-
- coroutineContext.cancelChildren()
- }
-
- @Test
- @DisableSceneContainer
- @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
fun dreamingToGlanceableHub_communalKtfRefactor() =
testScope.runTest {
// GIVEN a prior transition has run to DREAMING
@@ -1596,66 +1407,6 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
@Test
@DisableSceneContainer
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun lockscreenToGlanceableHub() =
- testScope.runTest {
- // GIVEN a prior transition has run to LOCKSCREEN
- runTransitionAndSetWakefulness(KeyguardState.AOD, KeyguardState.LOCKSCREEN)
- runCurrent()
-
- // WHEN a glanceable hub transition starts
- val currentScene = CommunalScenes.Blank
- val targetScene = CommunalScenes.Communal
-
- val progress = MutableStateFlow(0f)
- val transitionState =
- MutableStateFlow<ObservableTransitionState>(
- ObservableTransitionState.Transition(
- fromScene = currentScene,
- toScene = targetScene,
- currentScene = flowOf(targetScene),
- progress = progress,
- isInitiatedByUserInput = false,
- isUserInputOngoing = flowOf(false),
- )
- )
- communalInteractor.setTransitionState(transitionState)
- progress.value = .1f
- runCurrent()
-
- // THEN a transition from LOCKSCREEN => GLANCEABLE_HUB should occur
- assertThat(transitionRepository)
- .startedTransition(
- ownerName = FromLockscreenTransitionInteractor::class.simpleName,
- from = KeyguardState.LOCKSCREEN,
- to = KeyguardState.GLANCEABLE_HUB,
- animatorAssertion = { it.isNull() }, // transition should be manually animated
- )
-
- // WHEN the user stops dragging and the glanceable hub opening is cancelled
- clearInvocations(transitionRepository)
- runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GLANCEABLE_HUB)
- val idleTransitionState =
- MutableStateFlow<ObservableTransitionState>(
- ObservableTransitionState.Idle(currentScene)
- )
- communalInteractor.setTransitionState(idleTransitionState)
- runCurrent()
-
- // THEN a transition from LOCKSCREEN => GLANCEABLE_HUB should occur
- assertThat(transitionRepository)
- .startedTransition(
- ownerName = FromLockscreenTransitionInteractor::class.simpleName,
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.LOCKSCREEN,
- )
-
- coroutineContext.cancelChildren()
- }
-
- @Test
- @DisableSceneContainer
- @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
fun lockscreenToGlanceableHub_communalKtfRefactor() =
testScope.runTest {
// GIVEN a prior transition has run to LOCKSCREEN
@@ -1696,86 +1447,6 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
@Test
@DisableSceneContainer
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun glanceableHubToLockscreen() =
- testScope.runTest {
- // GIVEN a prior transition has run to GLANCEABLE_HUB
- runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GLANCEABLE_HUB)
- runCurrent()
-
- // WHEN a transition away from glanceable hub starts
- val currentScene = CommunalScenes.Communal
- val targetScene = CommunalScenes.Blank
-
- val progress = MutableStateFlow(0f)
- val transitionState =
- MutableStateFlow<ObservableTransitionState>(
- ObservableTransitionState.Transition(
- fromScene = currentScene,
- toScene = targetScene,
- currentScene = flowOf(targetScene),
- progress = progress,
- isInitiatedByUserInput = false,
- isUserInputOngoing = flowOf(false),
- )
- )
- communalInteractor.setTransitionState(transitionState)
- progress.value = .1f
- runCurrent()
-
- assertThat(transitionRepository)
- .startedTransition(
- ownerName = FromGlanceableHubTransitionInteractor::class.simpleName,
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.LOCKSCREEN,
- animatorAssertion = { it.isNull() }, // transition should be manually animated
- )
-
- // WHEN the user stops dragging and the glanceable hub closing is cancelled
- clearInvocations(transitionRepository)
- runTransitionAndSetWakefulness(KeyguardState.GLANCEABLE_HUB, KeyguardState.LOCKSCREEN)
- val idleTransitionState =
- MutableStateFlow<ObservableTransitionState>(
- ObservableTransitionState.Idle(currentScene)
- )
- communalInteractor.setTransitionState(idleTransitionState)
- runCurrent()
-
- assertThat(transitionRepository)
- .startedTransition(
- from = KeyguardState.LOCKSCREEN,
- to = KeyguardState.GLANCEABLE_HUB,
- )
-
- coroutineContext.cancelChildren()
- }
-
- @Test
- @DisableSceneContainer
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun glanceableHubToDozing() =
- testScope.runTest {
- // GIVEN a prior transition has run to GLANCEABLE_HUB
- runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GLANCEABLE_HUB)
-
- // WHEN the device begins to sleep
- powerInteractor.setAsleepForTest()
- runCurrent()
-
- assertThat(transitionRepository)
- .startedTransition(
- ownerName = FromGlanceableHubTransitionInteractor::class.simpleName,
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.DOZING,
- animatorAssertion = { it.isNotNull() },
- )
-
- coroutineContext.cancelChildren()
- }
-
- @Test
- @DisableSceneContainer
- @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
fun glanceableHubToDozing_communalKtfRefactor() =
testScope.runTest {
// GIVEN a prior transition has run to GLANCEABLE_HUB
@@ -1844,39 +1515,6 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
@Test
@BrokenWithSceneContainer(339465026)
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun glanceableHubToOccluded() =
- testScope.runTest {
- // GIVEN a prior transition has run to GLANCEABLE_HUB
- runTransitionAndSetWakefulness(KeyguardState.GONE, KeyguardState.GLANCEABLE_HUB)
- runCurrent()
-
- // GIVEN the device is idle on the glanceable hub
- val idleTransitionState =
- MutableStateFlow<ObservableTransitionState>(
- ObservableTransitionState.Idle(CommunalScenes.Communal)
- )
- communalInteractor.setTransitionState(idleTransitionState)
- runCurrent()
-
- // WHEN the keyguard is occluded
- keyguardRepository.setKeyguardOccluded(true)
- runCurrent()
-
- assertThat(transitionRepository)
- .startedTransition(
- ownerName = FromGlanceableHubTransitionInteractor::class.simpleName,
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.OCCLUDED,
- animatorAssertion = { it.isNotNull() },
- )
-
- coroutineContext.cancelChildren()
- }
-
- @Test
- @BrokenWithSceneContainer(339465026)
- @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
fun glanceableHubToOccluded_communalKtfRefactor() =
testScope.runTest {
// GIVEN device is not dreaming
@@ -1905,30 +1543,6 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
@Test
@DisableSceneContainer
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun glanceableHubToGone() =
- testScope.runTest {
- // GIVEN a prior transition has run to GLANCEABLE_HUB
- runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GLANCEABLE_HUB)
-
- // WHEN keyguard goes away
- keyguardRepository.setKeyguardGoingAway(true)
- runCurrent()
-
- assertThat(transitionRepository)
- .startedTransition(
- ownerName = FromGlanceableHubTransitionInteractor::class.simpleName,
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.GONE,
- animatorAssertion = { it.isNotNull() },
- )
-
- coroutineContext.cancelChildren()
- }
-
- @Test
- @DisableSceneContainer
- @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
fun glanceableHubToGone_communalKtfRefactor() =
testScope.runTest {
// GIVEN a prior transition has run to GLANCEABLE_HUB
@@ -1953,7 +1567,7 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
@Test
@DisableSceneContainer
- @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_GLANCEABLE_HUB_V2)
+ @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
fun glanceableHubToDreaming_v2() =
testScope.runTest {
kosmos.setCommunalV2Enabled(true)
@@ -1985,55 +1599,7 @@ class KeyguardTransitionScenariosTest(flags: FlagsParameterization?) : SysuiTest
}
@Test
- @DisableSceneContainer
- @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
- fun glanceableHubToDreaming() =
- testScope.runTest {
- runCurrent()
-
- // GIVEN that we are dreaming and not dozing
- keyguardRepository.setDreaming(true)
- keyguardRepository.setDozeTransitionModel(
- DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH)
- )
- advanceTimeBy(600L)
-
- // GIVEN a prior transition has run to GLANCEABLE_HUB
- runTransitionAndSetWakefulness(KeyguardState.DREAMING, KeyguardState.GLANCEABLE_HUB)
- runCurrent()
-
- // WHEN a transition away from glanceable hub starts
- val currentScene = CommunalScenes.Communal
- val targetScene = CommunalScenes.Blank
-
- val transitionState =
- MutableStateFlow<ObservableTransitionState>(
- ObservableTransitionState.Transition(
- fromScene = currentScene,
- toScene = targetScene,
- currentScene = flowOf(targetScene),
- progress = flowOf(0f, 0.1f),
- isInitiatedByUserInput = false,
- isUserInputOngoing = flowOf(false),
- )
- )
- communalSceneInteractor.setTransitionState(transitionState)
- runCurrent()
-
- assertThat(transitionRepository)
- .startedTransition(
- ownerName = FromGlanceableHubTransitionInteractor::class.simpleName,
- from = KeyguardState.GLANCEABLE_HUB,
- to = KeyguardState.DREAMING,
- animatorAssertion = { it.isNull() }, // transition should be manually animated
- )
-
- coroutineContext.cancelChildren()
- }
-
- @Test
@BrokenWithSceneContainer(339465026)
- @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
fun glanceableHubToOccludedDoesNotTriggerWhenDreamStateChanges_communalKtfRefactor() =
testScope.runTest {
// GIVEN that we are dreaming and not dozing
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt
index a0fed6bbfc2c..0ec3173ebb2a 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt
@@ -57,9 +57,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
duration = 1000.milliseconds,
edge = Edge.create(from = Scenes.Gone, to = DREAMING),
)
- .setupWithoutSceneContainer(
- edge = Edge.create(from = GONE, to = DREAMING),
- )
+ .setupWithoutSceneContainer(edge = Edge.create(from = GONE, to = DREAMING))
}
@Test(expected = IllegalArgumentException::class)
@@ -75,7 +73,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
underTest.sharedFlow(
startTime = 300.milliseconds,
duration = 800.milliseconds,
- onStep = { it }
+ onStep = { it },
)
}
@@ -112,6 +110,17 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
}
@Test
+ fun onStepReturnsNullEmitsNothing() =
+ testScope.runTest {
+ val flow = underTest.sharedFlow(duration = 100.milliseconds, onStep = { null })
+ var animationValues = collectLastValue(flow)
+ runCurrent()
+
+ repository.sendTransitionStep(step(0.5f, TransitionState.RUNNING))
+ assertThat(animationValues()).isNull()
+ }
+
+ @Test
fun usesStartTime() =
testScope.runTest {
val flow =
@@ -166,11 +175,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
@Test
fun usesOnStepToDoubleValue() =
testScope.runTest {
- val flow =
- underTest.sharedFlow(
- duration = 1000.milliseconds,
- onStep = { it * 2 },
- )
+ val flow = underTest.sharedFlow(duration = 1000.milliseconds, onStep = { it * 2 })
val animationValues by collectLastValue(flow)
runCurrent()
@@ -190,10 +195,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
fun usesOnStepToDoubleValueWithState() =
testScope.runTest {
val flow =
- underTest.sharedFlowWithState(
- duration = 1000.milliseconds,
- onStep = { it * 2 },
- )
+ underTest.sharedFlowWithState(duration = 1000.milliseconds, onStep = { it * 2 })
val animationValues by collectLastValue(flow)
runCurrent()
@@ -204,7 +206,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
from = GONE,
to = DREAMING,
transitionState = TransitionState.STARTED,
- value = 0f
+ value = 0f,
)
)
repository.sendTransitionStep(step(0.3f, TransitionState.RUNNING))
@@ -214,7 +216,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
from = GONE,
to = DREAMING,
transitionState = TransitionState.RUNNING,
- value = 0.6f
+ value = 0.6f,
)
)
repository.sendTransitionStep(step(0.6f, TransitionState.RUNNING))
@@ -224,7 +226,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
from = GONE,
to = DREAMING,
transitionState = TransitionState.RUNNING,
- value = 1.2f
+ value = 1.2f,
)
)
repository.sendTransitionStep(step(0.8f, TransitionState.RUNNING))
@@ -234,7 +236,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
from = GONE,
to = DREAMING,
transitionState = TransitionState.RUNNING,
- value = 1.6f
+ value = 1.6f,
)
)
repository.sendTransitionStep(step(1f, TransitionState.RUNNING))
@@ -244,7 +246,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
from = GONE,
to = DREAMING,
transitionState = TransitionState.RUNNING,
- value = 2f
+ value = 2f,
)
)
repository.sendTransitionStep(step(1f, TransitionState.FINISHED))
@@ -254,7 +256,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
from = GONE,
to = DREAMING,
transitionState = TransitionState.FINISHED,
- value = null
+ value = null,
)
)
}
@@ -262,11 +264,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
@Test
fun sameFloatValueWithTheSameTransitionStateDoesNotEmitTwice() =
testScope.runTest {
- val flow =
- underTest.sharedFlow(
- duration = 1000.milliseconds,
- onStep = { it },
- )
+ val flow = underTest.sharedFlow(duration = 1000.milliseconds, onStep = { it })
val values by collectValues(flow)
runCurrent()
@@ -280,11 +278,7 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
@Test
fun sameFloatValueWithADifferentTransitionStateDoesEmitTwice() =
testScope.runTest {
- val flow =
- underTest.sharedFlow(
- duration = 1000.milliseconds,
- onStep = { it },
- )
+ val flow = underTest.sharedFlow(duration = 1000.milliseconds, onStep = { it })
val values by collectValues(flow)
runCurrent()
@@ -302,14 +296,14 @@ class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
private fun step(
value: Float,
- state: TransitionState = TransitionState.RUNNING
+ state: TransitionState = TransitionState.RUNNING,
): TransitionStep {
return TransitionStep(
from = GONE,
to = DREAMING,
value = value,
transitionState = state,
- ownerName = "GoneToDreamingTransitionViewModelTest"
+ ownerName = "GoneToDreamingTransitionViewModelTest",
)
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt
index c8fade3fbf01..6648ae21edc6 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModelTest.kt
@@ -24,6 +24,7 @@ import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
+import com.android.systemui.keyguard.shared.model.TransitionState.FINISHED
import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING
import com.android.systemui.keyguard.shared.model.TransitionState.STARTED
import com.android.systemui.keyguard.shared.model.TransitionStep
@@ -63,7 +64,15 @@ class DeviceEntryBackgroundViewModelTest : SysuiTestCase() {
)
runCurrent()
- assertThat(alpha).isEqualTo(0.0f)
+ assertThat(alpha).isEqualTo(1.0f)
+
+ kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
+ listOf(lockscreenToDozing(1f, FINISHED)),
+ testScope,
+ )
+ runCurrent()
+
+ assertThat(alpha).isEqualTo(0f)
}
private fun lockscreenToDozing(value: Float, state: TransitionState = RUNNING): TransitionStep {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt
index 47ca4b14a26f..f357d0c80822 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenUserActionsViewModelTest.kt
@@ -69,7 +69,7 @@ class LockscreenUserActionsViewModelTest : SysuiTestCase() {
@Parameters(
name =
"canSwipeToEnter={0}, downWithTwoPointers={1}, downFromEdge={2}," +
- " isSingleShade={3}, isShadeTouchable={4}, isOccluded={6}"
+ " isSingleShade={3}, isShadeTouchable={4}, isOccluded={5}"
)
@JvmStatic
fun combinations() = buildList {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandlerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandlerTest.kt
index d073cf1ac9db..c2f0ab92b32b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandlerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandlerTest.kt
@@ -16,8 +16,11 @@
package com.android.systemui.media.controls.ui.view
+import android.content.res.Resources
import android.testing.TestableLooper
import android.view.MotionEvent
+import android.view.View
+import android.view.ViewGroup
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -25,16 +28,21 @@ import com.android.systemui.media.controls.util.MediaUiEventLogger
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.PageIndicator
import com.android.systemui.util.concurrency.FakeExecutor
-import com.android.systemui.util.mockito.eq
-import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock
+import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils
+import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyFloat
import org.mockito.Mock
import org.mockito.Mockito.anyInt
+import org.mockito.Mockito.eq
+import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
@SmallTest
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@@ -42,7 +50,9 @@ import org.mockito.MockitoAnnotations
class MediaCarouselScrollHandlerTest : SysuiTestCase() {
private val carouselWidth = 1038
+ private val settingsButtonWidth = 200
private val motionEventUp = MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 0f, 0f, 0)
+ private lateinit var testableLooper: TestableLooper
@Mock lateinit var mediaCarousel: MediaScrollView
@Mock lateinit var pageIndicator: PageIndicator
@@ -53,6 +63,9 @@ class MediaCarouselScrollHandlerTest : SysuiTestCase() {
@Mock lateinit var falsingManager: FalsingManager
@Mock lateinit var logSmartspaceImpression: (Boolean) -> Unit
@Mock lateinit var logger: MediaUiEventLogger
+ @Mock lateinit var contentContainer: ViewGroup
+ @Mock lateinit var settingsButton: View
+ @Mock lateinit var resources: Resources
lateinit var executor: FakeExecutor
private val clock = FakeSystemClock()
@@ -63,6 +76,11 @@ class MediaCarouselScrollHandlerTest : SysuiTestCase() {
fun setup() {
MockitoAnnotations.initMocks(this)
executor = FakeExecutor(clock)
+ testableLooper = TestableLooper.get(this)
+ PhysicsAnimatorTestUtils.prepareForTest()
+ PhysicsAnimatorTestUtils.setAllAnimationsBlock(true)
+
+ whenever(mediaCarousel.contentContainer).thenReturn(contentContainer)
mediaCarouselScrollHandler =
MediaCarouselScrollHandler(
mediaCarousel,
@@ -74,13 +92,17 @@ class MediaCarouselScrollHandlerTest : SysuiTestCase() {
closeGuts,
falsingManager,
logSmartspaceImpression,
- logger
+ logger,
)
mediaCarouselScrollHandler.playerWidthPlusPadding = carouselWidth
-
whenever(mediaCarousel.touchListener).thenReturn(mediaCarouselScrollHandler.touchListener)
}
+ @After
+ fun tearDown() {
+ PhysicsAnimatorTestUtils.tearDown()
+ }
+
@Test
fun testCarouselScroll_shortScroll() {
whenever(mediaCarousel.isLayoutRtl).thenReturn(false)
@@ -128,4 +150,109 @@ class MediaCarouselScrollHandlerTest : SysuiTestCase() {
verify(mediaCarousel).smoothScrollTo(eq(0), anyInt())
}
+
+ @Test
+ fun testCarouselScrollByStep_scrollRight() {
+ setupMediaContainer(visibleIndex = 0)
+
+ mediaCarouselScrollHandler.scrollByStep(1)
+ clock.advanceTime(DISMISS_DELAY)
+ executor.runAllReady()
+
+ verify(mediaCarousel).smoothScrollTo(eq(carouselWidth), anyInt())
+ }
+
+ @Test
+ fun testCarouselScrollByStep_scrollLeft() {
+ setupMediaContainer(visibleIndex = 1)
+
+ mediaCarouselScrollHandler.scrollByStep(-1)
+ clock.advanceTime(DISMISS_DELAY)
+ executor.runAllReady()
+
+ verify(mediaCarousel).smoothScrollTo(eq(0), anyInt())
+ }
+
+ @Test
+ fun testCarouselScrollByStep_scrollRight_alreadyAtEnd() {
+ setupMediaContainer(visibleIndex = 1)
+
+ mediaCarouselScrollHandler.scrollByStep(1)
+ clock.advanceTime(DISMISS_DELAY)
+ executor.runAllReady()
+
+ verify(mediaCarousel, never()).smoothScrollTo(anyInt(), anyInt())
+ verify(mediaCarousel).animationTargetX = eq(-settingsButtonWidth.toFloat())
+ }
+
+ @Test
+ fun testCarouselScrollByStep_scrollLeft_alreadyAtStart() {
+ setupMediaContainer(visibleIndex = 0)
+
+ mediaCarouselScrollHandler.scrollByStep(-1)
+ clock.advanceTime(DISMISS_DELAY)
+ executor.runAllReady()
+
+ verify(mediaCarousel, never()).smoothScrollTo(anyInt(), anyInt())
+ verify(mediaCarousel).animationTargetX = eq(settingsButtonWidth.toFloat())
+ }
+
+ @Test
+ fun testCarouselScrollByStep_scrollLeft_alreadyAtStart_isRTL() {
+ setupMediaContainer(visibleIndex = 0)
+ PhysicsAnimatorTestUtils.setAllAnimationsBlock(true)
+ whenever(mediaCarousel.isLayoutRtl).thenReturn(true)
+
+ mediaCarouselScrollHandler.scrollByStep(-1)
+ clock.advanceTime(DISMISS_DELAY)
+ executor.runAllReady()
+
+ verify(mediaCarousel, never()).smoothScrollTo(anyInt(), anyInt())
+ verify(mediaCarousel).animationTargetX = eq(-settingsButtonWidth.toFloat())
+ }
+
+ @Test
+ fun testCarouselScrollByStep_scrollRight_alreadyAtEnd_isRTL() {
+ setupMediaContainer(visibleIndex = 1)
+ PhysicsAnimatorTestUtils.setAllAnimationsBlock(true)
+ whenever(mediaCarousel.isLayoutRtl).thenReturn(true)
+
+ mediaCarouselScrollHandler.scrollByStep(1)
+ clock.advanceTime(DISMISS_DELAY)
+ executor.runAllReady()
+
+ verify(mediaCarousel, never()).smoothScrollTo(anyInt(), anyInt())
+ verify(mediaCarousel).animationTargetX = eq(settingsButtonWidth.toFloat())
+ }
+
+ @Test
+ fun testScrollByStep_noScroll_notDismissible() {
+ setupMediaContainer(visibleIndex = 1, showsSettingsButton = false)
+
+ mediaCarouselScrollHandler.scrollByStep(1)
+ clock.advanceTime(DISMISS_DELAY)
+ executor.runAllReady()
+
+ verify(mediaCarousel, never()).smoothScrollTo(anyInt(), anyInt())
+ verify(mediaCarousel, never()).animationTargetX = anyFloat()
+ }
+
+ private fun setupMediaContainer(visibleIndex: Int, showsSettingsButton: Boolean = true) {
+ whenever(contentContainer.childCount).thenReturn(2)
+ val child1: View = mock()
+ val child2: View = mock()
+ whenever(child1.left).thenReturn(0)
+ whenever(child2.left).thenReturn(carouselWidth)
+ whenever(contentContainer.getChildAt(0)).thenReturn(child1)
+ whenever(contentContainer.getChildAt(1)).thenReturn(child2)
+
+ whenever(settingsButton.width).thenReturn(settingsButtonWidth)
+ whenever(settingsButton.context).thenReturn(context)
+ whenever(settingsButton.resources).thenReturn(resources)
+ whenever(settingsButton.resources.getDimensionPixelSize(anyInt())).thenReturn(20)
+ mediaCarouselScrollHandler.onSettingsButtonUpdated(settingsButton)
+
+ mediaCarouselScrollHandler.visibleMediaIndex = visibleIndex
+ mediaCarouselScrollHandler.showsSettingsButton = showsSettingsButton
+ }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
index 847044aa405e..95d9c8f4e819 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java
@@ -386,6 +386,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
verify(mMediaSwitchingController).logInteractionAdjustVolume(mMediaDevice1);
}
+ @DisableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_DEVICE_GROUPING)
@Test
public void onBindViewHolder_bindSelectableDevice_verifyView() {
List<MediaDevice> selectableDevices = new ArrayList<>();
@@ -396,10 +397,55 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
assertThat(mViewHolder.mProgressBar.getVisibility()).isEqualTo(View.GONE);
assertThat(mViewHolder.mEndTouchArea.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mViewHolder.mCheckBox.isChecked()).isFalse();
assertThat(mViewHolder.mEndClickIcon.getVisibility()).isEqualTo(View.GONE);
assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(mViewHolder.mTitleText.getText().toString()).isEqualTo(TEST_DEVICE_NAME_2);
assertThat(mViewHolder.mContainerLayout.isFocusable()).isTrue();
+
+ mViewHolder.mCheckBox.performClick();
+ verify(mMediaSwitchingController).addDeviceToPlayMedia(mMediaDevice2);
+ }
+
+ @DisableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_DEVICE_GROUPING)
+ @Test
+ public void onBindViewHolder_bindDeselectableDevice_verifyView() {
+ when(mMediaSwitchingController.getSelectedMediaDevice()).thenReturn(
+ List.of(mMediaDevice1, mMediaDevice2));
+ when(mMediaSwitchingController.getDeselectableMediaDevice()).thenReturn(
+ List.of(mMediaDevice1, mMediaDevice2));
+ mMediaOutputAdapter.onBindViewHolder(mViewHolder, 1);
+
+ assertThat(mViewHolder.mEndTouchArea.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(mViewHolder.mCheckBox.isChecked()).isTrue();
+ assertThat(mViewHolder.mEndClickIcon.getVisibility()).isEqualTo(View.GONE);
+
+ mViewHolder.mCheckBox.performClick();
+ verify(mMediaSwitchingController).removeDeviceFromPlayMedia(mMediaDevice2);
+ }
+
+ @DisableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_DEVICE_GROUPING)
+ @Test
+ public void onBindViewHolder_changingSelectedValue_doesntTriggerChangeListener() {
+ List<MediaDevice> selectableDevices = List.of(mMediaDevice2);
+ List<MediaDevice> selectedDevices = new ArrayList<>();
+ selectedDevices.add(mMediaDevice1);
+ when(mMediaSwitchingController.getSelectableMediaDevice()).thenReturn(selectableDevices);
+ when(mMediaSwitchingController.getSelectedMediaDevice()).thenReturn(selectedDevices);
+
+ // mMediaDevice2 is selected
+ mMediaOutputAdapter.onBindViewHolder(mViewHolder, 1);
+ assertThat(mViewHolder.mCheckBox.isChecked()).isFalse();
+
+ // changing the selected state programmatically (not a user click)
+ selectedDevices.add(mMediaDevice2);
+ mMediaOutputAdapter.onBindViewHolder(mViewHolder, 1);
+ assertThat(mViewHolder.mCheckBox.isChecked()).isTrue();
+
+ // The onCheckedChangeListener is not invoked
+ verify(mMediaSwitchingController, never()).addDeviceToPlayMedia(mMediaDevice2);
+ verify(mMediaSwitchingController, never()).removeDeviceFromPlayMedia(mMediaDevice2);
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt
index 896ca26e3e79..3c8857fa6e5f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt
@@ -17,11 +17,14 @@
package com.android.systemui.qs
import android.content.res.Configuration
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
import android.view.ContextThemeWrapper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.internal.logging.MetricsLogger
import com.android.internal.logging.testing.UiEventLoggerFake
+import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.haptics.qs.QSLongPressEffect
@@ -33,6 +36,7 @@ import com.android.systemui.qs.customize.QSCustomizerController
import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.res.R
import com.android.systemui.statusbar.policy.ConfigurationController
+import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController
import com.android.systemui.util.leak.RotationUtils
import javax.inject.Provider
@@ -63,6 +67,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
@Mock private lateinit var tile: QSTile
@Mock private lateinit var tileLayout: TileLayout
@Captor private lateinit var captor: ArgumentCaptor<QSPanel.OnConfigurationChangedListener>
+ @Captor private lateinit var configCaptor: ArgumentCaptor<ConfigurationListener>
@Mock private lateinit var longPressEffectProvider: Provider<QSLongPressEffect>
@Mock private lateinit var mediaCarouselInteractor: MediaCarouselInteractor
@Mock private lateinit var configurationController: ConfigurationController
@@ -135,7 +140,8 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
}
@Test
- fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed() {
+ @DisableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
+ fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed_old() {
verify(quickQSPanel).addOnConfigurationChangedListener(captor.capture())
// verify that media starts in the expanded state by default
@@ -150,7 +156,24 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
}
@Test
- fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded() {
+ @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
+ fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed() {
+ verify(configurationController).addCallback(configCaptor.capture())
+
+ // verify that media starts in the expanded state by default
+ verify(mediaHost).expansion = MediaHostState.EXPANDED
+
+ // Rotate device, verify media size updated to collapsed
+ usingCollapsedLandscapeMedia = true
+ controller.setRotation(RotationUtils.ROTATION_LANDSCAPE)
+ configCaptor.allValues.forEach { it.onConfigChanged(Configuration.EMPTY) }
+
+ verify(mediaHost).expansion = MediaHostState.COLLAPSED
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
+ fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded_old() {
verify(quickQSPanel).addOnConfigurationChangedListener(captor.capture())
reset(mediaHost)
@@ -161,6 +184,19 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
verify(mediaHost).expansion = MediaHostState.EXPANDED
}
+ @Test
+ @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
+ fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded() {
+ verify(configurationController).addCallback(configCaptor.capture())
+ reset(mediaHost)
+
+ usingCollapsedLandscapeMedia = false
+ controller.setRotation(RotationUtils.ROTATION_LANDSCAPE)
+ configCaptor.allValues.forEach { it.onConfigChanged(Configuration.EMPTY) }
+
+ verify(mediaHost).expansion = MediaHostState.EXPANDED
+ }
+
class TestQuickQSPanelController(
view: QuickQSPanel,
qsHost: QSHost,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/GridLayoutTypeInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/GridLayoutTypeInteractorTest.kt
index c775bfd75f6e..9e400a6c0a4c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/GridLayoutTypeInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/GridLayoutTypeInteractorTest.kt
@@ -19,6 +19,7 @@ package com.android.systemui.qs.panels.domain.interactor
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
+import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
@@ -34,6 +35,7 @@ import org.junit.runner.RunWith
@SmallTest
@RunWith(AndroidJUnit4::class)
+@EnableSceneContainer
class GridLayoutTypeInteractorTest : SysuiTestCase() {
val kosmos = testKosmos()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/QSColumnsInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/QSColumnsInteractorTest.kt
index 2e7aeb433e04..9fe783b98046 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/QSColumnsInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/QSColumnsInteractorTest.kt
@@ -22,6 +22,7 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.ui.data.repository.configurationRepository
import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.kosmos.testCase
import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.panels.data.repository.QSColumnsRepository
@@ -76,6 +77,7 @@ class QSColumnsInteractorTest : SysuiTestCase() {
}
@Test
+ @EnableSceneContainer
fun withDualShade_returnsCorrectValue() =
with(kosmos) {
testScope.runTest {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/MediaInRowInLandscapeViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/MediaInRowInLandscapeViewModelTest.kt
index fdbf42c9afd8..d5e502e99de5 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/MediaInRowInLandscapeViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/MediaInRowInLandscapeViewModelTest.kt
@@ -21,6 +21,7 @@ import android.content.res.mainResources
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
+import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.kosmos.testScope
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager.Companion.LOCATION_QQS
@@ -36,6 +37,7 @@ import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
@@ -43,6 +45,7 @@ import org.junit.runner.RunWith
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters
+@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(ParameterizedAndroidJunit4::class)
@SmallTest
class MediaInRowInLandscapeViewModelTest(private val testData: TestData) : SysuiTestCase() {
@@ -63,6 +66,7 @@ class MediaInRowInLandscapeViewModelTest(private val testData: TestData) : Sysui
}
@Test
+ @EnableSceneContainer
fun shouldMediaShowInRow() =
with(kosmos) {
testScope.runTest {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/QSColumnsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/QSColumnsViewModelTest.kt
index 241cdbfbef83..4912c319bf2e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/QSColumnsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/QSColumnsViewModelTest.kt
@@ -21,6 +21,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.ui.data.repository.configurationRepository
+import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.testCase
@@ -88,6 +89,7 @@ class QSColumnsViewModelTest : SysuiTestCase() {
}
@Test
+ @EnableSceneContainer
fun mediaLocationNull_dualShade_alwaysDualShadeColumns() =
with(kosmos) {
testScope.runTest {
@@ -111,6 +113,7 @@ class QSColumnsViewModelTest : SysuiTestCase() {
}
@Test
+ @EnableSceneContainer
fun mediaLocationQS_dualShade_alwaysDualShadeColumns() =
with(kosmos) {
testScope.runTest {
@@ -133,6 +136,7 @@ class QSColumnsViewModelTest : SysuiTestCase() {
}
@Test
+ @EnableSceneContainer
fun mediaLocationQQS_dualShade_alwaysDualShadeColumns() =
with(kosmos) {
testScope.runTest {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
index adaebbd27986..55273935b4a9 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
@@ -25,8 +25,10 @@ import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.DefaultEdgeDetector
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.fakeFalsingManager
-import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.EnableSceneContainer
+import com.android.systemui.kosmos.collectLastValue
+import com.android.systemui.kosmos.runCurrent
+import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.power.data.repository.fakePowerRepository
@@ -44,17 +46,15 @@ import com.android.systemui.shade.domain.interactor.shadeMode
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.statusbar.data.repository.fakeRemoteInputRepository
import com.android.systemui.testKosmos
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@@ -64,10 +64,6 @@ class SceneContainerViewModelTest : SysuiTestCase() {
private val kosmos = testKosmos()
private val testScope by lazy { kosmos.testScope }
- private val sceneInteractor by lazy { kosmos.sceneInteractor }
- private val fakeSceneDataSource by lazy { kosmos.fakeSceneDataSource }
- private val sceneContainerConfig by lazy { kosmos.sceneContainerConfig }
- private val fakeRemoteInputRepository by lazy { kosmos.fakeRemoteInputRepository }
private val falsingManager by lazy { kosmos.fakeFalsingManager }
private val view = mock<View>()
@@ -91,14 +87,14 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun activate_setsMotionEventHandler() =
- testScope.runTest {
+ kosmos.runTest {
runCurrent()
assertThat(motionEventHandler).isNotNull()
}
@Test
fun deactivate_clearsMotionEventHandler() =
- testScope.runTest {
+ kosmos.runTest {
activationJob.cancel()
runCurrent()
@@ -107,7 +103,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun isVisible() =
- testScope.runTest {
+ kosmos.runTest {
assertThat(underTest.isVisible).isTrue()
sceneInteractor.setVisible(false, "reason")
@@ -121,7 +117,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun sceneTransition() =
- testScope.runTest {
+ kosmos.runTest {
val currentScene by collectLastValue(underTest.currentScene)
assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
@@ -132,7 +128,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun canChangeScene_whenAllowed_switchingFromGone_returnsTrue() =
- testScope.runTest {
+ kosmos.runTest {
val currentScene by collectLastValue(underTest.currentScene)
fakeSceneDataSource.changeScene(toScene = Scenes.Gone)
runCurrent()
@@ -149,7 +145,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun canChangeScene_whenAllowed_switchingFromLockscreen_returnsTrue() =
- testScope.runTest {
+ kosmos.runTest {
val currentScene by collectLastValue(underTest.currentScene)
fakeSceneDataSource.changeScene(toScene = Scenes.Lockscreen)
runCurrent()
@@ -166,7 +162,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun canChangeScene_whenNotAllowed_fromLockscreen_toFalsingProtectedScenes_returnsFalse() =
- testScope.runTest {
+ kosmos.runTest {
falsingManager.setIsFalseTouch(true)
val currentScene by collectLastValue(underTest.currentScene)
fakeSceneDataSource.changeScene(toScene = Scenes.Lockscreen)
@@ -188,7 +184,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun canChangeScene_whenNotAllowed_fromLockscreen_toFalsingUnprotectedScenes_returnsTrue() =
- testScope.runTest {
+ kosmos.runTest {
falsingManager.setIsFalseTouch(true)
val currentScene by collectLastValue(underTest.currentScene)
fakeSceneDataSource.changeScene(toScene = Scenes.Lockscreen)
@@ -209,7 +205,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun canChangeScene_whenNotAllowed_fromGone_toAnyOtherScene_returnsTrue() =
- testScope.runTest {
+ kosmos.runTest {
falsingManager.setIsFalseTouch(true)
val currentScene by collectLastValue(underTest.currentScene)
fakeSceneDataSource.changeScene(toScene = Scenes.Gone)
@@ -226,8 +222,70 @@ class SceneContainerViewModelTest : SysuiTestCase() {
}
@Test
+ fun canShowOrReplaceOverlay_whenAllowed_showingWhileOnGone_returnsTrue() =
+ kosmos.runTest {
+ val currentScene by collectLastValue(underTest.currentScene)
+ fakeSceneDataSource.changeScene(toScene = Scenes.Gone)
+ runCurrent()
+ assertThat(currentScene).isEqualTo(Scenes.Gone)
+
+ sceneContainerConfig.overlayKeys.forEach { overlay ->
+ assertWithMessage("Overlay $overlay incorrectly protected when allowed")
+ .that(underTest.canShowOrReplaceOverlay(newlyShown = overlay))
+ .isTrue()
+ }
+ }
+
+ @Test
+ fun canShowOrReplaceOverlay_whenAllowed_showingWhileOnLockscreen_returnsTrue() =
+ kosmos.runTest {
+ val currentScene by collectLastValue(underTest.currentScene)
+ fakeSceneDataSource.changeScene(toScene = Scenes.Lockscreen)
+ runCurrent()
+ assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+
+ sceneContainerConfig.overlayKeys.forEach { overlay ->
+ assertWithMessage("Overlay $overlay incorrectly protected when allowed")
+ .that(underTest.canShowOrReplaceOverlay(newlyShown = overlay))
+ .isTrue()
+ }
+ }
+
+ @Test
+ fun canShowOrReplaceOverlay_whenNotAllowed_whileOnLockscreen_returnsFalse() =
+ kosmos.runTest {
+ falsingManager.setIsFalseTouch(true)
+ val currentScene by collectLastValue(underTest.currentScene)
+ fakeSceneDataSource.changeScene(toScene = Scenes.Lockscreen)
+ runCurrent()
+ assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
+
+ sceneContainerConfig.overlayKeys.forEach { overlay ->
+ assertWithMessage("Protected overlay $overlay not properly protected")
+ .that(underTest.canShowOrReplaceOverlay(newlyShown = overlay))
+ .isFalse()
+ }
+ }
+
+ @Test
+ fun canShowOrReplaceOverlay_whenNotAllowed_whileOnGone_returnsTrue() =
+ kosmos.runTest {
+ falsingManager.setIsFalseTouch(true)
+ val currentScene by collectLastValue(underTest.currentScene)
+ fakeSceneDataSource.changeScene(toScene = Scenes.Gone)
+ runCurrent()
+ assertThat(currentScene).isEqualTo(Scenes.Gone)
+
+ sceneContainerConfig.overlayKeys.forEach { overlay ->
+ assertWithMessage("Protected overlay $overlay not properly protected")
+ .that(underTest.canShowOrReplaceOverlay(newlyShown = overlay))
+ .isTrue()
+ }
+ }
+
+ @Test
fun userInput() =
- testScope.runTest {
+ kosmos.runTest {
assertThat(kosmos.fakePowerRepository.userTouchRegistered).isFalse()
underTest.onMotionEvent(mock())
assertThat(kosmos.fakePowerRepository.userTouchRegistered).isTrue()
@@ -235,7 +293,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun userInputOnEmptySpace_insideEvent() =
- testScope.runTest {
+ kosmos.runTest {
assertThat(fakeRemoteInputRepository.areRemoteInputsClosed).isFalse()
val insideMotionEvent = MotionEvent.obtain(0, 0, ACTION_DOWN, 0f, 0f, 0)
underTest.onEmptySpaceMotionEvent(insideMotionEvent)
@@ -244,7 +302,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun userInputOnEmptySpace_outsideEvent_remoteInputActive() =
- testScope.runTest {
+ kosmos.runTest {
fakeRemoteInputRepository.isRemoteInputActive.value = true
assertThat(fakeRemoteInputRepository.areRemoteInputsClosed).isFalse()
val outsideMotionEvent = MotionEvent.obtain(0, 0, ACTION_OUTSIDE, 0f, 0f, 0)
@@ -254,7 +312,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun userInputOnEmptySpace_outsideEvent_remoteInputInactive() =
- testScope.runTest {
+ kosmos.runTest {
fakeRemoteInputRepository.isRemoteInputActive.value = false
assertThat(fakeRemoteInputRepository.areRemoteInputsClosed).isFalse()
val outsideMotionEvent = MotionEvent.obtain(0, 0, ACTION_OUTSIDE, 0f, 0f, 0)
@@ -264,7 +322,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun remoteUserInteraction_keepsContainerVisible() =
- testScope.runTest {
+ kosmos.runTest {
sceneInteractor.setVisible(false, "reason")
runCurrent()
assertThat(underTest.isVisible).isFalse()
@@ -272,9 +330,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
runCurrent()
assertThat(underTest.isVisible).isTrue()
- underTest.onMotionEvent(
- mock { whenever(actionMasked).thenReturn(MotionEvent.ACTION_UP) }
- )
+ underTest.onMotionEvent(mock { on { actionMasked } doReturn MotionEvent.ACTION_UP })
runCurrent()
assertThat(underTest.isVisible).isFalse()
@@ -282,7 +338,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun getActionableContentKey_noOverlays_returnsCurrentScene() =
- testScope.runTest {
+ kosmos.runTest {
val currentScene by collectLastValue(underTest.currentScene)
val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
@@ -300,7 +356,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun getActionableContentKey_multipleOverlays_returnsTopOverlay() =
- testScope.runTest {
+ kosmos.runTest {
val currentScene by collectLastValue(underTest.currentScene)
val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
fakeSceneDataSource.showOverlay(Overlays.QuickSettingsShade)
@@ -321,7 +377,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun edgeDetector_singleShade_usesDefaultEdgeDetector() =
- testScope.runTest {
+ kosmos.runTest {
val shadeMode by collectLastValue(kosmos.shadeMode)
kosmos.enableSingleShade()
@@ -331,7 +387,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun edgeDetector_splitShade_usesDefaultEdgeDetector() =
- testScope.runTest {
+ kosmos.runTest {
val shadeMode by collectLastValue(kosmos.shadeMode)
kosmos.enableSplitShade()
@@ -341,7 +397,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun edgeDetector_dualShade_narrowScreen_usesSceneContainerSwipeDetector() =
- testScope.runTest {
+ kosmos.runTest {
val shadeMode by collectLastValue(kosmos.shadeMode)
kosmos.enableDualShade(wideLayout = false)
@@ -352,7 +408,7 @@ class SceneContainerViewModelTest : SysuiTestCase() {
@Test
fun edgeDetector_dualShade_wideScreen_usesSceneContainerSwipeDetector() =
- testScope.runTest {
+ kosmos.runTest {
val shadeMode by collectLastValue(kosmos.shadeMode)
kosmos.enableDualShade(wideLayout = true)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
index c1477fe52f0e..a9f3a655ada9 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
@@ -80,6 +80,8 @@ class WorkProfilePolicyTest {
// Set desktop mode supported
whenever(mContext.resources).thenReturn(mResources)
whenever(mResources.getBoolean(R.bool.config_isDesktopModeSupported)).thenReturn(true)
+ whenever(mResources.getBoolean(R.bool.config_canInternalDisplayHostDesktops))
+ .thenReturn(true)
policy = WorkProfilePolicy(kosmos.profileTypeRepository, mContext)
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractorImplTest.kt
index 668f568d7f46..d26e195d360a 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractorImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractorImplTest.kt
@@ -20,6 +20,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.kosmos.testScope
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.testKosmos
@@ -31,6 +32,7 @@ import org.junit.runner.RunWith
@SmallTest
@RunWith(AndroidJUnit4::class)
+@EnableSceneContainer
class ShadeModeInteractorImplTest : SysuiTestCase() {
private val kosmos = testKosmos()
@@ -80,7 +82,7 @@ class ShadeModeInteractorImplTest : SysuiTestCase() {
}
@Test
- fun isDualShade_settingEnabled_returnsTrue() =
+ fun isDualShade_settingEnabledSceneContainerEnabled_returnsTrue() =
testScope.runTest {
// TODO(b/391578667): Add a test case for user switching once the bug is fixed.
val shadeMode by collectLastValue(underTest.shadeMode)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt
index b8f66acf6413..dde867814159 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/startable/ShadeStartableTest.kt
@@ -48,6 +48,7 @@ import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.TestScope
@@ -59,6 +60,7 @@ import org.mockito.kotlin.verify
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters
+@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(ParameterizedAndroidJunit4::class)
class ShadeStartableTest(flags: FlagsParameterization) : SysuiTestCase() {
@@ -103,6 +105,7 @@ class ShadeStartableTest(flags: FlagsParameterization) : SysuiTestCase() {
}
@Test
+ @EnableSceneContainer
fun hydrateShadeMode_dualShadeEnabled() =
testScope.runTest {
overrideResource(R.bool.config_use_split_notification_shade, false)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt
index dbe8f8226d43..c7b3175a636f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModelTest.kt
@@ -31,7 +31,6 @@ import com.android.systemui.kosmos.testScope
import com.android.systemui.plugins.activityStarter
import com.android.systemui.res.R
import com.android.systemui.statusbar.StatusBarIconView
-import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
import com.android.systemui.statusbar.chips.ui.model.ColorsModel
import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
@@ -265,91 +264,25 @@ class CallChipViewModelTest : SysuiTestCase() {
}
@Test
- fun chip_positiveStartTime_notPromoted_colorsAreThemed() =
+ fun chip_positiveStartTime_colorsAreAccentThemed() =
testScope.runTest {
val latest by collectLastValue(underTest.chip)
repo.setOngoingCallState(inCallModel(startTimeMs = 1000, promotedContent = null))
assertThat((latest as OngoingActivityChipModel.Active).colors)
- .isEqualTo(ColorsModel.Themed)
+ .isEqualTo(ColorsModel.AccentThemed)
}
@Test
- fun chip_zeroStartTime_notPromoted_colorsAreThemed() =
+ fun chip_zeroStartTime_colorsAreAccentThemed() =
testScope.runTest {
val latest by collectLastValue(underTest.chip)
repo.setOngoingCallState(inCallModel(startTimeMs = 0, promotedContent = null))
assertThat((latest as OngoingActivityChipModel.Active).colors)
- .isEqualTo(ColorsModel.Themed)
- }
-
- @Test
- @DisableFlags(StatusBarNotifChips.FLAG_NAME)
- fun chip_positiveStartTime_promoted_notifChipsFlagOff_colorsAreThemed() =
- testScope.runTest {
- val latest by collectLastValue(underTest.chip)
-
- repo.setOngoingCallState(
- inCallModel(startTimeMs = 1000, promotedContent = PROMOTED_CONTENT_WITH_COLOR)
- )
-
- assertThat((latest as OngoingActivityChipModel.Active).colors)
- .isEqualTo(ColorsModel.Themed)
- }
-
- @Test
- @DisableFlags(StatusBarNotifChips.FLAG_NAME)
- fun chip_zeroStartTime_promoted_notifChipsFlagOff_colorsAreThemed() =
- testScope.runTest {
- val latest by collectLastValue(underTest.chip)
-
- repo.setOngoingCallState(
- inCallModel(startTimeMs = 0, promotedContent = PROMOTED_CONTENT_WITH_COLOR)
- )
-
- assertThat((latest as OngoingActivityChipModel.Active).colors)
- .isEqualTo(ColorsModel.Themed)
- }
-
- @Test
- @EnableFlags(StatusBarNotifChips.FLAG_NAME)
- fun chip_positiveStartTime_promoted_notifChipsFlagOn_colorsAreCustom() =
- testScope.runTest {
- val latest by collectLastValue(underTest.chip)
-
- repo.setOngoingCallState(
- inCallModel(startTimeMs = 1000, promotedContent = PROMOTED_CONTENT_WITH_COLOR)
- )
-
- assertThat((latest as OngoingActivityChipModel.Active).colors)
- .isEqualTo(
- ColorsModel.Custom(
- backgroundColorInt = PROMOTED_BACKGROUND_COLOR,
- primaryTextColorInt = PROMOTED_PRIMARY_TEXT_COLOR,
- )
- )
- }
-
- @Test
- @EnableFlags(StatusBarNotifChips.FLAG_NAME)
- fun chip_zeroStartTime_promoted_notifChipsFlagOff_colorsAreCustom() =
- testScope.runTest {
- val latest by collectLastValue(underTest.chip)
-
- repo.setOngoingCallState(
- inCallModel(startTimeMs = 0, promotedContent = PROMOTED_CONTENT_WITH_COLOR)
- )
-
- assertThat((latest as OngoingActivityChipModel.Active).colors)
- .isEqualTo(
- ColorsModel.Custom(
- backgroundColorInt = PROMOTED_BACKGROUND_COLOR,
- primaryTextColorInt = PROMOTED_PRIMARY_TEXT_COLOR,
- )
- )
+ .isEqualTo(ColorsModel.AccentThemed)
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
index 192ad879891f..aaa9b58a45df 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModelTest.kt
@@ -186,7 +186,7 @@ class NotifChipsViewModelTest : SysuiTestCase() {
@Test
@DisableFlags(FLAG_PROMOTE_NOTIFICATIONS_AUTOMATICALLY)
- fun chips_onePromotedNotif_colorMatches() =
+ fun chips_onePromotedNotif_colorIsSystemThemed() =
kosmos.runTest {
val latest by collectLastValue(underTest.chips)
@@ -209,10 +209,7 @@ class NotifChipsViewModelTest : SysuiTestCase() {
)
assertThat(latest).hasSize(1)
- val colors = latest!![0].colors
- assertThat(colors).isInstanceOf(ColorsModel.Custom::class.java)
- assertThat((colors as ColorsModel.Custom).backgroundColorInt).isEqualTo(56)
- assertThat((colors as ColorsModel.Custom).primaryTextColorInt).isEqualTo(89)
+ assertThat(latest!![0].colors).isEqualTo(ColorsModel.SystemThemed)
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelperTest.kt
index d727089094f0..9ec5a42714bf 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelperTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelperTest.kt
@@ -52,24 +52,13 @@ class ChipTextTruncationHelperTest : SysuiTestCase() {
}
@Test
- fun shouldShowText_desiredSlightlyLargerThanMax_true() {
+ fun shouldShowText_desiredMoreThanMax_false() {
val result =
underTest.shouldShowText(
desiredTextWidthPx = (MAX_WIDTH * 1.1).toInt(),
widthMeasureSpec = UNLIMITED_WIDTH_SPEC,
)
- assertThat(result).isTrue()
- }
-
- @Test
- fun shouldShowText_desiredMoreThanTwiceMax_false() {
- val result =
- underTest.shouldShowText(
- desiredTextWidthPx = (MAX_WIDTH * 2.2).toInt(),
- widthMeasureSpec = UNLIMITED_WIDTH_SPEC,
- )
-
assertThat(result).isFalse()
}
@@ -80,8 +69,8 @@ class ChipTextTruncationHelperTest : SysuiTestCase() {
View.MeasureSpec.makeMeasureSpec(MAX_WIDTH / 2, View.MeasureSpec.AT_MOST)
)
- // WHEN desired is more than twice the smallerWidthSpec
- val desiredWidth = (MAX_WIDTH * 1.1).toInt()
+ // WHEN desired is more than the smallerWidthSpec
+ val desiredWidth = ((MAX_WIDTH / 2) * 1.1).toInt()
val result =
underTest.shouldShowText(
@@ -100,8 +89,8 @@ class ChipTextTruncationHelperTest : SysuiTestCase() {
View.MeasureSpec.makeMeasureSpec(MAX_WIDTH * 3, View.MeasureSpec.AT_MOST)
)
- // WHEN desired is more than twice the max
- val desiredWidth = (MAX_WIDTH * 2.2).toInt()
+ // WHEN desired is more than the max
+ val desiredWidth = (MAX_WIDTH * 1.1).toInt()
val result =
underTest.shouldShowText(
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelperTest.kt
index 60030ad4e428..e3a84fd2c2eb 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelperTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelperTest.kt
@@ -54,7 +54,7 @@ class ChipTransitionHelperTest : SysuiTestCase() {
OngoingActivityChipModel.Active.Timer(
key = KEY,
icon = createIcon(R.drawable.ic_cake),
- colors = ColorsModel.Themed,
+ colors = ColorsModel.AccentThemed,
startTimeMs = 100L,
onClickListenerLegacy = null,
clickBehavior = OngoingActivityChipModel.ClickBehavior.None,
@@ -68,7 +68,7 @@ class ChipTransitionHelperTest : SysuiTestCase() {
OngoingActivityChipModel.Active.IconOnly(
key = KEY,
icon = createIcon(R.drawable.ic_hotspot),
- colors = ColorsModel.Themed,
+ colors = ColorsModel.AccentThemed,
onClickListenerLegacy = null,
clickBehavior = OngoingActivityChipModel.ClickBehavior.None,
)
@@ -90,7 +90,7 @@ class ChipTransitionHelperTest : SysuiTestCase() {
OngoingActivityChipModel.Active.Timer(
key = KEY,
icon = createIcon(R.drawable.ic_cake),
- colors = ColorsModel.Themed,
+ colors = ColorsModel.AccentThemed,
startTimeMs = 100L,
onClickListenerLegacy = null,
clickBehavior = OngoingActivityChipModel.ClickBehavior.None,
@@ -132,7 +132,7 @@ class ChipTransitionHelperTest : SysuiTestCase() {
OngoingActivityChipModel.Active.Timer(
key = KEY,
icon = createIcon(R.drawable.ic_cake),
- colors = ColorsModel.Themed,
+ colors = ColorsModel.AccentThemed,
startTimeMs = 100L,
onClickListenerLegacy = null,
clickBehavior = OngoingActivityChipModel.ClickBehavior.None,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/ConversationNotificationProcessorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/ConversationNotificationProcessorTest.kt
new file mode 100644
index 000000000000..67d0adedca6e
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/ConversationNotificationProcessorTest.kt
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification
+
+import android.app.Flags
+import android.app.Notification
+import android.app.Notification.EXTRA_SUMMARIZED_CONTENT
+import android.app.Person
+import android.content.pm.LauncherApps
+import android.content.pm.launcherApps
+import android.graphics.drawable.Icon
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.testing.TestableLooper.RunWithLooper
+import android.text.SpannableStringBuilder
+import android.text.style.ImageSpan
+import android.text.style.StyleSpan
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.res.R
+import com.android.systemui.statusbar.RankingBuilder
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
+import com.android.systemui.statusbar.notification.row.NotificationRowContentBinderLogger
+import com.android.systemui.statusbar.notification.row.NotificationTestHelper
+import com.android.systemui.statusbar.notification.row.notificationRowContentBinderLogger
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@RunWithLooper
+class ConversationNotificationProcessorTest : SysuiTestCase() {
+
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
+ private lateinit var conversationNotificationProcessor: ConversationNotificationProcessor
+ private lateinit var testHelper: NotificationTestHelper
+ private lateinit var launcherApps: LauncherApps
+ private lateinit var logger: NotificationRowContentBinderLogger
+ private lateinit var conversationNotificationManager: ConversationNotificationManager
+
+ @Before
+ fun setup() {
+ launcherApps = kosmos.launcherApps
+ conversationNotificationManager = kosmos.conversationNotificationManager
+ logger = kosmos.notificationRowContentBinderLogger
+ testHelper = NotificationTestHelper(mContext, mDependency)
+
+ conversationNotificationProcessor =
+ ConversationNotificationProcessor(
+ context,
+ launcherApps,
+ conversationNotificationManager,
+ )
+ }
+
+ @Test
+ fun processNotification_notMessagingStyle() {
+ val nb = Notification.Builder(mContext).setSmallIcon(R.drawable.ic_person)
+ val newRow: ExpandableNotificationRow = testHelper.createRow(nb.build())
+
+ assertThat(conversationNotificationProcessor.processNotification(newRow.entry, nb, logger))
+ .isNull()
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_NM_SUMMARIZATION, Flags.FLAG_NM_SUMMARIZATION_UI)
+ fun processNotification_messagingStyleWithSummarization_flagOff() {
+ val summarization = "hello"
+ val nb = getMessagingNotification()
+ val newRow: ExpandableNotificationRow = testHelper.createRow(nb.build())
+ newRow.entry.setRanking(
+ RankingBuilder(newRow.entry.ranking).setSummarization(summarization).build()
+ )
+
+ assertThat(conversationNotificationProcessor.processNotification(newRow.entry, nb, logger))
+ .isNotNull()
+ assertThat(nb.build().extras.getCharSequence(EXTRA_SUMMARIZED_CONTENT)).isNull()
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_NM_SUMMARIZATION)
+ fun processNotification_messagingStyleWithSummarization() {
+ val summarization = "hello"
+ val nb = getMessagingNotification()
+ val newRow: ExpandableNotificationRow = testHelper.createRow(nb.build())
+ newRow.entry.setRanking(
+ RankingBuilder(newRow.entry.ranking).setSummarization(summarization).build()
+ )
+
+ assertThat(conversationNotificationProcessor.processNotification(newRow.entry, nb, logger))
+ .isNotNull()
+
+ val processedSummary = nb.build().extras.getCharSequence(EXTRA_SUMMARIZED_CONTENT)
+ assertThat(processedSummary.toString()).isEqualTo("x$summarization")
+
+ val checkSpans = SpannableStringBuilder(processedSummary)
+ assertThat(
+ checkSpans.getSpans(
+ /* queryStart = */ 0,
+ /* queryEnd = */ 1,
+ /* kind = */ ImageSpan::class.java,
+ )
+ )
+ .isNotNull()
+
+ assertThat(
+ processedSummary?.let {
+ checkSpans.getSpans(
+ /* queryStart = */ 0,
+ /* queryEnd = */ it.length,
+ /* kind = */ StyleSpan::class.java,
+ )
+ }
+ )
+ .isNotNull()
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_NM_SUMMARIZATION)
+ fun processNotification_messagingStyleWithoutSummarization() {
+ val nb = getMessagingNotification()
+ val newRow: ExpandableNotificationRow = testHelper.createRow(nb.build())
+ assertThat(conversationNotificationProcessor.processNotification(newRow.entry, nb, logger))
+ .isNotNull()
+ assertThat(nb.build().extras.getCharSequence(EXTRA_SUMMARIZED_CONTENT)).isNull()
+ }
+
+ private fun getMessagingNotification(): Notification.Builder {
+ val displayName = "Display Name"
+ val messageText = "Message Text"
+ val personIcon = Icon.createWithResource(mContext, R.drawable.ic_person)
+ val testPerson = Person.Builder().setName(displayName).setIcon(personIcon).build()
+ val messagingStyle = Notification.MessagingStyle(testPerson)
+ messagingStyle.addMessage(
+ Notification.MessagingStyle.Message(messageText, System.currentTimeMillis(), testPerson)
+ )
+ return Notification.Builder(mContext)
+ .setSmallIcon(R.drawable.ic_person)
+ .setStyle(messagingStyle)
+ }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
index da31cd967a36..7d406b4b397c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java
@@ -209,6 +209,26 @@ public class NotificationContentInflaterTest extends SysuiTestCase {
}
@Test
+ public void testInflationProcessesMessagingStyle() throws Exception {
+ String displayName = "Display Name";
+ String messageText = "Message Text";
+ Icon personIcon = Icon.createWithResource(
+ mContext, com.android.systemui.res.R.drawable.ic_person);
+ Person testPerson = new Person.Builder().setName(displayName).setIcon(personIcon).build();
+ Notification.MessagingStyle messagingStyle = new Notification.MessagingStyle(testPerson);
+ messagingStyle.addMessage(new Notification.MessagingStyle.Message(
+ messageText, System.currentTimeMillis(), testPerson));
+ Notification messageNotif = new Notification.Builder(mContext)
+ .setSmallIcon(com.android.systemui.res.R.drawable.ic_person)
+ .setStyle(messagingStyle)
+ .build();
+ ExpandableNotificationRow newRow = mHelper.createRow(messageNotif);
+ inflateAndWait(mNotificationInflater, FLAG_CONTENT_VIEW_ALL, newRow);
+
+ verify(mConversationNotificationProcessor).processNotification(any(), any(), any());
+ }
+
+ @Test
@Ignore
public void testInflationIsRetriedIfAsyncFails() throws Exception {
NotificationContentInflater.InflationProgress result =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt
index c77b09aac2b9..82eca3735a71 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt
@@ -587,6 +587,35 @@ class NotificationRowContentBinderImplTest : SysuiTestCase() {
Assert.assertFalse(hasText(publicView, contentTitle))
}
+ @Test
+ @Throws(java.lang.Exception::class)
+ @EnableFlags(android.app.Flags.FLAG_NM_SUMMARIZATION)
+ fun testAllMessagingStyleProcessedAsConversations() {
+ val displayName = "Display Name"
+ val messageText = "Message Text"
+ val personIcon = Icon.createWithResource(mContext, R.drawable.ic_person)
+ val testPerson = Person.Builder().setName(displayName).setIcon(personIcon).build()
+ val messagingStyle = Notification.MessagingStyle(testPerson)
+ messagingStyle.addMessage(
+ Notification.MessagingStyle.Message(messageText, System.currentTimeMillis(), testPerson)
+ )
+ val messageNotif =
+ Notification.Builder(mContext)
+ .setSmallIcon(R.drawable.ic_person)
+ .setStyle(messagingStyle)
+ .build()
+ val newRow: ExpandableNotificationRow = testHelper.createRow(messageNotif)
+
+ inflateAndWait(
+ false,
+ notificationInflater,
+ FLAG_CONTENT_VIEW_ALL,
+ REDACTION_TYPE_NONE,
+ newRow,
+ )
+ verify(conversationNotificationProcessor).processNotification(any(), any(), any())
+ }
+
private class ExceptionHolder {
var exception: Exception? = null
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/shelf/ui/viewmodel/NotificationShelfViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/shelf/ui/viewmodel/NotificationShelfViewModelTest.kt
index d570f18e35d8..6381b4e0fef7 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/shelf/ui/viewmodel/NotificationShelfViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/shelf/ui/viewmodel/NotificationShelfViewModelTest.kt
@@ -57,11 +57,12 @@ class NotificationShelfViewModelTest : SysuiTestCase() {
statusBarStateController = mock()
whenever(screenOffAnimationController.allowWakeUpIfDozing()).thenReturn(true)
}
- private val underTest = kosmos.notificationShelfViewModel
private val deviceEntryFaceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository
private val keyguardRepository = kosmos.fakeKeyguardRepository
- private val keyguardTransitionController = kosmos.lockscreenShadeTransitionController
private val powerRepository = kosmos.fakePowerRepository
+ private val keyguardTransitionController by lazy { kosmos.lockscreenShadeTransitionController }
+
+ private val underTest by lazy { kosmos.notificationShelfViewModel }
@Test
fun canModifyColorOfNotifications_whenKeyguardNotShowing() =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt
index 57b7df7a8d31..31f8590c0378 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.kt
@@ -51,11 +51,13 @@ import com.android.systemui.res.R
import com.android.systemui.shade.ShadeViewStateProvider
import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.statusbar.StatusBarState
+import com.android.systemui.statusbar.core.NewStatusBarIcons
import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler
import com.android.systemui.statusbar.layout.mockStatusBarContentInsetsProvider
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.batteryViewModelFactory
import com.android.systemui.statusbar.policy.BatteryController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
@@ -85,6 +87,7 @@ import org.mockito.MockitoAnnotations
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWithLooper(setAsMainLooper = true)
+@DisableFlags(NewStatusBarIcons.FLAG_NAME)
class KeyguardStatusBarViewControllerTest : SysuiTestCase() {
private lateinit var kosmos: Kosmos
private lateinit var testScope: TestScope
@@ -190,6 +193,7 @@ class KeyguardStatusBarViewControllerTest : SysuiTestCase() {
statusBarIconController,
iconManagerFactory,
batteryMeterViewController,
+ kosmos.batteryViewModelFactory,
shadeViewStateProvider,
keyguardStateController,
keyguardBypassController,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt
index 4759c081de5f..183cd8f1ae8b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt
@@ -19,6 +19,9 @@ package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel
import android.graphics.Color
import android.graphics.Rect
import android.view.View
+import androidx.compose.runtime.getValue
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.lifecycle.Hydrator
import com.android.systemui.plugins.DarkIconDispatcher
import com.android.systemui.statusbar.chips.mediaprojection.domain.model.MediaProjectionStopDialogModel
import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChipsModel
@@ -26,15 +29,20 @@ import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChip
import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle
import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel
+import com.android.systemui.statusbar.phone.domain.interactor.IsAreaDark
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
import com.android.systemui.statusbar.pipeline.shared.ui.model.SystemInfoCombinedVisibilityModel
import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
+import org.mockito.Mockito.mock
class FakeHomeStatusBarViewModel(
override val operatorNameViewModel: StatusBarOperatorNameViewModel
-) : HomeStatusBarViewModel {
+) : HomeStatusBarViewModel, ExclusiveActivatable() {
+ private val hydrator = Hydrator("FakeHomeStatusBarViewModel.hydrator")
+
override val areNotificationsLightsOut = MutableStateFlow(false)
override val isTransitioningFromLockscreenToOccluded = MutableStateFlow(false)
@@ -56,6 +64,11 @@ class FakeHomeStatusBarViewModel(
override val isHomeStatusBarAllowedByScene = MutableStateFlow(false)
+ override val batteryViewModelFactory: BatteryViewModel.Factory =
+ object : BatteryViewModel.Factory {
+ override fun create(): BatteryViewModel = mock(BatteryViewModel::class.java)
+ }
+
override val shouldShowOperatorNameView = MutableStateFlow(false)
override val isClockVisible =
@@ -80,6 +93,7 @@ class FakeHomeStatusBarViewModel(
var darkIconTint = Color.BLACK
var lightIconTint = Color.WHITE
+ var darkIntensity = 0f
override val areaTint: Flow<StatusBarTintColor> =
MutableStateFlow(
@@ -91,4 +105,22 @@ class FakeHomeStatusBarViewModel(
}
}
)
+
+ val isAreaDarkSource =
+ MutableStateFlow(
+ IsAreaDark { viewBounds ->
+ if (DarkIconDispatcher.isInAreas(darkRegions, viewBounds)) {
+ darkIntensity < 0.5f
+ } else {
+ false
+ }
+ }
+ )
+
+ override val areaDark: IsAreaDark by
+ hydrator.hydratedStateOf(traceName = "areaDark", source = isAreaDarkSource)
+
+ override suspend fun onActivated(): Nothing {
+ hydrator.activate()
+ }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt
index 354edac75452..36e18e653f20 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/unfold/DisplaySwitchLatencyTrackerTest.kt
@@ -56,7 +56,6 @@ import com.android.systemui.unfold.data.repository.UnfoldTransitionRepositoryImp
import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor
import com.android.systemui.unfoldedDeviceState
import com.android.systemui.util.animation.data.repository.fakeAnimationStatusRepository
-import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
@@ -79,8 +78,10 @@ import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.any
import org.mockito.kotlin.mock
import org.mockito.kotlin.times
+import org.mockito.kotlin.verifyNoMoreInteractions
@RunWith(AndroidJUnit4::class)
@SmallTest
@@ -603,12 +604,39 @@ class DisplaySwitchLatencyTrackerTest : SysuiTestCase() {
}
}
+ @Test
+ fun foldingStarted_screenStillOn_eventSentOnlyAfterScreenSwitches() {
+ // can happen for both folding and unfolding (with animations off) but it's more likely to
+ // happen when folding as waiting for screen on is the default case then
+ testScope.runTest {
+ startInUnfoldedState(displaySwitchLatencyTracker)
+ setDeviceState(FOLDED)
+ powerInteractor.setScreenPowerState(SCREEN_ON)
+ runCurrent()
+
+ verifyNoMoreInteractions(displaySwitchLatencyLogger)
+
+ powerInteractor.setScreenPowerState(SCREEN_OFF)
+ runCurrent()
+ powerInteractor.setScreenPowerState(SCREEN_ON)
+ runCurrent()
+
+ verify(displaySwitchLatencyLogger).log(any())
+ }
+ }
+
private suspend fun TestScope.startInFoldedState(tracker: DisplaySwitchLatencyTracker) {
setDeviceState(FOLDED)
tracker.start()
runCurrent()
}
+ private suspend fun TestScope.startInUnfoldedState(tracker: DisplaySwitchLatencyTracker) {
+ setDeviceState(UNFOLDED)
+ tracker.start()
+ runCurrent()
+ }
+
private suspend fun TestScope.startUnfolding() {
setDeviceState(HALF_FOLDED)
powerInteractor.setScreenPowerState(SCREEN_OFF)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt
index d89516dea622..7c166de81502 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt
@@ -22,20 +22,23 @@ import android.content.ComponentName
import android.content.Intent
import android.content.pm.UserInfo
import android.platform.test.annotations.EnableFlags
+import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
+import com.android.app.wallpaperManager
import com.android.internal.R
import com.android.systemui.SysuiTestCase
+import com.android.systemui.broadcast.broadcastDispatcher
import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.kosmos.testScope
import com.android.systemui.res.R as SysUIR
import com.android.systemui.shared.Flags as SharedFlags
+import com.android.systemui.testKosmos
import com.android.systemui.user.data.model.SelectedUserModel
import com.android.systemui.user.data.model.SelectionStatus
-import com.android.systemui.user.data.repository.FakeUserRepository
+import com.android.systemui.user.data.repository.fakeUserRepository
+import com.android.systemui.util.settings.fakeSettings
import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
@@ -43,6 +46,7 @@ import org.junit.Ignore
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
+import org.mockito.kotlin.doAnswer
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
@@ -50,42 +54,39 @@ import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
class WallpaperRepositoryImplTest : SysuiTestCase() {
- private val testDispatcher = StandardTestDispatcher()
- private val testScope = TestScope(testDispatcher)
- private val userRepository = FakeUserRepository()
- private val wallpaperFocalAreaRepository = FakeWallpaperFocalAreaRepository()
- private val wallpaperManager: WallpaperManager = mock()
- private val keyguardTransitionInteractor: KeyguardTransitionInteractor = mock()
-
- private val underTest: WallpaperRepositoryImpl by lazy {
- WallpaperRepositoryImpl(
- testScope.backgroundScope,
- testDispatcher,
- fakeBroadcastDispatcher,
- userRepository,
- wallpaperFocalAreaRepository,
- wallpaperManager,
- context,
- keyguardTransitionInteractor,
- )
- }
+ private var isWallpaperSupported = true
+ private val kosmos =
+ testKosmos().apply {
+ wallpaperManager =
+ mock<WallpaperManager>() {
+ on { isWallpaperSupported } doAnswer { isWallpaperSupported }
+ }
+ }
+ private val secureSettings = kosmos.fakeSettings
+ private val testScope = kosmos.testScope
+ private val userRepository = kosmos.fakeUserRepository
+ private val broadcastDispatcher = kosmos.broadcastDispatcher
+
+ // Initialized in each test since certain flows rely on mocked data that isn't
+ // modifiable after start, like wallpaperManager.isWallpaperSupported
+ private lateinit var underTest: WallpaperRepositoryImpl
lateinit var focalAreaTarget: String
@Before
fun setUp() {
- whenever(wallpaperManager.isWallpaperSupported).thenReturn(true)
focalAreaTarget = context.resources.getString(SysUIR.string.focal_area_target)
}
@Test
fun wallpaperInfo_nullInfo() =
testScope.runTest {
+ underTest = kosmos.wallpaperRepository
val latest by collectLastValue(underTest.wallpaperInfo)
- whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(null)
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(null)
- fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+ broadcastDispatcher.sendIntentToMatchingReceiversOnly(
context,
Intent(Intent.ACTION_WALLPAPER_CHANGED),
)
@@ -96,11 +97,13 @@ class WallpaperRepositoryImplTest : SysuiTestCase() {
@Test
fun wallpaperInfo_hasInfoFromManager() =
testScope.runTest {
+ underTest = kosmos.wallpaperRepository
val latest by collectLastValue(underTest.wallpaperInfo)
- whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(UNSUPPORTED_WP)
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any()))
+ .thenReturn(UNSUPPORTED_WP)
- fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+ broadcastDispatcher.sendIntentToMatchingReceiversOnly(
context,
Intent(Intent.ACTION_WALLPAPER_CHANGED),
)
@@ -111,7 +114,8 @@ class WallpaperRepositoryImplTest : SysuiTestCase() {
@Test
fun wallpaperInfo_initialValueIsFetched() =
testScope.runTest {
- whenever(wallpaperManager.getWallpaperInfoForUser(USER_WITH_SUPPORTED_WP.id))
+ underTest = kosmos.wallpaperRepository
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(USER_WITH_SUPPORTED_WP.id))
.thenReturn(SUPPORTED_WP)
userRepository.setUserInfos(listOf(USER_WITH_SUPPORTED_WP))
userRepository.setSelectedUserInfo(USER_WITH_SUPPORTED_WP)
@@ -126,15 +130,16 @@ class WallpaperRepositoryImplTest : SysuiTestCase() {
@Test
fun wallpaperInfo_updatesOnUserChanged() =
testScope.runTest {
+ underTest = kosmos.wallpaperRepository
val latest by collectLastValue(underTest.wallpaperInfo)
val user3 = UserInfo(/* id= */ 3, /* name= */ "user3", /* flags= */ 0)
val user3Wp = mock<WallpaperInfo>()
- whenever(wallpaperManager.getWallpaperInfoForUser(user3.id)).thenReturn(user3Wp)
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(user3.id)).thenReturn(user3Wp)
val user4 = UserInfo(/* id= */ 4, /* name= */ "user4", /* flags= */ 0)
val user4Wp = mock<WallpaperInfo>()
- whenever(wallpaperManager.getWallpaperInfoForUser(user4.id)).thenReturn(user4Wp)
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(user4.id)).thenReturn(user4Wp)
userRepository.setUserInfos(listOf(user3, user4))
@@ -154,15 +159,16 @@ class WallpaperRepositoryImplTest : SysuiTestCase() {
@Test
fun wallpaperInfo_doesNotUpdateOnUserChanging() =
testScope.runTest {
+ underTest = kosmos.wallpaperRepository
val latest by collectLastValue(underTest.wallpaperInfo)
val user3 = UserInfo(/* id= */ 3, /* name= */ "user3", /* flags= */ 0)
val user3Wp = mock<WallpaperInfo>()
- whenever(wallpaperManager.getWallpaperInfoForUser(user3.id)).thenReturn(user3Wp)
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(user3.id)).thenReturn(user3Wp)
val user4 = UserInfo(/* id= */ 4, /* name= */ "user4", /* flags= */ 0)
val user4Wp = mock<WallpaperInfo>()
- whenever(wallpaperManager.getWallpaperInfoForUser(user4.id)).thenReturn(user4Wp)
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(user4.id)).thenReturn(user4Wp)
userRepository.setUserInfos(listOf(user3, user4))
@@ -183,17 +189,18 @@ class WallpaperRepositoryImplTest : SysuiTestCase() {
@Test
fun wallpaperInfo_updatesOnIntent() =
testScope.runTest {
+ underTest = kosmos.wallpaperRepository
val latest by collectLastValue(underTest.wallpaperInfo)
val wp1 = mock<WallpaperInfo>()
- whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp1)
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp1)
assertThat(latest).isEqualTo(wp1)
// WHEN the info is new and a broadcast is sent
val wp2 = mock<WallpaperInfo>()
- whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp2)
- fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp2)
+ broadcastDispatcher.sendIntentToMatchingReceiversOnly(
context,
Intent(Intent.ACTION_WALLPAPER_CHANGED),
)
@@ -205,15 +212,16 @@ class WallpaperRepositoryImplTest : SysuiTestCase() {
@Test
fun wallpaperInfo_wallpaperNotSupported_alwaysNull() =
testScope.runTest {
- whenever(wallpaperManager.isWallpaperSupported).thenReturn(false)
+ isWallpaperSupported = false
+ underTest = kosmos.wallpaperRepository
val latest by collectLastValue(underTest.wallpaperInfo)
assertThat(latest).isNull()
// Even WHEN there *is* current wallpaper
val wp1 = mock<WallpaperInfo>()
- whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp1)
- fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(wp1)
+ broadcastDispatcher.sendIntentToMatchingReceiversOnly(
context,
Intent(Intent.ACTION_WALLPAPER_CHANGED),
)
@@ -226,6 +234,8 @@ class WallpaperRepositoryImplTest : SysuiTestCase() {
@EnableFlags(SharedFlags.FLAG_AMBIENT_AOD)
fun wallpaperSupportsAmbientMode_deviceDoesNotSupport_false() =
testScope.runTest {
+ underTest = kosmos.wallpaperRepository
+ secureSettings.putInt(Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED, 1)
context.orCreateTestableResources.addOverride(
R.bool.config_dozeSupportsAodWallpaper,
false,
@@ -239,6 +249,8 @@ class WallpaperRepositoryImplTest : SysuiTestCase() {
@EnableFlags(SharedFlags.FLAG_AMBIENT_AOD)
fun wallpaperSupportsAmbientMode_deviceDoesSupport_true() =
testScope.runTest {
+ underTest = kosmos.wallpaperRepository
+ secureSettings.putInt(Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED, 1)
context.orCreateTestableResources.addOverride(
R.bool.config_dozeSupportsAodWallpaper,
true,
@@ -249,19 +261,34 @@ class WallpaperRepositoryImplTest : SysuiTestCase() {
}
@Test
- @Ignore("ag/31591766")
+ @EnableFlags(SharedFlags.FLAG_AMBIENT_AOD)
+ fun wallpaperSupportsAmbientMode_deviceDoesSupport_settingDisabled_false() =
+ testScope.runTest {
+ underTest = kosmos.wallpaperRepository
+ secureSettings.putInt(Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED, 0)
+ context.orCreateTestableResources.addOverride(
+ R.bool.config_dozeSupportsAodWallpaper,
+ true,
+ )
+
+ val latest by collectLastValue(underTest.wallpaperSupportsAmbientMode)
+ assertThat(latest).isFalse()
+ }
+
+ @Test
@EnableFlags(SharedFlags.FLAG_EXTENDED_WALLPAPER_EFFECTS)
fun shouldSendNotificationLayout_setExtendedEffectsWallpaper_launchSendLayoutJob() =
testScope.runTest {
+ underTest = kosmos.wallpaperRepository
val latest by collectLastValue(underTest.shouldSendFocalArea)
val extedendEffectsWallpaper =
mock<WallpaperInfo>().apply {
whenever(this.component).thenReturn(ComponentName(context, focalAreaTarget))
}
- whenever(wallpaperManager.getWallpaperInfoForUser(any()))
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any()))
.thenReturn(extedendEffectsWallpaper)
- fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+ broadcastDispatcher.sendIntentToMatchingReceiversOnly(
context,
Intent(Intent.ACTION_WALLPAPER_CHANGED),
)
@@ -275,14 +302,15 @@ class WallpaperRepositoryImplTest : SysuiTestCase() {
@EnableFlags(SharedFlags.FLAG_EXTENDED_WALLPAPER_EFFECTS)
fun shouldSendNotificationLayout_setNotExtendedEffectsWallpaper_cancelSendLayoutJob() =
testScope.runTest {
+ underTest = kosmos.wallpaperRepository
val latest by collectLastValue(underTest.shouldSendFocalArea)
val extendedEffectsWallpaper =
mock<WallpaperInfo>().apply {
whenever(this.component).thenReturn(ComponentName("", focalAreaTarget))
}
- whenever(wallpaperManager.getWallpaperInfoForUser(any()))
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any()))
.thenReturn(extendedEffectsWallpaper)
- fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+ broadcastDispatcher.sendIntentToMatchingReceiversOnly(
context,
Intent(Intent.ACTION_WALLPAPER_CHANGED),
)
@@ -290,11 +318,14 @@ class WallpaperRepositoryImplTest : SysuiTestCase() {
assertThat(underTest.sendLockscreenLayoutJob).isNotNull()
assertThat(underTest.sendLockscreenLayoutJob!!.isActive).isEqualTo(true)
- whenever(wallpaperManager.getWallpaperInfoForUser(any())).thenReturn(UNSUPPORTED_WP)
- fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(
+ whenever(kosmos.wallpaperManager.getWallpaperInfoForUser(any()))
+ .thenReturn(UNSUPPORTED_WP)
+ broadcastDispatcher.sendIntentToMatchingReceiversOnly(
context,
Intent(Intent.ACTION_WALLPAPER_CHANGED),
)
+ runCurrent()
+
assertThat(latest).isFalse()
assertThat(underTest.sendLockscreenLayoutJob?.isCancelled).isEqualTo(true)
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt
index 390518f3e2e5..a023b3c430ad 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt
@@ -25,6 +25,8 @@ import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.testKosmos
+import com.android.systemui.window.data.repository.fakeWindowRootViewBlurRepository
+import com.android.systemui.window.data.repository.windowRootViewBlurRepository
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
@@ -34,7 +36,7 @@ import org.junit.runner.RunWith
@SmallTest
@RunWith(AndroidJUnit4::class)
-@EnableFlags(Flags.FLAG_BOUNCER_UI_REVAMP)
+@EnableFlags(Flags.FLAG_BOUNCER_UI_REVAMP, Flags.FLAG_GLANCEABLE_HUB_BLURRED_BACKGROUND)
class WindowRootViewModelTest : SysuiTestCase() {
val kosmos = testKosmos()
val testScope = kosmos.testScope
@@ -49,6 +51,7 @@ class WindowRootViewModelTest : SysuiTestCase() {
@Test
fun bouncerTransitionChangesWindowBlurRadius() =
testScope.runTest {
+ kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = true
val blurRadius by collectLastValue(underTest.blurRadius)
val isBlurOpaque by collectLastValue(underTest.isBlurOpaque)
runCurrent()
@@ -59,4 +62,27 @@ class WindowRootViewModelTest : SysuiTestCase() {
assertThat(blurRadius).isEqualTo(30)
assertThat(isBlurOpaque).isEqualTo(false)
}
+
+ @Test
+ fun blurRadiusDoesNotChangeWhenBlurIsNotSupported() =
+ testScope.runTest {
+ kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = false
+ val blurRadius by collectLastValue(underTest.blurRadius)
+ runCurrent()
+
+ kosmos.fakeBouncerTransitions.first().windowBlurRadius.value = 30.0f
+ runCurrent()
+
+ assertThat(blurRadius).isEqualTo(0f)
+
+ kosmos.fakeGlanceableHubTransitions.first().windowBlurRadius.value = 50.0f
+ runCurrent()
+
+ assertThat(blurRadius).isEqualTo(0f)
+
+ kosmos.windowRootViewBlurRepository.blurRadius.value = 60
+ runCurrent()
+
+ assertThat(blurRadius).isEqualTo(0f)
+ }
}
diff --git a/packages/SystemUI/plugin_core/proguard.flags b/packages/SystemUI/plugin_core/proguard.flags
index 6240898b3b93..8b78ba47fdfc 100644
--- a/packages/SystemUI/plugin_core/proguard.flags
+++ b/packages/SystemUI/plugin_core/proguard.flags
@@ -8,4 +8,7 @@
-keep interface com.android.systemui.plugins.annotations.** {
*;
}
--keep,allowshrinking,allowoptimization,allowobfuscation,allowaccessmodification @com.android.systemui.plugins.annotations.** class *
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keep,allowshrinking,allowoptimization,allowobfuscation,allowaccessmodification @com.android.systemui.plugins.annotations.** class * {
+ void <init>();
+}
diff --git a/packages/SystemUI/proguard_common.flags b/packages/SystemUI/proguard_common.flags
index e152c98a93e5..2b908a7dde6b 100644
--- a/packages/SystemUI/proguard_common.flags
+++ b/packages/SystemUI/proguard_common.flags
@@ -12,8 +12,14 @@
# Note that we restrict this to SysUISingleton classes, as other registering
# classes should either *always* unregister or *never* register from their
# constructor. We also keep callback class names for easier debugging.
--keepnames @com.android.systemui.util.annotations.WeaklyReferencedCallback class *
--keepnames class * extends @com.android.systemui.util.annotations.WeaklyReferencedCallback **
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keepnames @com.android.systemui.util.annotations.WeaklyReferencedCallback class * {
+ void <init>();
+}
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keepnames class * extends @com.android.systemui.util.annotations.WeaklyReferencedCallback ** {
+ void <init>();
+}
-if @com.android.systemui.util.annotations.WeaklyReferencedCallback class *
-keepclassmembers,allowaccessmodification @com.android.systemui.dagger.SysUISingleton class * {
<1> *;
@@ -23,10 +29,16 @@
<1> *;
}
--keep class androidx.core.app.CoreComponentFactory
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keep class androidx.core.app.CoreComponentFactory {
+ void <init>();
+}
# Keep the wm shell lib
--keep class com.android.wm.shell.*
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keep class com.android.wm.shell.* {
+ void <init>();
+}
# Keep the protolog group methods that are called by the generated code
-keepclassmembers class com.android.wm.shell.protolog.ShellProtoLogGroup {
*;
diff --git a/packages/SystemUI/res/layout/combined_qs_header.xml b/packages/SystemUI/res/layout/combined_qs_header.xml
index b9ef88eea6b9..32407c6ae1bf 100644
--- a/packages/SystemUI/res/layout/combined_qs_header.xml
+++ b/packages/SystemUI/res/layout/combined_qs_header.xml
@@ -147,6 +147,7 @@ frame when animating QS <-> QQS transition
android:id="@+id/batteryRemainingIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:visibility="gone"
app:textAppearance="@style/TextAppearance.QS.Status" />
</LinearLayout>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/ongoing_activity_chip_content.xml b/packages/SystemUI/res/layout/ongoing_activity_chip_content.xml
index 6f42286d9fac..b66a88a3e523 100644
--- a/packages/SystemUI/res/layout/ongoing_activity_chip_content.xml
+++ b/packages/SystemUI/res/layout/ongoing_activity_chip_content.xml
@@ -43,9 +43,6 @@
ongoing_activity_chip_short_time_delta] will ever be shown at one time. -->
<!-- Shows a timer, like 00:01. -->
- <!-- Don't use the LimitedWidth style for the timer because the end of the timer is often
- the most important value. ChipChronometer has the correct logic for when the timer is
- too large for the space allowed. -->
<com.android.systemui.statusbar.chips.ui.view.ChipChronometer
android:id="@+id/ongoing_activity_chip_time"
style="@style/StatusBar.Chip.Text"
@@ -54,14 +51,14 @@
<!-- Shows generic text. -->
<com.android.systemui.statusbar.chips.ui.view.ChipTextView
android:id="@+id/ongoing_activity_chip_text"
- style="@style/StatusBar.Chip.Text.LimitedWidth"
+ style="@style/StatusBar.Chip.Text"
android:visibility="gone"
/>
<!-- Shows a time delta in short form, like "15min" or "1hr". -->
<com.android.systemui.statusbar.chips.ui.view.ChipDateTimeView
android:id="@+id/ongoing_activity_chip_short_time_delta"
- style="@style/StatusBar.Chip.Text.LimitedWidth"
+ style="@style/StatusBar.Chip.Text"
android:visibility="gone"
/>
diff --git a/packages/SystemUI/res/layout/system_icons.xml b/packages/SystemUI/res/layout/system_icons.xml
index c28dc50cc1dc..bb99d581c0b0 100644
--- a/packages/SystemUI/res/layout/system_icons.xml
+++ b/packages/SystemUI/res/layout/system_icons.xml
@@ -34,12 +34,17 @@
android:orientation="horizontal"/>
<!-- PaddingEnd is added to balance hover padding, compensating for paddingStart in statusIcons.
- See b/339589733 -->
+ See b/339589733.
+
+ Default visibility is now "gone" to make space for the new battery icon
+ -->
<com.android.systemui.battery.BatteryMeterView android:id="@+id/battery"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:clipToPadding="false"
android:clipChildren="false"
android:paddingEnd="@dimen/status_bar_battery_end_padding"
+ android:visibility="gone"
systemui:textAppearance="@style/TextAppearance.StatusBar.Clock" />
+
</LinearLayout>
diff --git a/packages/SystemUI/res/values-iw/tiles_states_strings.xml b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
index d6b9bc8950af..1a5b8fbcd20d 100644
--- a/packages/SystemUI/res/values-iw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
@@ -194,6 +194,6 @@
<string-array name="tile_states_notes">
<item msgid="5894333929299989301">"לא זמין"</item>
<item msgid="6419996398343291862">"מושבת"</item>
- <item msgid="5908720590832378783">"מופעל"</item>
+ <item msgid="5908720590832378783">"מצב פעיל"</item>
</string-array>
</resources>
diff --git a/packages/SystemUI/res/values-night/colors.xml b/packages/SystemUI/res/values-night/colors.xml
index 326be99b8a65..85182a02faaf 100644
--- a/packages/SystemUI/res/values-night/colors.xml
+++ b/packages/SystemUI/res/values-night/colors.xml
@@ -110,12 +110,12 @@
<!-- Dark theme base colors for notification shade/scrim, the alpha component is adjusted
programmatically to match the spec -->
- <color name="shade_panel">@android:color/system_accent1_800</color>
- <color name="surface_effect_0">@android:color/system_accent1_800</color>
+ <color name="shade_panel_base">@android:color/system_accent1_800</color>
+ <color name="notification_scrim_base">@android:color/system_accent1_800</color>
- <!-- todo(b/388891904) Remove updated color references once they are available. -->
- <color name="shade_panel_base">@color/shade_panel</color>
- <color name="notification_scrim_base">@color/surface_effect_0</color>
+ <!-- Dark theme fallback colors for notification shade/scrim -->
+ <color name="shade_panel_fallback">@android:color/system_accent2_800</color>
+ <color name="notification_scrim_fallback">@android:color/system_surface_dim_dark</color>
<!-- Keyboard shortcut helper dialog -->
<color name="ksh_key_item_color">@*android:color/system_on_surface_variant_dark</color>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 5f8f77993245..8665fd6dcaf5 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -34,12 +34,12 @@
<!-- Base colors for notification shade/scrim, the alpha component is adjusted programmatically
to match the spec -->
- <color name="shade_panel">@android:color/system_accent1_900</color>
- <color name="surface_effect_0">@android:color/system_accent1_100</color>
+ <color name="shade_panel_base">@android:color/system_accent1_900</color>
+ <color name="notification_scrim_base">@android:color/system_accent1_100</color>
- <!-- todo(b/388891904) Remove updated color references once they are available. -->
- <color name="shade_panel_base">@color/shade_panel</color>
- <color name="notification_scrim_base">@color/surface_effect_0</color>
+ <!-- Fallback colors for notification shade/scrim -->
+ <color name="shade_panel_fallback">@android:color/system_accent2_200</color>
+ <color name="notification_scrim_fallback">@android:color/system_surface_dim_light</color>
<!-- The color of the background in the separated list of the Global Actions menu -->
<color name="global_actions_separated_background">#F5F5F5</color>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 9b8926e921c9..09aa2241e42b 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -1110,4 +1110,7 @@
<!-- Configuration for wallpaper focal area -->
<bool name="center_align_focal_area_shape">false</bool>
<string name="focal_area_target" translatable="false" />
+
+ <!-- Configuration to swipe to open glanceable hub -->
+ <bool name="config_swipeToOpenGlanceableHub">false</bool>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 2d3c07b93cb1..648e4c2e3ac7 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -1811,6 +1811,7 @@
<dimen name="ongoing_activity_chip_text_end_padding_for_embedded_padding_icon">6dp</dimen>
<dimen name="ongoing_activity_chip_text_fading_edge_length">12dp</dimen>
<dimen name="ongoing_activity_chip_corner_radius">28dp</dimen>
+ <dimen name="ongoing_activity_chip_outline_width">2px</dimen>
<!-- Status bar user chip -->
<dimen name="status_bar_user_chip_avatar_size">16dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index d18a90a17abe..86292039d93d 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1351,6 +1351,10 @@
<string name="accessibility_action_label_shrink_widget">Decrease height</string>
<!-- Label for accessibility action to expand a widget in edit mode. [CHAR LIMIT=NONE] -->
<string name="accessibility_action_label_expand_widget">Increase height</string>
+ <!-- Label for accessibility action to show the next media player. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_action_label_umo_show_next">Show next</string>
+ <!-- Label for accessibility action to show the previous media player. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_action_label_umo_show_previous">Show previous</string>
<!-- Title shown above information regarding lock screen widgets. [CHAR LIMIT=50] -->
<string name="communal_widgets_disclaimer_title">Lock screen widgets</string>
<!-- Information about lock screen widgets presented to the user. [CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 7f2c89346423..4961a7ece69a 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -93,15 +93,6 @@
<item name="android:textColor">?android:attr/colorPrimary</item>
</style>
- <!-- Style for a status bar chip text that has a maximum width. Since there's so little room in
- the status bar chip area, don't ellipsize the text and instead just fade it out a bit at
- the end. -->
- <style name="StatusBar.Chip.Text.LimitedWidth">
- <item name="android:ellipsize">none</item>
- <item name="android:requiresFadingEdge">horizontal</item>
- <item name="android:fadingEdgeLength">@dimen/ongoing_activity_chip_text_fading_edge_length</item>
- </style>
-
<style name="Chipbar" />
<style name="Chipbar.Text" parent="@*android:style/TextAppearance.DeviceDefault.Notification.Title">
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index 335a910eb106..73dc28230e65 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -98,7 +98,6 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.settingslib.Utils;
import com.android.settingslib.drawable.CircleFramedDrawable;
-import com.android.systemui.Flags;
import com.android.systemui.FontStyles;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.classifier.FalsingA11yDelegate;
@@ -121,6 +120,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
static final int USER_TYPE_PRIMARY = 1;
static final int USER_TYPE_WORK_PROFILE = 2;
static final int USER_TYPE_SECONDARY_USER = 3;
+ private boolean mTransparentModeEnabled = false;
@IntDef({MODE_UNINITIALIZED, MODE_DEFAULT, MODE_ONE_HANDED, MODE_USER_SWITCHER})
public @interface Mode {}
@@ -814,15 +814,30 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
mDisappearAnimRunning = false;
}
+ /**
+ * Make the bouncer background transparent
+ */
+ public void enableTransparentMode() {
+ mTransparentModeEnabled = true;
+ reloadBackgroundColor();
+ }
+
+ /**
+ * Make the bouncer background opaque
+ */
+ public void disableTransparentMode() {
+ mTransparentModeEnabled = false;
+ reloadBackgroundColor();
+ }
+
private void reloadBackgroundColor() {
- if (Flags.bouncerUiRevamp()) {
- // Keep the background transparent, otherwise the background color looks like a box
- // while scaling the bouncer for back animation or while transitioning to the bouncer.
+ if (mTransparentModeEnabled) {
setBackgroundColor(Color.TRANSPARENT);
} else {
setBackgroundColor(
getContext().getColor(com.android.internal.R.color.materialColorSurfaceDim));
}
+ invalidate();
}
void reloadColors() {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index ff7b2b025539..d10fce416150 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -70,6 +70,7 @@ import com.android.keyguard.KeyguardSecurityContainer.SwipeListener;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.keyguard.dagger.KeyguardBouncerScope;
import com.android.settingslib.utils.ThreadUtils;
+import com.android.systemui.Flags;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.biometrics.FaceAuthAccessibilityDelegate;
import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor;
@@ -96,6 +97,8 @@ import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.settings.GlobalSettings;
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepository;
+import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor;
import dagger.Lazy;
@@ -134,6 +137,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
private final FalsingA11yDelegate mFalsingA11yDelegate;
private final DeviceEntryFaceAuthInteractor mDeviceEntryFaceAuthInteractor;
private final BouncerMessageInteractor mBouncerMessageInteractor;
+ private final Lazy<WindowRootViewBlurInteractor> mRootViewBlurInteractor;
private int mTranslationY;
private final KeyguardDismissTransitionInteractor mKeyguardDismissTransitionInteractor;
private final DevicePolicyManager mDevicePolicyManager;
@@ -431,6 +435,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
private final Executor mBgExecutor;
@Nullable
private Job mSceneTransitionCollectionJob;
+ private Job mBlurEnabledCollectionJob;
@Inject
public KeyguardSecurityContainerController(KeyguardSecurityContainer view,
@@ -463,9 +468,11 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
KeyguardDismissTransitionInteractor keyguardDismissTransitionInteractor,
Lazy<PrimaryBouncerInteractor> primaryBouncerInteractor,
@Background Executor bgExecutor,
- Provider<DeviceEntryInteractor> deviceEntryInteractor
+ Provider<DeviceEntryInteractor> deviceEntryInteractor,
+ Lazy<WindowRootViewBlurInteractor> rootViewBlurInteractorProvider
) {
super(view);
+ mRootViewBlurInteractor = rootViewBlurInteractorProvider;
view.setAccessibilityDelegate(faceAuthAccessibilityDelegate);
mLockPatternUtils = lockPatternUtils;
mUpdateMonitor = keyguardUpdateMonitor;
@@ -539,6 +546,32 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
}
);
}
+
+ if (Flags.bouncerUiRevamp()) {
+ mBlurEnabledCollectionJob = mJavaAdapter.get().alwaysCollectFlow(
+ mRootViewBlurInteractor.get().isBlurCurrentlySupported(),
+ this::handleBlurSupportedChanged);
+ }
+ }
+
+ private void handleBlurSupportedChanged(boolean isWindowBlurSupported) {
+ if (isWindowBlurSupported) {
+ mView.enableTransparentMode();
+ } else {
+ mView.disableTransparentMode();
+ }
+ }
+
+ private void refreshBouncerBackground() {
+ // This is present solely for screenshot tests that disable blur by invoking setprop to
+ // disable blurs, however the mRootViewBlurInteractor#isBlurCurrentlySupported doesn't emit
+ // an updated value because sysui doesn't have a way to register for changes to setprop.
+ // KeyguardSecurityContainer view is inflated only once and doesn't re-inflate so it has to
+ // check the sysprop every time bouncer is about to be shown.
+ if (Flags.bouncerUiRevamp() && (ActivityManager.isRunningInUserTestHarness()
+ || ActivityManager.isRunningInTestHarness())) {
+ handleBlurSupportedChanged(!WindowRootViewBlurRepository.isDisableBlurSysPropSet());
+ }
}
@Override
@@ -552,6 +585,11 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
mSceneTransitionCollectionJob.cancel(null);
mSceneTransitionCollectionJob = null;
}
+
+ if (mBlurEnabledCollectionJob != null) {
+ mBlurEnabledCollectionJob.cancel(null);
+ mBlurEnabledCollectionJob = null;
+ }
}
/** */
@@ -718,6 +756,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
if (bouncerUserSwitcher != null) {
bouncerUserSwitcher.setAlpha(0f);
}
+
+ refreshBouncerBackground();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
index a67ec65cceda..8734d05bc894 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java
@@ -296,6 +296,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
mGestureDetector =
new MagnificationGestureDetector(mContext, handler, this);
mWindowInsetChangeRunnable = this::onWindowInsetChanged;
+ mWindowInsetChangeRunnable.run();
// Initialize listeners.
mMirrorViewRunnable = new Runnable() {
@@ -367,8 +368,12 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
private boolean updateSystemGestureInsetsTop() {
final WindowMetrics windowMetrics = mWm.getCurrentWindowMetrics();
final Insets insets = windowMetrics.getWindowInsets().getInsets(systemGestures());
- final int gestureTop =
- insets.bottom != 0 ? windowMetrics.getBounds().bottom - insets.bottom : -1;
+ final int gestureTop;
+ if (Flags.updateWindowMagnifierBottomBoundary()) {
+ gestureTop = windowMetrics.getBounds().bottom - insets.bottom;
+ } else {
+ gestureTop = insets.bottom != 0 ? windowMetrics.getBounds().bottom - insets.bottom : -1;
+ }
if (gestureTop != mSystemGestureTop) {
mSystemGestureTop = gestureTop;
return true;
@@ -953,7 +958,6 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
? mSystemGestureTop - height + mOuterBorderSize
: mWindowBounds.bottom - height + mOuterBorderSize;
final int y = MathUtils.clamp(mMagnificationFrame.top - mMirrorSurfaceMargin, minY, maxY);
-
if (computeWindowSize) {
LayoutParams params = (LayoutParams) mMirrorView.getLayoutParams();
params.width = width;
diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java
index 9a30c213a2f9..fcf51051940c 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java
@@ -46,7 +46,10 @@ import java.io.PrintWriter;
import javax.inject.Inject;
-/** Controller for {@link BatteryMeterView}. **/
+/**
+ * Controller for {@link BatteryMeterView}.
+ * @deprecated once [NewStatusBarIcons] is rolled out, this class is no longer needed
+ */
public class BatteryMeterViewController extends ViewController<BatteryMeterView> {
private final ConfigurationController mConfigurationController;
private final TunerService mTunerService;
diff --git a/packages/SystemUI/src/com/android/systemui/common/shared/colors/SurfaceEffectColors.kt b/packages/SystemUI/src/com/android/systemui/common/shared/colors/SurfaceEffectColors.kt
index d4027c029a0a..7c2fc7fe3aee 100644
--- a/packages/SystemUI/src/com/android/systemui/common/shared/colors/SurfaceEffectColors.kt
+++ b/packages/SystemUI/src/com/android/systemui/common/shared/colors/SurfaceEffectColors.kt
@@ -17,9 +17,6 @@
package com.android.systemui.common.shared.colors
import android.content.res.Resources
-import android.graphics.Color
-import com.android.internal.graphics.ColorUtils
-import com.android.systemui.res.R
object SurfaceEffectColors {
@JvmStatic
diff --git a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
index fc589b220f2f..e36e85565293 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt
@@ -19,11 +19,8 @@ package com.android.systemui.communal
import android.os.UserHandle
import android.provider.Settings
import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.compose.animation.scene.SceneKey
-import com.android.compose.animation.scene.TransitionKey
import com.android.internal.logging.UiEventLogger
import com.android.systemui.CoreStartable
-import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
@@ -31,36 +28,24 @@ import com.android.systemui.communal.shared.log.CommunalUiEvent
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.communal.shared.model.CommunalScenes.isCommunal
import com.android.systemui.communal.shared.model.CommunalTransitionKeys
-import com.android.systemui.communal.shared.model.EditModeState
import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.dock.DockManager
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
-import com.android.systemui.keyguard.shared.model.KeyguardState
-import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.statusbar.NotificationShadeWindowController
-import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.util.kotlin.emitOnStart
-import com.android.systemui.util.kotlin.getValue
import com.android.systemui.util.kotlin.sample
import com.android.systemui.util.settings.SettingsProxyExt.observerFlow
import com.android.systemui.util.settings.SystemSettings
-import java.util.Optional
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
-import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.withContext
@@ -72,16 +57,12 @@ import kotlinx.coroutines.withContext
class CommunalSceneStartable
@Inject
constructor(
- private val dockManager: DockManager,
private val communalInteractor: CommunalInteractor,
private val communalSettingsInteractor: CommunalSettingsInteractor,
private val communalSceneInteractor: CommunalSceneInteractor,
- private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
private val keyguardInteractor: KeyguardInteractor,
private val systemSettings: SystemSettings,
- centralSurfacesOpt: Optional<CentralSurfaces>,
private val notificationShadeWindowController: NotificationShadeWindowController,
- @Application private val applicationScope: CoroutineScope,
@Background private val bgScope: CoroutineScope,
@Main private val mainDispatcher: CoroutineDispatcher,
private val uiEventLogger: UiEventLogger,
@@ -92,115 +73,85 @@ constructor(
private var isDreaming: Boolean = false
- private val centralSurfaces: CentralSurfaces? by centralSurfacesOpt
-
override fun start() {
if (!communalSettingsInteractor.isCommunalFlagEnabled()) {
return
}
- if (!communalSceneKtfRefactor()) {
- // Handle automatically switching based on keyguard state.
- keyguardTransitionInteractor.startedKeyguardTransitionStep
- .mapLatest(::determineSceneAfterTransition)
- .filterNotNull()
- .onEach { (nextScene, nextTransition) ->
- // When launching a widget, we don't want to animate the scene change or the
- // Communal Hub will reveal the wallpaper even though it shouldn't. Instead we
- // snap to the new scene as part of the launch animation, once the activity
- // launch is done, so we don't change scene here.
- val delaySceneTransition =
- communalSceneInteractor.editModeState.value == EditModeState.STARTING ||
- communalSceneInteractor.isLaunchingWidget.value
- if (!delaySceneTransition) {
- communalSceneInteractor.changeScene(
- newScene = nextScene,
- loggingReason = "KTF syncing",
- transitionKey = nextTransition,
- )
- }
+ bgScope.launch {
+ communalSceneInteractor.isIdleOnCommunal.collectLatest {
+ withContext(mainDispatcher) {
+ notificationShadeWindowController.setGlanceableHubShowing(it)
}
- .launchIn(applicationScope)
- }
-
- // TODO(b/322787129): re-enable once custom animations are in place
- // Handle automatically switching to communal when docked.
- // dockManager
- // .retrieveIsDocked()
- // // Allow some time after docking to ensure the dream doesn't start. If the
- // dream
- // // starts, then we don't want to automatically transition to glanceable hub.
- // .debounce(DOCK_DEBOUNCE_DELAY)
- // .sample(keyguardTransitionInteractor.startedKeyguardState, ::Pair)
- // .onEach { (docked, lastStartedState) ->
- // if (docked && lastStartedState == KeyguardState.LOCKSCREEN) {
- // communalInteractor.onSceneChanged(CommunalScenes.Communal)
- // }
- // }
- // .launchIn(bgScope)
-
- systemSettings
- .observerFlow(Settings.System.SCREEN_OFF_TIMEOUT)
- // Read the setting value on start.
- .emitOnStart()
- .onEach {
- screenTimeout =
- systemSettings.getIntForUser(
- Settings.System.SCREEN_OFF_TIMEOUT,
- DEFAULT_SCREEN_TIMEOUT,
- UserHandle.USER_CURRENT,
- )
}
- .launchIn(bgScope)
+ }
- // The hub mode timeout should start as soon as the user enters hub mode. At the end of the
- // timer, if the device is dreaming, hub mode should closed and reveal the dream. If the
- // dream is not running, nothing will happen. However if the dream starts again underneath
- // hub mode after the initial timeout expires, such as if the device is docked or the dream
- // app is updated by the Play store, a new timeout should be started.
- bgScope.launch {
- combine(
- communalSceneInteractor.currentScene,
- // Emit a value on start so the combine starts.
- communalInteractor.userActivity.emitOnStart(),
- ) { scene, _ ->
- // Only timeout if we're on the hub is open.
- scene.isCommunal()
+ // In V2, the timeout is handled by PowerManagerService since we no longer keep the dream
+ // active underneath the hub.
+ if (!communalSettingsInteractor.isV2FlagEnabled()) {
+ systemSettings
+ .observerFlow(Settings.System.SCREEN_OFF_TIMEOUT)
+ // Read the setting value on start.
+ .emitOnStart()
+ .onEach {
+ screenTimeout =
+ systemSettings.getIntForUser(
+ Settings.System.SCREEN_OFF_TIMEOUT,
+ DEFAULT_SCREEN_TIMEOUT,
+ UserHandle.USER_CURRENT,
+ )
}
- .collectLatest { shouldTimeout ->
- cancelHubTimeout()
- if (shouldTimeout) {
- startHubTimeout()
+ .launchIn(bgScope)
+
+ // The hub mode timeout should start as soon as the user enters hub mode. At the end of
+ // the
+ // timer, if the device is dreaming, hub mode should closed and reveal the dream. If the
+ // dream is not running, nothing will happen. However if the dream starts again
+ // underneath
+ // hub mode after the initial timeout expires, such as if the device is docked or the
+ // dream
+ // app is updated by the Play store, a new timeout should be started.
+ bgScope.launch {
+ combine(
+ communalSceneInteractor.currentScene,
+ // Emit a value on start so the combine starts.
+ communalInteractor.userActivity.emitOnStart(),
+ ) { scene, _ ->
+ // Only timeout if we're on the hub is open.
+ scene.isCommunal()
}
- }
- }
- bgScope.launch {
- keyguardInteractor.isDreaming
- .sample(communalSceneInteractor.currentScene, ::Pair)
- .collectLatest { (isDreaming, scene) ->
- this@CommunalSceneStartable.isDreaming = isDreaming
- if (scene.isCommunal() && isDreaming && timeoutJob == null) {
- // If dreaming starts after timeout has expired, ex. if dream restarts under
- // the hub, wait for IS_ABLE_TO_DREAM_DELAY_MS and then close the hub. The
- // delay is necessary so the KeyguardInteractor.isAbleToDream flow passes
- // through that same amount of delay and publishes a new value which is then
- // picked up by the HomeSceneFamilyResolver such that the next call to
- // SceneInteractor.changeScene(Home) will resolve "Home" to "Dream".
- delay(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS)
- communalSceneInteractor.changeScene(
- CommunalScenes.Blank,
- "dream started after timeout",
- )
- uiEventLogger.log(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT)
+ .collectLatest { shouldTimeout ->
+ cancelHubTimeout()
+ if (shouldTimeout) {
+ startHubTimeout()
+ }
}
- }
- }
+ }
- bgScope.launch {
- communalSceneInteractor.isIdleOnCommunal.collectLatest {
- withContext(mainDispatcher) {
- notificationShadeWindowController.setGlanceableHubShowing(it)
- }
+ bgScope.launch {
+ keyguardInteractor.isDreaming
+ .sample(communalSceneInteractor.currentScene, ::Pair)
+ .collectLatest { (isDreaming, scene) ->
+ this@CommunalSceneStartable.isDreaming = isDreaming
+ if (scene.isCommunal() && isDreaming && timeoutJob == null) {
+ // If dreaming starts after timeout has expired, ex. if dream restarts
+ // under
+ // the hub, wait for IS_ABLE_TO_DREAM_DELAY_MS and then close the hub.
+ // The
+ // delay is necessary so the KeyguardInteractor.isAbleToDream flow
+ // passes
+ // through that same amount of delay and publishes a new value which is
+ // then
+ // picked up by the HomeSceneFamilyResolver such that the next call to
+ // SceneInteractor.changeScene(Home) will resolve "Home" to "Dream".
+ delay(KeyguardInteractor.IS_ABLE_TO_DREAM_DELAY_MS)
+ communalSceneInteractor.changeScene(
+ CommunalScenes.Blank,
+ "dream started after timeout",
+ )
+ uiEventLogger.log(CommunalUiEvent.COMMUNAL_HUB_TIMEOUT)
+ }
+ }
}
}
}
@@ -231,49 +182,7 @@ constructor(
}
}
- private suspend fun determineSceneAfterTransition(
- lastStartedTransition: TransitionStep
- ): Pair<SceneKey, TransitionKey>? {
- val to = lastStartedTransition.to
- val from = lastStartedTransition.from
- val docked = dockManager.isDocked
- val launchingActivityOverLockscreen =
- centralSurfaces?.isLaunchingActivityOverLockscreen ?: false
-
- return when {
- to == KeyguardState.OCCLUDED && !launchingActivityOverLockscreen -> {
- // Hide communal when an activity is started on keyguard, to ensure the activity
- // underneath the hub is shown. When launching activities over lockscreen, we only
- // change scenes once the activity launch animation is finished, so avoid
- // changing the scene here.
- Pair(CommunalScenes.Blank, CommunalTransitionKeys.SimpleFade)
- }
- to == KeyguardState.GLANCEABLE_HUB && from == KeyguardState.OCCLUDED -> {
- // When transitioning to the hub from an occluded state, fade out the hub without
- // doing any translation.
- Pair(CommunalScenes.Communal, CommunalTransitionKeys.SimpleFade)
- }
- // Transitioning to Blank scene when entering the edit mode will be handled separately
- // with custom animations.
- to == KeyguardState.GONE && !communalInteractor.editModeOpen.value ->
- Pair(CommunalScenes.Blank, CommunalTransitionKeys.SimpleFade)
- !docked && !KeyguardState.deviceIsAwakeInState(to) -> {
- // If the user taps the screen and wakes the device within this timeout, we don't
- // want to dismiss the hub
- delay(AWAKE_DEBOUNCE_DELAY)
- Pair(CommunalScenes.Blank, CommunalTransitionKeys.SimpleFade)
- }
- from == KeyguardState.DOZING && to == KeyguardState.GLANCEABLE_HUB -> {
- // Make sure the communal hub is showing when transitioning from dozing to hub.
- Pair(CommunalScenes.Communal, CommunalTransitionKeys.SimpleFade)
- }
- else -> null
- }
- }
-
companion object {
- val AWAKE_DEBOUNCE_DELAY = 5.seconds
- val DOCK_DEBOUNCE_DELAY = 1.seconds
val DEFAULT_SCREEN_TIMEOUT = 15000
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt
index f01a6dbf568f..ff741625a3cc 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/dagger/CommunalModule.kt
@@ -104,6 +104,7 @@ interface CommunalModule {
companion object {
const val LOGGABLE_PREFIXES = "loggable_prefixes"
const val LAUNCHER_PACKAGE = "launcher_package"
+ const val SWIPE_TO_HUB = "swipe_to_hub"
@Provides
@Communal
@@ -143,5 +144,11 @@ interface CommunalModule {
fun provideLauncherPackage(@Main resources: Resources): String {
return resources.getString(R.string.launcher_overlayable_package)
}
+
+ @Provides
+ @Named(SWIPE_TO_HUB)
+ fun provideSwipeToHub(@Main resources: Resources): Boolean {
+ return resources.getBoolean(R.bool.config_swipeToOpenGlanceableHub)
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt
index ec5540172be5..740555f40dea 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt
@@ -16,11 +16,11 @@
package com.android.systemui.communal.domain.interactor
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.compose.animation.scene.SceneKey
import com.android.compose.animation.scene.SceneTransitionLayout
import com.android.systemui.CoreStartable
-import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.communal.data.repository.CommunalSceneTransitionRepository
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.dagger.SysUISingleton
@@ -44,7 +44,6 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
-import com.android.app.tracing.coroutines.launchTraced as launch
/**
* This class listens to [SceneTransitionLayout] transitions and manages keyguard transition
@@ -122,11 +121,7 @@ constructor(
)
override fun start() {
- if (
- communalSceneKtfRefactor() &&
- settingsInteractor.isCommunalFlagEnabled() &&
- !SceneContainerFlag.isEnabled
- ) {
+ if (settingsInteractor.isCommunalFlagEnabled() && !SceneContainerFlag.isEnabled) {
sceneInteractor.registerSceneStateProcessor(this)
listenForSceneTransitionProgress()
}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt
index 49003a735fbd..d061a3331dad 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/BaseCommunalViewModel.kt
@@ -153,7 +153,7 @@ abstract class BaseCommunalViewModel(
) {}
/** Called as the UI requests deleting a widget. */
- open fun onDeleteWidget(id: Int, componentName: ComponentName, rank: Int) {}
+ open fun onDeleteWidget(id: Int, key: String, componentName: ComponentName, rank: Int) {}
/** Called as the UI detects a tap event on the widget. */
open fun onTapWidget(componentName: ComponentName, rank: Int) {}
@@ -202,6 +202,12 @@ abstract class BaseCommunalViewModel(
/** Called as the user request to show the customize widget button. */
open fun onLongClick() {}
+ /** Called as the user requests to switch to the previous player in UMO. */
+ open fun onShowPreviousMedia() {}
+
+ /** Called as the user requests to switch to the next player in UMO. */
+ open fun onShowNextMedia() {}
+
/** Called as the UI determines that a new widget has been added to the grid. */
open fun onNewWidgetAdded(provider: AppWidgetProviderInfo) {}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt
index 8aba11190623..59beb1ed6c10 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalEditModeViewModel.kt
@@ -141,7 +141,10 @@ constructor(
metricsLogger.logAddWidget(componentName.flattenToString(), rank)
}
- override fun onDeleteWidget(id: Int, componentName: ComponentName, rank: Int) {
+ override fun onDeleteWidget(id: Int, key: String, componentName: ComponentName, rank: Int) {
+ if (selectedKey.value == key) {
+ setSelectedKey(null)
+ }
communalInteractor.deleteWidget(id)
metricsLogger.logRemoveWidget(componentName.flattenToString(), rank)
}
diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt
index 4bc44005d2fc..2169881d11c5 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt
@@ -19,6 +19,7 @@ package com.android.systemui.communal.ui.viewmodel
import android.content.ComponentName
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.Flags
+import com.android.systemui.communal.dagger.CommunalModule.Companion.SWIPE_TO_HUB
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
@@ -92,6 +93,7 @@ constructor(
private val metricsLogger: CommunalMetricsLogger,
mediaCarouselController: MediaCarouselController,
blurConfig: BlurConfig,
+ @Named(SWIPE_TO_HUB) private val swipeToHub: Boolean,
) :
BaseCommunalViewModel(
communalSceneInteractor,
@@ -254,6 +256,14 @@ constructor(
}
}
+ override fun onShowPreviousMedia() {
+ mediaCarouselController.mediaCarouselScrollHandler.scrollByStep(-1)
+ }
+
+ override fun onShowNextMedia() {
+ mediaCarouselController.mediaCarouselScrollHandler.scrollByStep(1)
+ }
+
override fun onTapWidget(componentName: ComponentName, rank: Int) {
metricsLogger.logTapWidget(componentName.flattenToString(), rank)
}
@@ -349,6 +359,8 @@ constructor(
/** See [CommunalSettingsInteractor.isV2FlagEnabled] */
fun v2FlagEnabled(): Boolean = communalSettingsInteractor.isV2FlagEnabled()
+ fun swipeToHubEnabled(): Boolean = swipeToHub
+
companion object {
const val POPUP_AUTO_HIDE_TIMEOUT_MS = 12000L
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
index 3c68e3a09f02..8bff090959ab 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java
@@ -74,6 +74,7 @@ import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.dagger.CentralSurfacesModule;
import com.android.systemui.statusbar.dagger.StartCentralSurfacesModule;
+import com.android.systemui.statusbar.notification.dagger.NotificationStackModule;
import com.android.systemui.statusbar.notification.dagger.ReferenceNotificationsModule;
import com.android.systemui.statusbar.notification.headsup.HeadsUpModule;
import com.android.systemui.statusbar.phone.CentralSurfaces;
@@ -169,6 +170,7 @@ import javax.inject.Named;
WallpaperModule.class,
ShortcutHelperModule.class,
ContextualEducationModule.class,
+ NotificationStackModule.class,
})
public abstract class ReferenceSystemUIModule {
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt
index 9607053f4e7f..b712fdeaf623 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/domain/interactor/TutorialSchedulerInteractor.kt
@@ -39,6 +39,8 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.drop
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flow
@@ -99,6 +101,25 @@ constructor(
waitForDeviceConnection(deviceType)
}
+ // This flow is used by the notification updater once an initial notification is launched. It
+ // listens to the device connection changes for both keyboard and touchpad. When either of the
+ // device is disconnected, resolve the tutorial type base on the latest connection state.
+ // Dropping the initial state because it's the existing notification. Filtering out BOTH because
+ // we only care about disconnections.
+ val tutorialTypeUpdates: Flow<TutorialType> =
+ keyboardRepository.isAnyKeyboardConnected
+ .combine(touchpadRepository.isAnyTouchpadConnected, ::Pair)
+ .map { (keyboardConnected, touchpadConnected) ->
+ when {
+ keyboardConnected && touchpadConnected -> TutorialType.BOTH
+ keyboardConnected -> TutorialType.KEYBOARD
+ touchpadConnected -> TutorialType.TOUCHPAD
+ else -> TutorialType.NONE
+ }
+ }
+ .drop(1)
+ .filter { it != TutorialType.BOTH }
+
private suspend fun waitForDeviceConnection(deviceType: DeviceType) =
isAnyDeviceConnected[deviceType]!!.filter { it }.first()
@@ -172,6 +193,7 @@ constructor(
pw.println(
" launch time = ${repo.getScheduledTutorialLaunchTime(TOUCHPAD)}"
)
+ pw.println("Delay time = ${LAUNCH_DELAY.seconds} sec")
}
"notify" -> {
if (args.size != 2) help(pw)
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt
index 3cba70e39e66..a90c7adf86f3 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt
@@ -42,6 +42,9 @@ import com.android.systemui.res.R
import com.android.systemui.settings.UserTracker
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.merge
/** When the scheduler is due, show a notification to launch tutorial */
@@ -55,19 +58,43 @@ constructor(
private val notificationManager: NotificationManager,
private val userTracker: UserTracker,
) {
+ private var updaterJob: Job? = null
+
fun start() {
backgroundScope.launch {
merge(
tutorialSchedulerInteractor.tutorials,
tutorialSchedulerInteractor.commandTutorials,
)
- .collect { showNotification(it) }
+ .filter { it != TutorialType.NONE }
+ .collectLatest {
+ showNotification(it)
+ updaterJob?.cancel()
+ updaterJob = backgroundScope.launch { updateWhenDeviceDisconnects() }
+ }
}
}
+ private suspend fun updateWhenDeviceDisconnects() {
+ // Only update the notification when there is an active one (i.e. if the notification has
+ // been dismissed by the user, or if the tutorial has been launched, there's no need to
+ // update)
+ tutorialSchedulerInteractor.tutorialTypeUpdates
+ .filter { hasNotification() }
+ .collect {
+ if (it == TutorialType.NONE)
+ notificationManager.cancelAsUser(TAG, NOTIFICATION_ID, userTracker.userHandle)
+ else showNotification(it)
+ }
+ }
+
+ private fun hasNotification() =
+ notificationManager.activeNotifications.any { it.id == NOTIFICATION_ID }
+
// By sharing the same tag and id, we update the content of existing notification instead of
// creating multiple notifications
private fun showNotification(tutorialType: TutorialType) {
+ // Safe guard - but this should never been reached
if (tutorialType == TutorialType.NONE) return
if (notificationManager.getNotificationChannel(CHANNEL_ID) == null)
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt
index fdb80b2e0f87..978b873cbfab 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/source/AccessibilityShortcutsSource.kt
@@ -52,17 +52,15 @@ class AccessibilityShortcutsSource @Inject constructor(@Main private val resourc
val shortcuts = mutableListOf<KeyboardShortcutInfo>()
if (keyboardA11yShortcutControl()) {
- if (InputSettings.isAccessibilityBounceKeysFeatureEnabled()) {
- shortcuts.add(
- // Toggle bounce keys:
- // - Meta + Alt + 3
- shortcutInfo(
- resources.getString(R.string.group_accessibility_toggle_bounce_keys)
- ) {
- command(META_META_ON or META_ALT_ON, KEYCODE_3)
- }
- )
- }
+ shortcuts.add(
+ // Toggle bounce keys:
+ // - Meta + Alt + 3
+ shortcutInfo(
+ resources.getString(R.string.group_accessibility_toggle_bounce_keys)
+ ) {
+ command(META_META_ON or META_ALT_ON, KEYCODE_3)
+ }
+ )
if (InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled()) {
shortcuts.add(
// Toggle mouse keys:
@@ -74,28 +72,24 @@ class AccessibilityShortcutsSource @Inject constructor(@Main private val resourc
}
)
}
- if (InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
- shortcuts.add(
- // Toggle sticky keys:
- // - Meta + Alt + 5
- shortcutInfo(
- resources.getString(R.string.group_accessibility_toggle_sticky_keys)
- ) {
- command(META_META_ON or META_ALT_ON, KEYCODE_5)
- }
- )
- }
- if (InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) {
- shortcuts.add(
- // Toggle slow keys:
- // - Meta + Alt + 6
- shortcutInfo(
- resources.getString(R.string.group_accessibility_toggle_slow_keys)
- ) {
- command(META_META_ON or META_ALT_ON, KEYCODE_6)
- }
- )
- }
+ shortcuts.add(
+ // Toggle sticky keys:
+ // - Meta + Alt + 5
+ shortcutInfo(
+ resources.getString(R.string.group_accessibility_toggle_sticky_keys)
+ ) {
+ command(META_META_ON or META_ALT_ON, KEYCODE_5)
+ }
+ )
+ shortcuts.add(
+ // Toggle slow keys:
+ // - Meta + Alt + 6
+ shortcutInfo(
+ resources.getString(R.string.group_accessibility_toggle_slow_keys)
+ ) {
+ command(META_META_ON or META_ALT_ON, KEYCODE_6)
+ }
+ )
}
if (enableVoiceAccessKeyGestures()) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt
index eb96c921c181..6f5f662d6fa3 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt
@@ -21,7 +21,6 @@ import android.annotation.SuppressLint
import android.app.DreamManager
import com.android.app.animation.Interpolators
import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
@@ -155,9 +154,8 @@ constructor(
.sample(
communalInteractor.isCommunalAvailable,
communalInteractor.shouldShowCommunal,
- communalSceneInteractor.isIdleOnCommunal,
)
- .collect { (_, isCommunalAvailable, shouldShowCommunal, isIdleOnCommunal) ->
+ .collect { (_, isCommunalAvailable, shouldShowCommunal) ->
val isKeyguardOccludedLegacy = keyguardInteractor.isKeyguardOccluded.value
val primaryBouncerShowing = keyguardInteractor.primaryBouncerShowing.value
val isKeyguardGoingAway = keyguardInteractor.isKeyguardGoingAway.value
@@ -187,10 +185,6 @@ constructor(
}
} else if (isKeyguardOccludedLegacy) {
startTransitionTo(KeyguardState.OCCLUDED)
- } else if (isIdleOnCommunal && !communalSceneKtfRefactor()) {
- if (!SceneContainerFlag.isEnabled) {
- startTransitionTo(KeyguardState.GLANCEABLE_HUB)
- }
} else if (
shouldTransitionToCommunal(shouldShowCommunal, isCommunalAvailable)
) {
@@ -217,7 +211,6 @@ constructor(
.sample(
communalInteractor.shouldShowCommunal,
communalInteractor.isCommunalAvailable,
- communalSceneInteractor.isIdleOnCommunal,
keyguardInteractor.biometricUnlockState,
wakeToGoneInteractor.canWakeDirectlyToGone,
keyguardInteractor.primaryBouncerShowing,
@@ -227,7 +220,6 @@ constructor(
_,
shouldShowCommunal,
isCommunalAvailable,
- isIdleOnCommunal,
biometricUnlockState,
canWakeDirectlyToGone,
primaryBouncerShowing) ->
@@ -252,13 +244,6 @@ constructor(
ownerReason = "waking from dozing",
)
}
- } else if (isIdleOnCommunal && !communalSceneKtfRefactor()) {
- if (!SceneContainerFlag.isEnabled) {
- startTransitionTo(
- KeyguardState.GLANCEABLE_HUB,
- ownerReason = "waking from dozing",
- )
- }
} else if (
shouldTransitionToCommunal(shouldShowCommunal, isCommunalAvailable)
) {
@@ -276,15 +261,11 @@ constructor(
}
}
- private suspend fun transitionToGlanceableHub() {
- if (communalSceneKtfRefactor()) {
- communalSceneInteractor.snapToScene(
- newScene = CommunalScenes.Communal,
- loggingReason = "from dozing to hub",
- )
- } else {
- startTransitionTo(KeyguardState.GLANCEABLE_HUB)
- }
+ private fun transitionToGlanceableHub() {
+ communalSceneInteractor.snapToScene(
+ newScene = CommunalScenes.Communal,
+ loggingReason = "from dozing to hub",
+ )
}
/** Dismisses keyguard from the DOZING state. */
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
index c1c509b8fd57..0fb98ffa4a30 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt
@@ -21,7 +21,6 @@ import android.annotation.SuppressLint
import android.app.DreamManager
import com.android.app.animation.Interpolators
import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
@@ -59,7 +58,6 @@ constructor(
@Background bgDispatcher: CoroutineDispatcher,
@Main mainDispatcher: CoroutineDispatcher,
keyguardInteractor: KeyguardInteractor,
- private val glanceableHubTransitions: GlanceableHubTransitions,
private val communalInteractor: CommunalInteractor,
private val communalSceneInteractor: CommunalSceneInteractor,
private val communalSettingsInteractor: CommunalSettingsInteractor,
@@ -87,11 +85,7 @@ constructor(
listenForDreamingToLockscreenOrGone()
listenForDreamingToAodOrDozing()
listenForTransitionToCamera(scope, keyguardInteractor)
- if (!communalSceneKtfRefactor()) {
- listenForDreamingToGlanceableHub()
- } else {
- listenForDreamingToGlanceableHubFromPowerButton()
- }
+ listenForDreamingToGlanceableHubFromPowerButton()
listenForDreamingToPrimaryBouncer()
}
@@ -105,18 +99,6 @@ constructor(
}
}
- private fun listenForDreamingToGlanceableHub() {
- if (!communalSettingsInteractor.isCommunalFlagEnabled()) return
- if (SceneContainerFlag.isEnabled) return
- scope.launch("$TAG#listenForDreamingToGlanceableHub", mainDispatcher) {
- glanceableHubTransitions.listenForGlanceableHubTransition(
- transitionOwnerName = TAG,
- fromState = KeyguardState.DREAMING,
- toState = KeyguardState.GLANCEABLE_HUB,
- )
- }
- }
-
/**
* Normally when pressing power button from the dream, the devices goes from DREAMING to DOZING,
* then [FromDozingTransitionInteractor] handles the transition to GLANCEABLE_HUB. However if
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt
index c5d40a0dcf30..2eeba0f10e0c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt
@@ -19,7 +19,6 @@ package com.android.systemui.keyguard.domain.interactor
import android.animation.ValueAnimator
import com.android.app.animation.Interpolators
import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
import com.android.systemui.communal.shared.model.CommunalScenes
@@ -31,12 +30,10 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.KeyguardWmStateRefactor
import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
-import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.util.kotlin.BooleanFlowOperators.allOf
import com.android.systemui.util.kotlin.BooleanFlowOperators.noneOf
-import com.android.systemui.util.kotlin.BooleanFlowOperators.not
import com.android.systemui.util.kotlin.Utils.Companion.sampleFilter
import com.android.systemui.util.kotlin.sample
import javax.inject.Inject
@@ -45,10 +42,8 @@ import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.FlowPreview
-import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.debounce
-import kotlinx.coroutines.withContext
@OptIn(FlowPreview::class)
@SysUISingleton
@@ -58,7 +53,6 @@ constructor(
@Background private val scope: CoroutineScope,
@Main mainDispatcher: CoroutineDispatcher,
@Background bgDispatcher: CoroutineDispatcher,
- private val glanceableHubTransitions: GlanceableHubTransitions,
private val communalSettingsInteractor: CommunalSettingsInteractor,
keyguardInteractor: KeyguardInteractor,
private val communalSceneInteractor: CommunalSceneInteractor,
@@ -83,9 +77,6 @@ constructor(
if (!communalSettingsInteractor.isCommunalFlagEnabled()) {
return
}
- if (!communalSceneKtfRefactor()) {
- listenForHubToLockscreenOrDreaming()
- }
listenForHubToDozing()
listenForHubToPrimaryBouncer()
listenForHubToAlternateBouncer()
@@ -108,30 +99,6 @@ constructor(
}
}
- /**
- * Listens for the glanceable hub transition to lock screen and directly drives the keyguard
- * transition.
- */
- private fun listenForHubToLockscreenOrDreaming() {
- scope.launch("$TAG#listenForGlanceableHubToLockscreenOrDream") {
- keyguardInteractor.isDreaming.collectLatest { dreaming ->
- withContext(mainDispatcher) {
- val toState =
- if (dreaming) {
- KeyguardState.DREAMING
- } else {
- KeyguardState.LOCKSCREEN
- }
- glanceableHubTransitions.listenForGlanceableHubTransition(
- transitionOwnerName = TAG,
- fromState = KeyguardState.GLANCEABLE_HUB,
- toState = toState,
- )
- }
- }
- }
- }
-
private fun listenForHubToPrimaryBouncer() {
scope.launch("$TAG#listenForHubToPrimaryBouncer") {
keyguardInteractor.primaryBouncerShowing
@@ -161,18 +128,11 @@ constructor(
powerInteractor.isAsleep
.filterRelevantKeyguardStateAnd { isAsleep -> isAsleep }
.collect {
- if (communalSceneKtfRefactor()) {
- communalSceneInteractor.snapToScene(
- newScene = CommunalScenes.Blank,
- loggingReason = "hub to dozing",
- keyguardState = KeyguardState.DOZING,
- )
- } else {
- startTransitionTo(
- toState = KeyguardState.DOZING,
- modeOnCanceled = TransitionModeOnCanceled.LAST_VALUE,
- )
- }
+ communalSceneInteractor.snapToScene(
+ newScene = CommunalScenes.Blank,
+ loggingReason = "hub to dozing",
+ keyguardState = KeyguardState.DOZING,
+ )
}
}
}
@@ -202,21 +162,17 @@ constructor(
.filterRelevantKeyguardStateAnd { onTop -> onTop }
.collect {
maybeStartTransitionToOccludedOrInsecureCamera { state, reason ->
- if (communalSceneKtfRefactor()) {
- communalSceneInteractor.changeScene(
- newScene = CommunalScenes.Blank,
- loggingReason = "hub to occluded (KeyguardWmStateRefactor)",
- transitionKey = CommunalTransitionKeys.SimpleFade,
- keyguardState = state,
- )
- null
- } else {
- startTransitionTo(state, ownerReason = reason)
- }
+ communalSceneInteractor.changeScene(
+ newScene = CommunalScenes.Blank,
+ loggingReason = "hub to occluded (KeyguardWmStateRefactor)",
+ transitionKey = CommunalTransitionKeys.SimpleFade,
+ keyguardState = state,
+ )
+ null
}
}
}
- } else if (communalSceneKtfRefactor()) {
+ } else {
scope.launch {
combine(
keyguardInteractor.isKeyguardOccluded,
@@ -248,56 +204,40 @@ constructor(
)
}
}
- } else {
- scope.launch {
- allOf(keyguardInteractor.isKeyguardOccluded, not(keyguardInteractor.isDreaming))
- .filterRelevantKeyguardStateAnd { isOccludedAndNotDreaming ->
- isOccludedAndNotDreaming
- }
- .collect { _ -> startTransitionTo(KeyguardState.OCCLUDED) }
- }
}
}
private fun listenForHubToGone() {
if (SceneContainerFlag.isEnabled) return
- if (communalSceneKtfRefactor()) {
- scope.launch {
- allOf(
- keyguardInteractor.isKeyguardGoingAway,
- // TODO(b/327225415): Handle edit mode opening here to avoid going to GONE
- // state until after edit mode is ready to be shown.
- noneOf(
- // When launching activities from widgets on the hub, we wait to change
- // scenes until the activity launch is complete.
- communalSceneInteractor.isLaunchingWidget
- ),
- )
- .filterRelevantKeyguardStateAnd { isKeyguardGoingAway -> isKeyguardGoingAway }
- .sample(communalSceneInteractor.editModeState, ::Pair)
- .collect { (_, editModeState) ->
- if (
- editModeState == EditModeState.STARTING ||
- editModeState == EditModeState.SHOWING
- ) {
- // Don't change scenes here as that is handled by the edit activity.
- startTransitionTo(KeyguardState.GONE)
- } else {
- communalSceneInteractor.changeScene(
- newScene = CommunalScenes.Blank,
- loggingReason = "hub to gone",
- transitionKey = CommunalTransitionKeys.SimpleFade,
- keyguardState = KeyguardState.GONE,
- )
- }
+ scope.launch {
+ allOf(
+ keyguardInteractor.isKeyguardGoingAway,
+ // TODO(b/327225415): Handle edit mode opening here to avoid going to GONE
+ // state until after edit mode is ready to be shown.
+ noneOf(
+ // When launching activities from widgets on the hub, we wait to change
+ // scenes until the activity launch is complete.
+ communalSceneInteractor.isLaunchingWidget
+ ),
+ )
+ .filterRelevantKeyguardStateAnd { isKeyguardGoingAway -> isKeyguardGoingAway }
+ .sample(communalSceneInteractor.editModeState, ::Pair)
+ .collect { (_, editModeState) ->
+ if (
+ editModeState == EditModeState.STARTING ||
+ editModeState == EditModeState.SHOWING
+ ) {
+ // Don't change scenes here as that is handled by the edit activity.
+ startTransitionTo(KeyguardState.GONE)
+ } else {
+ communalSceneInteractor.changeScene(
+ newScene = CommunalScenes.Blank,
+ loggingReason = "hub to gone",
+ transitionKey = CommunalTransitionKeys.SimpleFade,
+ keyguardState = KeyguardState.GONE,
+ )
}
- }
- } else {
- scope.launch {
- keyguardInteractor.isKeyguardGoingAway
- .filterRelevantKeyguardStateAnd { isKeyguardGoingAway -> isKeyguardGoingAway }
- .collect { startTransitionTo(KeyguardState.GONE) }
- }
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt
index cf712f111034..a01dc02bbd9f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt
@@ -20,7 +20,6 @@ import android.animation.ValueAnimator
import android.util.MathUtils
import com.android.app.animation.Interpolators
import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
@@ -69,7 +68,6 @@ constructor(
keyguardInteractor: KeyguardInteractor,
private val shadeRepository: ShadeRepository,
powerInteractor: PowerInteractor,
- private val glanceableHubTransitions: GlanceableHubTransitions,
private val communalSettingsInteractor: CommunalSettingsInteractor,
private val communalInteractor: CommunalInteractor,
private val communalSceneInteractor: CommunalSceneInteractor,
@@ -96,9 +94,6 @@ constructor(
listenForLockscreenToPrimaryBouncerDragging()
listenForLockscreenToAlternateBouncer()
listenForLockscreenTransitionToCamera()
- if (!communalSceneKtfRefactor()) {
- listenForLockscreenToGlanceableHub()
- }
if (communalSettingsInteractor.isV2FlagEnabled()) {
listenForLockscreenToGlanceableHubV2()
}
@@ -358,24 +353,6 @@ constructor(
}
}
- /**
- * Listens for transition from glanceable hub back to lock screen and directly drives the
- * keyguard transition.
- */
- private fun listenForLockscreenToGlanceableHub() {
- if (SceneContainerFlag.isEnabled) return
- if (!communalSettingsInteractor.isCommunalFlagEnabled()) {
- return
- }
- scope.launch(context = mainDispatcher) {
- glanceableHubTransitions.listenForGlanceableHubTransition(
- transitionOwnerName = TAG,
- fromState = KeyguardState.LOCKSCREEN,
- toState = KeyguardState.GLANCEABLE_HUB,
- )
- }
- }
-
private fun listenForLockscreenToGlanceableHubV2() {
scope.launch {
communalInteractor.shouldShowCommunal
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt
index 284298df6906..a2cfdc192394 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt
@@ -19,7 +19,6 @@ package com.android.systemui.keyguard.domain.interactor
import android.animation.ValueAnimator
import com.android.app.animation.Interpolators
import com.android.app.tracing.coroutines.launchTraced as launch
-import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.Flags.restartDreamOnUnocclude
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
@@ -143,15 +142,11 @@ constructor(
startTransitionTo(KeyguardState.DREAMING)
} else if (isIdleOnCommunal || showCommunalFromOccluded) {
if (SceneContainerFlag.isEnabled) return
- if (communalSceneKtfRefactor()) {
- communalSceneInteractor.changeScene(
- newScene = CommunalScenes.Communal,
- loggingReason = "occluded to hub",
- transitionKey = CommunalTransitionKeys.SimpleFade,
- )
- } else {
- startTransitionTo(KeyguardState.GLANCEABLE_HUB)
- }
+ communalSceneInteractor.changeScene(
+ newScene = CommunalScenes.Communal,
+ loggingReason = "occluded to hub",
+ transitionKey = CommunalTransitionKeys.SimpleFade,
+ )
} else {
startTransitionTo(KeyguardState.LOCKSCREEN)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt
index 402c152070a2..30c1aac7b2a7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt
@@ -18,8 +18,8 @@ package com.android.systemui.keyguard.domain.interactor
import android.animation.ValueAnimator
import android.util.Log
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.keyguard.KeyguardSecurityModel
-import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.dagger.SysUISingleton
@@ -35,7 +35,6 @@ import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.util.kotlin.Utils.Companion.sample
-import com.android.systemui.util.kotlin.sample
import com.android.wm.shell.shared.animation.Interpolators
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
@@ -45,7 +44,6 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
-import com.android.app.tracing.coroutines.launchTraced as launch
@SysUISingleton
class FromPrimaryBouncerTransitionInteractor
@@ -173,8 +171,7 @@ constructor(
// If the hub is showing, and we are not animating a widget launch nor transitioning to
// edit mode, then close the hub immediately.
if (
- communalSceneKtfRefactor() &&
- communalSceneInteractor.isIdleOnCommunal.value &&
+ communalSceneInteractor.isIdleOnCommunal.value &&
!communalSceneInteractor.isLaunchingWidget.value &&
communalSceneInteractor.editModeState.value == null
) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitions.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitions.kt
deleted file mode 100644
index bde0f56aa691..000000000000
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitions.kt
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.keyguard.domain.interactor
-
-import android.animation.ValueAnimator
-import com.android.app.animation.Interpolators
-import com.android.systemui.communal.domain.interactor.CommunalInteractor
-import com.android.systemui.communal.domain.model.CommunalTransitionProgressModel
-import com.android.systemui.communal.shared.model.CommunalScenes
-import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
-import com.android.systemui.keyguard.shared.model.KeyguardState
-import com.android.systemui.keyguard.shared.model.TransitionInfo
-import com.android.systemui.keyguard.shared.model.TransitionState
-import com.android.systemui.scene.shared.flag.SceneContainerFlag
-import com.android.systemui.util.kotlin.sample
-import java.util.UUID
-import javax.inject.Inject
-
-class GlanceableHubTransitions
-@Inject
-constructor(
- private val transitionInteractor: KeyguardTransitionInteractor,
- private val transitionRepository: KeyguardTransitionRepository,
- private val communalInteractor: CommunalInteractor,
-) {
- /**
- * Listens for the glanceable hub transition to the specified scene and directly drives the
- * keyguard transition between the lockscreen and the hub.
- *
- * The glanceable hub transition progress is used as the source of truth as it cannot be driven
- * externally. The progress is used for both transitions caused by user touch input or by
- * programmatic changes.
- */
- suspend fun listenForGlanceableHubTransition(
- transitionOwnerName: String,
- fromState: KeyguardState,
- toState: KeyguardState,
- ) {
- if (SceneContainerFlag.isEnabled) return
- val toScene =
- if (fromState == KeyguardState.GLANCEABLE_HUB) {
- CommunalScenes.Blank
- } else {
- CommunalScenes.Communal
- }
- var transitionId: UUID? = null
-
- communalInteractor
- .transitionProgressToScene(toScene)
- .sample(
- transitionInteractor.startedKeyguardTransitionStep,
- ::Pair,
- )
- .collect { (transitionProgress, lastStartedStep) ->
- val id = transitionId
- if (id == null) {
- // No transition started.
- if (
- transitionProgress is CommunalTransitionProgressModel.Transition &&
- lastStartedStep.to == fromState
- ) {
- transitionId =
- transitionRepository.startTransition(
- TransitionInfo(
- ownerName = transitionOwnerName,
- from = fromState,
- to = toState,
- animator = null, // transition will be manually controlled
- )
- )
- }
- } else {
- if (lastStartedStep.to != toState) {
- return@collect
- }
- // An existing `id` means a transition is started, and calls to
- // `updateTransition` will control it until FINISHED or CANCELED
- val nextState: TransitionState
- val progressFraction: Float
- when (transitionProgress) {
- is CommunalTransitionProgressModel.Idle -> {
- if (transitionProgress.scene == toScene) {
- nextState = TransitionState.FINISHED
- progressFraction = 1f
- } else {
- nextState = TransitionState.CANCELED
- progressFraction = 0f
- }
- }
- is CommunalTransitionProgressModel.Transition -> {
- nextState = TransitionState.RUNNING
- progressFraction = transitionProgress.progress
- }
- is CommunalTransitionProgressModel.OtherTransition -> {
- // Shouldn't happen but if another transition starts during the
- // current one, mark the current one as canceled.
- nextState = TransitionState.CANCELED
- progressFraction = 0f
- }
- }
- transitionRepository.updateTransition(
- id,
- progressFraction,
- nextState,
- )
-
- if (
- nextState == TransitionState.CANCELED ||
- nextState == TransitionState.FINISHED
- ) {
- transitionId = null
- }
-
- // If canceled, just put the state back.
- if (nextState == TransitionState.CANCELED) {
- transitionRepository.startTransition(
- TransitionInfo(
- ownerName = transitionOwnerName,
- from = toState,
- to = fromState,
- animator =
- ValueAnimator().apply {
- interpolator = Interpolators.LINEAR
- duration = 0
- }
- )
- )
- }
- }
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
index 8f6815829ba2..c5127a5e49ba 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
@@ -66,11 +66,14 @@ constructor(
* range. This function maps the [startTime] and [duration] into [0, 1], when this subset is
* valid.
*
+ * Note that [onStep] accepts a null return value. When null, no animation information will
+ * be emitted, effectively saying "do not change the value on this frame"
+ *
* Note that [onCancel] isn't used when the scene framework is enabled.
*/
fun sharedFlow(
duration: Duration = transitionDuration,
- onStep: (Float) -> Float,
+ onStep: (Float) -> Float?,
startTime: Duration = 0.milliseconds,
onStart: (() -> Unit)? = null,
onCancel: (() -> Float)? = null,
@@ -102,7 +105,7 @@ constructor(
*/
fun sharedFlowWithState(
duration: Duration,
- onStep: (Float) -> Float,
+ onStep: (Float) -> Float?,
startTime: Duration = 0.milliseconds,
onStart: (() -> Unit)? = null,
onCancel: (() -> Float)? = null,
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
index dc7fefa1d754..65c0a4fe46a7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
@@ -54,7 +54,12 @@ constructor(
)
val deviceEntryBackgroundViewAlpha: Flow<Float> =
- transitionAnimation.immediatelyTransitionTo(0f)
+ transitionAnimation.sharedFlow(
+ duration = TO_DOZING_DURATION,
+ onStep = { null },
+ onFinish = { 0f },
+ onCancel = { 0f },
+ )
override val deviceEntryParentViewAlpha: Flow<Float> =
deviceEntryUdfpsInteractor.isUdfpsEnrolledAndEnabled.flatMapLatest {
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandler.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandler.kt
index d63c2e07b94f..0107a5278e3e 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaCarouselScrollHandler.kt
@@ -23,11 +23,11 @@ import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.ViewOutlineProvider
+import androidx.annotation.VisibleForTesting
import androidx.core.view.GestureDetectorCompat
import androidx.dynamicanimation.animation.FloatPropertyCompat
import androidx.dynamicanimation.animation.SpringForce
import com.android.app.tracing.TraceStateLogger
-import com.android.internal.annotations.VisibleForTesting
import com.android.settingslib.Utils
import com.android.systemui.Gefingerpoken
import com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS
@@ -38,9 +38,10 @@ import com.android.systemui.res.R
import com.android.systemui.util.animation.TransitionLayout
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.wm.shell.shared.animation.PhysicsAnimator
+import kotlin.math.sign
private const val FLING_SLOP = 1000000
-private const val DISMISS_DELAY = 100L
+@VisibleForTesting const val DISMISS_DELAY = 100L
private const val SCROLL_DELAY = 100L
private const val RUBBERBAND_FACTOR = 0.2f
private const val SETTINGS_BUTTON_TRANSLATION_FRACTION = 0.3f
@@ -64,7 +65,7 @@ class MediaCarouselScrollHandler(
private val closeGuts: (immediate: Boolean) -> Unit,
private val falsingManager: FalsingManager,
private val logSmartspaceImpression: (Boolean) -> Unit,
- private val logger: MediaUiEventLogger
+ private val logger: MediaUiEventLogger,
) {
/** Trace state logger for media carousel visibility */
private val visibleStateLogger = TraceStateLogger("$TAG#visibleToUser")
@@ -96,7 +97,7 @@ class MediaCarouselScrollHandler(
/** What's the currently visible player index? */
var visibleMediaIndex: Int = 0
- private set
+ @VisibleForTesting set
/** How much are we scrolled into the current media? */
private var scrollIntoCurrentMedia: Int = 0
@@ -137,14 +138,14 @@ class MediaCarouselScrollHandler(
eStart: MotionEvent?,
eCurrent: MotionEvent,
vX: Float,
- vY: Float
+ vY: Float,
) = onFling(vX, vY)
override fun onScroll(
down: MotionEvent?,
lastMotion: MotionEvent,
distanceX: Float,
- distanceY: Float
+ distanceY: Float,
) = onScroll(down!!, lastMotion, distanceX)
override fun onDown(e: MotionEvent): Boolean {
@@ -157,6 +158,7 @@ class MediaCarouselScrollHandler(
val touchListener =
object : Gefingerpoken {
override fun onTouchEvent(motionEvent: MotionEvent?) = onTouch(motionEvent!!)
+
override fun onInterceptTouchEvent(ev: MotionEvent?) = onInterceptTouch(ev!!)
}
@@ -168,7 +170,7 @@ class MediaCarouselScrollHandler(
scrollX: Int,
scrollY: Int,
oldScrollX: Int,
- oldScrollY: Int
+ oldScrollY: Int,
) {
if (playerWidthPlusPadding == 0) {
return
@@ -177,7 +179,7 @@ class MediaCarouselScrollHandler(
val relativeScrollX = scrollView.relativeScrollX
onMediaScrollingChanged(
relativeScrollX / playerWidthPlusPadding,
- relativeScrollX % playerWidthPlusPadding
+ relativeScrollX % playerWidthPlusPadding,
)
}
}
@@ -209,7 +211,7 @@ class MediaCarouselScrollHandler(
0,
carouselWidth,
carouselHeight,
- cornerRadius.toFloat()
+ cornerRadius.toFloat(),
)
}
}
@@ -235,7 +237,7 @@ class MediaCarouselScrollHandler(
getMaxTranslation().toFloat(),
0.0f,
1.0f,
- Math.abs(contentTranslation)
+ Math.abs(contentTranslation),
)
val settingsTranslation =
(1.0f - settingsOffset) *
@@ -323,7 +325,7 @@ class MediaCarouselScrollHandler(
CONTENT_TRANSLATION,
newTranslation,
startVelocity = 0.0f,
- config = translationConfig
+ config = translationConfig,
)
.start()
scrollView.animationTargetX = newTranslation
@@ -391,7 +393,7 @@ class MediaCarouselScrollHandler(
CONTENT_TRANSLATION,
newTranslation,
startVelocity = 0.0f,
- config = translationConfig
+ config = translationConfig,
)
.start()
} else {
@@ -430,7 +432,7 @@ class MediaCarouselScrollHandler(
CONTENT_TRANSLATION,
newTranslation,
startVelocity = vX,
- config = translationConfig
+ config = translationConfig,
)
.start()
scrollView.animationTargetX = newTranslation
@@ -583,10 +585,35 @@ class MediaCarouselScrollHandler(
// We need to post this to wait for the active player becomes visible.
mainExecutor.executeDelayed(
{ scrollView.smoothScrollTo(view.left, scrollView.scrollY) },
- SCROLL_DELAY
+ SCROLL_DELAY,
)
}
+ /**
+ * Scrolls the media carousel by the number of players specified by [step]. If scrolling beyond
+ * the carousel's bounds:
+ * - If the carousel is not dismissible, the settings button is displayed.
+ * - If the carousel is dismissible, no action taken.
+ *
+ * @param step A positive number means next, and negative means previous.
+ */
+ fun scrollByStep(step: Int) {
+ val destIndex = visibleMediaIndex + step
+ if (destIndex >= mediaContent.childCount || destIndex < 0) {
+ if (!showsSettingsButton) return
+ var translation = getMaxTranslation() * sign(-step.toFloat())
+ translation = if (isRtl) -translation else translation
+ PhysicsAnimator.getInstance(this)
+ .spring(CONTENT_TRANSLATION, translation, config = translationConfig)
+ .start()
+ scrollView.animationTargetX = translation
+ } else if (scrollView.getContentTranslation() != 0.0f) {
+ resetTranslation(true)
+ } else {
+ scrollToPlayer(destIndex = destIndex)
+ }
+ }
+
companion object {
private val CONTENT_TRANSLATION =
object : FloatPropertyCompat<MediaCarouselScrollHandler>("contentTranslation") {
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
index be814aecc42b..322c35116222 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java
@@ -209,8 +209,13 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
&& !mController.isCurrentConnectedDeviceRemote()) {
connectionState = ConnectionState.CONNECTED;
restrictVolumeAdjustment = true;
- mCurrentActivePosition = position;
clickListener = v -> onItemClick(v, device);
+ } else if (currentlyConnected && isMutingExpectedDeviceExist
+ && !mController.isCurrentConnectedDeviceRemote()) {
+ // mark as disconnected and set special click listener
+ clickListener = v -> cancelMuteAwaitConnection();
+ } else if (device.getState() == MediaDeviceState.STATE_GROUPING) {
+ connectionState = ConnectionState.CONNECTING;
} else if (mShouldGroupSelectedMediaItems
&& mController.getSelectedMediaDevice().size() > 1
&& isDeviceIncluded(mController.getSelectedMediaDevice(), device)) {
@@ -225,13 +230,11 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
boolean isActiveWithOngoingSession =
device.hasOngoingSession() && (currentlyConnected || isSelected);
if (isActiveWithOngoingSession) {
- mCurrentActivePosition = position;
ongoingSessionStatus = new OngoingSessionStatus(
device.isHostForOngoingSession());
connectionState = ConnectionState.CONNECTED;
} else {
if (currentlyConnected) {
- mCurrentActivePosition = position;
connectionState = ConnectionState.CONNECTED;
}
clickListener = getClickListenerBasedOnSelectionBehavior(device);
@@ -242,8 +245,6 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
deviceStatusIcon = mContext.getDrawable(R.drawable.media_output_status_failed);
subtitle = mContext.getString(R.string.media_output_dialog_connect_failed);
clickListener = v -> onItemClick(v, device);
- } else if (device.getState() == MediaDeviceState.STATE_GROUPING) {
- connectionState = ConnectionState.CONNECTING;
} else if (mController.getSelectedMediaDevice().size() > 1 && isSelected) {
// selected device in group
groupStatus = new GroupStatus(
@@ -251,16 +252,11 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
isDeselectable /* deselectable */);
connectionState = ConnectionState.CONNECTED;
} else if (currentlyConnected) {
+ connectionState = ConnectionState.CONNECTED;
// single selected device
- if (isMutingExpectedDeviceExist
- && !mController.isCurrentConnectedDeviceRemote()) {
- // mark as disconnected and set special click listener
- clickListener = v -> cancelMuteAwaitConnection();
- } else if (device.hasOngoingSession()) {
- mCurrentActivePosition = position;
+ if (device.hasOngoingSession()) {
ongoingSessionStatus = new OngoingSessionStatus(
device.isHostForOngoingSession());
- connectionState = ConnectionState.CONNECTED;
} else if (mController.isCurrentConnectedDeviceRemote()
&& !mController.getSelectableMediaDevice().isEmpty()) {
//If device is connected and there's other selectable devices, layout as
@@ -268,10 +264,6 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
groupStatus = new GroupStatus(
true /* selected */,
isDeselectable /* isDeselectable */);
- connectionState = ConnectionState.CONNECTED;
- } else {
- mCurrentActivePosition = position;
- connectionState = ConnectionState.CONNECTED;
}
} else if (isSelectable) {
//groupable device
@@ -289,6 +281,10 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
}
}
+ if (connectionState == ConnectionState.CONNECTED || isDeviceGroup) {
+ mCurrentActivePosition = position;
+ }
+
if (isDeviceGroup) {
String sessionName = mController.getSessionName() == null ? ""
: mController.getSessionName().toString();
@@ -440,6 +436,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
updateEndAreaColor(groupStatus.selected() ? mController.getColorSeekbarProgress()
: mController.getColorItemBackground());
mEndTouchArea.setContentDescription(getDeviceItemContentDescription(device));
+ mCheckBox.setOnCheckedChangeListener(null);
mCheckBox.setChecked(groupStatus.selected());
mCheckBox.setOnCheckedChangeListener(
isEnabled ? (buttonView, isChecked) -> onGroupActionTriggered(
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
index cf3b4969b07d..28540d4f1259 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
@@ -883,7 +883,7 @@ private suspend fun synchronizeQsState(
var currentTransition: ExpansionTransition? = null
fun snapTo(scene: SceneKey) {
- state.snapToScene(scene)
+ state.snapTo(scene)
currentTransition = null
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
index 7701b9087e23..ebfe101948c2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt
@@ -34,6 +34,7 @@ import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.clipScrollableContainer
import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Arrangement.spacedBy
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
@@ -56,14 +57,18 @@ import androidx.compose.foundation.lazy.grid.rememberLazyGridState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.systemGestureExclusion
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
+import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Clear
+import androidx.compose.material.icons.filled.Remove
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LocalContentColor
+import androidx.compose.material3.LocalMinimumInteractiveComponentSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
@@ -86,9 +91,12 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.geometry.isSpecified
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.MeasureScope
import androidx.compose.ui.layout.layout
import androidx.compose.ui.layout.onGloballyPositioned
@@ -105,10 +113,13 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.stateDescription
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
+import androidx.compose.ui.unit.toSize
import androidx.compose.ui.util.fastMap
+import androidx.compose.ui.zIndex
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.compose.animation.bounceable
import com.android.compose.modifiers.height
@@ -131,6 +142,7 @@ import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaul
import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.AUTO_SCROLL_SPEED
import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.AvailableTilesGridMinHeight
import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.CurrentTilesGridPadding
+import com.android.systemui.qs.panels.ui.compose.infinitegrid.EditModeTileDefaults.TileBadgeSize
import com.android.systemui.qs.panels.ui.compose.selection.MutableSelectionState
import com.android.systemui.qs.panels.ui.compose.selection.ResizableTileContainer
import com.android.systemui.qs.panels.ui.compose.selection.ResizingState
@@ -143,6 +155,7 @@ import com.android.systemui.qs.panels.ui.compose.selection.selectableTile
import com.android.systemui.qs.panels.ui.model.GridCell
import com.android.systemui.qs.panels.ui.model.SpacerGridCell
import com.android.systemui.qs.panels.ui.model.TileGridCell
+import com.android.systemui.qs.panels.ui.viewmodel.AvailableEditActions
import com.android.systemui.qs.panels.ui.viewmodel.BounceableTileViewModel
import com.android.systemui.qs.panels.ui.viewmodel.EditTileViewModel
import com.android.systemui.qs.pipeline.shared.TileSpec
@@ -152,6 +165,7 @@ import kotlin.math.abs
import kotlin.math.roundToInt
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
object TileType
@@ -232,16 +246,14 @@ fun DefaultEditTileGrid(
// the top bar
.padding(top = innerPadding.calculateTopPadding())
.clipScrollableContainer(Orientation.Vertical)
- .verticalScroll(scrollState),
+ .verticalScroll(scrollState)
+ .dragAndDropRemoveZone(listState, onRemoveTile),
) {
AnimatedContent(
targetState = listState.dragInProgress || selectionState.selected,
label = "QSEditHeader",
) { showRemoveTarget ->
- EditGridHeader(
- Modifier.dragAndDropRemoveZone(listState, onRemoveTile)
- .padding(bottom = 26.dp)
- ) {
+ EditGridHeader(Modifier.padding(bottom = 26.dp)) {
if (showRemoveTarget) {
RemoveTileTarget {
selectionState.selection?.let {
@@ -261,6 +273,7 @@ fun DefaultEditTileGrid(
columns,
largeTilesSpan,
onResize,
+ onRemoveTile,
onSetTiles,
)
@@ -269,7 +282,6 @@ fun DefaultEditTileGrid(
Modifier.fillMaxWidth()
.requiredHeightIn(AvailableTilesGridMinHeight)
.animateContentSize()
- .dragAndDropRemoveZone(listState, onRemoveTile)
) {
// Using the fully qualified name here as a workaround for AnimatedVisibility
// not being available from a Box
@@ -385,6 +397,7 @@ private fun CurrentTilesGrid(
columns: Int,
largeTilesSpan: Int,
onResize: (TileSpec, toIcon: Boolean) -> Unit,
+ onRemoveTile: (TileSpec) -> Unit,
onSetTiles: (List<TileSpec>) -> Unit,
) {
val currentListState by rememberUpdatedState(listState)
@@ -424,8 +437,15 @@ private fun CurrentTilesGrid(
}
.testTag(CURRENT_TILES_GRID_TEST_TAG),
) {
- EditTiles(cells, columns, listState, selectionState, coroutineScope, largeTilesSpan) {
- resizingOperation ->
+ EditTiles(
+ cells,
+ columns,
+ listState,
+ selectionState,
+ coroutineScope,
+ largeTilesSpan,
+ onRemoveTile,
+ ) { resizingOperation ->
when (resizingOperation) {
is TemporaryResizeOperation -> {
currentListState.resizeTile(resizingOperation.spec, resizingOperation.toIcon)
@@ -530,6 +550,7 @@ fun LazyGridScope.EditTiles(
selectionState: MutableSelectionState,
coroutineScope: CoroutineScope,
largeTilesSpan: Int,
+ onRemoveTile: (TileSpec) -> Unit,
onResize: (operation: ResizeOperation) -> Unit,
) {
items(
@@ -558,6 +579,7 @@ fun LazyGridScope.EditTiles(
dragAndDropState = dragAndDropState,
selectionState = selectionState,
onResize = onResize,
+ onRemoveTile = onRemoveTile,
coroutineScope = coroutineScope,
bounceableInfo = cells.bounceableInfo(index, columns),
largeTilesSpan = largeTilesSpan,
@@ -576,6 +598,7 @@ private fun TileGridCell(
dragAndDropState: DragAndDropState,
selectionState: MutableSelectionState,
onResize: (operation: ResizeOperation) -> Unit,
+ onRemoveTile: (TileSpec) -> Unit,
coroutineScope: CoroutineScope,
largeTilesSpan: Int,
bounceableInfo: BounceableInfo,
@@ -583,6 +606,8 @@ private fun TileGridCell(
) {
val stateDescription = stringResource(id = R.string.accessibility_qs_edit_position, index + 1)
var selected by remember { mutableStateOf(false) }
+ val showRemovalBadge =
+ !selected && cell.tile.availableEditActions.contains(AvailableEditActions.REMOVE)
val selectionAlpha by
animateFloatAsState(
targetValue = if (selected) 1f else 0f,
@@ -682,6 +707,15 @@ private fun TileGridCell(
) {
EditTile(tile = cell.tile, state = state, progress = progress)
}
+
+ if (showRemovalBadge) {
+ TileBadge(
+ icon = Icons.Default.Remove,
+ contentDescription = stringResource(R.string.qs_customize_remove),
+ ) {
+ onRemoveTile(cell.tile.tileSpec)
+ }
+ }
}
}
@@ -708,27 +742,35 @@ private fun AvailableTileGridCell(
verticalArrangement = spacedBy(CommonTileDefaults.TilePadding, Alignment.Top),
modifier = modifier,
) {
- Box(
- Modifier.fillMaxWidth()
- .height(TileHeight)
- .clickable(onClick = onClick, onClickLabel = onClickActionName)
- .semantics(mergeDescendants = true) { this.stateDescription = stateDescription }
- .dragAndDropTileSource(
- SizedTileImpl(cell.tile, cell.width),
- dragAndDropState,
- DragType.Add,
- ) {
- selectionState.unSelect()
- }
- .tileBackground(colors.background)
- .tilePadding()
- ) {
- // Icon
- SmallTileContent(
- iconProvider = { cell.tile.icon },
- color = colors.icon,
- animateToEnd = true,
- modifier = Modifier.align(Alignment.Center),
+ Box {
+ Box(
+ Modifier.fillMaxWidth()
+ .height(TileHeight)
+ .clickable(onClick = onClick, onClickLabel = onClickActionName)
+ .semantics(mergeDescendants = true) { this.stateDescription = stateDescription }
+ .dragAndDropTileSource(
+ SizedTileImpl(cell.tile, cell.width),
+ dragAndDropState,
+ DragType.Add,
+ ) {
+ selectionState.unSelect()
+ }
+ .tileBackground(colors.background)
+ .tilePadding()
+ ) {
+ // Icon
+ SmallTileContent(
+ iconProvider = { cell.tile.icon },
+ color = colors.icon,
+ animateToEnd = true,
+ modifier = Modifier.align(Alignment.Center),
+ )
+ }
+
+ TileBadge(
+ icon = Icons.Default.Add,
+ contentDescription = onClickActionName,
+ onClick = onClick,
)
}
Box(Modifier.fillMaxSize()) {
@@ -745,6 +787,39 @@ private fun AvailableTileGridCell(
}
@Composable
+private fun TileBadge(icon: ImageVector, contentDescription: String?, onClick: () -> Unit) {
+ // Use a higher zIndex than the tile to draw over it, and manually create the touch target as
+ // we're drawing over neighbor tiles as well.
+ val minTouchTargetSize = LocalMinimumInteractiveComponentSize.current
+
+ Box(
+ Modifier.zIndex(2f)
+ .layout { measurable, constraints ->
+ val size = minTouchTargetSize.roundToPx()
+ val placeable = measurable.measure(Constraints(size))
+ layout(placeable.width, placeable.height) {
+ val iconRadius = TileBadgeSize.roundToPx() / 2
+ val x = constraints.maxWidth - placeable.width / 2 - iconRadius
+ val y = 0 - placeable.height / 2 + iconRadius
+ placeable.place(x, y)
+ }
+ }
+ .systemGestureExclusion { Rect(Offset.Zero, it.size.toSize()) }
+ .pointerInput(Unit) { detectTapGestures { onClick() } }
+ ) {
+ val secondaryColor = MaterialTheme.colorScheme.secondary
+ Icon(
+ icon,
+ contentDescription = contentDescription,
+ modifier =
+ Modifier.size(TileBadgeSize).align(Alignment.Center).drawBehind {
+ drawCircle(secondaryColor)
+ },
+ )
+ }
+}
+
+@Composable
private fun SpacerGridCell(modifier: Modifier = Modifier) {
// By default, spacers are invisible and exist purely to catch drag movements
Box(modifier.height(TileHeight).fillMaxWidth())
@@ -829,6 +904,7 @@ private object EditModeTileDefaults {
const val AUTO_SCROLL_SPEED = 2 // 2ms per pixel
val CurrentTilesGridPadding = 8.dp
val AvailableTilesGridMinHeight = 200.dp
+ val TileBadgeSize = 20.dp
@Composable
fun editTileColors(): TileColors =
diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt
index c1545e1263db..7c472638da63 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/Selection.kt
@@ -81,7 +81,7 @@ fun ResizableTileContainer(
state = state,
modifier =
// Higher zIndex to make sure the handle is drawn above the content
- Modifier.zIndex(2f),
+ Modifier.zIndex(if (selected) 2f else 1f),
)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
index 01bcc2400933..efdf5bee2c7b 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt
@@ -40,6 +40,7 @@ import com.android.systemui.lifecycle.Hydrator
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.logger.SceneLogger
+import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.composable.Overlay
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
@@ -218,39 +219,36 @@ constructor(
* it being a false touch.
*/
fun canChangeScene(toScene: SceneKey): Boolean {
- val interactionTypeOrNull =
- when (toScene) {
- Scenes.Bouncer -> Classifier.BOUNCER_UNLOCK
- Scenes.Gone -> Classifier.UNLOCK
- Scenes.Shade -> Classifier.NOTIFICATION_DRAG_DOWN
- Scenes.QuickSettings -> Classifier.QUICK_SETTINGS
- else -> null
- }
-
- val fromScene = currentScene.value
- val isAllowed =
- interactionTypeOrNull?.let { interactionType ->
- // It's important that the falsing system is always queried, even if no enforcement
- // will occur. This helps build up the right signal in the system.
- val isFalseTouch = falsingInteractor.isFalseTouch(interactionType)
-
- // Only enforce falsing if moving from the lockscreen scene to a new scene.
- val fromLockscreenScene = fromScene == Scenes.Lockscreen
-
- !fromLockscreenScene || !isFalseTouch
- } ?: true
-
- if (isAllowed) {
+ return isInteractionAllowedByFalsing(toScene).also {
// A scene change is guaranteed; log it.
logger.logSceneChanged(
- from = fromScene,
+ from = currentScene.value,
to = toScene,
sceneState = null,
reason = "user interaction",
isInstant = false,
)
}
- return isAllowed
+ }
+
+ /**
+ * Returns `true` if showing the [newlyShown] overlay is currently allowed; `false` otherwise.
+ *
+ * This is invoked only for user-initiated transitions. The goal is to check with the falsing
+ * system whether the overlay change should be rejected due to it being a false touch.
+ */
+ fun canShowOrReplaceOverlay(
+ newlyShown: OverlayKey,
+ beingReplaced: OverlayKey? = null,
+ ): Boolean {
+ return isInteractionAllowedByFalsing(newlyShown).also {
+ // An overlay change is guaranteed; log it.
+ logger.logOverlayChangeRequested(
+ from = beingReplaced,
+ to = newlyShown,
+ reason = "user interaction",
+ )
+ }
}
/**
@@ -313,6 +311,34 @@ constructor(
return sceneInteractor.filteredUserActions(unfiltered)
}
+ /**
+ * Returns `true` if transitioning to [content] is permissible by the falsing system; `false`
+ * otherwise.
+ */
+ private fun isInteractionAllowedByFalsing(content: ContentKey): Boolean {
+ val interactionTypeOrNull =
+ when (content) {
+ Scenes.Bouncer -> Classifier.BOUNCER_UNLOCK
+ Scenes.Gone -> Classifier.UNLOCK
+ Scenes.Shade,
+ Overlays.NotificationsShade -> Classifier.NOTIFICATION_DRAG_DOWN
+ Scenes.QuickSettings,
+ Overlays.QuickSettingsShade -> Classifier.QUICK_SETTINGS
+ else -> null
+ }
+
+ return interactionTypeOrNull?.let { interactionType ->
+ // It's important that the falsing system is always queried, even if no enforcement
+ // will occur. This helps build up the right signal in the system.
+ val isFalseTouch = falsingInteractor.isFalseTouch(interactionType)
+
+ // Only enforce falsing if moving from the lockscreen scene to new content.
+ val fromLockscreenScene = currentScene.value == Scenes.Lockscreen
+
+ !fromLockscreenScene || !isFalseTouch
+ } ?: true
+ }
+
/** Defines interface for classes that can handle externally-reported [MotionEvent]s. */
interface MotionEventHandler {
/** Notifies that a [MotionEvent] has occurred. */
diff --git a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
index a379ef7b0b96..305e71e48702 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
@@ -520,7 +520,10 @@ constructor(
val glanceableHubV2 = communalSettingsInteractor.isV2FlagEnabled()
if (
!hubShowing &&
- (touchOnNotifications || touchOnUmo || touchOnSmartspace || glanceableHubV2)
+ (touchOnNotifications ||
+ touchOnUmo ||
+ touchOnSmartspace ||
+ !communalViewModel.swipeToHubEnabled())
) {
logger.d({
"Lockscreen touch ignored: touchOnNotifications: $bool1, touchOnUmo: $bool2, " +
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
index 9a79e1a45505..ce48c85d57ae 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt
@@ -31,16 +31,26 @@ import android.os.Trace.TRACE_TAG_APP
import android.provider.AlarmClock
import android.view.DisplayCutout
import android.view.View
+import android.view.ViewGroup
import android.view.WindowInsets
import android.widget.TextView
import androidx.annotation.VisibleForTesting
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.wrapContentWidth
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.unit.dp
import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.core.view.doOnLayout
+import androidx.core.view.isVisible
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.app.animation.Interpolators
import com.android.settingslib.Utils
import com.android.systemui.Dumpable
import com.android.systemui.animation.ShadeInterpolation
import com.android.systemui.battery.BatteryMeterView
+import com.android.systemui.battery.BatteryMeterView.MODE_ESTIMATE
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.demomode.DemoMode
@@ -60,12 +70,15 @@ import com.android.systemui.shade.carrier.ShadeCarrierGroup
import com.android.systemui.shade.carrier.ShadeCarrierGroupController
import com.android.systemui.shade.data.repository.ShadeDisplaysRepository
import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround
+import com.android.systemui.statusbar.core.NewStatusBarIcons
import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
+import com.android.systemui.statusbar.pipeline.battery.ui.composable.BatteryWithEstimate
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.NextAlarmController
@@ -76,6 +89,7 @@ import dagger.Lazy
import java.io.PrintWriter
import javax.inject.Inject
import javax.inject.Named
+import kotlinx.coroutines.flow.MutableStateFlow
/**
* Controller for QS header.
@@ -100,6 +114,7 @@ constructor(
private val shadeDisplaysRepositoryLazy: Lazy<ShadeDisplaysRepository>,
private val variableDateViewControllerFactory: VariableDateViewController.Factory,
@Named(SHADE_HEADER) private val batteryMeterViewController: BatteryMeterViewController,
+ private val batteryViewModelFactory: BatteryViewModel.Factory,
private val dumpManager: DumpManager,
private val shadeCarrierGroupControllerBuilder: ShadeCarrierGroupController.Builder,
private val combinedShadeHeadersConstraintManager: CombinedShadeHeadersConstraintManager,
@@ -162,6 +177,8 @@ constructor(
private var lastInsets: WindowInsets? = null
private var nextAlarmIntent: PendingIntent? = null
+ private val showBatteryEstimate = MutableStateFlow(false)
+
private var qsDisabled = false
private var visible = false
set(value) {
@@ -323,10 +340,6 @@ constructor(
override fun onInit() {
variableDateViewControllerFactory.create(date as VariableDateView).init()
- batteryMeterViewController.init()
-
- // battery settings same as in QS icons
- batteryMeterViewController.ignoreTunerUpdates()
val fgColor =
Utils.getColorAttrDefaultColor(header.context, android.R.attr.textColorPrimary)
@@ -336,11 +349,36 @@ constructor(
iconManager = tintedIconManagerFactory.create(iconContainer, StatusBarLocation.QS)
iconManager.setTint(fgColor, bgColor)
- batteryIcon.updateColors(
- fgColor /* foreground */,
- bgColor /* background */,
- fgColor, /* single tone (current default) */
- )
+ if (!NewStatusBarIcons.isEnabled) {
+ batteryMeterViewController.init()
+
+ // battery settings same as in QS icons
+ batteryMeterViewController.ignoreTunerUpdates()
+
+ batteryIcon.isVisible = true
+ batteryIcon.updateColors(
+ fgColor /* foreground */,
+ bgColor /* background */,
+ fgColor, /* single tone (current default) */
+ )
+ } else {
+ // Configure the compose battery view
+ val batteryComposeView =
+ ComposeView(mView.context).apply {
+ setContent {
+ val showBatteryEstimate by showBatteryEstimate.collectAsStateWithLifecycle()
+ BatteryWithEstimate(
+ modifier = Modifier.height(17.dp).wrapContentWidth(),
+ viewModelFactory = batteryViewModelFactory,
+ isDark = { true },
+ showEstimate = showBatteryEstimate,
+ )
+ }
+ }
+ mView.requireViewById<ViewGroup>(R.id.hover_system_icons_container).apply {
+ addView(batteryComposeView, -1)
+ }
+ }
carrierIconSlots =
listOf(header.context.getString(com.android.internal.R.string.status_bar_mobile))
@@ -474,7 +512,11 @@ constructor(
private fun updateBatteryMode() {
qsBatteryModeController.getBatteryMode(cutout, qsExpandedFraction)?.let {
- batteryIcon.setPercentShowMode(it)
+ if (NewStatusBarIcons.isEnabled) {
+ showBatteryEstimate.value = it == MODE_ESTIMATE
+ } else {
+ batteryIcon.setPercentShowMode(it)
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
index b9df9f868dc3..7d4b0ed6304c 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
@@ -45,13 +45,17 @@ import com.android.systemui.shade.domain.interactor.ShadeLockscreenInteractor
import com.android.systemui.shade.domain.interactor.ShadeLockscreenInteractorImpl
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import com.android.systemui.shade.domain.interactor.ShadeModeInteractorImpl
+import com.android.systemui.window.dagger.WindowRootViewBlurModule
import dagger.Binds
import dagger.Module
import dagger.Provides
import javax.inject.Provider
/** Module for classes related to the notification shade. */
-@Module(includes = [StartShadeModule::class, ShadeViewProviderModule::class])
+@Module(
+ includes =
+ [StartShadeModule::class, ShadeViewProviderModule::class, WindowRootViewBlurModule::class]
+)
abstract class ShadeModule {
companion object {
@Provides
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractor.kt
index 8f4e8701cad8..1ab0b93da175 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeModeInteractor.kt
@@ -22,6 +22,7 @@ import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.log.table.logDiffsForTable
import com.android.systemui.scene.domain.SceneFrameworkTableLog
+import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.shade.data.repository.ShadeRepository
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.shared.settings.data.repository.SecureSettingsRepository
@@ -32,6 +33,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.stateIn
/**
@@ -89,10 +91,14 @@ constructor(
) : ShadeModeInteractor {
private val isDualShadeEnabled: Flow<Boolean> =
- secureSettingsRepository.boolSetting(
- Settings.Secure.DUAL_SHADE,
- defaultValue = DUAL_SHADE_ENABLED_DEFAULT,
- )
+ if (SceneContainerFlag.isEnabled) {
+ secureSettingsRepository.boolSetting(
+ Settings.Secure.DUAL_SHADE,
+ defaultValue = DUAL_SHADE_ENABLED_DEFAULT,
+ )
+ } else {
+ flowOf(false)
+ }
override val isShadeLayoutWide: StateFlow<Boolean> = repository.isShadeLayoutWide
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/ShadeColors.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/ShadeColors.kt
index 8db622566e5e..62428471f08b 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ui/ShadeColors.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ui/ShadeColors.kt
@@ -23,18 +23,48 @@ import com.android.systemui.res.R
object ShadeColors {
@JvmStatic
- fun Resources.shadePanel(): Int {
- val layerAbove =
- ColorUtils.setAlphaComponent(getColor(R.color.shade_panel_base), (0.4f * 255).toInt())
+ fun Resources.shadePanel(blurSupported: Boolean): Int {
+ return if (blurSupported) {
+ shadePanelStandard()
+ } else {
+ shadePanelFallback()
+ }
+ }
+
+ @JvmStatic
+ fun Resources.notificationScrim(blurSupported: Boolean): Int {
+ return if (blurSupported) {
+ notificationScrimStandard()
+ } else {
+ notificationScrimFallback()
+ }
+ }
+
+ @JvmStatic
+ private fun Resources.shadePanelStandard(): Int {
+ val layerAbove = ColorUtils.setAlphaComponent(
+ getColor(R.color.shade_panel_base, null),
+ (0.4f * 255).toInt()
+ )
val layerBelow = ColorUtils.setAlphaComponent(Color.WHITE, (0.1f * 255).toInt())
return ColorUtils.compositeColors(layerAbove, layerBelow)
}
@JvmStatic
- fun Resources.notificationScrim(): Int {
+ private fun Resources.shadePanelFallback(): Int {
+ return getColor(R.color.shade_panel_fallback, null)
+ }
+
+ @JvmStatic
+ private fun Resources.notificationScrimStandard(): Int {
return ColorUtils.setAlphaComponent(
- getColor(R.color.notification_scrim_base),
+ getColor(R.color.notification_scrim_base, null),
(0.5f * 255).toInt(),
)
}
+
+ @JvmStatic
+ private fun Resources.notificationScrimFallback(): Int {
+ return getColor(R.color.notification_scrim_fallback, null)
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
index 25ebc8c1ffa1..f06565f1b6d2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
@@ -24,8 +24,10 @@ import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_
import static android.os.Flags.allowPrivateProfile;
import static android.os.UserHandle.USER_ALL;
import static android.os.UserHandle.USER_NULL;
+import static android.provider.Settings.Secure.REDACT_OTP_NOTIFICATION_IMMEDIATELY;
import static android.provider.Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS;
import static android.provider.Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS;
+import static android.provider.Settings.Secure.REDACT_OTP_NOTIFICATION_WHILE_CONNECTED_TO_WIFI;
import static com.android.systemui.DejankUtils.whitelistIpcs;
@@ -44,6 +46,7 @@ import android.database.ContentObserver;
import android.database.ExecutorContentObserver;
import android.net.Uri;
import android.os.Looper;
+import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -118,6 +121,11 @@ public class NotificationLockscreenUserManagerImpl implements
Settings.Secure.getUriFor(LOCK_SCREEN_SHOW_NOTIFICATIONS);
private static final Uri SHOW_PRIVATE_LOCKSCREEN =
Settings.Secure.getUriFor(LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS);
+ private static final Uri REDACT_OTP_ON_WIFI =
+ Settings.Secure.getUriFor(REDACT_OTP_NOTIFICATION_WHILE_CONNECTED_TO_WIFI);
+
+ private static final Uri REDACT_OTP_IMMEDIATELY =
+ Settings.Secure.getUriFor(REDACT_OTP_NOTIFICATION_IMMEDIATELY);
private static final long LOCK_TIME_FOR_SENSITIVE_REDACTION_MS =
TimeUnit.MINUTES.toMillis(10);
@@ -307,6 +315,9 @@ public class NotificationLockscreenUserManagerImpl implements
@VisibleForTesting
protected final AtomicBoolean mConnectedToWifi = new AtomicBoolean(false);
+ protected final AtomicBoolean mRedactOtpOnWifi = new AtomicBoolean(true);
+ protected final AtomicBoolean mRedactOtpImmediately = new AtomicBoolean(false);
+
protected int mCurrentUserId = 0;
protected NotificationPresenter mPresenter;
@@ -363,6 +374,8 @@ public class NotificationLockscreenUserManagerImpl implements
mLockScreenUris.add(SHOW_LOCKSCREEN);
mLockScreenUris.add(SHOW_PRIVATE_LOCKSCREEN);
+ mLockScreenUris.add(REDACT_OTP_ON_WIFI);
+ mLockScreenUris.add(REDACT_OTP_IMMEDIATELY);
dumpManager.registerDumpable(this);
@@ -432,6 +445,10 @@ public class NotificationLockscreenUserManagerImpl implements
changed |= updateUserShowSettings(user.getIdentifier());
} else if (SHOW_PRIVATE_LOCKSCREEN.equals(uri)) {
changed |= updateUserShowPrivateSettings(user.getIdentifier());
+ } else if (REDACT_OTP_ON_WIFI.equals(uri)) {
+ changed |= updateRedactOtpOnWifiSetting();
+ } else if (REDACT_OTP_IMMEDIATELY.equals(uri)) {
+ changed |= updateRedactOtpImmediatelySetting();
}
}
@@ -465,6 +482,14 @@ public class NotificationLockscreenUserManagerImpl implements
true,
mLockscreenSettingsObserver,
USER_ALL);
+ mSecureSettings.registerContentObserverAsync(
+ REDACT_OTP_ON_WIFI,
+ mLockscreenSettingsObserver
+ );
+ mSecureSettings.registerContentObserverAsync(
+ REDACT_OTP_IMMEDIATELY,
+ mLockscreenSettingsObserver
+ );
mBroadcastDispatcher.registerReceiver(mAllUsersReceiver,
@@ -602,6 +627,28 @@ public class NotificationLockscreenUserManagerImpl implements
}
@WorkerThread
+ private boolean updateRedactOtpOnWifiSetting() {
+ boolean originalValue = mRedactOtpOnWifi.get();
+ boolean newValue = mSecureSettings.getIntForUser(
+ REDACT_OTP_NOTIFICATION_WHILE_CONNECTED_TO_WIFI,
+ 0,
+ Process.myUserHandle().getIdentifier()) != 0;
+ mRedactOtpOnWifi.set(newValue);
+ return originalValue != newValue;
+ }
+
+ @WorkerThread
+ private boolean updateRedactOtpImmediatelySetting() {
+ boolean originalValue = mRedactOtpImmediately.get();
+ boolean newValue = mSecureSettings.getIntForUser(
+ REDACT_OTP_NOTIFICATION_IMMEDIATELY,
+ 0,
+ Process.myUserHandle().getIdentifier()) != 0;
+ mRedactOtpImmediately.set(newValue);
+ return originalValue != newValue;
+ }
+
+ @WorkerThread
private boolean updateGlobalKeyguardSettings() {
final boolean oldValue = mKeyguardAllowingNotifications;
mKeyguardAllowingNotifications = mKeyguardManager.getPrivateNotificationsAllowed();
@@ -769,23 +816,31 @@ public class NotificationLockscreenUserManagerImpl implements
return false;
}
- if (mConnectedToWifi.get()) {
- return false;
+ if (!mRedactOtpOnWifi.get()) {
+ if (mConnectedToWifi.get()) {
+ return false;
+ }
+
+ long lastWifiConnectTime = mLastWifiConnectionTime.get();
+ // If the device has connected to wifi since receiving the notification, do not redact
+ if (ent.getSbn().getPostTime() < lastWifiConnectTime) {
+ return false;
+ }
}
if (ent.getRanking() == null || !ent.getRanking().hasSensitiveContent()) {
return false;
}
- long lastWifiConnectTime = mLastWifiConnectionTime.get();
- // If the device has connected to wifi since receiving the notification, do not redact
- if (ent.getSbn().getPostTime() < lastWifiConnectTime) {
- return false;
+ long latestTimeForRedaction;
+ if (mRedactOtpImmediately.get()) {
+ latestTimeForRedaction = mLastLockTime.get();
+ } else {
+ // If the lock screen was not already locked for LOCK_TIME_FOR_SENSITIVE_REDACTION_MS
+ // when this notification arrived, do not redact
+ latestTimeForRedaction = mLastLockTime.get() + LOCK_TIME_FOR_SENSITIVE_REDACTION_MS;
}
- // If the lock screen was not already locked for LOCK_TIME_FOR_SENSITIVE_REDACTION_MS when
- // this notification arrived, do not redact
- long latestTimeForRedaction = mLastLockTime.get() + LOCK_TIME_FOR_SENSITIVE_REDACTION_MS;
if (ent.getSbn().getPostTime() < latestTimeForRedaction) {
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModel.kt
index a2c0226addfa..f466278e15a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/call/ui/viewmodel/CallChipViewModel.kt
@@ -32,9 +32,7 @@ import com.android.systemui.res.R
import com.android.systemui.statusbar.chips.StatusBarChipLogTags.pad
import com.android.systemui.statusbar.chips.StatusBarChipsLog
import com.android.systemui.statusbar.chips.call.domain.interactor.CallChipInteractor
-import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
import com.android.systemui.statusbar.chips.ui.model.ColorsModel
-import com.android.systemui.statusbar.chips.ui.model.ColorsModel.Companion.toCustomColorsModel
import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipViewModel
@@ -86,12 +84,7 @@ constructor(
OngoingActivityChipModel.ChipIcon.SingleColorIcon(phoneIcon)
}
- val colors =
- if (StatusBarNotifChips.isEnabled && state.promotedContent != null) {
- state.promotedContent.toCustomColorsModel()
- } else {
- ColorsModel.Themed
- }
+ val colors = ColorsModel.AccentThemed
// This block mimics OngoingCallController#updateChip.
if (state.startTimeMs <= 0L) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt
index 8357df42937e..2d6102e310f2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/notification/ui/viewmodel/NotifChipsViewModel.kt
@@ -27,7 +27,7 @@ import com.android.systemui.res.R
import com.android.systemui.statusbar.chips.notification.domain.interactor.StatusBarNotificationChipsInteractor
import com.android.systemui.statusbar.chips.notification.domain.model.NotificationChipModel
import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
-import com.android.systemui.statusbar.chips.ui.model.ColorsModel.Companion.toCustomColorsModel
+import com.android.systemui.statusbar.chips.ui.model.ColorsModel
import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor
@@ -85,8 +85,7 @@ constructor(
contentDescription,
)
}
- val colors = this.promotedContent.toCustomColorsModel()
-
+ val colors = ColorsModel.SystemThemed
val clickListener: () -> Unit = {
// The notification pipeline needs everything to run on the main thread, so keep
// this event on the main thread.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt
index 456cd121a540..d41353b2c176 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/binder/OngoingActivityChipBinder.kt
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.chips.ui.binder
import android.annotation.IdRes
+import android.content.Context
import android.content.res.ColorStateList
import android.graphics.drawable.GradientDrawable
import android.view.View
@@ -32,6 +33,7 @@ import com.android.systemui.common.ui.binder.IconViewBinder
import com.android.systemui.res.R
import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
+import com.android.systemui.statusbar.chips.ui.model.ColorsModel
import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
import com.android.systemui.statusbar.chips.ui.view.ChipChronometer
@@ -76,8 +78,10 @@ object OngoingActivityChipBinder {
chipTimeView.setTextColor(textColor)
chipTextView.setTextColor(textColor)
chipShortTimeDeltaView.setTextColor(textColor)
- (chipBackgroundView.background as GradientDrawable).color =
- chipModel.colors.background(chipContext)
+ (chipBackgroundView.background as GradientDrawable).setBackgroundColors(
+ chipModel.colors,
+ chipContext,
+ )
}
is OngoingActivityChipModel.Inactive -> {
// The Chronometer should be stopped to prevent leaks -- see b/192243808 and
@@ -460,5 +464,20 @@ object OngoingActivityChipBinder {
chipView.minimumWidth = minimumWidth
}
+ private fun GradientDrawable.setBackgroundColors(colors: ColorsModel, context: Context) {
+ this.color = colors.background(context)
+ val outline = colors.outline(context)
+ if (outline != null) {
+ this.setStroke(
+ context.resources.getDimensionPixelSize(
+ R.dimen.ongoing_activity_chip_outline_width
+ ),
+ outline,
+ )
+ } else {
+ this.setStroke(0, /* color= */ 0)
+ }
+ }
+
@IdRes private val CUSTOM_ICON_VIEW_ID = R.id.ongoing_activity_chip_custom_icon
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipContent.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipContent.kt
index 32de0fbfd870..8443d106dfb1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipContent.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipContent.kt
@@ -20,16 +20,9 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.drawWithCache
-import androidx.compose.ui.graphics.BlendMode
-import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.CompositingStrategy
-import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.Measurable
import androidx.compose.ui.layout.MeasureResult
import androidx.compose.ui.layout.MeasureScope
@@ -37,6 +30,8 @@ import androidx.compose.ui.node.LayoutModifierNode
import androidx.compose.ui.node.ModifierNodeElement
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.dimensionResource
+import androidx.compose.ui.text.TextMeasurer
+import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.rememberTextMeasurer
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
@@ -83,15 +78,14 @@ fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier =
softWrap = false,
modifier =
modifier
- .customTextContentLayout(
+ .hideTextIfDoesNotFit(
+ text = text,
+ textStyle = textStyle,
+ textMeasurer = textMeasurer,
maxTextWidth = maxTextWidth,
startPadding = startPadding,
endPadding = endPadding,
- ) { constraintWidth ->
- val intrinsicWidth =
- textMeasurer.measure(text, textStyle, softWrap = false).size.width
- intrinsicWidth <= constraintWidth
- }
+ )
.neverDecreaseWidth(),
)
}
@@ -108,7 +102,6 @@ fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier =
}
is OngoingActivityChipModel.Active.Text -> {
- var hasOverflow by remember { mutableStateOf(false) }
val text = viewModel.text
Text(
text = text,
@@ -116,24 +109,14 @@ fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier =
style = textStyle,
softWrap = false,
modifier =
- modifier
- .customTextContentLayout(
- maxTextWidth = maxTextWidth,
- startPadding = startPadding,
- endPadding = endPadding,
- ) { constraintWidth ->
- val intrinsicWidth =
- textMeasurer.measure(text, textStyle, softWrap = false).size.width
- hasOverflow = intrinsicWidth > constraintWidth
- constraintWidth.toFloat() / intrinsicWidth.toFloat() > 0.5f
- }
- .overflowFadeOut(
- hasOverflow = { hasOverflow },
- fadeLength =
- dimensionResource(
- id = R.dimen.ongoing_activity_chip_text_fading_edge_length
- ),
- ),
+ modifier.hideTextIfDoesNotFit(
+ text = text,
+ textStyle = textStyle,
+ textMeasurer = textMeasurer,
+ maxTextWidth = maxTextWidth,
+ startPadding = startPadding,
+ endPadding = endPadding,
+ ),
)
}
@@ -180,45 +163,67 @@ private class NeverDecreaseWidthNode : Modifier.Node(), LayoutModifierNode {
}
/**
- * A custom layout modifier for text that ensures its text is only visible if a provided
- * [shouldShow] callback returns true. Imposes a provided [maxTextWidthPx]. Also, accounts for
- * provided padding values if provided and ensures its text is placed with the provided padding
- * included around it.
+ * A custom layout modifier for text that ensures the text is only visible if it completely fits
+ * within the constrained bounds. Imposes a provided [maxTextWidthPx]. Also, accounts for provided
+ * padding values if provided and ensures its text is placed with the provided padding included
+ * around it.
*/
-private fun Modifier.customTextContentLayout(
+private fun Modifier.hideTextIfDoesNotFit(
+ text: String,
+ textStyle: TextStyle,
+ textMeasurer: TextMeasurer,
maxTextWidth: Dp,
startPadding: Dp = 0.dp,
endPadding: Dp = 0.dp,
- shouldShow: (constraintWidth: Int) -> Boolean,
): Modifier {
return this.then(
- CustomTextContentLayoutElement(maxTextWidth, startPadding, endPadding, shouldShow)
+ HideTextIfDoesNotFitElement(
+ text,
+ textStyle,
+ textMeasurer,
+ maxTextWidth,
+ startPadding,
+ endPadding,
+ )
)
}
-private data class CustomTextContentLayoutElement(
+private data class HideTextIfDoesNotFitElement(
+ val text: String,
+ val textStyle: TextStyle,
+ val textMeasurer: TextMeasurer,
val maxTextWidth: Dp,
val startPadding: Dp,
val endPadding: Dp,
- val shouldShow: (constrainedWidth: Int) -> Boolean,
-) : ModifierNodeElement<CustomTextContentLayoutNode>() {
- override fun create(): CustomTextContentLayoutNode {
- return CustomTextContentLayoutNode(maxTextWidth, startPadding, endPadding, shouldShow)
+) : ModifierNodeElement<HideTextIfDoesNotFitNode>() {
+ override fun create(): HideTextIfDoesNotFitNode {
+ return HideTextIfDoesNotFitNode(
+ text,
+ textStyle,
+ textMeasurer,
+ maxTextWidth,
+ startPadding,
+ endPadding,
+ )
}
- override fun update(node: CustomTextContentLayoutNode) {
- node.shouldShow = shouldShow
+ override fun update(node: HideTextIfDoesNotFitNode) {
+ node.text = text
+ node.textStyle = textStyle
+ node.textMeasurer = textMeasurer
node.maxTextWidth = maxTextWidth
node.startPadding = startPadding
node.endPadding = endPadding
}
}
-private class CustomTextContentLayoutNode(
+private class HideTextIfDoesNotFitNode(
+ var text: String,
+ var textStyle: TextStyle,
+ var textMeasurer: TextMeasurer,
var maxTextWidth: Dp,
var startPadding: Dp,
var endPadding: Dp,
- var shouldShow: (constrainedWidth: Int) -> Boolean,
) : Modifier.Node(), LayoutModifierNode {
override fun MeasureScope.measure(
measurable: Measurable,
@@ -230,9 +235,10 @@ private class CustomTextContentLayoutNode(
.coerceAtLeast(constraints.minWidth)
val placeable = measurable.measure(constraints.copy(maxWidth = maxWidth))
- val height = placeable.height
- val width = placeable.width
- return if (shouldShow(maxWidth)) {
+ val intrinsicWidth = textMeasurer.measure(text, textStyle, softWrap = false).size.width
+ return if (intrinsicWidth <= maxWidth) {
+ val height = placeable.height
+ val width = placeable.width
layout(width + horizontalPadding.roundToPx(), height) {
placeable.place(startPadding.roundToPx(), 0)
}
@@ -241,20 +247,3 @@ private class CustomTextContentLayoutNode(
}
}
}
-
-private fun Modifier.overflowFadeOut(hasOverflow: () -> Boolean, fadeLength: Dp): Modifier {
- return graphicsLayer(compositingStrategy = CompositingStrategy.Offscreen).drawWithCache {
- val width = size.width
- val start = (width - fadeLength.toPx()).coerceAtLeast(0f)
- val gradient =
- Brush.horizontalGradient(
- colors = listOf(Color.Black, Color.Transparent),
- startX = start,
- endX = width,
- )
- onDrawWithContent {
- drawContent()
- if (hasOverflow()) drawRect(brush = gradient, blendMode = BlendMode.DstIn)
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt
index 76c53861f0ab..1cdf6800fb97 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.chips.ui.compose
import android.content.res.ColorStateList
import android.view.ViewGroup
import androidx.compose.foundation.background
+import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -103,6 +104,13 @@ private fun ChipBody(
} else {
dimensionResource(id = R.dimen.ongoing_activity_chip_min_text_width) + chipSidePadding
}
+
+ val outline = model.colors.outline(context)
+ val outlineWidth = dimensionResource(R.dimen.ongoing_activity_chip_outline_width)
+
+ val shape =
+ RoundedCornerShape(dimensionResource(id = R.dimen.ongoing_activity_chip_corner_radius))
+
// Use a Box with `fillMaxHeight` to create a larger click surface for the chip. The visible
// height of the chip is determined by the height of the background of the Row below.
Box(
@@ -121,12 +129,7 @@ private fun ChipBody(
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
modifier =
- Modifier.clip(
- RoundedCornerShape(
- dimensionResource(id = R.dimen.ongoing_activity_chip_corner_radius)
- )
- )
- .height(dimensionResource(R.dimen.ongoing_appops_chip_height))
+ Modifier.height(dimensionResource(R.dimen.ongoing_appops_chip_height))
.thenIf(isClickable) { Modifier.widthIn(min = minWidth) }
.layout { measurable, constraints ->
val placeable = measurable.measure(constraints)
@@ -136,7 +139,14 @@ private fun ChipBody(
}
}
}
- .background(Color(model.colors.background(context).defaultColor))
+ .background(Color(model.colors.background(context).defaultColor), shape = shape)
+ .thenIf(outline != null) {
+ Modifier.border(
+ width = outlineWidth,
+ color = Color(outline!!),
+ shape = shape,
+ )
+ }
.padding(
horizontal =
if (hasEmbeddedIcon) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt
index 25f90f9a0065..4954cb0a1b24 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/model/ColorsModel.kt
@@ -21,7 +21,6 @@ import android.content.res.ColorStateList
import androidx.annotation.ColorInt
import com.android.settingslib.Utils
import com.android.systemui.res.R
-import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel
/** Model representing how the chip in the status bar should be colored. */
sealed interface ColorsModel {
@@ -31,13 +30,38 @@ sealed interface ColorsModel {
/** The color for the text (and icon) on the chip. */
@ColorInt fun text(context: Context): Int
- /** The chip should match the theme's primary color. */
- data object Themed : ColorsModel {
+ /** The color to use for the chip outline, or null if the chip shouldn't have an outline. */
+ @ColorInt fun outline(context: Context): Int?
+
+ /** The chip should match the theme's primary accent color. */
+ // TODO(b/347717946): The chip's color isn't getting updated when the user switches theme, it
+ // only gets updated when a different configuration change happens, like a rotation.
+ data object AccentThemed : ColorsModel {
override fun background(context: Context): ColorStateList =
Utils.getColorAttr(context, com.android.internal.R.attr.colorAccent)
override fun text(context: Context) =
Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.colorPrimary)
+
+ override fun outline(context: Context) = null
+ }
+
+ /** The chip should match the system theme main color. */
+ // TODO(b/347717946): The chip's color isn't getting updated when the user switches theme, it
+ // only gets updated when a different configuration change happens, like a rotation.
+ data object SystemThemed : ColorsModel {
+ override fun background(context: Context): ColorStateList =
+ ColorStateList.valueOf(
+ context.getColor(com.android.internal.R.color.materialColorSurfaceDim)
+ )
+
+ override fun text(context: Context) =
+ context.getColor(com.android.internal.R.color.materialColorOnSurface)
+
+ override fun outline(context: Context) =
+ // Outline is required on the SystemThemed chip to guarantee the chip doesn't completely
+ // blend in with the background.
+ context.getColor(com.android.internal.R.color.materialColorOutlineVariant)
}
/** The chip should have the given background color and primary text color. */
@@ -46,6 +70,8 @@ sealed interface ColorsModel {
ColorStateList.valueOf(backgroundColorInt)
override fun text(context: Context): Int = primaryTextColorInt
+
+ override fun outline(context: Context) = null
}
/** The chip should have a red background with white text. */
@@ -55,15 +81,7 @@ sealed interface ColorsModel {
}
override fun text(context: Context) = context.getColor(android.R.color.white)
- }
- companion object {
- /** Converts the promoted notification colors to a [Custom] colors model. */
- fun PromotedNotificationContentModel.toCustomColorsModel(): Custom {
- return Custom(
- backgroundColorInt = this.colors.backgroundColor,
- primaryTextColorInt = this.colors.primaryTextColor,
- )
- }
+ override fun outline(context: Context) = null
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelper.kt
index 52495eb55436..c19b144b7f42 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/view/ChipTextTruncationHelper.kt
@@ -51,9 +51,8 @@ class ChipTextTruncationHelper(private val view: View) {
}
/**
- * Returns true if this view should show the text because there's enough room for a substantial
- * amount of text, and returns false if this view should hide the text because the text is much
- * too long.
+ * Returns true if this view should show the text because there's enough room for all the text,
+ * and returns false if this view should hide the text because not all of it fits.
*
* @param desiredTextWidthPx should be calculated by having the view measure itself with
* [unlimitedWidthMeasureSpec] and then sending its `measuredWidth` to this method. (This
@@ -82,9 +81,8 @@ class ChipTextTruncationHelper(private val view: View) {
enforcedTextWidth = maxWidthBasedOnDimension
}
- // Only show the text if at least 50% of it can show. (Assume that if < 50% of the text will
- // be visible, the text will be more confusing than helpful.)
- return desiredTextWidthPx <= enforcedTextWidth * 2
+ // Only show the text if all of it can show
+ return desiredTextWidthPx <= enforcedTextWidth
}
private fun fetchMaxWidth() =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt
index 89cb42056e87..9bc5231c07e1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt
@@ -69,7 +69,10 @@ constructor(
messagingStyle.conversationType =
if (entry.ranking.channel.isImportantConversation)
Notification.MessagingStyle.CONVERSATION_TYPE_IMPORTANT
- else Notification.MessagingStyle.CONVERSATION_TYPE_NORMAL
+ else if (entry.ranking.isConversation)
+ Notification.MessagingStyle.CONVERSATION_TYPE_NORMAL
+ else
+ Notification.MessagingStyle.CONVERSATION_TYPE_LEGACY
entry.ranking.conversationShortcutInfo?.let { shortcutInfo ->
logger.logAsyncTaskProgress(entry, "getting shortcut icon")
messagingStyle.shortcutIcon = launcherApps.getShortcutIcon(shortcutInfo)
diff --git a/core/java/com/android/internal/app/IAppOpsCallback.aidl b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/BundleEntry.java
index 3a9525c03161..37485feed792 100644
--- a/core/java/com/android/internal/app/IAppOpsCallback.aidl
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/BundleEntry.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 The Android Open Source Project
+ * Copyright (C) 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,10 +14,13 @@
* limitations under the License.
*/
-package com.android.internal.app;
+package com.android.systemui.statusbar.notification.collection;
-// This interface is also used by native code, so must
-// be kept in sync with frameworks/native/libs/permission/include/binder/IAppOpsCallback.h
-oneway interface IAppOpsCallback {
- void opChanged(int op, int uid, String packageName, String persistentDeviceId);
+/**
+ * Abstract class to represent notification section bundled by AI.
+ */
+public class BundleEntry extends PipelineEntry {
+
+ public class BundleEntryAdapter implements EntryAdapter {
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/EntryAdapter.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/EntryAdapter.java
new file mode 100644
index 000000000000..b12b1c538a32
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/EntryAdapter.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.collection;
+
+/**
+ * Adapter interface for UI to get relevant info.
+ */
+public interface EntryAdapter {
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListEntry.java
index 915057fe735b..c8e3be4e57b4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListEntry.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListEntry.java
@@ -27,7 +27,7 @@ import com.android.systemui.statusbar.notification.collection.listbuilder.NotifS
* Abstract superclass for top-level entries, i.e. things that can appear in the final notification
* list shown to users. In practice, this means either GroupEntries or NotificationEntries.
*/
-public abstract class ListEntry {
+public abstract class ListEntry extends PipelineEntry {
private final String mKey;
private final long mCreationTime;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
index 9dc651ed507a..7dd82a6b5198 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
@@ -270,6 +270,9 @@ public final class NotificationEntry extends ListEntry {
setRanking(ranking);
}
+ public class NotifEntryAdapter implements EntryAdapter {
+ }
+
@Override
public NotificationEntry getRepresentativeEntry() {
return this;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/PipelineEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/PipelineEntry.java
new file mode 100644
index 000000000000..efedfef5cbe9
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/PipelineEntry.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.collection;
+
+/**
+ * Class to represent a notification, group, or bundle in the pipeline.
+ */
+public class PipelineEntry {
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackOptionalModule.kt
index 6ceeb6aae7a5..bcaf1878a869 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationStackOptionalModule.kt
@@ -26,7 +26,7 @@ import dagger.Module
* This is meant to be bound in SystemUI variants with [NotificationStackScrollLayoutController].
*/
@Module
-interface NotificationStackGoogleModule {
+interface NotificationStackModule {
@Binds
fun bindNotificationStackRebindingHider(
impl: NotificationStackRebindingHiderImpl
@@ -35,7 +35,7 @@ interface NotificationStackGoogleModule {
/** This is meant to be used by all SystemUI variants, also those without NSSL. */
@Module
-interface NotificationStackModule {
+interface NotificationStackOptionalModule {
@BindsOptionalOf
fun bindOptionalOfNotificationStackRebindingHider(): NotificationStackRebindingHider
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
index e10825bc52fe..34f4969127e3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
@@ -121,7 +121,7 @@ import javax.inject.Provider;
NotificationMemoryModule.class,
NotificationStatsLoggerModule.class,
NotificationsLogModule.class,
- NotificationStackModule.class,
+ NotificationStackOptionalModule.class,
})
public interface NotificationsModule {
@Binds
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
index 96192b1ea315..25deec375c03 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
@@ -391,7 +391,7 @@ public class FooterView extends StackScrollerDecorView {
if (!notificationFooterBackgroundTintOptimization()) {
if (notificationShadeBlur()) {
Color backgroundColor = Color.valueOf(
- SurfaceEffectColors.surfaceEffect0(getResources()));
+ SurfaceEffectColors.surfaceEffect1(getResources()));
scHigh = ColorUtils.setAlphaComponent(backgroundColor.toArgb(), 0xFF);
// Apply alpha on background drawables.
int backgroundAlpha = (int) (backgroundColor.alpha() * 0xFF);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/AvalancheController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/AvalancheController.kt
index de113d365bd8..ccc2dffcfd7b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/AvalancheController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/headsup/AvalancheController.kt
@@ -49,7 +49,7 @@ constructor(
) : Dumpable {
private val tag = "AvalancheController"
- private val debug = Compile.IS_DEBUG
+ private val debug = Compile.IS_DEBUG && Log.isLoggable(tag, Log.DEBUG)
var baseEntryMapStr: () -> String = { "baseEntryMapStr not initialized" }
var enableAtRuntime = true
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt
index 7c75983885ea..777ffda8c87d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt
@@ -231,6 +231,7 @@ private class AODPromotedNotificationViewUpdater(root: View) {
) {
// Icon binding must be called in this order
updateImageView(icon, content.smallIcon)
+ icon?.setImageLevel(content.iconLevel)
icon?.setBackgroundColor(Background.colorInt)
icon?.originalIconColor = PrimaryText.colorInt
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt
index cd7872291801..39c7df064c8c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/PromotedNotificationContentExtractor.kt
@@ -96,6 +96,7 @@ constructor(
contentBuilder.wasPromotedAutomatically =
notification.extras.getBoolean(EXTRA_WAS_AUTOMATICALLY_PROMOTED, false)
contentBuilder.smallIcon = notification.smallIconModel(imageModelProvider)
+ contentBuilder.iconLevel = notification.iconLevel
contentBuilder.appName = notification.loadHeaderAppName(context)
contentBuilder.subText = notification.subText()
contentBuilder.time = notification.extractWhen()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt
index af5a8203c979..38d41e37f916 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/shared/model/PromotedNotificationContentModel.kt
@@ -38,6 +38,7 @@ data class PromotedNotificationContentModel(
*/
val wasPromotedAutomatically: Boolean,
val smallIcon: ImageModel?,
+ val iconLevel: Int,
val appName: CharSequence?,
val subText: CharSequence?,
val shortCriticalText: String?,
@@ -67,6 +68,7 @@ data class PromotedNotificationContentModel(
class Builder(val key: String) {
var wasPromotedAutomatically: Boolean = false
var smallIcon: ImageModel? = null
+ var iconLevel: Int = 0
var appName: CharSequence? = null
var subText: CharSequence? = null
var time: When? = null
@@ -94,6 +96,7 @@ data class PromotedNotificationContentModel(
identity = Identity(key, style),
wasPromotedAutomatically = wasPromotedAutomatically,
smallIcon = smallIcon,
+ iconLevel = iconLevel,
appName = appName,
subText = subText,
shortCriticalText = shortCriticalText,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index a2d563aede1f..9bf07689dbdb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -47,6 +47,7 @@ import android.os.Bundle;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
+import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.FloatProperty;
import android.util.IndentingPrintWriter;
@@ -81,6 +82,8 @@ import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.ContrastColorUtil;
import com.android.internal.widget.CachingIconView;
import com.android.internal.widget.CallLayout;
+import com.android.internal.widget.ConversationLayout;
+import com.android.internal.widget.MessagingLayout;
import com.android.systemui.Flags;
import com.android.systemui.flags.RefactorFlag;
import com.android.systemui.plugins.FalsingManager;
@@ -97,6 +100,7 @@ import com.android.systemui.statusbar.notification.AboveShelfChangedListener;
import com.android.systemui.statusbar.notification.ColorUpdateLogger;
import com.android.systemui.statusbar.notification.FeedbackIcon;
import com.android.systemui.statusbar.notification.LaunchAnimationParameters;
+import com.android.systemui.statusbar.notification.NmSummarizationUiFlag;
import com.android.systemui.statusbar.notification.NotificationFadeAware;
import com.android.systemui.statusbar.notification.NotificationTransitionAnimatorController;
import com.android.systemui.statusbar.notification.NotificationUtils;
@@ -205,6 +209,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
private int mMaxSmallHeightBeforeN;
private int mMaxSmallHeightBeforeP;
private int mMaxSmallHeightBeforeS;
+ private int mMaxSmallHeightWithSummarization;
private int mMaxSmallHeight;
private int mMaxExpandedHeight;
private int mMaxExpandedHeightForPromotedOngoing;
@@ -856,6 +861,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
int smallHeight;
boolean isCallLayout = contractedView instanceof CallLayout;
+ boolean isMessagingLayout = contractedView instanceof MessagingLayout
+ || contractedView instanceof ConversationLayout;
if (customView && beforeS && !mIsSummaryWithChildren) {
if (beforeN) {
@@ -867,6 +874,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
} else if (isCallLayout) {
smallHeight = maxExpandedHeight;
+ } else if (NmSummarizationUiFlag.isEnabled()
+ && isMessagingLayout
+ && !TextUtils.isEmpty(mEntry.getRanking().getSummarization())) {
+ smallHeight = mMaxSmallHeightWithSummarization;
} else {
smallHeight = mMaxSmallHeight;
}
@@ -2111,6 +2122,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
mMaxSmallHeight = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_min_height);
}
+ mMaxSmallHeightWithSummarization = NotificationUtils.getFontScaledHeight(mContext,
+ com.android.internal.R.dimen.notification_collapsed_height_with_summarization);
mMaxExpandedHeight = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.notification_max_height);
mMaxExpandedHeightForPromotedOngoing = NotificationUtils.getFontScaledHeight(mContext,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
index 73e8246907aa..e311b53bfa64 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
@@ -55,6 +55,7 @@ import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.notification.ConversationNotificationProcessor;
import com.android.systemui.statusbar.notification.InflationException;
+import com.android.systemui.statusbar.notification.NmSummarizationUiFlag;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.promoted.PromotedNotificationContentExtractor;
import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUiForceExpanded;
@@ -201,13 +202,13 @@ public class NotificationContentInflater implements NotificationRowContentBinder
mNotifLayoutInflaterFactoryProvider,
mHeadsUpStyleProvider,
mLogger);
-
result = inflateSmartReplyViews(result, reInflateFlags, entry, row.getContext(),
packageContext, row.getExistingSmartReplyState(), smartRepliesInflater, mLogger);
boolean isConversation = entry.getRanking().isConversation();
Notification.MessagingStyle messagingStyle = null;
- if (isConversation && (AsyncHybridViewInflation.isEnabled()
- || LockscreenOtpRedaction.isSingleLineViewEnabled())) {
+ if (NmSummarizationUiFlag.isEnabled()
+ || (isConversation && (AsyncHybridViewInflation.isEnabled()
+ || LockscreenOtpRedaction.isSingleLineViewEnabled()))) {
messagingStyle = mConversationProcessor
.processNotification(entry, builder, mLogger);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt
index 589e5b8be240..517fc3a06d84 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt
@@ -48,6 +48,7 @@ import com.android.systemui.statusbar.NotificationLockscreenUserManager.REDACTIO
import com.android.systemui.statusbar.NotificationRemoteInputManager
import com.android.systemui.statusbar.notification.ConversationNotificationProcessor
import com.android.systemui.statusbar.notification.InflationException
+import com.android.systemui.statusbar.notification.NmSummarizationUiFlag
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.promoted.PromotedNotificationContentExtractor
import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel
@@ -700,7 +701,7 @@ constructor(
// process conversations and extract the messaging style
val messagingStyle =
- if (entry.ranking.isConversation) {
+ if (NmSummarizationUiFlag.isEnabled || entry.ranking.isConversation) {
conversationProcessor.processNotification(entry, builder, logger)
} else null
@@ -730,9 +731,8 @@ constructor(
builder = builder,
systemUiContext = systemUiContext,
redactText = false,
- summarization = entry.sbn.notification.extras.getCharSequence(
- EXTRA_SUMMARIZED_CONTENT,
- )
+ summarization =
+ entry.sbn.notification.extras.getCharSequence(EXTRA_SUMMARIZED_CONTENT),
)
} else null
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
index 58326dbb3a34..fa4fe46e690c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -47,6 +47,7 @@ import com.android.settingslib.Utils;
import com.android.systemui.battery.BatteryMeterView;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.res.R;
+import com.android.systemui.statusbar.core.NewStatusBarIcons;
import com.android.systemui.statusbar.layout.StatusBarContentInsetsProvider;
import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher.DarkChange;
import com.android.systemui.statusbar.phone.ui.TintedIconManager;
@@ -79,7 +80,7 @@ public class KeyguardStatusBarView extends RelativeLayout {
private TextView mCarrierLabel;
private ImageView mMultiUserAvatar;
- private BatteryMeterView mBatteryView;
+ @Nullable private BatteryMeterView mBatteryView;
private StatusIconContainer mStatusIconContainer;
private StatusBarUserSwitcherContainer mUserSwitcherContainer;
@@ -131,6 +132,11 @@ public class KeyguardStatusBarView extends RelativeLayout {
mMultiUserAvatar = findViewById(R.id.multi_user_avatar);
mCarrierLabel = findViewById(R.id.keyguard_carrier_text);
mBatteryView = mSystemIconsContainer.findViewById(R.id.battery);
+ if (NewStatusBarIcons.isEnabled()) {
+ // When this flag is rolled forward, this whole view can be removed
+ mBatteryView.setVisibility(View.GONE);
+ mBatteryView = null;
+ }
mCutoutSpace = findViewById(R.id.cutout_space_view);
mStatusIconArea = findViewById(R.id.status_icon_area);
mStatusIconContainer = findViewById(R.id.statusIcons);
@@ -259,7 +265,10 @@ public class KeyguardStatusBarView extends RelativeLayout {
mMultiUserAvatar.setVisibility(View.GONE);
}
}
- mBatteryView.setForceShowPercent(mBatteryCharging && mShowPercentAvailable);
+
+ if (mBatteryView != null) {
+ mBatteryView.setForceShowPercent(mBatteryCharging && mShowPercentAvailable);
+ }
}
private void updateSystemIconsLayoutParams() {
@@ -442,7 +451,9 @@ public class KeyguardStatusBarView extends RelativeLayout {
/** Should only be called from {@link KeyguardStatusBarViewController}. */
void onThemeChanged(TintedIconManager iconManager) {
- mBatteryView.setColorsFromContext(mContext);
+ if (mBatteryView != null) {
+ mBatteryView.setColorsFromContext(mContext);
+ }
updateIconsAndTextColors(iconManager);
}
@@ -450,7 +461,9 @@ public class KeyguardStatusBarView extends RelativeLayout {
void onOverlayChanged() {
final int carrierTheme = R.style.TextAppearance_StatusBar_Clock;
mCarrierLabel.setTextAppearance(carrierTheme);
- mBatteryView.updatePercentView();
+ if (mBatteryView != null) {
+ mBatteryView.updatePercentView();
+ }
final int userSwitcherTheme = R.style.TextAppearance_StatusBar_UserChip;
TextView userSwitcherName = mUserSwitcherContainer.findViewById(R.id.current_user_name);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
index 40245aef4f67..de7215461c80 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
@@ -34,10 +34,12 @@ import android.provider.Settings;
import android.util.MathUtils;
import android.view.DisplayCutout;
import android.view.View;
+import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
+import androidx.compose.ui.platform.ComposeView;
import androidx.core.animation.Animator;
import androidx.core.animation.AnimatorListenerAdapter;
import androidx.core.animation.ValueAnimator;
@@ -62,6 +64,7 @@ import com.android.systemui.shade.ShadeViewStateProvider;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
+import com.android.systemui.statusbar.core.NewStatusBarIcons;
import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore;
import com.android.systemui.statusbar.disableflags.DisableStateTracker;
import com.android.systemui.statusbar.events.SystemStatusAnimationCallback;
@@ -71,10 +74,13 @@ import com.android.systemui.statusbar.notification.AnimatableProperty;
import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
+import com.android.systemui.statusbar.phone.domain.interactor.DarkIconInteractor;
import com.android.systemui.statusbar.phone.fragment.StatusBarIconBlocklistKt;
import com.android.systemui.statusbar.phone.fragment.StatusBarSystemEventDefaultAnimator;
import com.android.systemui.statusbar.phone.ui.StatusBarIconController;
import com.android.systemui.statusbar.phone.ui.TintedIconManager;
+import com.android.systemui.statusbar.pipeline.battery.ui.binder.UnifiedBatteryViewBinder;
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -125,6 +131,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
private final StatusBarIconController mStatusBarIconController;
private final TintedIconManager.Factory mTintedIconManagerFactory;
private final BatteryMeterViewController mBatteryMeterViewController;
+ private final BatteryViewModel.Factory mBatteryViewModelFactory;
private final ShadeViewStateProvider mShadeViewStateProvider;
private final KeyguardStateController mKeyguardStateController;
private final KeyguardBypassController mKeyguardBypassController;
@@ -145,7 +152,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
private final GlanceableHubToLockscreenTransitionViewModel mHubToLockscreenTransitionViewModel;
private final LockscreenToGlanceableHubTransitionViewModel mLockscreenToHubTransitionViewModel;
- private View mSystemIconsContainer;
+ private ViewGroup mSystemIconsContainer;
private final StatusOverlayHoverListenerFactory mStatusOverlayHoverListenerFactory;
private final ConfigurationController.ConfigurationListener mConfigurationListener =
@@ -327,6 +334,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
StatusBarIconController statusBarIconController,
TintedIconManager.Factory tintedIconManagerFactory,
BatteryMeterViewController batteryMeterViewController,
+ BatteryViewModel.Factory batteryViewModelFactory,
ShadeViewStateProvider shadeViewStateProvider,
KeyguardStateController keyguardStateController,
KeyguardBypassController bypassController,
@@ -360,6 +368,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
mStatusBarIconController = statusBarIconController;
mTintedIconManagerFactory = tintedIconManagerFactory;
mBatteryMeterViewController = batteryMeterViewController;
+ mBatteryViewModelFactory = batteryViewModelFactory;
mShadeViewStateProvider = shadeViewStateProvider;
mKeyguardStateController = keyguardStateController;
mKeyguardBypassController = bypassController;
@@ -417,7 +426,9 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
protected void onInit() {
super.onInit();
mCarrierTextController.init();
- mBatteryMeterViewController.init();
+ if (!NewStatusBarIcons.isEnabled()) {
+ mBatteryMeterViewController.init();
+ }
if (isMigrationEnabled()) {
KeyguardStatusBarViewBinder.bind(mView, mKeyguardStatusBarViewModel);
}
@@ -469,6 +480,15 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat
mToGlanceableHubStatusBarAlphaConsumer, mCoroutineDispatcher);
collectFlow(mView, mHubToLockscreenTransitionViewModel.getStatusBarAlpha(),
mFromGlanceableHubStatusBarAlphaConsumer, mCoroutineDispatcher);
+ if (NewStatusBarIcons.isEnabled()) {
+ ComposeView batteryComposeView = new ComposeView(mContext);
+ UnifiedBatteryViewBinder.bind(
+ batteryComposeView,
+ mBatteryViewModelFactory,
+ DarkIconInteractor.toIsAreaDark(mView.darkChangeFlow()));
+
+ mSystemIconsContainer.addView(batteryComposeView, -1);
+ }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 4d222fdb90ea..258b7cafcdcf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -81,6 +81,9 @@ import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.wakelock.DelayedWakeLock;
import com.android.systemui.util.wakelock.WakeLock;
+import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor;
+
+import dagger.Lazy;
import kotlinx.coroutines.CoroutineDispatcher;
@@ -89,6 +92,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
+import java.util.function.Supplier;
import javax.inject.Inject;
@@ -226,7 +230,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
private float mScrimBehindAlphaKeyguard = KEYGUARD_SCRIM_ALPHA;
static final float TRANSPARENT_BOUNCER_SCRIM_ALPHA = 0.54f;
- private final float mDefaultScrimAlpha;
+ private float mDefaultScrimAlpha;
private float mRawPanelExpansionFraction;
private float mPanelScrimMinFraction;
@@ -257,6 +261,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener;
private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
private final BlurConfig mBlurConfig;
+ private final Lazy<WindowRootViewBlurInteractor> mWindowRootViewBlurInteractor;
private Consumer<Integer> mScrimVisibleListener;
private boolean mBlankScreen;
private boolean mScreenBlankingCallbackCalled;
@@ -339,14 +344,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
KeyguardInteractor keyguardInteractor,
@Main CoroutineDispatcher mainDispatcher,
LargeScreenShadeInterpolator largeScreenShadeInterpolator,
- BlurConfig blurConfig) {
+ BlurConfig blurConfig,
+ Lazy<WindowRootViewBlurInteractor> windowRootViewBlurInteractor) {
mScrimStateListener = lightBarController::setScrimState;
mLargeScreenShadeInterpolator = largeScreenShadeInterpolator;
mBlurConfig = blurConfig;
- // All scrims default alpha need to match bouncer background alpha to make sure the
- // transitions involving the bouncer are smooth and don't overshoot the bouncer alpha.
- mDefaultScrimAlpha =
- Flags.bouncerUiRevamp() ? TRANSPARENT_BOUNCER_SCRIM_ALPHA : BUSY_SCRIM_ALPHA;
+ mWindowRootViewBlurInteractor = windowRootViewBlurInteractor;
+ mDefaultScrimAlpha = BUSY_SCRIM_ALPHA;
mKeyguardStateController = keyguardStateController;
mDarkenWhileDragging = !mKeyguardStateController.canDismissLockScreen();
@@ -407,7 +411,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
final ScrimState[] states = ScrimState.values();
for (int i = 0; i < states.length; i++) {
- states[i].init(mScrimInFront, mScrimBehind, mDozeParameters, mDockManager, mBlurConfig);
+ states[i].init(mScrimInFront, mScrimBehind, mDozeParameters, mDockManager,
+ this::isBlurCurrentlySupported);
states[i].setScrimBehindAlphaKeyguard(mScrimBehindAlphaKeyguard);
states[i].setDefaultScrimAlpha(mDefaultScrimAlpha);
}
@@ -485,6 +490,42 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
Edge.Companion.create(Scenes.Communal, LOCKSCREEN),
Edge.Companion.create(GLANCEABLE_HUB, LOCKSCREEN)),
mGlanceableHubConsumer, mMainDispatcher);
+
+ if (Flags.bouncerUiRevamp() || Flags.notificationShadeBlur()) {
+ collectFlow(behindScrim,
+ mWindowRootViewBlurInteractor.get().isBlurCurrentlySupported(),
+ this::handleBlurSupportedChanged);
+ }
+ }
+
+ private void updateDefaultScrimAlpha(float alpha) {
+ mDefaultScrimAlpha = alpha;
+ for (ScrimState state : ScrimState.values()) {
+ state.setDefaultScrimAlpha(mDefaultScrimAlpha);
+ }
+ applyAndDispatchState();
+ }
+
+ private boolean isBlurCurrentlySupported() {
+ return mWindowRootViewBlurInteractor.get()
+ .isBlurCurrentlySupported()
+ .getValue();
+ }
+
+ private void handleBlurSupportedChanged(boolean isBlurSupported) {
+ if (Flags.bouncerUiRevamp()) {
+ if (isBlurSupported) {
+ updateDefaultScrimAlpha(TRANSPARENT_BOUNCER_SCRIM_ALPHA);
+ ScrimState.BOUNCER_SCRIMMED.setNotifBlurRadius(mBlurConfig.getMaxBlurRadiusPx());
+ } else {
+ ScrimState.BOUNCER_SCRIMMED.setNotifBlurRadius(0f);
+ updateDefaultScrimAlpha(BUSY_SCRIM_ALPHA);
+ }
+ }
+ if (Flags.notificationShadeBlur()) {
+ mState.prepare(mState);
+ applyAndDispatchState();
+ }
}
// TODO(b/270984686) recompute scrim height accurately, based on shade contents.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
index 5f423cf35edd..d47c0f8d59d8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -17,19 +17,19 @@
package com.android.systemui.statusbar.phone;
import static com.android.systemui.statusbar.phone.ScrimController.BUSY_SCRIM_ALPHA;
-import static com.android.systemui.statusbar.phone.ScrimController.TRANSPARENT_BOUNCER_SCRIM_ALPHA;
import android.graphics.Color;
import com.android.app.tracing.coroutines.TrackTracer;
import com.android.systemui.Flags;
import com.android.systemui.dock.DockManager;
-import com.android.systemui.keyguard.ui.transitions.BlurConfig;
import com.android.systemui.res.R;
import com.android.systemui.scrim.ScrimView;
import com.android.systemui.shade.ui.ShadeColors;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
+import java.util.function.Supplier;
+
import kotlinx.coroutines.ExperimentalCoroutinesApi;
/**
@@ -90,7 +90,8 @@ public enum ScrimState {
}
if (Flags.notificationShadeBlur()) {
mBehindTint = Color.TRANSPARENT;
- mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources());
+ mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources(),
+ mIsBlurSupported.get());
mBehindAlpha = 0.0f;
mNotifAlpha = 0.0f;
mFrontAlpha = 0.0f;
@@ -116,8 +117,8 @@ public enum ScrimState {
@Override
public void prepare(ScrimState previousState) {
if (Flags.bouncerUiRevamp()) {
- mBehindAlpha = mClipQsScrim ? 0.0f : TRANSPARENT_BOUNCER_SCRIM_ALPHA;
- mNotifAlpha = mClipQsScrim ? TRANSPARENT_BOUNCER_SCRIM_ALPHA : 0;
+ mBehindAlpha = mDefaultScrimAlpha;
+ mNotifAlpha = 0f;
mBehindTint = mNotifTint = mSurfaceColor;
mFrontAlpha = 0f;
return;
@@ -153,12 +154,11 @@ public enum ScrimState {
if (previousState == SHADE_LOCKED) {
mBehindAlpha = previousState.getBehindAlpha();
mNotifAlpha = previousState.getNotifAlpha();
- mNotifBlurRadius = mBlurConfig.getMaxBlurRadiusPx();
} else {
mNotifAlpha = 0f;
mBehindAlpha = 0f;
}
- mFrontAlpha = TRANSPARENT_BOUNCER_SCRIM_ALPHA;
+ mFrontAlpha = mDefaultScrimAlpha;
mFrontTint = mSurfaceColor;
return;
}
@@ -187,9 +187,11 @@ public enum ScrimState {
@Override
public void prepare(ScrimState previousState) {
if (Flags.notificationShadeBlur()) {
- mBehindTint = ShadeColors.shadePanel(mScrimBehind.getResources());
+ mBehindTint = ShadeColors.shadePanel(mScrimBehind.getResources(),
+ mIsBlurSupported.get());
mBehindAlpha = Color.alpha(mBehindTint) / 255.0f;
- mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources());
+ mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources(),
+ mIsBlurSupported.get());
mNotifAlpha = Color.alpha(mNotifTint) / 255.0f;
mFrontAlpha = 0.0f;
} else {
@@ -308,9 +310,11 @@ public enum ScrimState {
mBehindTint = mBackgroundColor;
mBlankScreen = true;
} else if (Flags.notificationShadeBlur()) {
- mBehindTint = ShadeColors.shadePanel(mScrimBehind.getResources());
+ mBehindTint = ShadeColors.shadePanel(mScrimBehind.getResources(),
+ mIsBlurSupported.get());
mBehindAlpha = Color.alpha(mBehindTint) / 255.0f;
- mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources());
+ mNotifTint = ShadeColors.notificationScrim(mScrimBehind.getResources(),
+ mIsBlurSupported.get());
mNotifAlpha = Color.alpha(mNotifTint) / 255.0f;
mFrontAlpha = 0.0f;
return;
@@ -403,7 +407,7 @@ public enum ScrimState {
DozeParameters mDozeParameters;
DockManager mDockManager;
boolean mDisplayRequiresBlanking;
- protected BlurConfig mBlurConfig;
+ protected Supplier<Boolean> mIsBlurSupported;
boolean mLaunchingAffordanceWithPreview;
boolean mOccludeAnimationPlaying;
boolean mWakeLockScreenSensorActive;
@@ -417,7 +421,7 @@ public enum ScrimState {
protected float mNotifBlurRadius = 0.0f;
public void init(ScrimView scrimInFront, ScrimView scrimBehind, DozeParameters dozeParameters,
- DockManager dockManager, BlurConfig blurConfig) {
+ DockManager dockManager, Supplier<Boolean> isBlurSupported) {
mBackgroundColor = scrimBehind.getContext().getColor(R.color.shade_scrim_background_dark);
mScrimInFront = scrimInFront;
mScrimBehind = scrimBehind;
@@ -425,7 +429,7 @@ public enum ScrimState {
mDozeParameters = dozeParameters;
mDockManager = dockManager;
mDisplayRequiresBlanking = dozeParameters.getDisplayNeedsBlanking();
- mBlurConfig = blurConfig;
+ mIsBlurSupported = isBlurSupported;
}
/** Prepare state for transition. */
@@ -536,4 +540,8 @@ public enum ScrimState {
public float getNotifBlurRadius() {
return mNotifBlurRadius;
}
+
+ public void setNotifBlurRadius(float value) {
+ mNotifBlurRadius = value;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java
index 7207d0aef3ee..4d531b512dd9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarComponent.java
@@ -20,6 +20,7 @@ import com.android.systemui.battery.BatteryMeterViewController;
import com.android.systemui.dagger.qualifiers.DisplaySpecific;
import com.android.systemui.dagger.qualifiers.RootView;
import com.android.systemui.plugins.DarkIconDispatcher;
+import com.android.systemui.statusbar.core.NewStatusBarIcons;
import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController;
import com.android.systemui.statusbar.layout.StatusBarBoundsProvider;
import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor;
@@ -85,7 +86,9 @@ public interface HomeStatusBarComponent {
default void init() {
// No one accesses these controllers, so we need to make sure we reference them here so they
// do get initialized.
- getBatteryMeterViewController().init();
+ if (!NewStatusBarIcons.isEnabled()) {
+ getBatteryMeterViewController().init();
+ }
getHeadsUpAppearanceController().init();
getPhoneStatusBarViewController().init();
if (!NotificationsLiveDataStoreRefactor.isEnabled()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/binder/UnifiedBatteryViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/binder/UnifiedBatteryViewBinder.kt
index 903844efa3f0..9665c33ac4c7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/binder/UnifiedBatteryViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/binder/UnifiedBatteryViewBinder.kt
@@ -16,7 +16,10 @@
package com.android.systemui.statusbar.pipeline.battery.ui.binder
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.width
import androidx.compose.runtime.getValue
+import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.core.view.isVisible
@@ -27,6 +30,8 @@ import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.statusbar.phone.domain.interactor.IsAreaDark
import com.android.systemui.statusbar.pipeline.battery.ui.composable.UnifiedBattery
import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel.Companion.STATUS_BAR_BATTERY_HEIGHT
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel.Companion.STATUS_BAR_BATTERY_WIDTH
import kotlinx.coroutines.flow.Flow
/** In cases where the battery needs to be bound to an existing android view */
@@ -47,7 +52,13 @@ object UnifiedBatteryViewBinder {
)
setContent {
val isDark by isAreaDark.collectAsStateWithLifecycle(IsAreaDark { true })
- UnifiedBattery(viewModelFactory = viewModelFactory, isDark = isDark)
+ UnifiedBattery(
+ modifier =
+ Modifier.height(STATUS_BAR_BATTERY_HEIGHT)
+ .width(STATUS_BAR_BATTERY_WIDTH),
+ viewModelFactory = viewModelFactory,
+ isDark = isDark,
+ )
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/composable/BatteryWithEstimate.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/composable/BatteryWithEstimate.kt
index 2ee86ee0a679..ac793a9c97e3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/composable/BatteryWithEstimate.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/composable/BatteryWithEstimate.kt
@@ -54,7 +54,7 @@ fun BatteryWithEstimate(
)
if (showEstimate) {
viewModel.batteryTimeRemainingEstimate?.let {
- Spacer(modifier.width(2.dp))
+ Spacer(modifier.width(4.dp))
Text(text = it, color = Color.White)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModel.kt
index d0d099e74cb1..afd4bb1f36c7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModel.kt
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.pipeline.battery.ui.viewmodel
import android.content.Context
import androidx.compose.runtime.getValue
+import androidx.compose.ui.unit.dp
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.lifecycle.ExclusiveActivatable
@@ -223,6 +224,10 @@ constructor(interactor: BatteryInteractor, @Application context: Context) : Excl
}
companion object {
+ // Status bar battery height, based on a 21x12 base canvas
+ val STATUS_BAR_BATTERY_HEIGHT = 13.dp
+ val STATUS_BAR_BATTERY_WIDTH = 22.75.dp
+
fun Int.glyphRepresentation(): List<BatteryGlyph> = toString().map { it.toGlyph() }
private fun Char.toGlyph(): BatteryGlyph =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt
index 9d72daf01831..c34fa464cc3a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt
@@ -23,6 +23,8 @@ import android.widget.LinearLayout
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
@@ -34,9 +36,11 @@ import androidx.compose.ui.viewinterop.AndroidView
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.theme.PlatformTheme
import com.android.keyguard.AlphaOptimizedLinearLayout
+import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.plugins.DarkIconDispatcher
import com.android.systemui.res.R
import com.android.systemui.statusbar.chips.ui.compose.OngoingActivityChips
+import com.android.systemui.statusbar.core.NewStatusBarIcons
import com.android.systemui.statusbar.core.StatusBarRootModernization
import com.android.systemui.statusbar.data.repository.DarkIconDispatcherStore
import com.android.systemui.statusbar.events.domain.interactor.SystemStatusEventAnimationInteractor
@@ -51,6 +55,9 @@ import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController
import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
import com.android.systemui.statusbar.phone.ui.DarkIconManager
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
+import com.android.systemui.statusbar.pipeline.battery.ui.composable.UnifiedBattery
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel.Companion.STATUS_BAR_BATTERY_HEIGHT
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel.Companion.STATUS_BAR_BATTERY_WIDTH
import com.android.systemui.statusbar.pipeline.shared.ui.binder.HomeStatusBarIconBlockListBinder
import com.android.systemui.statusbar.pipeline.shared.ui.binder.HomeStatusBarViewBinder
import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel
@@ -73,14 +80,13 @@ constructor(
) {
fun create(root: ViewGroup, andThen: (ViewGroup) -> Unit): ComposeView {
val composeView = ComposeView(root.context)
- val displayId = root.context.displayId
val darkIconDispatcher =
darkIconDispatcherStore.forDisplay(root.context.displayId) ?: return composeView
composeView.apply {
setContent {
StatusBarRoot(
parent = root,
- statusBarViewModel = homeStatusBarViewModelFactory.create(displayId),
+ statusBarViewModelFactory = homeStatusBarViewModelFactory,
statusBarViewBinder = homeStatusBarViewBinder,
notificationIconsBinder = notificationIconsBinder,
darkIconManagerFactory = darkIconManagerFactory,
@@ -110,7 +116,7 @@ constructor(
@Composable
fun StatusBarRoot(
parent: ViewGroup,
- statusBarViewModel: HomeStatusBarViewModel,
+ statusBarViewModelFactory: HomeStatusBarViewModelFactory,
statusBarViewBinder: HomeStatusBarViewBinder,
notificationIconsBinder: NotificationIconContainerStatusBarViewBinder,
darkIconManagerFactory: DarkIconManager.Factory,
@@ -120,6 +126,10 @@ fun StatusBarRoot(
eventAnimationInteractor: SystemStatusEventAnimationInteractor,
onViewCreated: (ViewGroup) -> Unit,
) {
+ val displayId = parent.context.displayId
+ val statusBarViewModel =
+ rememberViewModel("HomeStatusBar") { statusBarViewModelFactory.create(displayId) }
+
Box(Modifier.fillMaxSize()) {
// TODO(b/364360986): remove this before rolling the flag forward
if (StatusBarRootModernization.SHOW_DISAMBIGUATION) {
@@ -159,10 +169,6 @@ fun StatusBarRoot(
LinearLayout.LayoutParams.WRAP_CONTENT,
)
- setViewCompositionStrategy(
- ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
- )
-
setContent {
PlatformTheme {
val chips by
@@ -241,6 +247,12 @@ fun StatusBarRoot(
endSideContent.addView(composeView, 0)
}
+ // If the flag is enabled, create and add a compose battery view to the end
+ // of the system_icons container
+ if (NewStatusBarIcons.isEnabled) {
+ addBatteryComposable(phoneStatusBarView, statusBarViewModel)
+ }
+
notificationIconsBinder.bindWhileAttached(
notificationIconContainer,
context.displayId,
@@ -263,6 +275,27 @@ fun StatusBarRoot(
}
}
+/** Create a new [UnifiedBattery] and add it to the end of the system_icons container */
+private fun addBatteryComposable(
+ phoneStatusBarView: PhoneStatusBarView,
+ statusBarViewModel: HomeStatusBarViewModel,
+) {
+ val batteryComposeView =
+ ComposeView(phoneStatusBarView.context).apply {
+ setContent {
+ UnifiedBattery(
+ modifier =
+ Modifier.height(STATUS_BAR_BATTERY_HEIGHT).width(STATUS_BAR_BATTERY_WIDTH),
+ viewModelFactory = statusBarViewModel.batteryViewModelFactory,
+ isDark = statusBarViewModel.areaDark,
+ )
+ }
+ }
+ phoneStatusBarView.findViewById<ViewGroup>(R.id.system_icons).apply {
+ addView(batteryComposeView, -1)
+ }
+}
+
/**
* This is our analog of the flexi "ribbon", which just shows some text so we know if the flag is on
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt
index 1bc45a95044c..f396cbfc8000 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel
import android.annotation.ColorInt
import android.graphics.Rect
import android.view.View
+import androidx.compose.runtime.getValue
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
@@ -28,6 +29,8 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED
import com.android.systemui.keyguard.shared.model.TransitionState
+import com.android.systemui.lifecycle.ExclusiveActivatable
+import com.android.systemui.lifecycle.Hydrator
import com.android.systemui.log.table.TableLogBufferFactory
import com.android.systemui.log.table.logDiffsForTable
import com.android.systemui.plugins.DarkIconDispatcher
@@ -55,8 +58,10 @@ import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNoti
import com.android.systemui.statusbar.notification.headsup.PinnedStatus
import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor
import com.android.systemui.statusbar.phone.domain.interactor.DarkIconInteractor
+import com.android.systemui.statusbar.phone.domain.interactor.IsAreaDark
import com.android.systemui.statusbar.phone.domain.interactor.LightsOutInteractor
import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
import com.android.systemui.statusbar.pipeline.shared.domain.interactor.HomeStatusBarIconBlockListInteractor
import com.android.systemui.statusbar.pipeline.shared.domain.interactor.HomeStatusBarInteractor
import com.android.systemui.statusbar.pipeline.shared.ui.model.SystemInfoCombinedVisibilityModel
@@ -90,6 +95,9 @@ import kotlinx.coroutines.flow.stateIn
* so that it's all in one place and easily testable outside of the fragment.
*/
interface HomeStatusBarViewModel {
+ /** Factory to create the view model for the battery icon */
+ val batteryViewModelFactory: BatteryViewModel.Factory
+
/**
* True if the device is currently transitioning from lockscreen to occluded and false
* otherwise.
@@ -171,6 +179,9 @@ interface HomeStatusBarViewModel {
*/
val areaTint: Flow<StatusBarTintColor>
+ /** [IsAreaDark] applicable for this status bar's display and content area */
+ val areaDark: IsAreaDark
+
/** Interface for the assisted factory, to allow for providing a fake in tests */
interface HomeStatusBarViewModelFactory {
fun create(displayId: Int): HomeStatusBarViewModel
@@ -181,6 +192,7 @@ class HomeStatusBarViewModelImpl
@AssistedInject
constructor(
@Assisted thisDisplayId: Int,
+ override val batteryViewModelFactory: BatteryViewModel.Factory,
tableLoggerFactory: TableLogBufferFactory,
homeStatusBarInteractor: HomeStatusBarInteractor,
homeStatusBarIconBlockListInteractor: HomeStatusBarIconBlockListInteractor,
@@ -201,7 +213,9 @@ constructor(
statusBarContentInsetsViewModelStore: StatusBarContentInsetsViewModelStore,
@Background bgScope: CoroutineScope,
@Background bgDispatcher: CoroutineDispatcher,
-) : HomeStatusBarViewModel {
+) : HomeStatusBarViewModel, ExclusiveActivatable() {
+
+ private val hydrator = Hydrator(traceName = "HomeStatusBarViewModel.hydrator")
val tableLogger = tableLoggerFactory.getOrCreate(tableLogBufferName(thisDisplayId), 200)
@@ -294,6 +308,13 @@ constructor(
.distinctUntilChanged()
.flowOn(bgDispatcher)
+ override val areaDark: IsAreaDark by
+ hydrator.hydratedStateOf(
+ traceName = "areaDark",
+ initialValue = IsAreaDark { true },
+ source = darkIconInteractor.isAreaDark(thisDisplayId),
+ )
+
/**
* True if the current SysUI state can show the home status bar (aka this status bar), and false
* if we shouldn't be showing any part of the home status bar.
@@ -473,6 +494,10 @@ constructor(
@View.Visibility
private fun Boolean.toVisibleOrInvisible(): Int = if (this) View.VISIBLE else View.INVISIBLE
+ override suspend fun onActivated(): Nothing {
+ hydrator.activate()
+ }
+
/** Inject this to create the display-dependent view model */
@AssistedFactory
interface HomeStatusBarViewModelFactoryImpl :
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt b/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt
index cd401d5deb6e..e1640cd4ce7a 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt
@@ -214,7 +214,12 @@ constructor(
private suspend fun waitForScreenTurnedOn() {
traceAsync(TAG, "waitForScreenTurnedOn()") {
- powerInteractor.screenPowerState.filter { it == ScreenPowerState.SCREEN_ON }.first()
+ // dropping first as it's stateFlow and will always emit latest value but we're
+ // only interested in new states
+ powerInteractor.screenPowerState
+ .drop(1)
+ .filter { it == ScreenPowerState.SCREEN_ON }
+ .first()
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/NoCooldownDisplaySwitchLatencyTracker.kt b/packages/SystemUI/src/com/android/systemui/unfold/NoCooldownDisplaySwitchLatencyTracker.kt
index 6ac0bb168f18..91f142646c3d 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/NoCooldownDisplaySwitchLatencyTracker.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/NoCooldownDisplaySwitchLatencyTracker.kt
@@ -50,6 +50,7 @@ import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.TimeoutCancellationException
import kotlinx.coroutines.asCoroutineDispatcher
+import kotlinx.coroutines.flow.drop
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flatMapLatest
@@ -160,7 +161,12 @@ constructor(
private suspend fun waitForScreenTurnedOn() {
traceAsync(TAG, "waitForScreenTurnedOn()") {
- powerInteractor.screenPowerState.filter { it == ScreenPowerState.SCREEN_ON }.first()
+ // dropping first as it's stateFlow and will always emit latest value but we're
+ // only interested in new states
+ powerInteractor.screenPowerState
+ .drop(1)
+ .filter { it == ScreenPowerState.SCREEN_ON }
+ .first()
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt
index 92ec4f554548..eb2b2f68a6e2 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt
@@ -120,7 +120,7 @@ constructor(
drawerContainer.setTransitionListener(ringerDrawerTransitionListener)
volumeDialogBackgroundView.background = volumeDialogBackgroundView.background.mutate()
ringerBackgroundView.background = ringerBackgroundView.background.mutate()
- launch { dialogViewModel.addTouchableBounds(drawerContainer) }
+ launch { dialogViewModel.addTouchableBounds(ringerBackgroundView) }
viewModel.ringerViewModel
.mapLatest { ringerState ->
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
index a51e33ad05cc..2c9ee54878e5 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
@@ -19,7 +19,6 @@ package com.android.systemui.volume.dialog.sliders.ui
import android.graphics.drawable.Drawable
import android.view.View
import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
@@ -61,11 +60,9 @@ import com.android.systemui.volume.haptics.ui.VolumeHapticsConfigsProvider
import javax.inject.Inject
import kotlin.math.round
import kotlin.math.roundToInt
-import kotlinx.coroutines.Job
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.isActive
-import kotlinx.coroutines.launch
@VolumeDialogSliderScope
class VolumeDialogSliderViewBinder
@@ -116,10 +113,6 @@ private fun VolumeDialogSlider(
val steps = with(sliderStateModel.valueRange) { endInclusive - start - 1 }.toInt()
- var animateJob: Job? = null
- val animatedSliderValue =
- remember(sliderStateModel.value) { Animatable(sliderStateModel.value) }
-
val interactionSource = remember { MutableInteractionSource() }
val hapticsViewModel: SliderHapticsViewModel? =
hapticsViewModelFactory?.let {
@@ -149,16 +142,7 @@ private fun VolumeDialogSlider(
hapticsViewModel?.onValueChangeEnded()
}
sliderState.onValueChange = { newValue ->
- if (newValue != animatedSliderValue.targetValue) {
- animateJob?.cancel()
- animateJob =
- coroutineScope.launch {
- animatedSliderValue.animateTo(newValue) {
- sliderState.value = value
- }
- }
- }
-
+ sliderState.value = newValue
hapticsViewModel?.addVelocityDataPoint(newValue)
overscrollViewModel.setSlider(
value = sliderState.value,
@@ -173,7 +157,7 @@ private fun VolumeDialogSlider(
var lastDiscreteStep by remember { mutableFloatStateOf(round(sliderStateModel.value)) }
LaunchedEffect(sliderStateModel.value) {
val value = sliderStateModel.value
- launch { animatedSliderValue.animateTo(value) }
+ sliderState.value = value
if (value != lastDiscreteStep) {
lastDiscreteStep = value
hapticsViewModel?.onValueChange(value)
diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt
index a34a2ddb7713..a55f76b333d9 100644
--- a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt
@@ -23,6 +23,7 @@ import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.os.UserHandle
+import android.provider.Settings
import android.view.View
import androidx.annotation.VisibleForTesting
import com.android.app.tracing.coroutines.launchTraced as launch
@@ -41,6 +42,8 @@ import com.android.systemui.shared.Flags.extendedWallpaperEffects
import com.android.systemui.user.data.model.SelectedUserModel
import com.android.systemui.user.data.model.SelectionStatus
import com.android.systemui.user.data.repository.UserRepository
+import com.android.systemui.util.settings.SecureSettings
+import com.android.systemui.util.settings.SettingsProxyExt.observerFlow
import com.android.systemui.utils.coroutines.flow.mapLatestConflated
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
@@ -54,7 +57,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filter
-import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
@@ -87,6 +90,7 @@ constructor(
private val wallpaperManager: WallpaperManager,
private val context: Context,
keyguardTransitionInteractor: KeyguardTransitionInteractor,
+ private val secureSettings: SecureSettings,
) : WallpaperRepository {
private val wallpaperChanged: Flow<Unit> =
broadcastDispatcher
@@ -125,7 +129,17 @@ constructor(
}
override val wallpaperSupportsAmbientMode: Flow<Boolean> =
- flowOf(context.resources.getBoolean(R.bool.config_dozeSupportsAodWallpaper) && ambientAod())
+ secureSettings
+ .observerFlow(UserHandle.USER_ALL, Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED)
+ .onStart { emit(Unit) }
+ .map {
+ val userEnabled =
+ secureSettings.getInt(Settings.Secure.DOZE_ALWAYS_ON_WALLPAPER_ENABLED, 1) == 1
+ userEnabled &&
+ context.resources.getBoolean(R.bool.config_dozeSupportsAodWallpaper) &&
+ ambientAod()
+ }
+ .flowOn(bgDispatcher)
override var rootView: View? = null
diff --git a/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurModule.kt b/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurModule.kt
new file mode 100644
index 000000000000..95b3b68fa1ca
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurModule.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.window.dagger
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepository
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepositoryImpl
+import dagger.Binds
+import dagger.Module
+
+/**
+ * Module that can be installed in sysui variants where we support cross window blur.
+ */
+@Module
+interface WindowRootViewBlurModule {
+ @Binds
+ @SysUISingleton
+ fun bindWindowRootViewBlurRepository(
+ windowRootViewBlurRepositoryImpl: WindowRootViewBlurRepositoryImpl
+ ): WindowRootViewBlurRepository
+}
diff --git a/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurNotSupportedModule.kt b/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurNotSupportedModule.kt
new file mode 100644
index 000000000000..ae917e072ff3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/window/dagger/WindowRootViewBlurNotSupportedModule.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.window.dagger
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.window.data.repository.NoopWindowRootViewBlurRepository
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepository
+import dagger.Binds
+import dagger.Module
+
+/**
+ * Module that can be installed in sysui variants where we don't support cross window blur.
+ */
+@Module
+interface WindowRootViewBlurNotSupportedModule {
+ @Binds
+ @SysUISingleton
+ fun bindWindowRootViewBlurRepository(
+ windowRootViewBlurRepositoryImpl: NoopWindowRootViewBlurRepository
+ ): WindowRootViewBlurRepository
+}
diff --git a/packages/SystemUI/src/com/android/systemui/window/data/repository/NoopWindowRootViewBlurRepository.kt b/packages/SystemUI/src/com/android/systemui/window/data/repository/NoopWindowRootViewBlurRepository.kt
new file mode 100644
index 000000000000..80aa11a71569
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/window/data/repository/NoopWindowRootViewBlurRepository.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.window.data.repository
+
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepository
+import javax.inject.Inject
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+
+class NoopWindowRootViewBlurRepository @Inject constructor() : WindowRootViewBlurRepository {
+ override val blurRadius: MutableStateFlow<Int> = MutableStateFlow(0)
+ override val isBlurOpaque: MutableStateFlow<Boolean> = MutableStateFlow(true)
+ override val isBlurSupported: StateFlow<Boolean> = MutableStateFlow(false)
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepository.kt b/packages/SystemUI/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepository.kt
index 22a74c86e0f1..41ceda033bdf 100644
--- a/packages/SystemUI/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepository.kt
@@ -16,14 +16,77 @@
package com.android.systemui.window.data.repository
+import android.app.ActivityManager
+import android.os.SystemProperties
+import android.view.CrossWindowBlurListeners
+import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
+import com.android.systemui.window.data.repository.WindowRootViewBlurRepository.Companion.isDisableBlurSysPropSet
+import java.util.concurrent.Executor
import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.stateIn
/** Repository that maintains state for the window blur effect. */
+interface WindowRootViewBlurRepository {
+ val blurRadius: MutableStateFlow<Int>
+ val isBlurOpaque: MutableStateFlow<Boolean>
+
+ /** Is blur supported based on settings toggle and battery power saver mode. */
+ val isBlurSupported: StateFlow<Boolean>
+
+ companion object {
+ /**
+ * Whether the `persist.sysui.disableBlur` is set, this is used to disable blur for tests.
+ */
+ @JvmStatic
+ fun isDisableBlurSysPropSet() = SystemProperties.getBoolean(DISABLE_BLUR_PROPERTY, false)
+
+ // property that can be used to disable the cross window blur for tests
+ private const val DISABLE_BLUR_PROPERTY = "persist.sysui.disableBlur"
+ }
+}
+
@SysUISingleton
-class WindowRootViewBlurRepository @Inject constructor() {
- val blurRadius = MutableStateFlow(0)
+class WindowRootViewBlurRepositoryImpl
+@Inject
+constructor(
+ crossWindowBlurListeners: CrossWindowBlurListeners,
+ @Main private val executor: Executor,
+ @Application private val scope: CoroutineScope,
+) : WindowRootViewBlurRepository {
+ override val blurRadius = MutableStateFlow(0)
+
+ override val isBlurOpaque = MutableStateFlow(false)
+
+ override val isBlurSupported: StateFlow<Boolean> =
+ conflatedCallbackFlow {
+ val sendUpdate = { value: Boolean ->
+ trySendWithFailureLogging(
+ isBlurAllowed() && value,
+ TAG,
+ "unable to send blur enabled/disable state change",
+ )
+ }
+ crossWindowBlurListeners.addListener(executor, sendUpdate)
+ sendUpdate(crossWindowBlurListeners.isCrossWindowBlurEnabled)
+
+ awaitClose { crossWindowBlurListeners.removeListener(sendUpdate) }
+ } // stateIn because this is backed by a binder call.
+ .stateIn(scope, SharingStarted.WhileSubscribed(), false)
+
+ private fun isBlurAllowed(): Boolean {
+ return ActivityManager.isHighEndGfx() && !isDisableBlurSysPropSet()
+ }
- val isBlurOpaque = MutableStateFlow(false)
+ companion object {
+ const val TAG = "WindowRootViewBlurRepository"
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt b/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt
index 9e369347dea5..7a88a2ef966b 100644
--- a/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt
@@ -75,6 +75,12 @@ constructor(
_onBlurAppliedEvent.emit(appliedBlurRadius)
}
+ /**
+ * Whether blur is enabled or not based on settings toggle, critical thermal state, battery save
+ * state and multimedia tunneling state.
+ */
+ val isBlurCurrentlySupported: StateFlow<Boolean> = repository.isBlurSupported
+
/** Radius of blur to be applied on the window root view. */
val blurRadius: StateFlow<Int> = repository.blurRadius.asStateFlow()
diff --git a/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt
index b18c39dcf5e0..1b42352f1736 100644
--- a/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt
@@ -26,11 +26,14 @@ import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onEach
@@ -38,6 +41,7 @@ import kotlinx.coroutines.flow.onEach
typealias BlurAppliedUiEvent = Int
/** View model for window root view. */
+@OptIn(ExperimentalCoroutinesApi::class)
class WindowRootViewModel
@AssistedInject
constructor(
@@ -58,7 +62,7 @@ constructor(
glanceableHubTransitions.map { it.windowBlurRadius.logIfPossible(it.javaClass.name) }
else emptyList()
- val blurRadius: Flow<Float> =
+ private val _blurRadius =
listOf(
*bouncerBlurRadiusFlows.toTypedArray(),
*glanceableHubBlurRadiusFlows.toTypedArray(),
@@ -66,8 +70,23 @@ constructor(
)
.merge()
+ val blurRadius: Flow<Float> =
+ blurInteractor.isBlurCurrentlySupported.flatMapLatest { blurSupported ->
+ if (blurSupported) {
+ _blurRadius
+ } else {
+ flowOf(0f)
+ }
+ }
+
val isBlurOpaque =
- blurInteractor.isBlurOpaque.distinctUntilChanged().logIfPossible("isBlurOpaque")
+ blurInteractor.isBlurCurrentlySupported.flatMapLatest { blurSupported ->
+ if (blurSupported) {
+ blurInteractor.isBlurOpaque.distinctUntilChanged().logIfPossible("isBlurOpaque")
+ } else {
+ flowOf(false)
+ }
+ }
override suspend fun onActivated(): Nothing {
coroutineScope {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt
index 26cf4a261289..92b26ea3a8ef 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt
@@ -22,14 +22,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
-import androidx.compose.ui.semantics.SemanticsProperties
-import androidx.compose.ui.test.SemanticsMatcher
-import androidx.compose.ui.test.assert
-import androidx.compose.ui.test.filter
-import androidx.compose.ui.test.hasContentDescription
-import androidx.compose.ui.test.junit4.ComposeContentTestRule
import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.onChildren
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
@@ -100,7 +93,10 @@ class DragAndDropTest : SysuiTestCase() {
composeRule.onNodeWithText("Remove").assertExists()
// Every other tile should still be in the same order
- composeRule.assertTileGridContainsExactly(listOf("tileB", "tileC", "tileD_large", "tileE"))
+ composeRule.assertGridContainsExactly(
+ CURRENT_TILES_GRID_TEST_TAG,
+ listOf("tileB", "tileC", "tileD_large", "tileE"),
+ )
}
@Test
@@ -125,8 +121,9 @@ class DragAndDropTest : SysuiTestCase() {
composeRule.onNodeWithText("Remove").assertDoesNotExist()
// Tile A and B should swap places
- composeRule.assertTileGridContainsExactly(
- listOf("tileB", "tileA", "tileC", "tileD_large", "tileE")
+ composeRule.assertGridContainsExactly(
+ CURRENT_TILES_GRID_TEST_TAG,
+ listOf("tileB", "tileA", "tileC", "tileD_large", "tileE"),
)
}
@@ -152,7 +149,10 @@ class DragAndDropTest : SysuiTestCase() {
composeRule.onNodeWithText("Remove").assertDoesNotExist()
// Tile A is gone
- composeRule.assertTileGridContainsExactly(listOf("tileB", "tileC", "tileD_large", "tileE"))
+ composeRule.assertGridContainsExactly(
+ CURRENT_TILES_GRID_TEST_TAG,
+ listOf("tileB", "tileC", "tileD_large", "tileE"),
+ )
}
@Test
@@ -166,7 +166,7 @@ class DragAndDropTest : SysuiTestCase() {
}
composeRule.waitForIdle()
- listState.onStarted(createEditTile("newTile"), DragType.Add)
+ listState.onStarted(createEditTile("tile_new"), DragType.Add)
// Insert after tileD, which is at index 4
// [ a ] [ b ] [ c ] [ empty ]
// [ tile d ] [ e ]
@@ -179,23 +179,13 @@ class DragAndDropTest : SysuiTestCase() {
// Remove drop zone should disappear
composeRule.onNodeWithText("Remove").assertDoesNotExist()
- // newTile is added after tileD
- composeRule.assertTileGridContainsExactly(
- listOf("tileA", "tileB", "tileC", "tileD_large", "newTile", "tileE")
+ // tile_new is added after tileD
+ composeRule.assertGridContainsExactly(
+ CURRENT_TILES_GRID_TEST_TAG,
+ listOf("tileA", "tileB", "tileC", "tileD_large", "tile_new", "tileE"),
)
}
- private fun ComposeContentTestRule.assertTileGridContainsExactly(specs: List<String>) {
- onNodeWithTag(CURRENT_TILES_GRID_TEST_TAG)
- .onChildren()
- .filter(SemanticsMatcher.keyIsDefined(SemanticsProperties.ContentDescription))
- .apply {
- fetchSemanticsNodes().forEachIndexed { index, _ ->
- get(index).assert(hasContentDescription(specs[index]))
- }
- }
- }
-
companion object {
private const val CURRENT_TILES_GRID_TEST_TAG = "CurrentTilesGrid"
private const val AVAILABLE_TILES_GRID_TEST_TAG = "AvailableTilesGrid"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/EditModeTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/EditModeTest.kt
index 4e8b0bcd374c..8c09b81744d7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/EditModeTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/EditModeTest.kt
@@ -23,16 +23,9 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
-import androidx.compose.ui.semantics.SemanticsProperties
-import androidx.compose.ui.test.SemanticsMatcher
-import androidx.compose.ui.test.assert
-import androidx.compose.ui.test.filter
-import androidx.compose.ui.test.hasContentDescription
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.onChildren
import androidx.compose.ui.test.onNodeWithContentDescription
-import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.text.AnnotatedString
@@ -113,20 +106,6 @@ class EditModeTest : SysuiTestCase() {
specs: List<String>
) = assertGridContainsExactly(AVAILABLE_TILES_GRID_TEST_TAG, specs)
- private fun ComposeContentTestRule.assertGridContainsExactly(
- testTag: String,
- specs: List<String>,
- ) {
- onNodeWithTag(testTag)
- .onChildren()
- .filter(SemanticsMatcher.keyIsDefined(SemanticsProperties.ContentDescription))
- .apply {
- fetchSemanticsNodes().forEachIndexed { index, _ ->
- get(index).assert(hasContentDescription(specs[index]))
- }
- }
- }
-
companion object {
private const val CURRENT_TILES_GRID_TEST_TAG = "CurrentTilesGrid"
private const val AVAILABLE_TILES_GRID_TEST_TAG = "AvailableTilesGrid"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/TestMatchers.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/TestMatchers.kt
new file mode 100644
index 000000000000..dbccf864fc26
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/TestMatchers.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.panels.ui.compose
+
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.semantics.getOrNull
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.filter
+import androidx.compose.ui.test.hasContentDescription
+import androidx.compose.ui.test.junit4.ComposeContentTestRule
+import androidx.compose.ui.test.onChildren
+import androidx.compose.ui.test.onNodeWithTag
+
+/** Asserts that the tile grid with [testTag] contains exactly [specs] */
+fun ComposeContentTestRule.assertGridContainsExactly(testTag: String, specs: List<String>) {
+ onNodeWithTag(testTag)
+ .onChildren()
+ .filter(SemanticsMatcher.contentDescriptionStartsWith("tile"))
+ .apply {
+ fetchSemanticsNodes().forEachIndexed { index, _ ->
+ get(index).assert(hasContentDescription(specs[index]))
+ }
+ }
+}
+
+/**
+ * A [SemanticsMatcher] that matches anything with a content description starting with the given
+ * [prefix]
+ */
+fun SemanticsMatcher.Companion.contentDescriptionStartsWith(prefix: String): SemanticsMatcher {
+ return SemanticsMatcher("${SemanticsProperties.ContentDescription.name} starts with $prefix") {
+ semanticsNode ->
+ semanticsNode.config.getOrNull(SemanticsProperties.ContentDescription)?.any {
+ it.startsWith(prefix)
+ } ?: false
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
index 732561e0979b..944604f94ce4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
@@ -640,11 +640,11 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() {
}
}
- @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
@Test
fun onTouchEvent_shadeInteracting_movesNotDispatched() =
with(kosmos) {
testScope.runTest {
+ `whenever`(communalViewModel.swipeToHubEnabled()).thenReturn(true)
// On lockscreen.
goToScene(CommunalScenes.Blank)
whenever(
@@ -721,11 +721,11 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() {
}
}
- @DisableFlags(FLAG_GLANCEABLE_HUB_V2)
@Test
fun onTouchEvent_bouncerInteracting_movesNotDispatched() =
with(kosmos) {
testScope.runTest {
+ `whenever`(communalViewModel.swipeToHubEnabled()).thenReturn(true)
// On lockscreen.
goToScene(CommunalScenes.Blank)
whenever(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
index edb0f352a64a..f3af794f776b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt
@@ -59,6 +59,7 @@ import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.batteryViewModelFactory
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.FakeConfigurationController
import com.android.systemui.statusbar.policy.NextAlarmController
@@ -202,6 +203,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
Lazy { kosmos.shadeDisplaysRepository },
variableDateViewControllerFactory,
batteryMeterViewController,
+ kosmos.batteryViewModelFactory,
dumpManager,
mShadeCarrierGroupControllerBuilder,
combinedShadeHeadersConstraintManager,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index a5234883ed77..9137215f8c61 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -63,6 +63,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.ShadeInterpolation;
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants;
import com.android.systemui.dock.DockManager;
+import com.android.systemui.flags.DisableSceneContainer;
import com.android.systemui.flags.EnableSceneContainer;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository;
@@ -118,10 +119,8 @@ public class ScrimControllerTest extends SysuiTestCase {
@Rule public Expect mExpect = Expect.create();
private final KosmosJavaAdapter mKosmos = new KosmosJavaAdapter(this);
- private final FakeConfigurationController mConfigurationController =
- new FakeConfigurationController();
- private final LargeScreenShadeInterpolator
- mLinearLargeScreenShadeInterpolator = new LinearLargeScreenShadeInterpolator();
+ private FakeConfigurationController mConfigurationController;
+ private LargeScreenShadeInterpolator mLinearLargeScreenShadeInterpolator;
private final TestScope mTestScope = mKosmos.getTestScope();
private final JavaAdapter mJavaAdapter = new JavaAdapter(mTestScope.getBackgroundScope());
@@ -137,6 +136,7 @@ public class ScrimControllerTest extends SysuiTestCase {
private boolean mAlwaysOnEnabled;
private TestableLooper mLooper;
private Context mContext;
+
@Mock private DozeParameters mDozeParameters;
@Mock private LightBarController mLightBarController;
@Mock private DelayedWakeLock.Factory mDelayedWakeLockFactory;
@@ -149,12 +149,11 @@ public class ScrimControllerTest extends SysuiTestCase {
@Mock private PrimaryBouncerToGoneTransitionViewModel mPrimaryBouncerToGoneTransitionViewModel;
@Mock private AlternateBouncerToGoneTransitionViewModel
mAlternateBouncerToGoneTransitionViewModel;
- private final KeyguardTransitionInteractor mKeyguardTransitionInteractor =
- mKosmos.getKeyguardTransitionInteractor();
- private final FakeKeyguardTransitionRepository mKeyguardTransitionRepository =
- mKosmos.getKeyguardTransitionRepository();
@Mock private KeyguardInteractor mKeyguardInteractor;
+ private KeyguardTransitionInteractor mKeyguardTransitionInteractor;
+ private FakeKeyguardTransitionRepository mKeyguardTransitionRepository;
+
// TODO(b/204991468): Use a real PanelExpansionStateManager object once this bug is fixed. (The
// event-dispatch-on-registration pattern caused some of these unit tests to fail.)
@Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@@ -238,6 +237,9 @@ public class ScrimControllerTest extends SysuiTestCase {
when(mContext.getColor(com.android.internal.R.color.materialColorSurface))
.thenAnswer(invocation -> mSurfaceColor);
+ mConfigurationController = new FakeConfigurationController();
+ mLinearLargeScreenShadeInterpolator = new LinearLargeScreenShadeInterpolator();
+
mScrimBehind = spy(new ScrimView(mContext));
mScrimInFront = new ScrimView(mContext);
mNotificationsScrim = new ScrimView(mContext);
@@ -270,6 +272,9 @@ public class ScrimControllerTest extends SysuiTestCase {
when(mAlternateBouncerToGoneTransitionViewModel.getScrimAlpha())
.thenReturn(emptyFlow());
+ mKeyguardTransitionRepository = mKosmos.getKeyguardTransitionRepository();
+ mKeyguardTransitionInteractor = mKosmos.getKeyguardTransitionInteractor();
+
mScrimController = new ScrimController(
mLightBarController,
mDozeParameters,
@@ -290,7 +295,8 @@ public class ScrimControllerTest extends SysuiTestCase {
mKeyguardInteractor,
mKosmos.getTestDispatcher(),
mLinearLargeScreenShadeInterpolator,
- new BlurConfig(0.0f, 0.0f));
+ new BlurConfig(0.0f, 0.0f),
+ mKosmos::getWindowRootViewBlurInteractor);
mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible);
mScrimController.attachViews(mScrimBehind, mNotificationsScrim, mScrimInFront);
mScrimController.setAnimatorListener(mAnimatorListener);
@@ -321,6 +327,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToKeyguard() {
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
finishAnimationsImmediately();
@@ -336,7 +343,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
- public void transitionToShadeLocked() {
+@DisableSceneContainer void transitionToShadeLocked() {
mScrimController.legacyTransitionTo(SHADE_LOCKED);
mScrimController.setQsPosition(1f, 0);
finishAnimationsImmediately();
@@ -372,6 +379,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToShadeLocked_clippingQs() {
mScrimController.setClipsQsScrim(true);
mScrimController.legacyTransitionTo(SHADE_LOCKED);
@@ -390,6 +398,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToOff() {
mScrimController.legacyTransitionTo(ScrimState.OFF);
finishAnimationsImmediately();
@@ -405,6 +414,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToAod_withRegularWallpaper() {
mScrimController.legacyTransitionTo(ScrimState.AOD);
finishAnimationsImmediately();
@@ -420,6 +430,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToAod_withFrontAlphaUpdates() {
// Assert that setting the AOD front scrim alpha doesn't take effect in a non-AOD state.
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
@@ -464,6 +475,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToAod_afterDocked_ignoresAlwaysOnAndUpdatesFrontAlpha() {
// Assert that setting the AOD front scrim alpha doesn't take effect in a non-AOD state.
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
@@ -505,6 +517,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToPulsing_withFrontAlphaUpdates() {
// Pre-condition
// Need to go to AoD first because PULSING doesn't change
@@ -550,6 +563,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToKeyguardBouncer() {
mScrimController.legacyTransitionTo(BOUNCER);
finishAnimationsImmediately();
@@ -570,6 +584,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void lockscreenToHubTransition_setsBehindScrimAlpha() {
// Start on lockscreen.
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
@@ -616,6 +631,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void hubToLockscreenTransition_setsViewAlpha() {
// Start on glanceable hub.
mScrimController.legacyTransitionTo(ScrimState.GLANCEABLE_HUB);
@@ -662,6 +678,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToHub() {
mScrimController.setRawPanelExpansionFraction(0f);
mScrimController.setBouncerHiddenFraction(KeyguardBouncerConstants.EXPANSION_HIDDEN);
@@ -676,6 +693,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void openBouncerOnHub() {
mScrimController.legacyTransitionTo(ScrimState.GLANCEABLE_HUB);
@@ -705,6 +723,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void openShadeOnHub() {
mScrimController.legacyTransitionTo(ScrimState.GLANCEABLE_HUB);
@@ -733,6 +752,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToHubOverDream() {
mScrimController.setRawPanelExpansionFraction(0f);
mScrimController.setBouncerHiddenFraction(KeyguardBouncerConstants.EXPANSION_HIDDEN);
@@ -747,6 +767,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void openBouncerOnHubOverDream() {
mScrimController.legacyTransitionTo(ScrimState.GLANCEABLE_HUB_OVER_DREAM);
@@ -776,6 +797,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void openShadeOnHubOverDream() {
mScrimController.legacyTransitionTo(ScrimState.GLANCEABLE_HUB_OVER_DREAM);
@@ -804,6 +826,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void onThemeChange_bouncerBehindTint_isUpdatedToSurfaceColor() {
assertEquals(BOUNCER.getBehindTint(), 0x112233);
mSurfaceColor = 0x223344;
@@ -812,6 +835,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void onThemeChangeWhileClipQsScrim_bouncerBehindTint_remainsBlack() {
mScrimController.setClipsQsScrim(true);
mScrimController.legacyTransitionTo(BOUNCER);
@@ -824,6 +848,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToKeyguardBouncer_clippingQs() {
mScrimController.setClipsQsScrim(true);
mScrimController.legacyTransitionTo(BOUNCER);
@@ -844,6 +869,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void disableClipQsScrimWithoutStateTransition_updatesTintAndAlpha() {
mScrimController.setClipsQsScrim(true);
mScrimController.legacyTransitionTo(BOUNCER);
@@ -866,6 +892,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void enableClipQsScrimWithoutStateTransition_updatesTintAndAlpha() {
mScrimController.setClipsQsScrim(false);
mScrimController.legacyTransitionTo(BOUNCER);
@@ -888,6 +915,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToBouncer() {
mScrimController.legacyTransitionTo(ScrimState.BOUNCER_SCRIMMED);
finishAnimationsImmediately();
@@ -901,6 +929,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToUnlocked_clippedQs() {
mScrimController.setClipsQsScrim(true);
mScrimController.setRawPanelExpansionFraction(0f);
@@ -959,6 +988,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToUnlocked_nonClippedQs_followsLargeScreensInterpolator() {
mScrimController.setClipsQsScrim(false);
mScrimController.setRawPanelExpansionFraction(0f);
@@ -998,6 +1028,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void scrimStateCallback() {
mScrimController.legacyTransitionTo(ScrimState.UNLOCKED);
finishAnimationsImmediately();
@@ -1013,6 +1044,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void panelExpansion() {
mScrimController.setRawPanelExpansionFraction(0f);
mScrimController.setRawPanelExpansionFraction(0.5f);
@@ -1035,6 +1067,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void qsExpansion() {
reset(mScrimBehind);
mScrimController.setQsPosition(1f, 999 /* value doesn't matter */);
@@ -1047,6 +1080,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void qsExpansion_clippingQs() {
reset(mScrimBehind);
mScrimController.setClipsQsScrim(true);
@@ -1060,6 +1094,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void qsExpansion_half_clippingQs() {
reset(mScrimBehind);
mScrimController.setClipsQsScrim(true);
@@ -1073,6 +1108,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void panelExpansionAffectsAlpha() {
mScrimController.setRawPanelExpansionFraction(0f);
mScrimController.setRawPanelExpansionFraction(0.5f);
@@ -1095,6 +1131,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToUnlockedFromOff() {
// Simulate unlock with fingerprint without AOD
mScrimController.legacyTransitionTo(ScrimState.OFF);
@@ -1117,6 +1154,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToUnlockedFromAod() {
// Simulate unlock with fingerprint
mScrimController.legacyTransitionTo(ScrimState.AOD);
@@ -1139,6 +1177,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void scrimBlanksBeforeLeavingAod() {
// Simulate unlock with fingerprint
mScrimController.legacyTransitionTo(ScrimState.AOD);
@@ -1162,6 +1201,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void scrimBlankCallbackWhenUnlockingFromPulse() {
boolean[] blanked = {false};
// Simulate unlock with fingerprint
@@ -1180,6 +1220,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void blankingNotRequired_leavingAoD() {
// GIVEN display does NOT need blanking
when(mDozeParameters.getDisplayNeedsBlanking()).thenReturn(false);
@@ -1204,7 +1245,8 @@ public class ScrimControllerTest extends SysuiTestCase {
mKeyguardInteractor,
mKosmos.getTestDispatcher(),
mLinearLargeScreenShadeInterpolator,
- new BlurConfig(0.0f, 0.0f));
+ new BlurConfig(0.0f, 0.0f),
+ mKosmos::getWindowRootViewBlurInteractor);
mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible);
mScrimController.attachViews(mScrimBehind, mNotificationsScrim, mScrimInFront);
mScrimController.setAnimatorListener(mAnimatorListener);
@@ -1234,6 +1276,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testScrimCallback() {
int[] callOrder = {0, 0, 0};
int[] currentCall = {0};
@@ -1260,12 +1303,14 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testScrimCallbacksWithoutAmbientDisplay() {
mAlwaysOnEnabled = false;
testScrimCallback();
}
@Test
+ @DisableSceneContainer
public void testScrimCallbackCancelled() {
boolean[] cancelledCalled = {false};
mScrimController.legacyTransitionTo(ScrimState.AOD, new ScrimController.Callback() {
@@ -1279,6 +1324,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testHoldsWakeLock_whenAOD() {
mScrimController.legacyTransitionTo(ScrimState.AOD);
verify(mWakeLock).acquire(anyString());
@@ -1288,6 +1334,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testDoesNotHoldWakeLock_whenUnlocking() {
mScrimController.legacyTransitionTo(ScrimState.UNLOCKED);
finishAnimationsImmediately();
@@ -1295,6 +1342,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testCallbackInvokedOnSameStateTransition() {
mScrimController.legacyTransitionTo(ScrimState.UNLOCKED);
finishAnimationsImmediately();
@@ -1304,6 +1352,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testConservesExpansionOpacityAfterTransition() {
mScrimController.legacyTransitionTo(ScrimState.UNLOCKED);
mScrimController.setRawPanelExpansionFraction(0.5f);
@@ -1321,6 +1370,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testCancelsOldAnimationBeforeBlanking() {
mScrimController.legacyTransitionTo(ScrimState.AOD);
finishAnimationsImmediately();
@@ -1333,6 +1383,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testScrimsAreNotFocusable() {
assertFalse("Behind scrim should not be focusable", mScrimBehind.isFocusable());
assertFalse("Front scrim should not be focusable", mScrimInFront.isFocusable());
@@ -1341,6 +1392,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testEatsTouchEvent() {
HashSet<ScrimState> eatsTouches =
new HashSet<>(Collections.singletonList(ScrimState.AOD));
@@ -1357,6 +1409,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testAnimatesTransitionToAod() {
when(mDozeParameters.shouldControlScreenOff()).thenReturn(false);
ScrimState.AOD.prepare(ScrimState.KEYGUARD);
@@ -1371,6 +1424,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testIsLowPowerMode() {
HashSet<ScrimState> lowPowerModeStates = new HashSet<>(Arrays.asList(
ScrimState.OFF, ScrimState.AOD, ScrimState.PULSING));
@@ -1388,6 +1442,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testScrimsOpaque_whenShadeFullyExpanded() {
mScrimController.legacyTransitionTo(ScrimState.UNLOCKED);
mScrimController.setRawPanelExpansionFraction(1);
@@ -1402,6 +1457,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testScrimsVisible_whenShadeVisible() {
mScrimController.setClipsQsScrim(true);
mScrimController.legacyTransitionTo(ScrimState.UNLOCKED);
@@ -1417,6 +1473,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testDoesntAnimate_whenUnlocking() {
// LightRevealScrim will animate the transition, we should only hide the keyguard scrims.
ScrimState.UNLOCKED.prepare(ScrimState.KEYGUARD);
@@ -1437,6 +1494,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testScrimsVisible_whenShadeVisible_clippingQs() {
mScrimController.setClipsQsScrim(true);
mScrimController.legacyTransitionTo(ScrimState.UNLOCKED);
@@ -1452,6 +1510,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testScrimsVisible_whenShadeVisibleOnLockscreen() {
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
mScrimController.setQsPosition(0.25f, 300);
@@ -1463,6 +1522,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testNotificationScrimTransparent_whenOnLockscreen() {
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
// even if shade is not pulled down, panel has expansion of 1 on the lockscreen
@@ -1475,6 +1535,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testNotificationScrimVisible_afterOpeningShadeFromLockscreen() {
mScrimController.setRawPanelExpansionFraction(1);
mScrimController.legacyTransitionTo(SHADE_LOCKED);
@@ -1486,6 +1547,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void qsExpansion_BehindTint_shadeLocked_bouncerActive_usesBouncerProgress() {
when(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(true);
// clipping doesn't change tested logic but allows to assert scrims more in line with
@@ -1502,6 +1564,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void expansionNotificationAlpha_shadeLocked_bouncerActive_usesBouncerInterpolator() {
when(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(true);
@@ -1518,6 +1581,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void expansionNotificationAlpha_shadeLocked_bouncerNotActive_usesShadeInterpolator() {
when(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(false);
@@ -1533,6 +1597,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void notificationAlpha_unnocclusionAnimating_bouncerNotActive_usesKeyguardNotifAlpha() {
when(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(false);
@@ -1552,6 +1617,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void notificationAlpha_inKeyguardState_bouncerActive_usesInvertedBouncerInterpolator() {
when(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(true);
mScrimController.setClipsQsScrim(true);
@@ -1572,6 +1638,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void notificationAlpha_inKeyguardState_bouncerNotActive_usesInvertedShadeInterpolator() {
when(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(false);
mScrimController.setClipsQsScrim(true);
@@ -1592,6 +1659,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void behindTint_inKeyguardState_bouncerNotActive_usesKeyguardBehindTint() {
when(mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit()).thenReturn(false);
mScrimController.setClipsQsScrim(false);
@@ -1603,6 +1671,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testNotificationTransparency_followsTransitionToFullShade() {
mScrimController.setClipsQsScrim(true);
@@ -1644,6 +1713,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void notificationTransparency_followsNotificationScrimProgress() {
mScrimController.legacyTransitionTo(SHADE_LOCKED);
mScrimController.setRawPanelExpansionFraction(1.0f);
@@ -1660,6 +1730,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void notificationAlpha_qsNotClipped_alphaMatchesNotificationExpansionProgress() {
mScrimController.setClipsQsScrim(false);
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
@@ -1695,6 +1766,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void setNotificationsOverScrollAmount_setsTranslationYOnNotificationsScrim() {
int overScrollAmount = 10;
@@ -1704,6 +1776,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void setNotificationsOverScrollAmount_doesNotSetTranslationYOnBehindScrim() {
int overScrollAmount = 10;
@@ -1713,6 +1786,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void setNotificationsOverScrollAmount_doesNotSetTranslationYOnFrontScrim() {
int overScrollAmount = 10;
@@ -1722,6 +1796,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void notificationBoundsTopGetsPassedToKeyguard() {
mScrimController.legacyTransitionTo(SHADE_LOCKED);
mScrimController.setQsPosition(1f, 0);
@@ -1732,6 +1807,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void notificationBoundsTopDoesNotGetPassedToKeyguardWhenNotifScrimIsNotVisible() {
mScrimController.setKeyguardOccluded(true);
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
@@ -1742,6 +1818,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void transitionToDreaming() {
mScrimController.setRawPanelExpansionFraction(0f);
mScrimController.setBouncerHiddenFraction(KeyguardBouncerConstants.EXPANSION_HIDDEN);
@@ -1761,6 +1838,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void keyguardGoingAwayUpdateScrims() {
when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(true);
mScrimController.updateScrims();
@@ -1770,6 +1848,7 @@ public class ScrimControllerTest extends SysuiTestCase {
@Test
+ @DisableSceneContainer
public void setUnOccludingAnimationKeyguard() {
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
finishAnimationsImmediately();
@@ -1784,6 +1863,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testHidesScrimFlickerInActivity() {
mScrimController.setKeyguardOccluded(true);
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
@@ -1802,6 +1882,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void notificationAlpha_inKeyguardState_bouncerNotActive_clipsQsScrimFalse() {
mScrimController.setClipsQsScrim(false);
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
@@ -1811,6 +1892,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void aodStateSetsFrontScrimToNotBlend() {
mScrimController.legacyTransitionTo(ScrimState.AOD);
assertFalse("Front scrim should not blend with main color",
@@ -1818,6 +1900,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void applyState_unlocked_bouncerShowing() {
mScrimController.legacyTransitionTo(ScrimState.UNLOCKED);
mScrimController.setBouncerHiddenFraction(0.99f);
@@ -1827,6 +1910,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void ignoreTransitionRequestWhileKeyguardTransitionRunning() {
mScrimController.legacyTransitionTo(ScrimState.UNLOCKED);
mScrimController.mBouncerToGoneTransition.accept(
@@ -1839,6 +1923,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void primaryBouncerToGoneOnFinishCallsKeyguardFadedAway() {
when(mKeyguardStateController.isKeyguardFadingAway()).thenReturn(true);
mScrimController.mBouncerToGoneTransition.accept(
@@ -1849,6 +1934,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void primaryBouncerToGoneOnFinishCallsLightBarController() {
reset(mLightBarController);
mScrimController.mBouncerToGoneTransition.accept(
@@ -1860,6 +1946,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testDoNotAnimateChangeIfOccludeAnimationPlaying() {
mScrimController.setOccludeAnimationPlaying(true);
mScrimController.legacyTransitionTo(ScrimState.UNLOCKED);
@@ -1868,6 +1955,7 @@ public class ScrimControllerTest extends SysuiTestCase {
}
@Test
+ @DisableSceneContainer
public void testNotifScrimAlpha_1f_afterUnlockFinishedAndExpanded() {
mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
when(mKeyguardUnlockAnimationController.isPlayingCannedUnlockAnimation()).thenReturn(true);
diff --git a/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt
index f893aba240fc..d6e6ea8f9a29 100644
--- a/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/app/WallpaperManagerKosmos.kt
@@ -20,6 +20,6 @@ import android.content.applicationContext
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
-val Kosmos.wallpaperManager: WallpaperManager by Fixture {
+var Kosmos.wallpaperManager: WallpaperManager by Fixture {
WallpaperManager.getInstance(applicationContext)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt
index d995b868a162..0f7366daf796 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractorKosmos.kt
@@ -38,7 +38,6 @@ var Kosmos.fromDreamingTransitionInteractor by
bgDispatcher = testDispatcher,
mainDispatcher = testDispatcher,
keyguardInteractor = keyguardInteractor,
- glanceableHubTransitions = glanceableHubTransitions,
communalInteractor = communalInteractor,
communalSceneInteractor = communalSceneInteractor,
communalSettingsInteractor = communalSettingsInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt
index 494f08b88345..bf72e48713bb 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractorKosmos.kt
@@ -31,7 +31,6 @@ var Kosmos.fromGlanceableHubTransitionInteractor by
scope = applicationCoroutineScope,
mainDispatcher = testDispatcher,
bgDispatcher = testDispatcher,
- glanceableHubTransitions = glanceableHubTransitions,
communalSettingsInteractor = communalSettingsInteractor,
keyguardInteractor = keyguardInteractor,
transitionRepository = keyguardTransitionRepository,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt
index ff7a06c5087e..985044c80f18 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt
@@ -39,7 +39,6 @@ var Kosmos.fromLockscreenTransitionInteractor by
keyguardInteractor = keyguardInteractor,
shadeRepository = shadeRepository,
powerInteractor = powerInteractor,
- glanceableHubTransitions = glanceableHubTransitions,
communalSettingsInteractor = communalSettingsInteractor,
swipeToDismissInteractor = swipeToDismissInteractor,
keyguardOcclusionInteractor = keyguardOcclusionInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt
index b255b51281af..044332981bf8 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/GeneralKosmos.kt
@@ -57,12 +57,10 @@ fun Kosmos.useUnconfinedTestDispatcher() = apply { testDispatcher = UnconfinedTe
var Kosmos.testScope by Fixture { TestScope(testDispatcher) }
var Kosmos.backgroundScope by Fixture { testScope.backgroundScope }
-var Kosmos.applicationCoroutineScope by Fixture { backgroundScope }
+var Kosmos.applicationCoroutineScope by Fixture { testScope.backgroundScope }
var Kosmos.testCase: SysuiTestCase by Fixture()
-var Kosmos.backgroundCoroutineContext: CoroutineContext by Fixture {
- backgroundScope.coroutineContext
-}
-var Kosmos.mainCoroutineContext: CoroutineContext by Fixture { testScope.coroutineContext }
+var Kosmos.backgroundCoroutineContext: CoroutineContext by Fixture { testDispatcher }
+var Kosmos.mainCoroutineContext: CoroutineContext by Fixture { testDispatcher }
/**
* Run this test body with a [Kosmos] as receiver, and using the [testScope] currently installed in
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
index 446e10671afb..60b371aa8afb 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
@@ -90,6 +90,7 @@ import com.android.systemui.statusbar.policy.domain.interactor.deviceProvisionin
import com.android.systemui.statusbar.ui.viewmodel.keyguardStatusBarViewModel
import com.android.systemui.util.time.systemClock
import com.android.systemui.volume.domain.interactor.volumeDialogInteractor
+import com.android.systemui.window.domain.interactor.windowRootViewBlurInteractor
/**
* Helper for using [Kosmos] from Java.
@@ -192,4 +193,5 @@ class KosmosJavaAdapter() {
val disableFlagsInteractor by lazy { kosmos.disableFlagsInteractor }
val fakeDisableFlagsRepository by lazy { kosmos.fakeDisableFlagsRepository }
val mockWindowRootViewProvider by lazy { kosmos.mockWindowRootViewProvider }
+ val windowRootViewBlurInteractor by lazy { kosmos.windowRootViewBlurInteractor }
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitionsKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/ConversationNotificationManagerKosmos.kt
index a45b269638c0..af53ae56b2bf 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/GlanceableHubTransitionsKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/ConversationNotificationManagerKosmos.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2024 The Android Open Source Project
+ * Copyright (C) 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,17 +14,10 @@
* limitations under the License.
*/
-package com.android.systemui.keyguard.domain.interactor
+package com.android.systemui.statusbar.notification
-import com.android.systemui.communal.domain.interactor.communalInteractor
-import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
-val Kosmos.glanceableHubTransitions by
- Kosmos.Fixture {
- GlanceableHubTransitions(
- transitionRepository = keyguardTransitionRepository,
- transitionInteractor = keyguardTransitionInteractor,
- communalInteractor = communalInteractor,
- )
- }
+val Kosmos.conversationNotificationManager: ConversationNotificationManager by
+ Kosmos.Fixture { mock<ConversationNotificationManager>() }
diff --git a/packages/SystemUI/src/com/android/systemui/common/shared/colors/ShadeColors.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderLoggerKosmos.kt
index 70ace6a6d038..cc40222efec9 100644
--- a/packages/SystemUI/src/com/android/systemui/common/shared/colors/ShadeColors.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderLoggerKosmos.kt
@@ -14,19 +14,10 @@
* limitations under the License.
*/
-package com.android.systemui.common.shared.colors
+package com.android.systemui.statusbar.notification.row
-import android.content.res.Resources
-import android.graphics.Color
-import com.android.internal.graphics.ColorUtils
-import com.android.systemui.res.R
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
-object ShadeColors {
- @JvmStatic
- fun Resources.shadeBasePanel(): Int {
- val layerAbove =
- ColorUtils.setAlphaComponent(getColor(R.color.shade_panel), (0.4f * 255).toInt())
- val layerBelow = ColorUtils.setAlphaComponent(Color.WHITE, (0.1f * 255).toInt())
- return ColorUtils.compositeColors(layerAbove, layerBelow)
- }
-}
+val Kosmos.notificationRowContentBinderLogger: NotificationRowContentBinderLogger by
+ Kosmos.Fixture { mock<NotificationRowContentBinderLogger>() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModelKosmos.kt
index c6cf0063986a..7dd0103e9f5a 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/battery/ui/viewmodel/BatteryViewModelKosmos.kt
@@ -22,3 +22,10 @@ import com.android.systemui.statusbar.pipeline.battery.domain.interactor.battery
val Kosmos.batteryViewModel by
Kosmos.Fixture { BatteryViewModel(batteryInteractor, testableContext) }
+
+val Kosmos.batteryViewModelFactory by
+ Kosmos.Fixture {
+ object : BatteryViewModel.Factory {
+ override fun create(): BatteryViewModel = batteryViewModel
+ }
+ }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt
index bc29dba3442c..fbada934c9d4 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt
@@ -35,6 +35,7 @@ import com.android.systemui.statusbar.notification.domain.interactor.activeNotif
import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor
import com.android.systemui.statusbar.phone.domain.interactor.darkIconInteractor
import com.android.systemui.statusbar.phone.domain.interactor.lightsOutInteractor
+import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.batteryViewModelFactory
import com.android.systemui.statusbar.pipeline.shared.domain.interactor.homeStatusBarIconBlockListInteractor
import com.android.systemui.statusbar.pipeline.shared.domain.interactor.homeStatusBarInteractor
@@ -42,6 +43,7 @@ var Kosmos.homeStatusBarViewModel: HomeStatusBarViewModel by
Kosmos.Fixture {
HomeStatusBarViewModelImpl(
testableContext.displayId,
+ batteryViewModelFactory,
tableLogBufferFactory,
homeStatusBarInteractor,
homeStatusBarIconBlockListInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt
index 6b955ffb0b68..7ebec6c3a7b9 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt
@@ -16,9 +16,27 @@
package com.android.systemui.wallpapers.data.repository
+import android.content.applicationContext
+import com.android.app.wallpaperManager
+import com.android.systemui.broadcast.broadcastDispatcher
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.kosmos.testDispatcher
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.user.data.repository.userRepository
+import com.android.systemui.util.settings.fakeSettings
-var Kosmos.fakeWallpaperRepository by Kosmos.Fixture { FakeWallpaperRepository() }
-
-var Kosmos.wallpaperRepository: WallpaperRepository by Kosmos.Fixture { fakeWallpaperRepository }
+val Kosmos.wallpaperRepository by Fixture {
+ WallpaperRepositoryImpl(
+ context = applicationContext,
+ scope = testScope.backgroundScope,
+ bgDispatcher = testDispatcher,
+ broadcastDispatcher = broadcastDispatcher,
+ userRepository = userRepository,
+ keyguardTransitionInteractor = keyguardTransitionInteractor,
+ wallpaperFocalAreaRepository = wallpaperFocalAreaRepository,
+ wallpaperManager = wallpaperManager,
+ secureSettings = fakeSettings,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepositoryKosmos.kt
index 7281e03a5ea4..96992233375d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/window/data/repository/WindowRootViewBlurRepositoryKosmos.kt
@@ -17,5 +17,16 @@
package com.android.systemui.window.data.repository
import com.android.systemui.kosmos.Kosmos
+import kotlinx.coroutines.flow.MutableStateFlow
-val Kosmos.windowRootViewBlurRepository by Kosmos.Fixture { WindowRootViewBlurRepository() }
+val Kosmos.fakeWindowRootViewBlurRepository: FakeWindowRootViewBlurRepository by
+ Kosmos.Fixture { FakeWindowRootViewBlurRepository() }
+
+val Kosmos.windowRootViewBlurRepository: WindowRootViewBlurRepository by
+ Kosmos.Fixture { fakeWindowRootViewBlurRepository }
+
+class FakeWindowRootViewBlurRepository : WindowRootViewBlurRepository {
+ override val blurRadius: MutableStateFlow<Int> = MutableStateFlow(0)
+ override val isBlurOpaque: MutableStateFlow<Boolean> = MutableStateFlow(false)
+ override val isBlurSupported: MutableStateFlow<Boolean> = MutableStateFlow(false)
+}
diff --git a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickController.java b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickController.java
index db8441d2424b..5283df5ca7e1 100644
--- a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickController.java
+++ b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickController.java
@@ -17,11 +17,16 @@
package com.android.server.accessibility.autoclick;
import static android.view.MotionEvent.BUTTON_PRIMARY;
+import static android.view.MotionEvent.BUTTON_SECONDARY;
import static android.view.accessibility.AccessibilityManager.AUTOCLICK_CURSOR_AREA_SIZE_DEFAULT;
import static android.view.accessibility.AccessibilityManager.AUTOCLICK_DELAY_DEFAULT;
import static android.view.accessibility.AccessibilityManager.AUTOCLICK_IGNORE_MINOR_CURSOR_MOVEMENT_DEFAULT;
import static com.android.server.accessibility.autoclick.AutoclickIndicatorView.SHOW_INDICATOR_DELAY_TIME;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AUTOCLICK_TYPE_LEFT_CLICK;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AUTOCLICK_TYPE_RIGHT_CLICK;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AutoclickType;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.ClickPanelControllerInterface;
import android.accessibilityservice.AccessibilityTrace;
import android.annotation.NonNull;
@@ -84,6 +89,23 @@ public class AutoclickController extends BaseEventStreamTransformation {
@VisibleForTesting AutoclickTypePanel mAutoclickTypePanel;
private WindowManager mWindowManager;
+ // Default click type is left-click.
+ private @AutoclickType int mActiveClickType = AUTOCLICK_TYPE_LEFT_CLICK;
+
+ @VisibleForTesting
+ final ClickPanelControllerInterface clickPanelController =
+ new ClickPanelControllerInterface() {
+ @Override
+ public void handleAutoclickTypeChange(@AutoclickType int clickType) {
+ mActiveClickType = clickType;
+ }
+
+ @Override
+ public void toggleAutoclickPause() {
+ // TODO(b/388872274): allows users to pause the autoclick.
+ }
+ };
+
public AutoclickController(Context context, int userId, AccessibilityTraceManager trace) {
mTrace = trace;
mContext = context;
@@ -124,7 +146,8 @@ public class AutoclickController extends BaseEventStreamTransformation {
mAutoclickIndicatorView = new AutoclickIndicatorView(mContext);
mWindowManager = mContext.getSystemService(WindowManager.class);
- mAutoclickTypePanel = new AutoclickTypePanel(mContext, mWindowManager);
+ mAutoclickTypePanel =
+ new AutoclickTypePanel(mContext, mWindowManager, clickPanelController);
mAutoclickTypePanel.show();
mWindowManager.addView(mAutoclickIndicatorView, mAutoclickIndicatorView.getLayoutParams());
@@ -644,6 +667,15 @@ public class AutoclickController extends BaseEventStreamTransformation {
final long now = SystemClock.uptimeMillis();
+ // TODO(b/395094903): always triggers left-click when the cursor hovers over the
+ // autoclick type panel, to always allow users to change a different click type.
+ // Otherwise, if one chooses the right-click, this user won't be able to rely on
+ // autoclick to select other click types.
+ final int actionButton =
+ mActiveClickType == AUTOCLICK_TYPE_RIGHT_CLICK
+ ? BUTTON_SECONDARY
+ : BUTTON_PRIMARY;
+
MotionEvent downEvent =
MotionEvent.obtain(
/* downTime= */ now,
@@ -653,7 +685,7 @@ public class AutoclickController extends BaseEventStreamTransformation {
mTempPointerProperties,
mTempPointerCoords,
mMetaState,
- BUTTON_PRIMARY,
+ actionButton,
/* xPrecision= */ 1.0f,
/* yPrecision= */ 1.0f,
mLastMotionEvent.getDeviceId(),
@@ -663,11 +695,11 @@ public class AutoclickController extends BaseEventStreamTransformation {
MotionEvent pressEvent = MotionEvent.obtain(downEvent);
pressEvent.setAction(MotionEvent.ACTION_BUTTON_PRESS);
- pressEvent.setActionButton(BUTTON_PRIMARY);
+ pressEvent.setActionButton(actionButton);
MotionEvent releaseEvent = MotionEvent.obtain(downEvent);
releaseEvent.setAction(MotionEvent.ACTION_BUTTON_RELEASE);
- releaseEvent.setActionButton(BUTTON_PRIMARY);
+ releaseEvent.setActionButton(actionButton);
releaseEvent.setButtonState(0);
MotionEvent upEvent = MotionEvent.obtain(downEvent);
diff --git a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickIndicatorView.java b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickIndicatorView.java
index 557e1b2afcd5..01f359fc5753 100644
--- a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickIndicatorView.java
+++ b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickIndicatorView.java
@@ -34,6 +34,8 @@ import android.view.animation.LinearInterpolator;
import androidx.annotation.VisibleForTesting;
+import com.android.internal.R;
+
// A visual indicator for the autoclick feature.
public class AutoclickIndicatorView extends View {
private static final String TAG = AutoclickIndicatorView.class.getSimpleName();
@@ -67,8 +69,7 @@ public class AutoclickIndicatorView extends View {
super(context);
mPaint = new Paint();
- // TODO(b/383901288): update styling once determined by UX.
- mPaint.setARGB(255, 52, 103, 235);
+ mPaint.setColor(context.getColor(R.color.materialColorPrimary));
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(10);
diff --git a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickTypePanel.java b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickTypePanel.java
index 2ef11f4b78e1..cf928e2f3fa4 100644
--- a/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickTypePanel.java
+++ b/services/accessibility/java/com/android/server/accessibility/autoclick/AutoclickTypePanel.java
@@ -18,6 +18,7 @@ package com.android.server.accessibility.autoclick;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+import android.annotation.IntDef;
import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
@@ -39,12 +40,40 @@ public class AutoclickTypePanel {
private final String TAG = AutoclickTypePanel.class.getSimpleName();
+ public static final int AUTOCLICK_TYPE_LEFT_CLICK = 0;
+ public static final int AUTOCLICK_TYPE_RIGHT_CLICK = 1;
+ public static final int AUTOCLICK_TYPE_DOUBLE_CLICK = 2;
+ public static final int AUTOCLICK_TYPE_DRAG = 3;
+ public static final int AUTOCLICK_TYPE_SCROLL = 4;
+
+ // Types of click the AutoclickTypePanel supports.
+ @IntDef({
+ AUTOCLICK_TYPE_LEFT_CLICK,
+ AUTOCLICK_TYPE_RIGHT_CLICK,
+ AUTOCLICK_TYPE_DOUBLE_CLICK,
+ AUTOCLICK_TYPE_DRAG,
+ AUTOCLICK_TYPE_SCROLL,
+ })
+ public @interface AutoclickType {}
+
+ // An interface exposed to {@link AutoclickController) to handle different actions on the panel,
+ // including changing autoclick type, pausing/resuming autoclick.
+ public interface ClickPanelControllerInterface {
+ // Allows users to change a different autoclick type.
+ void handleAutoclickTypeChange(@AutoclickType int clickType);
+
+ // Allows users to pause/resume the autoclick.
+ void toggleAutoclickPause();
+ }
+
private final Context mContext;
private final View mContentView;
private final WindowManager mWindowManager;
+ private final ClickPanelControllerInterface mClickPanelController;
+
// Whether the panel is expanded or not.
private boolean mExpanded = false;
@@ -56,9 +85,13 @@ public class AutoclickTypePanel {
private LinearLayout mSelectedButton;
- public AutoclickTypePanel(Context context, WindowManager windowManager) {
+ public AutoclickTypePanel(
+ Context context,
+ WindowManager windowManager,
+ ClickPanelControllerInterface clickPanelController) {
mContext = context;
mWindowManager = windowManager;
+ mClickPanelController = clickPanelController;
mContentView =
LayoutInflater.from(context)
@@ -76,26 +109,35 @@ public class AutoclickTypePanel {
}
private void initializeButtonState() {
- mLeftClickButton.setOnClickListener(v -> togglePanelExpansion(mLeftClickButton));
- mRightClickButton.setOnClickListener(v -> togglePanelExpansion(mRightClickButton));
- mDoubleClickButton.setOnClickListener(v -> togglePanelExpansion(mDoubleClickButton));
- mScrollButton.setOnClickListener(v -> togglePanelExpansion(mScrollButton));
- mDragButton.setOnClickListener(v -> togglePanelExpansion(mDragButton));
+ mLeftClickButton.setOnClickListener(v -> togglePanelExpansion(AUTOCLICK_TYPE_LEFT_CLICK));
+ mRightClickButton.setOnClickListener(v -> togglePanelExpansion(AUTOCLICK_TYPE_RIGHT_CLICK));
+ mDoubleClickButton.setOnClickListener(
+ v -> togglePanelExpansion(AUTOCLICK_TYPE_DOUBLE_CLICK));
+ mScrollButton.setOnClickListener(v -> togglePanelExpansion(AUTOCLICK_TYPE_SCROLL));
+ mDragButton.setOnClickListener(v -> togglePanelExpansion(AUTOCLICK_TYPE_DRAG));
+
+ // TODO(b/388872274): registers listener for pause button and allows users to pause/resume
+ // the autoclick.
+ // TODO(b/388847771): registers listener for position button and allows users to move the
+ // panel to a different position.
// Initializes panel as collapsed state and only displays the left click button.
hideAllClickTypeButtons();
mLeftClickButton.setVisibility(View.VISIBLE);
- setSelectedButton(/* selectedButton= */ mLeftClickButton);
+ setSelectedClickType(AUTOCLICK_TYPE_LEFT_CLICK);
}
/** Sets the selected button and updates the newly and previously selected button styling. */
- private void setSelectedButton(@NonNull LinearLayout selectedButton) {
+ private void setSelectedClickType(@AutoclickType int clickType) {
+ final LinearLayout selectedButton = getButtonFromClickType(clickType);
+
// Updates the previously selected button styling.
if (mSelectedButton != null) {
toggleSelectedButtonStyle(mSelectedButton, /* isSelected= */ false);
}
mSelectedButton = selectedButton;
+ mClickPanelController.handleAutoclickTypeChange(clickType);
// Updates the newly selected button styling.
toggleSelectedButtonStyle(selectedButton, /* isSelected= */ true);
@@ -130,7 +172,9 @@ public class AutoclickTypePanel {
}
/** Toggles the panel expanded or collapsed state. */
- private void togglePanelExpansion(LinearLayout button) {
+ private void togglePanelExpansion(@AutoclickType int clickType) {
+ final LinearLayout button = getButtonFromClickType(clickType);
+
if (mExpanded) {
// If the panel is already in expanded state, we should collapse it by hiding all
// buttons except the one user selected.
@@ -138,7 +182,7 @@ public class AutoclickTypePanel {
button.setVisibility(View.VISIBLE);
// Sets the newly selected button.
- setSelectedButton(/* selectedButton= */ button);
+ setSelectedClickType(clickType);
} else {
// If the panel is already collapsed, we just need to expand it.
showAllClickTypeButtons();
@@ -166,6 +210,17 @@ public class AutoclickTypePanel {
mScrollButton.setVisibility(View.VISIBLE);
}
+ private LinearLayout getButtonFromClickType(@AutoclickType int clickType) {
+ return switch (clickType) {
+ case AUTOCLICK_TYPE_LEFT_CLICK -> mLeftClickButton;
+ case AUTOCLICK_TYPE_RIGHT_CLICK -> mRightClickButton;
+ case AUTOCLICK_TYPE_DOUBLE_CLICK -> mDoubleClickButton;
+ case AUTOCLICK_TYPE_DRAG -> mDragButton;
+ case AUTOCLICK_TYPE_SCROLL -> mScrollButton;
+ default -> throw new IllegalArgumentException("Unknown clickType " + clickType);
+ };
+ }
+
@VisibleForTesting
boolean getExpansionStateForTesting() {
return mExpanded;
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 414db37508e5..05301fdd8385 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -588,10 +588,10 @@ public class CompanionDeviceManagerService extends SystemService {
@Override
@EnforcePermission(DELIVER_COMPANION_MESSAGES)
public void attachSystemDataTransport(String packageName, int userId, int associationId,
- ParcelFileDescriptor fd) {
+ ParcelFileDescriptor fd, int flags) {
attachSystemDataTransport_enforcePermission();
- mTransportManager.attachSystemDataTransport(associationId, fd);
+ mTransportManager.attachSystemDataTransport(associationId, fd, flags);
}
@Override
diff --git a/services/companion/java/com/android/server/companion/securechannel/AttestationVerifier.java b/services/companion/java/com/android/server/companion/securechannel/AttestationVerifier.java
index df3071e08a03..42af0597b35c 100644
--- a/services/companion/java/com/android/server/companion/securechannel/AttestationVerifier.java
+++ b/services/companion/java/com/android/server/companion/securechannel/AttestationVerifier.java
@@ -16,7 +16,9 @@
package com.android.server.companion.securechannel;
+import static android.companion.CompanionDeviceManager.TRANSPORT_FLAG_EXTEND_PATCH_DIFF;
import static android.security.attestationverification.AttestationVerificationManager.PARAM_CHALLENGE;
+import static android.security.attestationverification.AttestationVerificationManager.PARAM_MAX_PATCH_LEVEL_DIFF_MONTHS;
import static android.security.attestationverification.AttestationVerificationManager.PROFILE_PEER_DEVICE;
import static android.security.attestationverification.AttestationVerificationManager.TYPE_CHALLENGE;
@@ -34,15 +36,21 @@ import java.util.function.BiConsumer;
/**
* Helper class to perform attestation verification synchronously.
+ *
+ * @hide
*/
public class AttestationVerifier {
private static final long ATTESTATION_VERIFICATION_TIMEOUT_SECONDS = 10; // 10 seconds
private static final String PARAM_OWNED_BY_SYSTEM = "android.key_owned_by_system";
+ private static final int EXTENDED_PATCH_LEVEL_DIFF_MONTHS = 24; // 2 years
+
private final Context mContext;
+ private final int mFlags;
- AttestationVerifier(Context context) {
+ AttestationVerifier(Context context, int flags) {
this.mContext = context;
+ this.mFlags = flags;
}
/**
@@ -59,10 +67,13 @@ public class AttestationVerifier {
@NonNull byte[] remoteAttestation,
@NonNull byte[] attestationChallenge
) throws SecureChannelException {
- Bundle requirements = new Bundle();
+ final Bundle requirements = new Bundle();
requirements.putByteArray(PARAM_CHALLENGE, attestationChallenge);
requirements.putBoolean(PARAM_OWNED_BY_SYSTEM, true); // Custom parameter for CDM
+ // Apply flags to verifier requirements
+ updateRequirements(requirements);
+
// Synchronously execute attestation verification.
AtomicInteger verificationResult = new AtomicInteger(0);
CountDownLatch verificationFinished = new CountDownLatch(1);
@@ -96,4 +107,15 @@ public class AttestationVerifier {
return verificationResult.get();
}
+
+ private void updateRequirements(Bundle requirements) {
+ if (mFlags == 0) {
+ return;
+ }
+
+ if ((mFlags & TRANSPORT_FLAG_EXTEND_PATCH_DIFF) > 0) {
+ requirements.putInt(PARAM_MAX_PATCH_LEVEL_DIFF_MONTHS,
+ EXTENDED_PATCH_LEVEL_DIFF_MONTHS);
+ }
+ }
}
diff --git a/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java b/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java
index 2d3782fb3181..6c7c9b3e073d 100644
--- a/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java
+++ b/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java
@@ -59,6 +59,7 @@ public class SecureChannel {
private final Callback mCallback;
private final byte[] mPreSharedKey;
private final AttestationVerifier mVerifier;
+ private final int mFlags;
private volatile boolean mStopped;
private volatile boolean mInProgress;
@@ -89,7 +90,7 @@ public class SecureChannel {
@NonNull Callback callback,
@NonNull byte[] preSharedKey
) {
- this(in, out, callback, preSharedKey, null);
+ this(in, out, callback, preSharedKey, null, 0);
}
/**
@@ -100,14 +101,16 @@ public class SecureChannel {
* @param out output stream from which data is sent out
* @param callback subscription to received messages from the channel
* @param context context for fetching the Attestation Verifier Framework system service
+ * @param flags flags for custom security settings on the channel
*/
public SecureChannel(
@NonNull final InputStream in,
@NonNull final OutputStream out,
@NonNull Callback callback,
- @NonNull Context context
+ @NonNull Context context,
+ int flags
) {
- this(in, out, callback, null, new AttestationVerifier(context));
+ this(in, out, callback, null, new AttestationVerifier(context, flags), flags);
}
public SecureChannel(
@@ -115,13 +118,15 @@ public class SecureChannel {
final OutputStream out,
Callback callback,
byte[] preSharedKey,
- AttestationVerifier verifier
+ AttestationVerifier verifier,
+ int flags
) {
this.mInput = in;
this.mOutput = out;
this.mCallback = callback;
this.mPreSharedKey = preSharedKey;
this.mVerifier = verifier;
+ this.mFlags = flags;
}
/**
diff --git a/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java b/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java
index 36083607bfcd..92d9fb02de79 100644
--- a/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java
+++ b/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java
@@ -16,7 +16,11 @@
package com.android.server.companion.transport;
+import static android.companion.AssociationRequest.DEVICE_PROFILE_WEARABLE_SENSING;
import static android.companion.CompanionDeviceManager.MESSAGE_REQUEST_PERMISSION_RESTORE;
+import static android.companion.CompanionDeviceManager.TRANSPORT_FLAG_EXTEND_PATCH_DIFF;
+
+import static com.android.server.companion.transport.TransportUtils.enforceAssociationCanUseTransportFlags;
import android.annotation.NonNull;
import android.annotation.SuppressLint;
@@ -152,10 +156,14 @@ public class CompanionTransportManager {
/**
* Attach transport.
*/
- public void attachSystemDataTransport(int associationId, ParcelFileDescriptor fd) {
+ public void attachSystemDataTransport(int associationId, ParcelFileDescriptor fd,
+ int flags) {
Slog.i(TAG, "Attaching transport for association id=[" + associationId + "]...");
- mAssociationStore.getAssociationWithCallerChecks(associationId);
+ AssociationInfo association =
+ mAssociationStore.getAssociationWithCallerChecks(associationId);
+
+ enforceAssociationCanUseTransportFlags(association, flags);
synchronized (mTransports) {
if (mTransports.contains(associationId)) {
@@ -163,7 +171,7 @@ public class CompanionTransportManager {
}
// TODO: Implement new API to pass a PSK
- initializeTransport(associationId, fd, null);
+ initializeTransport(association, fd, null, flags);
notifyOnTransportsChanged();
}
@@ -217,10 +225,12 @@ public class CompanionTransportManager {
}
}
- private void initializeTransport(int associationId,
+ private void initializeTransport(AssociationInfo association,
ParcelFileDescriptor fd,
- byte[] preSharedKey) {
+ byte[] preSharedKey,
+ int flags) {
Slog.i(TAG, "Initializing transport");
+ int associationId = association.getId();
Transport transport;
if (!isSecureTransportEnabled()) {
// If secure transport is explicitly disabled for testing, use raw transport
@@ -230,15 +240,21 @@ public class CompanionTransportManager {
// If device is debug build, use hardcoded test key for authentication
Slog.d(TAG, "Creating an unauthenticated secure channel");
final byte[] testKey = "CDM".getBytes(StandardCharsets.UTF_8);
- transport = new SecureTransport(associationId, fd, mContext, testKey, null);
+ transport = new SecureTransport(associationId, fd, mContext, testKey, null, 0);
} else if (preSharedKey != null) {
// If either device is not Android, then use app-specific pre-shared key
Slog.d(TAG, "Creating a PSK-authenticated secure channel");
- transport = new SecureTransport(associationId, fd, mContext, preSharedKey, null);
+ transport = new SecureTransport(associationId, fd, mContext, preSharedKey, null, 0);
+ } else if (DEVICE_PROFILE_WEARABLE_SENSING.equals(association.getDeviceProfile())) {
+ // If device is glasses with WEARABLE_SENSING profile, extend the allowed patch
+ // difference to 2 years instead of 1.
+ Slog.d(TAG, "Creating a secure channel with extended patch difference allowance");
+ transport = new SecureTransport(associationId, fd, mContext,
+ TRANSPORT_FLAG_EXTEND_PATCH_DIFF);
} else {
// If none of the above applies, then use secure channel with attestation verification
Slog.d(TAG, "Creating a secure channel");
- transport = new SecureTransport(associationId, fd, mContext);
+ transport = new SecureTransport(associationId, fd, mContext, flags);
}
addMessageListenersToTransport(transport);
diff --git a/services/companion/java/com/android/server/companion/transport/SecureTransport.java b/services/companion/java/com/android/server/companion/transport/SecureTransport.java
index 1e95e65848a5..77dc80998e2e 100644
--- a/services/companion/java/com/android/server/companion/transport/SecureTransport.java
+++ b/services/companion/java/com/android/server/companion/transport/SecureTransport.java
@@ -36,15 +36,22 @@ class SecureTransport extends Transport implements SecureChannel.Callback {
private final BlockingQueue<byte[]> mRequestQueue = new ArrayBlockingQueue<>(500);
- SecureTransport(int associationId, ParcelFileDescriptor fd, Context context) {
+ SecureTransport(int associationId, ParcelFileDescriptor fd, Context context, int flags) {
super(associationId, fd, context);
- mSecureChannel = new SecureChannel(mRemoteIn, mRemoteOut, this, context);
+ mSecureChannel = new SecureChannel(mRemoteIn, mRemoteOut, this, context, flags);
}
SecureTransport(int associationId, ParcelFileDescriptor fd, Context context,
- byte[] preSharedKey, AttestationVerifier verifier) {
+ byte[] preSharedKey, AttestationVerifier verifier, int flags) {
super(associationId, fd, context);
- mSecureChannel = new SecureChannel(mRemoteIn, mRemoteOut, this, preSharedKey, verifier);
+ mSecureChannel = new SecureChannel(
+ mRemoteIn,
+ mRemoteOut,
+ this,
+ preSharedKey,
+ verifier,
+ flags
+ );
}
@Override
diff --git a/services/companion/java/com/android/server/companion/transport/TransportUtils.java b/services/companion/java/com/android/server/companion/transport/TransportUtils.java
new file mode 100644
index 000000000000..7a15c11afd19
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/transport/TransportUtils.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.companion.transport;
+
+import static android.companion.AssociationRequest.DEVICE_PROFILE_WEARABLE_SENSING;
+import static android.companion.CompanionDeviceManager.TRANSPORT_FLAG_EXTEND_PATCH_DIFF;
+
+import static java.util.Collections.unmodifiableMap;
+
+import android.companion.AssociationInfo;
+import android.util.ArrayMap;
+
+import java.util.Map;
+
+/**
+ * Utility class for transport manager.
+ * @hide
+ */
+public final class TransportUtils {
+
+ /**
+ * Device profile -> Union of allowlisted transport flags
+ */
+ private static final Map<String, Integer> DEVICE_PROFILE_TRANSPORT_FLAGS_ALLOWLIST;
+ static {
+ final Map<String, Integer> map = new ArrayMap<>();
+ map.put(DEVICE_PROFILE_WEARABLE_SENSING,
+ TRANSPORT_FLAG_EXTEND_PATCH_DIFF);
+ DEVICE_PROFILE_TRANSPORT_FLAGS_ALLOWLIST = unmodifiableMap(map);
+ }
+
+ /**
+ * Enforce that the association that is trying to attach a transport with provided flags has
+ * one of the allowlisted device profiles that may apply the flagged features.
+ *
+ * @param association Association for which transport is being attached
+ * @param flags Flags for features being applied to the transport
+ */
+ public static void enforceAssociationCanUseTransportFlags(
+ AssociationInfo association, int flags) {
+ if (flags == 0) {
+ return;
+ }
+
+ final String deviceProfile = association.getDeviceProfile();
+ if (!DEVICE_PROFILE_TRANSPORT_FLAGS_ALLOWLIST.containsKey(deviceProfile)) {
+ throw new IllegalArgumentException("Association (id=" + association.getId()
+ + ") with device profile " + deviceProfile + " does not support the "
+ + "usage of transport flags.");
+ }
+
+ int allowedFlags = DEVICE_PROFILE_TRANSPORT_FLAGS_ALLOWLIST.get(deviceProfile);
+
+ // Ensure that every non-zero bits in flags are also present in allowed flags
+ if ((allowedFlags & flags) != flags) {
+ throw new IllegalArgumentException("Association (id=" + association.getId()
+ + ") does not have the device profile required to use at least "
+ + "one of the flags in this transport.");
+ }
+ }
+
+ private TransportUtils() {}
+}
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 00db11e72dd9..2aaf6a9c2391 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -300,10 +300,7 @@ java_genrule_combiner {
java_library {
name: "services.core",
- static_libs: select(release_flag("RELEASE_SERVICES_JAVA_GENRULE_COMBINER"), {
- true: ["services.core.combined"],
- default: ["services.core.priorityboosted"],
- }),
+ static_libs: ["services.core.combined"],
}
java_library_host {
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java
index c0a97db7275b..767201125e09 100644
--- a/services/core/java/com/android/server/app/GameManagerService.java
+++ b/services/core/java/com/android/server/app/GameManagerService.java
@@ -361,6 +361,14 @@ public final class GameManagerService extends IGameManagerService.Stub {
case POPULATE_GAME_MODE_SETTINGS: {
removeEqualMessages(POPULATE_GAME_MODE_SETTINGS, msg.obj);
final int userId = (int) msg.obj;
+ synchronized (mLock) {
+ if (!mSettings.containsKey(userId)) {
+ GameManagerSettings userSettings = new GameManagerSettings(
+ Environment.getDataSystemDeDirectory(userId));
+ mSettings.put(userId, userSettings);
+ userSettings.readPersistentDataLocked();
+ }
+ }
final String[] packageNames = getInstalledGamePackageNames(userId);
updateConfigsForUser(userId, false /*checkGamePackage*/, packageNames);
break;
@@ -990,8 +998,7 @@ public final class GameManagerService extends IGameManagerService.Stub {
@Override
public void onUserStarting(@NonNull TargetUser user) {
Slog.d(TAG, "Starting user " + user.getUserIdentifier());
- mService.onUserStarting(user,
- Environment.getDataSystemDeDirectory(user.getUserIdentifier()));
+ mService.onUserStarting(user, /*settingDataDirOverride*/ null);
}
@Override
@@ -1596,13 +1603,16 @@ public final class GameManagerService extends IGameManagerService.Stub {
}
}
- void onUserStarting(@NonNull TargetUser user, File settingDataDir) {
+ void onUserStarting(@NonNull TargetUser user, File settingDataDirOverride) {
final int userId = user.getUserIdentifier();
- synchronized (mLock) {
- if (!mSettings.containsKey(userId)) {
- GameManagerSettings userSettings = new GameManagerSettings(settingDataDir);
- mSettings.put(userId, userSettings);
- userSettings.readPersistentDataLocked();
+ if (settingDataDirOverride != null) {
+ synchronized (mLock) {
+ if (!mSettings.containsKey(userId)) {
+ GameManagerSettings userSettings = new GameManagerSettings(
+ settingDataDirOverride);
+ mSettings.put(userId, userSettings);
+ userSettings.readPersistentDataLocked();
+ }
}
}
sendUserMessage(userId, POPULATE_GAME_MODE_SETTINGS, EVENT_ON_USER_STARTING,
diff --git a/services/core/java/com/android/server/app/GameManagerSettings.java b/services/core/java/com/android/server/app/GameManagerSettings.java
index c57a1f73d7d7..fd4bf2f3ef65 100644
--- a/services/core/java/com/android/server/app/GameManagerSettings.java
+++ b/services/core/java/com/android/server/app/GameManagerSettings.java
@@ -221,9 +221,7 @@ public class GameManagerSettings {
return false;
}
- try {
- final FileInputStream str = mSettingsFile.openRead();
-
+ try (FileInputStream str = mSettingsFile.openRead()) {
final TypedXmlPullParser parser = Xml.resolvePullParser(str);
int type;
while ((type = parser.next()) != XmlPullParser.START_TAG
@@ -251,7 +249,6 @@ public class GameManagerSettings {
+ type);
}
}
- str.close();
} catch (XmlPullParserException | java.io.IOException e) {
Slog.wtf(TAG, "Error reading game manager settings", e);
return false;
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index b48d0a6ed547..86871ea45d13 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -12598,7 +12598,7 @@ public class AudioService extends IAudioService.Stub
//==========================================================================================
static final int LOG_NB_EVENTS_LIFECYCLE = 20;
static final int LOG_NB_EVENTS_PHONE_STATE = 20;
- static final int LOG_NB_EVENTS_DEVICE_CONNECTION = 50;
+ static final int LOG_NB_EVENTS_DEVICE_CONNECTION = 200;
static final int LOG_NB_EVENTS_FORCE_USE = 20;
static final int LOG_NB_EVENTS_VOLUME = 100;
static final int LOG_NB_EVENTS_DYN_POLICY = 10;
diff --git a/services/core/java/com/android/server/display/mode/VotesStatsReporter.java b/services/core/java/com/android/server/display/mode/VotesStatsReporter.java
index d3d49c272338..7b579c0e0c21 100644
--- a/services/core/java/com/android/server/display/mode/VotesStatsReporter.java
+++ b/services/core/java/com/android/server/display/mode/VotesStatsReporter.java
@@ -25,6 +25,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Trace;
import android.util.SparseArray;
+import android.util.SparseIntArray;
import android.view.Display;
import com.android.internal.util.FrameworkStatsLog;
@@ -37,7 +38,7 @@ class VotesStatsReporter {
private static final int REFRESH_RATE_NOT_LIMITED = 1000;
private final boolean mIgnoredRenderRate;
- private int mLastMinPriorityReported = Vote.MAX_PRIORITY + 1;
+ private final SparseIntArray mLastMinPriorityByDisplay = new SparseIntArray();
VotesStatsReporter(boolean ignoreRenderRate) {
mIgnoredRenderRate = ignoreRenderRate;
@@ -71,9 +72,11 @@ class VotesStatsReporter {
void reportVotesActivated(int displayId, int minPriority, @Nullable Display.Mode baseMode,
SparseArray<Vote> votes) {
+ int lastMinPriorityReported = mLastMinPriorityByDisplay.get(
+ displayId, Vote.MAX_PRIORITY + 1);
int selectedRefreshRate = baseMode != null ? (int) baseMode.getRefreshRate() : -1;
for (int priority = Vote.MIN_PRIORITY; priority <= Vote.MAX_PRIORITY; priority++) {
- if (priority < mLastMinPriorityReported && priority < minPriority) {
+ if (priority < lastMinPriorityReported && priority < minPriority) {
continue;
}
Vote vote = votes.get(priority);
@@ -82,7 +85,7 @@ class VotesStatsReporter {
}
// Was previously reported ACTIVE, changed to ADDED
- if (priority >= mLastMinPriorityReported && priority < minPriority) {
+ if (priority >= lastMinPriorityReported && priority < minPriority) {
int maxRefreshRate = getMaxRefreshRate(vote, mIgnoredRenderRate);
FrameworkStatsLog.write(
DISPLAY_MODE_DIRECTOR_VOTE_CHANGED, displayId, priority,
@@ -90,7 +93,7 @@ class VotesStatsReporter {
maxRefreshRate, selectedRefreshRate);
}
// Was previously reported ADDED, changed to ACTIVE
- if (priority >= minPriority && priority < mLastMinPriorityReported) {
+ if (priority >= minPriority && priority < lastMinPriorityReported) {
int maxRefreshRate = getMaxRefreshRate(vote, mIgnoredRenderRate);
FrameworkStatsLog.write(
DISPLAY_MODE_DIRECTOR_VOTE_CHANGED, displayId, priority,
@@ -98,7 +101,7 @@ class VotesStatsReporter {
maxRefreshRate, selectedRefreshRate);
}
- mLastMinPriorityReported = minPriority;
+ mLastMinPriorityByDisplay.put(displayId, minPriority);
}
}
diff --git a/services/core/java/com/android/server/flags/services.aconfig b/services/core/java/com/android/server/flags/services.aconfig
index 4505d0e2d799..7e5c1bc9ada5 100644
--- a/services/core/java/com/android/server/flags/services.aconfig
+++ b/services/core/java/com/android/server/flags/services.aconfig
@@ -86,3 +86,10 @@ flag {
description: "Enable the time notifications feature, a toggle to enable/disable time-related notifications in Date & Time Settings"
bug: "283267917"
}
+
+flag {
+ name: "certpininstaller_removal"
+ namespace: "network_security"
+ description: "Remove CertPinInstallReceiver from the platform"
+ bug: "391205997"
+}
diff --git a/services/core/java/com/android/server/input/InputGestureManager.java b/services/core/java/com/android/server/input/InputGestureManager.java
index 108afba7c52a..977c029f3a29 100644
--- a/services/core/java/com/android/server/input/InputGestureManager.java
+++ b/services/core/java/com/android/server/input/InputGestureManager.java
@@ -256,13 +256,11 @@ final class InputGestureManager {
));
}
if (keyboardA11yShortcutControl()) {
- if (InputSettings.isAccessibilityBounceKeysFeatureEnabled()) {
- systemShortcuts.add(createKeyGesture(
- KeyEvent.KEYCODE_3,
- KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
- KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS
- ));
- }
+ systemShortcuts.add(createKeyGesture(
+ KeyEvent.KEYCODE_3,
+ KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
+ KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS
+ ));
if (InputSettings.isAccessibilityMouseKeysFeatureFlagEnabled()) {
systemShortcuts.add(createKeyGesture(
KeyEvent.KEYCODE_4,
@@ -270,20 +268,16 @@ final class InputGestureManager {
KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MOUSE_KEYS
));
}
- if (InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
- systemShortcuts.add(createKeyGesture(
- KeyEvent.KEYCODE_5,
- KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
- KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS
- ));
- }
- if (InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) {
- systemShortcuts.add(createKeyGesture(
- KeyEvent.KEYCODE_6,
- KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
- KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS
- ));
- }
+ systemShortcuts.add(createKeyGesture(
+ KeyEvent.KEYCODE_5,
+ KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
+ KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS
+ ));
+ systemShortcuts.add(createKeyGesture(
+ KeyEvent.KEYCODE_6,
+ KeyEvent.META_META_ON | KeyEvent.META_ALT_ON,
+ KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS
+ ));
}
synchronized (mGestureLock) {
for (InputGestureData systemShortcut : systemShortcuts) {
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 4a5f4a19893a..8624f4230e9c 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -2775,7 +2775,7 @@ public class InputManagerService extends IInputManager.Stub
}
return true;
case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS:
- if (complete && InputSettings.isAccessibilityBounceKeysFeatureEnabled()) {
+ if (complete) {
final boolean bounceKeysEnabled =
InputSettings.isAccessibilityBounceKeysEnabled(mContext);
InputSettings.setAccessibilityBounceKeysThreshold(mContext,
@@ -2793,7 +2793,7 @@ public class InputManagerService extends IInputManager.Stub
}
break;
case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS:
- if (complete && InputSettings.isAccessibilityStickyKeysFeatureEnabled()) {
+ if (complete) {
final boolean stickyKeysEnabled =
InputSettings.isAccessibilityStickyKeysEnabled(mContext);
InputSettings.setAccessibilityStickyKeysEnabled(mContext, !stickyKeysEnabled);
@@ -2801,7 +2801,7 @@ public class InputManagerService extends IInputManager.Stub
}
break;
case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS:
- if (complete && InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()) {
+ if (complete) {
final boolean slowKeysEnabled =
InputSettings.isAccessibilitySlowKeysEnabled(mContext);
InputSettings.setAccessibilitySlowKeysThreshold(mContext,
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java
index ddace179348c..2ea61171b9e1 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java
@@ -43,7 +43,6 @@ import com.android.internal.annotations.GuardedBy;
import java.util.Collection;
import java.util.Optional;
-import java.util.concurrent.atomic.AtomicBoolean;
/**
* A class that represents a broker for the endpoint registered by the client app. This class
@@ -89,8 +88,11 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
/** The remote callback interface for this endpoint. */
private final IContextHubEndpointCallback mContextHubEndpointCallback;
- /** True if this endpoint is registered with the service. */
- private AtomicBoolean mIsRegistered = new AtomicBoolean(true);
+ /** True if this endpoint is registered with the service/HAL. */
+ @GuardedBy("mRegistrationLock")
+ private boolean mIsRegistered = false;
+
+ private final Object mRegistrationLock = new Object();
private final Object mOpenSessionLock = new Object();
@@ -192,7 +194,7 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
public int openSession(HubEndpointInfo destination, String serviceDescriptor)
throws RemoteException {
super.openSession_enforcePermission();
- if (!mIsRegistered.get()) throw new IllegalStateException("Endpoint is not registered");
+ if (!isRegistered()) throw new IllegalStateException("Endpoint is not registered");
if (!hasEndpointPermissions(destination)) {
throw new SecurityException(
"Insufficient permission to open a session with endpoint: " + destination);
@@ -223,7 +225,7 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
@android.annotation.EnforcePermission(android.Manifest.permission.ACCESS_CONTEXT_HUB)
public void closeSession(int sessionId, int reason) throws RemoteException {
super.closeSession_enforcePermission();
- if (!mIsRegistered.get()) throw new IllegalStateException("Endpoint is not registered");
+ if (!isRegistered()) throw new IllegalStateException("Endpoint is not registered");
if (!cleanupSessionResources(sessionId)) {
throw new IllegalArgumentException(
"Unknown session ID in closeSession: id=" + sessionId);
@@ -235,19 +237,26 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
@android.annotation.EnforcePermission(android.Manifest.permission.ACCESS_CONTEXT_HUB)
public void unregister() {
super.unregister_enforcePermission();
- mIsRegistered.set(false);
- try {
- mHubInterface.unregisterEndpoint(mHalEndpointInfo);
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException while calling HAL unregisterEndpoint", e);
- }
synchronized (mOpenSessionLock) {
// Iterate in reverse since cleanupSessionResources will remove the entry
for (int i = mSessionInfoMap.size() - 1; i >= 0; i--) {
int id = mSessionInfoMap.keyAt(i);
+ halCloseEndpointSessionNoThrow(id, Reason.ENDPOINT_GONE);
cleanupSessionResources(id);
}
}
+ synchronized (mRegistrationLock) {
+ if (!isRegistered()) {
+ Log.w(TAG, "Attempting to unregister when already unregistered");
+ return;
+ }
+ mIsRegistered = false;
+ try {
+ mHubInterface.unregisterEndpoint(mHalEndpointInfo);
+ } catch (RemoteException e) {
+ Log.e(TAG, "RemoteException while calling HAL unregisterEndpoint", e);
+ }
+ }
mEndpointManager.unregisterEndpoint(mEndpointInfo.getIdentifier().getEndpoint());
releaseWakeLockOnExit();
}
@@ -335,7 +344,7 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
/** Invoked when the underlying binder of this broker has died at the client process. */
@Override
public void binderDied() {
- if (mIsRegistered.get()) {
+ if (isRegistered()) {
unregister();
}
}
@@ -365,6 +374,22 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
}
}
+ /**
+ * Registers this endpoints with the Context Hub HAL.
+ *
+ * @throws RemoteException if the registrations fails with a RemoteException
+ */
+ /* package */ void register() throws RemoteException {
+ synchronized (mRegistrationLock) {
+ if (isRegistered()) {
+ Log.w(TAG, "Attempting to register when already registered");
+ } else {
+ mHubInterface.registerEndpoint(mHalEndpointInfo);
+ mIsRegistered = true;
+ }
+ }
+ }
+
/* package */ void attachDeathRecipient() throws RemoteException {
if (mContextHubEndpointCallback != null) {
mContextHubEndpointCallback.asBinder().linkToDeath(this, 0 /* flags */);
@@ -425,6 +450,24 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
}
}
+ /* package */ void onHalRestart() {
+ synchronized (mRegistrationLock) {
+ mIsRegistered = false;
+ try {
+ register();
+ } catch (RemoteException e) {
+ Log.e(TAG, "RemoteException while calling HAL registerEndpoint", e);
+ }
+ }
+ synchronized (mOpenSessionLock) {
+ for (int i = mSessionInfoMap.size() - 1; i >= 0; i--) {
+ int id = mSessionInfoMap.keyAt(i);
+ onCloseEndpointSession(id, Reason.HUB_RESET);
+ }
+ }
+ // TODO(b/390029594): Cancel any ongoing reliable communication transactions
+ }
+
private Optional<Byte> onEndpointSessionOpenRequestInternal(
int sessionId, HubEndpointInfo initiator, String serviceDescriptor) {
if (!hasEndpointPermissions(initiator)) {
@@ -465,24 +508,21 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
}
remote = mSessionInfoMap.get(sessionId).getRemoteEndpointInfo();
}
- if (!ContextHubServiceUtil.notePermissions(
- mAppOpsManager,
- mUid,
- mPackageName,
- mAttributionTag,
- remote.getRequiredPermissions(),
- RECEIVE_MSG_NOTE
- + "-0x"
- + Long.toHexString(remote.getIdentifier().getHub())
- + "-0x"
- + Long.toHexString(remote.getIdentifier().getEndpoint()))) {
- Log.e(
- TAG,
- "Dropping message from "
- + remote
- + ". "
- + mPackageName
- + " doesn't have permission");
+
+ try {
+ Binder.withCleanCallingIdentity(
+ () -> {
+ if (!notePermissions(remote)) {
+ throw new RuntimeException(
+ "Dropping message from "
+ + remote
+ + ". "
+ + mPackageName
+ + " doesn't have permission");
+ }
+ });
+ } catch (RuntimeException e) {
+ Log.e(TAG, e.getMessage());
return ErrorCode.PERMISSION_DENIED;
}
@@ -553,7 +593,7 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
private void acquireWakeLock() {
Binder.withCleanCallingIdentity(
() -> {
- if (mIsRegistered.get()) {
+ if (isRegistered()) {
mWakeLock.acquire(WAKELOCK_TIMEOUT_MILLIS);
}
});
@@ -608,4 +648,30 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
}
return true;
}
+
+ private boolean isRegistered() {
+ synchronized (mRegistrationLock) {
+ return mIsRegistered;
+ }
+ }
+
+ /**
+ * Utility to call notePermissions for e.g. when processing a message from a given endpoint for
+ * this broker.
+ *
+ * @param endpoint The endpoint to check permissions for this broker.
+ */
+ private boolean notePermissions(HubEndpointInfo endpoint) {
+ return ContextHubServiceUtil.notePermissions(
+ mAppOpsManager,
+ mUid,
+ mPackageName,
+ mAttributionTag,
+ endpoint.getRequiredPermissions(),
+ RECEIVE_MSG_NOTE
+ + "-0x"
+ + Long.toHexString(endpoint.getIdentifier().getHub())
+ + "-0x"
+ + Long.toHexString(endpoint.getIdentifier().getEndpoint()));
+ }
}
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
index ed98bf98f7b7..06aeb62a28b8 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
@@ -206,12 +206,6 @@ import java.util.function.Consumer;
EndpointInfo halEndpointInfo =
ContextHubServiceUtil.createHalEndpointInfo(
pendingEndpointInfo, endpointId, SERVICE_HUB_ID);
- try {
- mHubInterface.registerEndpoint(halEndpointInfo);
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException while calling HAL registerEndpoint", e);
- throw e;
- }
broker =
new ContextHubEndpointBroker(
mContext,
@@ -222,6 +216,7 @@ import java.util.function.Consumer;
packageName,
attributionTag,
mTransactionManager);
+ broker.register();
mEndpointMap.put(endpointId, broker);
try {
@@ -282,6 +277,14 @@ import java.util.function.Consumer;
mEndpointMap.remove(endpointId);
}
+ /** Invoked by the service when the Context Hub HAL restarts. */
+ /* package */ void onHalRestart() {
+ for (ContextHubEndpointBroker broker : mEndpointMap.values()) {
+ // The broker will close existing sessions and re-register itself
+ broker.onHalRestart();
+ }
+ }
+
@Override
public void onEndpointSessionOpenRequest(
int sessionId,
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java b/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java
index 88764b6601ff..a3d94291e913 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubHalEndpointCallback.java
@@ -21,9 +21,6 @@ import android.hardware.contexthub.HubMessage;
import android.hardware.contexthub.IEndpointCallback;
import android.hardware.contexthub.Message;
import android.hardware.contexthub.MessageDeliveryStatus;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Process;
import android.os.RemoteException;
/** IEndpointCallback implementation. */
@@ -32,11 +29,6 @@ public class ContextHubHalEndpointCallback
private final IEndpointLifecycleCallback mEndpointLifecycleCallback;
private final IEndpointSessionCallback mEndpointSessionCallback;
- // Use this thread in case where the execution requires to be on an async service thread.
- private final HandlerThread mHandlerThread =
- new HandlerThread("Context Hub endpoint callback", Process.THREAD_PRIORITY_BACKGROUND);
- private Handler mHandler;
-
/** Interface for listening for endpoint start and stop events. */
public interface IEndpointLifecycleCallback {
/** Called when a batch of endpoints started. */
@@ -73,9 +65,6 @@ public class ContextHubHalEndpointCallback
IEndpointSessionCallback endpointSessionCallback) {
mEndpointLifecycleCallback = endpointLifecycleCallback;
mEndpointSessionCallback = endpointSessionCallback;
-
- mHandlerThread.start();
- mHandler = new Handler(mHandlerThread.getLooper());
}
@Override
@@ -88,7 +77,7 @@ public class ContextHubHalEndpointCallback
for (int i = 0; i < halEndpointInfos.length; i++) {
endpointInfos[i] = new HubEndpointInfo(halEndpointInfos[i]);
}
- mHandler.post(() -> mEndpointLifecycleCallback.onEndpointStarted(endpointInfos));
+ mEndpointLifecycleCallback.onEndpointStarted(endpointInfos);
}
@Override
@@ -98,7 +87,7 @@ public class ContextHubHalEndpointCallback
for (int i = 0; i < halEndpointIds.length; i++) {
endpointIds[i] = new HubEndpointInfo.HubEndpointIdentifier(halEndpointIds[i]);
}
- mHandler.post(() -> mEndpointLifecycleCallback.onEndpointStopped(endpointIds, reason));
+ mEndpointLifecycleCallback.onEndpointStopped(endpointIds, reason);
}
@Override
@@ -109,37 +98,33 @@ public class ContextHubHalEndpointCallback
new HubEndpointInfo.HubEndpointIdentifier(destination.hubId, destination.id);
HubEndpointInfo.HubEndpointIdentifier initiatorId =
new HubEndpointInfo.HubEndpointIdentifier(initiator.hubId, initiator.id);
- mHandler.post(
- () ->
- mEndpointSessionCallback.onEndpointSessionOpenRequest(
- sessionId, destinationId, initiatorId, serviceDescriptor));
+ mEndpointSessionCallback.onEndpointSessionOpenRequest(
+ sessionId, destinationId, initiatorId, serviceDescriptor);
}
@Override
public void onCloseEndpointSession(int sessionId, byte reason) throws RemoteException {
- mHandler.post(() -> mEndpointSessionCallback.onCloseEndpointSession(sessionId, reason));
+ mEndpointSessionCallback.onCloseEndpointSession(sessionId, reason);
}
@Override
public void onEndpointSessionOpenComplete(int sessionId) throws RemoteException {
- mHandler.post(() -> mEndpointSessionCallback.onEndpointSessionOpenComplete(sessionId));
+ mEndpointSessionCallback.onEndpointSessionOpenComplete(sessionId);
}
@Override
public void onMessageReceived(int sessionId, Message message) throws RemoteException {
HubMessage hubMessage = ContextHubServiceUtil.createHubMessage(message);
- mHandler.post(() -> mEndpointSessionCallback.onMessageReceived(sessionId, hubMessage));
+ mEndpointSessionCallback.onMessageReceived(sessionId, hubMessage);
}
@Override
public void onMessageDeliveryStatusReceived(
int sessionId, MessageDeliveryStatus messageDeliveryStatus) throws RemoteException {
- mHandler.post(
- () ->
- mEndpointSessionCallback.onMessageDeliveryStatusReceived(
- sessionId,
- messageDeliveryStatus.messageSequenceNumber,
- messageDeliveryStatus.errorCode));
+ mEndpointSessionCallback.onMessageDeliveryStatusReceived(
+ sessionId,
+ messageDeliveryStatus.messageSequenceNumber,
+ messageDeliveryStatus.errorCode);
}
@Override
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubService.java b/services/core/java/com/android/server/location/contexthub/ContextHubService.java
index 2b0ca145372b..502a7aeba258 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubService.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubService.java
@@ -259,6 +259,9 @@ public class ContextHubService extends IContextHubService.Stub {
if (mHubInfoRegistry != null) {
mHubInfoRegistry.onHalRestart();
}
+ if (mEndpointManager != null) {
+ mEndpointManager.onHalRestart();
+ }
resetSettings();
if (Flags.reconnectHostEndpointsAfterHalRestart()) {
mClientManager.forEachClientOfHub(mContextHubId,
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 0aaa0fea3740..76c5240ab623 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -3733,8 +3733,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
break;
case KeyEvent.KEYCODE_3:
- if (InputSettings.isAccessibilityBounceKeysFeatureEnabled()
- && keyboardA11yShortcutControl()) {
+ if (keyboardA11yShortcutControl()) {
if (firstDown && event.isMetaPressed()
&& event.isAltPressed()) {
final boolean bounceKeysEnabled =
@@ -3765,8 +3764,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
break;
case KeyEvent.KEYCODE_5:
- if (InputSettings.isAccessibilityStickyKeysFeatureEnabled()
- && keyboardA11yShortcutControl()) {
+ if (keyboardA11yShortcutControl()) {
if (firstDown && event.isMetaPressed() && event.isAltPressed()) {
final boolean stickyKeysEnabled =
InputSettings.isAccessibilityStickyKeysEnabled(
@@ -3780,8 +3778,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
break;
case KeyEvent.KEYCODE_6:
- if (InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()
- && keyboardA11yShortcutControl()) {
+ if (keyboardA11yShortcutControl()) {
if (firstDown && event.isMetaPressed() && event.isAltPressed()) {
final boolean slowKeysEnabled =
InputSettings.isAccessibilitySlowKeysEnabled(mContext);
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index d84016b3816e..cf9c57aa634a 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -113,7 +113,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED;
import static android.view.WindowManager.PROPERTY_ALLOW_UNTRUSTED_ACTIVITY_EMBEDDING_STATE_SHARING;
import static android.view.WindowManager.TRANSIT_CLOSE;
-import static android.view.WindowManager.TRANSIT_FLAG_OPEN_BEHIND;
import static android.view.WindowManager.TRANSIT_OLD_UNSET;
import static android.view.WindowManager.TRANSIT_RELAUNCH;
import static android.view.WindowManager.hasWindowExtensionsEnabled;
@@ -658,8 +657,6 @@ final class ActivityRecord extends WindowToken {
private RemoteAnimationDefinition mRemoteAnimationDefinition;
- AnimatingActivityRegistry mAnimatingActivityRegistry;
-
// Set to the previous Task parent of the ActivityRecord when it is reparented to a new Task
// due to picture-in-picture. This gets cleared whenever this activity or the Task
// it references to gets removed. This should also be cleared when we move out of pip.
@@ -856,12 +853,6 @@ final class ActivityRecord extends WindowToken {
})
@interface SplashScreenBehavior { }
- // Force an app transition to be ran in the case the visibility of the app did not change.
- // We use this for the case of moving a Root Task to the back with multiple activities, and the
- // top activity enters PIP; the bottom activity's visibility stays the same, but we need to
- // run the transition.
- boolean mRequestForceTransition;
-
boolean mEnteringAnimation;
boolean mOverrideTaskTransition;
boolean mDismissKeyguardIfInsecure;
@@ -1586,9 +1577,6 @@ final class ActivityRecord extends WindowToken {
}
}
final Task rootTask = getRootTask();
-
- updateAnimatingActivityRegistry();
-
if (task == mLastParentBeforePip && task != null) {
// Notify the TaskFragmentOrganizer that the activity is reparented back from pip.
mAtmService.mWindowOrganizerController.mTaskFragmentOrganizerController
@@ -1690,20 +1678,6 @@ final class ActivityRecord extends WindowToken {
return !organizedTaskFragment.isAllowedToEmbedActivityInTrustedMode(this);
}
- void updateAnimatingActivityRegistry() {
- final Task rootTask = getRootTask();
- final AnimatingActivityRegistry registry = rootTask != null
- ? rootTask.getAnimatingActivityRegistry()
- : null;
-
- // If we reparent, make sure to remove ourselves from the old animation registry.
- if (mAnimatingActivityRegistry != null && mAnimatingActivityRegistry != registry) {
- mAnimatingActivityRegistry.notifyFinished(this);
- }
-
- mAnimatingActivityRegistry = registry;
- }
-
boolean canAutoEnterPip() {
// beforeStopping=false since the actual pip-ing will take place after startPausing()
final boolean activityCanPip = checkEnterPictureInPictureState(
@@ -1788,7 +1762,6 @@ final class ActivityRecord extends WindowToken {
if (prevDc.mOpeningApps.remove(this)) {
// Transfer opening transition to new display.
mDisplayContent.mOpeningApps.add(this);
- mDisplayContent.transferAppTransitionFrom(prevDc);
mDisplayContent.executeAppTransition();
}
@@ -4631,12 +4604,6 @@ final class ActivityRecord extends WindowToken {
}
}
- // In this case, the starting icon has already been displayed, so start
- // letting windows get shown immediately without any more transitions.
- if (fromActivity.mVisible) {
- mDisplayContent.mSkipAppTransitionAnimation = true;
- }
-
ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "Moving existing starting %s"
+ " from %s to %s", tStartingWindow, fromActivity, this);
@@ -5667,76 +5634,17 @@ final class ActivityRecord extends WindowToken {
mTransitionController.mValidateCommitVis.add(this);
return;
}
- // If we are preparing an app transition, then delay changing
- // the visibility of this token until we execute that transition.
- if (deferCommitVisibilityChange(visible)) {
- return;
- }
commitVisibility(visible, true /* performLayout */);
updateReportedVisibilityLocked();
}
- /**
- * Returns {@code true} if this activity is either added to opening-apps or closing-apps.
- * Then its visibility will be committed until the transition is ready.
- */
- private boolean deferCommitVisibilityChange(boolean visible) {
- if (mTransitionController.isShellTransitionsEnabled()) {
- // Shell transition doesn't use opening/closing sets.
- return false;
- }
- if (!mDisplayContent.mAppTransition.isTransitionSet()) {
- return false;
- }
- if (mWaitForEnteringPinnedMode && mVisible == visible) {
- // If the visibility is not changed during enter PIP, we don't want to include it in
- // app transition to affect the animation theme, because the Pip organizer will
- // animate the entering PIP instead.
- return false;
- }
-
- // The animation will be visible soon so do not skip by screen off.
- final boolean ignoreScreenOn = canTurnScreenOn() || mTaskSupervisor.getKeyguardController()
- .isKeyguardGoingAway(mDisplayContent.mDisplayId);
- // Ignore display frozen so the opening / closing transition type can be updated correctly
- // even if the display is frozen. And it's safe since in applyAnimation will still check
- // DC#okToAnimate again if the transition animation is fine to apply.
- if (!okToAnimate(true /* ignoreFrozen */, ignoreScreenOn)) {
- return false;
- }
- if (visible) {
- mDisplayContent.mOpeningApps.add(this);
- mEnteringAnimation = true;
- } else if (mVisible) {
- mDisplayContent.mClosingApps.add(this);
- mEnteringAnimation = false;
- }
- if ((mDisplayContent.mAppTransition.getTransitFlags() & TRANSIT_FLAG_OPEN_BEHIND) != 0) {
- // Add the launching-behind activity to mOpeningApps.
- final WindowState win = mDisplayContent.findFocusedWindow();
- if (win != null) {
- final ActivityRecord focusedActivity = win.mActivityRecord;
- if (focusedActivity != null) {
- ProtoLog.d(WM_DEBUG_APP_TRANSITIONS,
- "TRANSIT_FLAG_OPEN_BEHIND, adding %s to mOpeningApps",
- focusedActivity);
- // Force animation to be loaded.
- mDisplayContent.mOpeningApps.add(focusedActivity);
- }
- }
- }
- return true;
- }
-
@Override
boolean applyAnimation(LayoutParams lp, @TransitionOldType int transit, boolean enter,
boolean isVoiceInteraction, @Nullable ArrayList<WindowContainer> sources) {
if ((mTransitionChangeFlags & FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT) != 0) {
return false;
}
- // If it was set to true, reset the last request to force the transition.
- mRequestForceTransition = false;
return super.applyAnimation(lp, transit, enter, isVoiceInteraction, sources);
}
@@ -5899,27 +5807,6 @@ final class ActivityRecord extends WindowToken {
}
/**
- * Check if visibility of this {@link ActivityRecord} should be updated as part of an app
- * transition.
- *
- * <p class="note><strong>Note:</strong> If the visibility of this {@link ActivityRecord} is
- * already set to {@link #mVisible}, we don't need to update the visibility. So {@code false} is
- * returned.</p>
- *
- * @param visible {@code true} if this {@link ActivityRecord} should become visible,
- * {@code false} if this should become invisible.
- * @return {@code true} if visibility of this {@link ActivityRecord} should be updated, and
- * an app transition animation should be run.
- */
- boolean shouldApplyAnimation(boolean visible) {
- // Allow for state update and animation to be applied if:
- // * activity is transitioning visibility state
- // * or the activity was marked as hidden and is exiting before we had a chance to play the
- // transition animation
- return isVisible() != visible || mRequestForceTransition || (!isVisible() && mIsExiting);
- }
-
- /**
* See {@link Activity#setRecentsScreenshotEnabled}.
*/
void setRecentsScreenshotEnabled(boolean enabled) {
@@ -7629,13 +7516,6 @@ final class ActivityRecord extends WindowToken {
}
@Override
- public boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
- return mAnimatingActivityRegistry != null
- && mAnimatingActivityRegistry.notifyAboutToFinish(
- this, endDeferFinishCallback);
- }
-
- @Override
boolean isWaitingForTransitionStart() {
final DisplayContent dc = getDisplayContent();
return dc != null && dc.mAppTransition.isTransitionSet()
@@ -7656,10 +7536,6 @@ final class ActivityRecord extends WindowToken {
@Override
public void onLeashAnimationStarting(Transaction t, SurfaceControl leash) {
- if (mAnimatingActivityRegistry != null) {
- mAnimatingActivityRegistry.notifyStarting(this);
- }
-
if (mNeedsLetterboxedAnimation) {
updateLetterboxSurfaceIfNeeded(findMainWindow(), t);
mNeedsAnimationBoundsLayer = true;
@@ -7670,17 +7546,7 @@ final class ActivityRecord extends WindowToken {
// new layer.
if (mNeedsAnimationBoundsLayer) {
mTmpRect.setEmpty();
- if (getDisplayContent().mAppTransitionController.isTransitWithinTask(
- getTransit(), task)) {
- task.getBounds(mTmpRect);
- } else {
- final Task rootTask = getRootTask();
- if (rootTask == null) {
- return;
- }
- // Set clip rect to root task bounds.
- rootTask.getBounds(mTmpRect);
- }
+ task.getBounds(mTmpRect);
mAnimationBoundsLayer = createAnimationBoundsLayer(t);
// Crop to root task bounds.
@@ -7836,10 +7702,6 @@ final class ActivityRecord extends WindowToken {
mNeedsLetterboxedAnimation = false;
updateLetterboxSurfaceIfNeeded(findMainWindow(), t);
}
-
- if (mAnimatingActivityRegistry != null) {
- mAnimatingActivityRegistry.notifyFinished(this);
- }
}
@Override
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 254127dee7a8..819e117e6d05 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -4128,22 +4128,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
@Override
public void registerRemoteAnimationsForDisplay(int displayId,
RemoteAnimationDefinition definition) {
- mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
- "registerRemoteAnimations");
- definition.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid());
- synchronized (mGlobalLock) {
- final DisplayContent display = mRootWindowContainer.getDisplayContent(displayId);
- if (display == null) {
- Slog.e(TAG, "Couldn't find display with id: " + displayId);
- return;
- }
- final long origId = Binder.clearCallingIdentity();
- try {
- display.registerRemoteAnimations(definition);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
+ // TODO(b/365884835): Remove callers.
}
/** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */
diff --git a/services/core/java/com/android/server/wm/AnimatingActivityRegistry.java b/services/core/java/com/android/server/wm/AnimatingActivityRegistry.java
deleted file mode 100644
index 18ec96c38264..000000000000
--- a/services/core/java/com/android/server/wm/AnimatingActivityRegistry.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.wm;
-
-import android.util.ArrayMap;
-import android.util.ArraySet;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-
-/**
- * Keeps track of all {@link ActivityRecord} that are animating and makes sure all animations are
- * finished at the same time such that we don't run into issues with z-ordering: An activity A
- * that has a shorter animation that is above another activity B with a longer animation in the same
- * task, the animation layer would put the B on top of A, but from the hierarchy, A needs to be on
- * top of B. Thus, we defer reparenting A to the original hierarchy such that it stays on top of B
- * until B finishes animating.
- */
-class AnimatingActivityRegistry {
-
- private ArraySet<ActivityRecord> mAnimatingActivities = new ArraySet<>();
- private ArrayMap<ActivityRecord, Runnable> mFinishedTokens = new ArrayMap<>();
-
- private ArrayList<Runnable> mTmpRunnableList = new ArrayList<>();
-
- private boolean mEndingDeferredFinish;
-
- /**
- * Notifies that an {@link ActivityRecord} has started animating.
- */
- void notifyStarting(ActivityRecord token) {
- mAnimatingActivities.add(token);
- }
-
- /**
- * Notifies that an {@link ActivityRecord} has finished animating.
- */
- void notifyFinished(ActivityRecord activity) {
- mAnimatingActivities.remove(activity);
- mFinishedTokens.remove(activity);
-
- // If we were the last activity, make sure the end all deferred finishes.
- if (mAnimatingActivities.isEmpty()) {
- endDeferringFinished();
- }
- }
-
- /**
- * Called when an {@link ActivityRecord} is about to finish animating.
- *
- * @param endDeferFinishCallback Callback to run when defer finish should be ended.
- * @return {@code true} if finishing the animation should be deferred, {@code false} otherwise.
- */
- boolean notifyAboutToFinish(ActivityRecord activity, Runnable endDeferFinishCallback) {
- final boolean removed = mAnimatingActivities.remove(activity);
- if (!removed) {
- return false;
- }
-
- if (mAnimatingActivities.isEmpty()) {
-
- // If no animations are animating anymore, finish all others.
- endDeferringFinished();
- return false;
- } else {
-
- // Otherwise let's put it into the pending list of to be finished animations.
- mFinishedTokens.put(activity, endDeferFinishCallback);
- return true;
- }
- }
-
- private void endDeferringFinished() {
-
- // Don't start recursing. Running the finished listener invokes notifyFinished, which may
- // invoked us again.
- if (mEndingDeferredFinish) {
- return;
- }
- try {
- mEndingDeferredFinish = true;
-
- // Copy it into a separate temp list to avoid modifying the collection while iterating
- // as calling the callback may call back into notifyFinished.
- for (int i = mFinishedTokens.size() - 1; i >= 0; i--) {
- mTmpRunnableList.add(mFinishedTokens.valueAt(i));
- }
- mFinishedTokens.clear();
- for (int i = mTmpRunnableList.size() - 1; i >= 0; i--) {
- mTmpRunnableList.get(i).run();
- }
- mTmpRunnableList.clear();
- } finally {
- mEndingDeferredFinish = false;
- }
- }
-
- void dump(PrintWriter pw, String header, String prefix) {
- if (!mAnimatingActivities.isEmpty() || !mFinishedTokens.isEmpty()) {
- pw.print(prefix); pw.println(header);
- prefix = prefix + " ";
- pw.print(prefix); pw.print("mAnimatingActivities="); pw.println(mAnimatingActivities);
- pw.print(prefix); pw.print("mFinishedTokens="); pw.println(mFinishedTokens);
- }
- }
-}
diff --git a/services/core/java/com/android/server/wm/AnimationAdapter.java b/services/core/java/com/android/server/wm/AnimationAdapter.java
index 3dc377dbc14c..4458ed76dcba 100644
--- a/services/core/java/com/android/server/wm/AnimationAdapter.java
+++ b/services/core/java/com/android/server/wm/AnimationAdapter.java
@@ -109,15 +109,6 @@ public interface AnimationAdapter {
* Gets called when the animation is about to finish and gives the client the opportunity to
* defer finishing the animation, i.e. it keeps the leash around until the client calls
* endDeferFinishCallback.
- * <p>
- * This has the same effect as
- * {@link com.android.server.wm.SurfaceAnimator.Animatable#shouldDeferAnimationFinish(Runnable)}
- * . The later will be evaluated first and has precedence over this method if it returns true,
- * which means that if the {@link com.android.server.wm.SurfaceAnimator.Animatable} requests to
- * defer its finish, this method won't be called so this adapter will never have access to the
- * finish callback. On the other hand, if the
- * {@link com.android.server.wm.SurfaceAnimator.Animatable}, doesn't request to defer, this
- * {@link AnimationAdapter} is responsible for ending the animation.
*
* @param endDeferFinishCallback The callback to call when defer finishing should be ended.
* @return Whether the client would like to defer the animation finish.
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 932f26857105..9c4b722feb47 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -1462,7 +1462,7 @@ public class AppTransition implements Dump {
}
boolean prepareAppTransition(@TransitionType int transit, @TransitionFlags int flags) {
- if (mDisplayContent.mTransitionController.isShellTransitionsEnabled()) {
+ if (WindowManagerService.sEnableShellTransitions) {
return false;
}
mNextAppTransitionRequests.add(transit);
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
deleted file mode 100644
index d5fe056a2ba4..000000000000
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ /dev/null
@@ -1,1352 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.wm;
-
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
-import static android.view.WindowManager.TRANSIT_CHANGE;
-import static android.view.WindowManager.TRANSIT_CLOSE;
-import static android.view.WindowManager.TRANSIT_FLAG_APP_CRASHED;
-import static android.view.WindowManager.TRANSIT_FLAG_OPEN_BEHIND;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
-import static android.view.WindowManager.TRANSIT_NONE;
-import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_RELAUNCH;
-import static android.view.WindowManager.TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_DREAM_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_DREAM_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_OCCLUDE;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_OCCLUDE_BY_DREAM;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_UNOCCLUDE;
-import static android.view.WindowManager.TRANSIT_OLD_NONE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CHANGE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN_BEHIND;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_TO_BACK;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_TO_FRONT;
-import static android.view.WindowManager.TRANSIT_OLD_TRANSLUCENT_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TRANSLUCENT_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_INTRA_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_INTRA_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_WALLPAPER_OPEN;
-import static android.view.WindowManager.TRANSIT_OPEN;
-import static android.view.WindowManager.TRANSIT_RELAUNCH;
-import static android.view.WindowManager.TRANSIT_TO_BACK;
-import static android.view.WindowManager.TRANSIT_TO_FRONT;
-
-import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS;
-import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_APP_TRANSITIONS_ANIM;
-import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
-import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
-import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SNAPSHOT;
-import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_SPLASH_SCREEN;
-import static com.android.server.wm.ActivityTaskManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
-import static com.android.server.wm.AppTransition.isNormalTransit;
-import static com.android.server.wm.NonAppWindowAnimationAdapter.shouldAttachNavBarToApp;
-import static com.android.server.wm.NonAppWindowAnimationAdapter.shouldStartNonAppWindowAnimationsForKeyguardExit;
-import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
-import static com.android.server.wm.WallpaperAnimationAdapter.shouldStartWallpaperAnimation;
-import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-
-import android.annotation.IntDef;
-import android.annotation.Nullable;
-import android.graphics.Rect;
-import android.os.Trace;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.Pair;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationDefinition;
-import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
-import android.view.WindowManager.TransitionFlags;
-import android.view.WindowManager.TransitionOldType;
-import android.view.WindowManager.TransitionType;
-import android.window.ITaskFragmentOrganizer;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.protolog.ProtoLog;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.function.Consumer;
-import java.util.function.Predicate;
-
-/**
- * Checks for app transition readiness, resolves animation attributes and performs visibility
- * change for apps that animate as part of an app transition.
- */
-public class AppTransitionController {
- private static final String TAG = TAG_WITH_CLASS_NAME ? "AppTransitionController" : TAG_WM;
- private final WindowManagerService mService;
- private final DisplayContent mDisplayContent;
- private final WallpaperController mWallpaperControllerLocked;
- private RemoteAnimationDefinition mRemoteAnimationDefinition = null;
-
- private static final int TYPE_NONE = 0;
- private static final int TYPE_ACTIVITY = 1;
- private static final int TYPE_TASK_FRAGMENT = 2;
- private static final int TYPE_TASK = 3;
-
- @IntDef(prefix = { "TYPE_" }, value = {
- TYPE_NONE,
- TYPE_ACTIVITY,
- TYPE_TASK_FRAGMENT,
- TYPE_TASK
- })
- @Retention(RetentionPolicy.SOURCE)
- @interface TransitContainerType {}
-
- private final ArrayMap<WindowContainer, Integer> mTempTransitionReasons = new ArrayMap<>();
- private final ArrayList<WindowContainer> mTempTransitionWindows = new ArrayList<>();
-
- AppTransitionController(WindowManagerService service, DisplayContent displayContent) {
- mService = service;
- mDisplayContent = displayContent;
- mWallpaperControllerLocked = mDisplayContent.mWallpaperController;
- }
-
- void registerRemoteAnimations(RemoteAnimationDefinition definition) {
- mRemoteAnimationDefinition = definition;
- }
-
- /**
- * Returns the currently visible window that is associated with the wallpaper in case we are
- * transitioning from an activity with a wallpaper to one without.
- */
- @Nullable
- private WindowState getOldWallpaper() {
- final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
- final @TransitionType int firstTransit =
- mDisplayContent.mAppTransition.getFirstAppTransition();
-
- final ArraySet<WindowContainer> openingWcs = getAnimationTargets(
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps, true /* visible */);
- final boolean showWallpaper = wallpaperTarget != null
- && (wallpaperTarget.hasWallpaper()
- // Update task open transition to wallpaper transition when wallpaper is visible.
- // (i.e.launching app info activity from recent tasks)
- || ((firstTransit == TRANSIT_OPEN || firstTransit == TRANSIT_TO_FRONT)
- && (!openingWcs.isEmpty() && openingWcs.valueAt(0).asTask() != null)
- && mWallpaperControllerLocked.isWallpaperVisible()));
- // If wallpaper is animating or wallpaperTarget doesn't have SHOW_WALLPAPER flag set,
- // don't consider upgrading to wallpaper transition.
- return (mWallpaperControllerLocked.isWallpaperTargetAnimating() || !showWallpaper)
- ? null : wallpaperTarget;
- }
-
- /**
- * Handle application transition for given display.
- */
- void handleAppTransitionReady() {
- mTempTransitionReasons.clear();
- if (!transitionGoodToGo(mDisplayContent.mOpeningApps, mTempTransitionReasons)
- || !transitionGoodToGo(mDisplayContent.mChangingContainers, mTempTransitionReasons)
- || !transitionGoodToGoForTaskFragments()) {
- return;
- }
-
- Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "AppTransitionReady");
-
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "**** GOOD TO GO");
- // TODO(b/205335975): Remove window which stuck in animatingExit status. Find actual cause.
- mDisplayContent.forAllWindows(WindowState::cleanupAnimatingExitWindow,
- true /* traverseTopToBottom */);
- // TODO(new-app-transition): Remove code using appTransition.getAppTransition()
- final AppTransition appTransition = mDisplayContent.mAppTransition;
-
- mDisplayContent.mNoAnimationNotifyOnTransitionFinished.clear();
-
- appTransition.removeAppTransitionTimeoutCallbacks();
-
- mDisplayContent.mWallpaperMayChange = false;
-
- int appCount = mDisplayContent.mOpeningApps.size();
- for (int i = 0; i < appCount; ++i) {
- // Clearing the mAnimatingExit flag before entering animation. It's set to true if app
- // window is removed, or window relayout to invisible. This also affects window
- // visibility. We need to clear it *before* maybeUpdateTransitToWallpaper() as the
- // transition selection depends on wallpaper target visibility.
- mDisplayContent.mOpeningApps.valueAtUnchecked(i).clearAnimatingFlags();
- }
- appCount = mDisplayContent.mChangingContainers.size();
- for (int i = 0; i < appCount; ++i) {
- // Clearing for same reason as above.
- final ActivityRecord activity = getAppFromContainer(
- mDisplayContent.mChangingContainers.valueAtUnchecked(i));
- if (activity != null) {
- activity.clearAnimatingFlags();
- }
- }
-
- // Adjust wallpaper before we pull the lower/upper target, since pending changes
- // (like the clearAnimatingFlags() above) might affect wallpaper target result.
- // Or, the opening app window should be a wallpaper target.
- mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(
- mDisplayContent.mOpeningApps);
-
- ArraySet<ActivityRecord> tmpOpenApps = mDisplayContent.mOpeningApps;
- ArraySet<ActivityRecord> tmpCloseApps = mDisplayContent.mClosingApps;
- if (mDisplayContent.mAtmService.mBackNavigationController.isMonitoringFinishTransition()) {
- tmpOpenApps = new ArraySet<>(mDisplayContent.mOpeningApps);
- tmpCloseApps = new ArraySet<>(mDisplayContent.mClosingApps);
- }
-
- @TransitionOldType final int transit = getTransitCompatType(
- mDisplayContent.mAppTransition, tmpOpenApps,
- tmpCloseApps, mDisplayContent.mChangingContainers,
- mWallpaperControllerLocked.getWallpaperTarget(), getOldWallpaper(),
- mDisplayContent.mSkipAppTransitionAnimation);
- mDisplayContent.mSkipAppTransitionAnimation = false;
-
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
- "handleAppTransitionReady: displayId=%d appTransition={%s}"
- + " openingApps=[%s] closingApps=[%s] transit=%s",
- mDisplayContent.mDisplayId, appTransition.toString(), tmpOpenApps,
- tmpCloseApps, AppTransition.appTransitionOldToString(transit));
-
- // Find the layout params of the top-most application window in the tokens, which is
- // what will control the animation theme. If all closing windows are obscured, then there is
- // no need to do an animation. This is the case, for example, when this transition is being
- // done behind a dream window.
- final ArraySet<Integer> activityTypes = collectActivityTypes(tmpOpenApps,
- tmpCloseApps, mDisplayContent.mChangingContainers);
- final ActivityRecord animLpActivity = findAnimLayoutParamsToken(transit, activityTypes,
- tmpOpenApps, tmpCloseApps, mDisplayContent.mChangingContainers);
- final ActivityRecord topOpeningApp =
- getTopApp(tmpOpenApps, false /* ignoreHidden */);
- final ActivityRecord topClosingApp =
- getTopApp(tmpCloseApps, false /* ignoreHidden */);
- final ActivityRecord topChangingApp =
- getTopApp(mDisplayContent.mChangingContainers, false /* ignoreHidden */);
- final WindowManager.LayoutParams animLp = getAnimLp(animLpActivity);
-
- // Check if there is any override
- if (!overrideWithTaskFragmentRemoteAnimation(transit, activityTypes)) {
- // Unfreeze the windows that were previously frozen for TaskFragment animation.
- overrideWithRemoteAnimationIfSet(animLpActivity, transit, activityTypes);
- }
-
- final boolean voiceInteraction = containsVoiceInteraction(mDisplayContent.mClosingApps)
- || containsVoiceInteraction(mDisplayContent.mOpeningApps);
-
- final int layoutRedo;
- mService.mSurfaceAnimationRunner.deferStartingAnimations();
- try {
- applyAnimations(tmpOpenApps, tmpCloseApps, transit, animLp, voiceInteraction);
- handleClosingApps();
- handleOpeningApps();
- handleChangingApps(transit);
- handleClosingChangingContainers();
-
- appTransition.setLastAppTransition(transit, topOpeningApp,
- topClosingApp, topChangingApp);
-
- final int flags = appTransition.getTransitFlags();
- layoutRedo = appTransition.goodToGo(transit, topOpeningApp);
- appTransition.postAnimationCallback();
- } finally {
- appTransition.clear();
- mService.mSurfaceAnimationRunner.continueStartingAnimations();
- }
-
- mService.mSnapshotController.onTransitionStarting(mDisplayContent);
-
- mDisplayContent.mOpeningApps.clear();
- mDisplayContent.mClosingApps.clear();
- mDisplayContent.mChangingContainers.clear();
- mDisplayContent.mUnknownAppVisibilityController.clear();
- mDisplayContent.mClosingChangingContainers.clear();
-
- // This has changed the visibility of windows, so perform
- // a new layout to get them all up-to-date.
- mDisplayContent.setLayoutNeeded();
-
- mDisplayContent.computeImeTarget(true /* updateImeTarget */);
-
- mService.mAtmService.mTaskSupervisor.getActivityMetricsLogger().notifyTransitionStarting(
- mTempTransitionReasons);
-
- Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
-
- mDisplayContent.pendingLayoutChanges |=
- layoutRedo | FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG;
- }
-
- /**
- * Get old transit type based on the current transit requests.
- *
- * @param appTransition {@link AppTransition} for managing app transition state.
- * @param openingApps {@link ActivityRecord}s which are becoming visible.
- * @param closingApps {@link ActivityRecord}s which are becoming invisible.
- * @param changingContainers {@link WindowContainer}s which are changed in configuration.
- * @param wallpaperTarget If non-null, this is the currently visible window that is associated
- * with the wallpaper.
- * @param oldWallpaper The currently visible window that is associated with the wallpaper in
- * case we are transitioning from an activity with a wallpaper to one
- * without. Otherwise null.
- */
- @TransitionOldType static int getTransitCompatType(AppTransition appTransition,
- ArraySet<ActivityRecord> openingApps, ArraySet<ActivityRecord> closingApps,
- ArraySet<WindowContainer> changingContainers, @Nullable WindowState wallpaperTarget,
- @Nullable WindowState oldWallpaper, boolean skipAppTransitionAnimation) {
-
- final ActivityRecord topOpeningApp = getTopApp(openingApps, false /* ignoreHidden */);
- final ActivityRecord topClosingApp = getTopApp(closingApps, true /* ignoreHidden */);
-
- // Determine if closing and opening app token sets are wallpaper targets, in which case
- // special animations are needed.
- final boolean openingAppHasWallpaper = canBeWallpaperTarget(openingApps)
- && wallpaperTarget != null;
- final boolean closingAppHasWallpaper = canBeWallpaperTarget(closingApps)
- && wallpaperTarget != null;
-
- // Keyguard transit has high priority.
- switch (appTransition.getKeyguardTransition()) {
- case TRANSIT_KEYGUARD_GOING_AWAY:
- return openingAppHasWallpaper ? TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER
- : TRANSIT_OLD_KEYGUARD_GOING_AWAY;
- case TRANSIT_KEYGUARD_OCCLUDE:
- // When there is a closing app, the keyguard has already been occluded by an
- // activity, and another activity has started on top of that activity, so normal
- // app transition animation should be used.
- if (!closingApps.isEmpty()) {
- return TRANSIT_OLD_ACTIVITY_OPEN;
- }
- if (!openingApps.isEmpty() && openingApps.valueAt(0).getActivityType()
- == ACTIVITY_TYPE_DREAM) {
- return TRANSIT_OLD_KEYGUARD_OCCLUDE_BY_DREAM;
- }
- return TRANSIT_OLD_KEYGUARD_OCCLUDE;
- case TRANSIT_KEYGUARD_UNOCCLUDE:
- return TRANSIT_OLD_KEYGUARD_UNOCCLUDE;
- }
-
- // Determine whether the top opening and closing activity is a dream activity. If so, this
- // has higher priority than others except keyguard transit.
- if (topOpeningApp != null && topOpeningApp.getActivityType() == ACTIVITY_TYPE_DREAM) {
- return TRANSIT_OLD_DREAM_ACTIVITY_OPEN;
- } else if (topClosingApp != null
- && topClosingApp.getActivityType() == ACTIVITY_TYPE_DREAM) {
- return TRANSIT_OLD_DREAM_ACTIVITY_CLOSE;
- }
-
- // This is not keyguard transition and one of the app has request to skip app transition.
- if (skipAppTransitionAnimation) {
- return WindowManager.TRANSIT_OLD_UNSET;
- }
- @TransitionFlags final int flags = appTransition.getTransitFlags();
- @TransitionType final int firstTransit = appTransition.getFirstAppTransition();
-
- // Special transitions
- // TODO(new-app-transitions): Revisit if those can be rewritten by using flags.
- if (appTransition.containsTransitRequest(TRANSIT_CHANGE) && !changingContainers.isEmpty()) {
- @TransitContainerType int changingType =
- getTransitContainerType(changingContainers.valueAt(0));
- switch (changingType) {
- case TYPE_TASK:
- return TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE;
- case TYPE_TASK_FRAGMENT:
- return TRANSIT_OLD_TASK_FRAGMENT_CHANGE;
- default:
- throw new IllegalStateException(
- "TRANSIT_CHANGE with unrecognized changing type=" + changingType);
- }
- }
- if ((flags & TRANSIT_FLAG_APP_CRASHED) != 0) {
- return TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE;
- }
- if (firstTransit == TRANSIT_NONE) {
- return TRANSIT_OLD_NONE;
- }
-
- /*
- * There are cases where we open/close a new task/activity, but in reality only a
- * translucent activity on top of existing activities is opening/closing. For that one, we
- * have a different animation because non of the task/activity animations actually work well
- * with translucent apps.
- */
- if (isNormalTransit(firstTransit)) {
- boolean allOpeningVisible = true;
- boolean allTranslucentOpeningApps = !openingApps.isEmpty();
- for (int i = openingApps.size() - 1; i >= 0; i--) {
- final ActivityRecord activity = openingApps.valueAt(i);
- if (!activity.isVisible()) {
- allOpeningVisible = false;
- if (activity.fillsParent()) {
- allTranslucentOpeningApps = false;
- }
- }
- }
- boolean allTranslucentClosingApps = !closingApps.isEmpty();
- for (int i = closingApps.size() - 1; i >= 0; i--) {
- if (closingApps.valueAt(i).fillsParent()) {
- allTranslucentClosingApps = false;
- break;
- }
- }
-
- if (allTranslucentClosingApps && allOpeningVisible) {
- return TRANSIT_OLD_TRANSLUCENT_ACTIVITY_CLOSE;
- }
- if (allTranslucentOpeningApps && closingApps.isEmpty()) {
- return TRANSIT_OLD_TRANSLUCENT_ACTIVITY_OPEN;
- }
- }
-
- if (closingAppHasWallpaper && openingAppHasWallpaper) {
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Wallpaper animation!");
- switch (firstTransit) {
- case TRANSIT_OPEN:
- case TRANSIT_TO_FRONT:
- return TRANSIT_OLD_WALLPAPER_INTRA_OPEN;
- case TRANSIT_CLOSE:
- case TRANSIT_TO_BACK:
- return TRANSIT_OLD_WALLPAPER_INTRA_CLOSE;
- }
- } else if (oldWallpaper != null && !openingApps.isEmpty()
- && !openingApps.contains(oldWallpaper.mActivityRecord)
- && closingApps.contains(oldWallpaper.mActivityRecord)
- && topClosingApp == oldWallpaper.mActivityRecord) {
- // We are transitioning from an activity with a wallpaper to one without.
- return TRANSIT_OLD_WALLPAPER_CLOSE;
- } else if (wallpaperTarget != null && wallpaperTarget.isVisible()
- && openingApps.contains(wallpaperTarget.mActivityRecord)
- && topOpeningApp == wallpaperTarget.mActivityRecord
- /* && transit != TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE */) {
- // We are transitioning from an activity without
- // a wallpaper to now showing the wallpaper
- return TRANSIT_OLD_WALLPAPER_OPEN;
- }
-
- final ArraySet<WindowContainer> openingWcs = getAnimationTargets(
- openingApps, closingApps, true /* visible */);
- final ArraySet<WindowContainer> closingWcs = getAnimationTargets(
- openingApps, closingApps, false /* visible */);
- final WindowContainer<?> openingContainer = !openingWcs.isEmpty()
- ? openingWcs.valueAt(0) : null;
- final WindowContainer<?> closingContainer = !closingWcs.isEmpty()
- ? closingWcs.valueAt(0) : null;
- @TransitContainerType int openingType = getTransitContainerType(openingContainer);
- @TransitContainerType int closingType = getTransitContainerType(closingContainer);
- if (appTransition.containsTransitRequest(TRANSIT_TO_FRONT) && openingType == TYPE_TASK) {
- if (topOpeningApp != null && topOpeningApp.isActivityTypeHome()) {
- // If we are opening the home task, we want to play an animation as if
- // the task on top is being brought to back.
- return TRANSIT_OLD_TASK_TO_BACK;
- }
- return TRANSIT_OLD_TASK_TO_FRONT;
- }
- if (appTransition.containsTransitRequest(TRANSIT_TO_BACK) && closingType == TYPE_TASK) {
- return TRANSIT_OLD_TASK_TO_BACK;
- }
- if (appTransition.containsTransitRequest(TRANSIT_OPEN)) {
- if (openingType == TYPE_TASK) {
- return (appTransition.getTransitFlags() & TRANSIT_FLAG_OPEN_BEHIND) != 0
- ? TRANSIT_OLD_TASK_OPEN_BEHIND : TRANSIT_OLD_TASK_OPEN;
- }
- if (openingType == TYPE_ACTIVITY) {
- return TRANSIT_OLD_ACTIVITY_OPEN;
- }
- if (openingType == TYPE_TASK_FRAGMENT) {
- return TRANSIT_OLD_TASK_FRAGMENT_OPEN;
- }
- }
- if (appTransition.containsTransitRequest(TRANSIT_CLOSE)) {
- if (closingType == TYPE_TASK) {
- return TRANSIT_OLD_TASK_CLOSE;
- }
- if (closingType == TYPE_TASK_FRAGMENT) {
- return TRANSIT_OLD_TASK_FRAGMENT_CLOSE;
- }
- if (closingType == TYPE_ACTIVITY) {
- for (int i = closingApps.size() - 1; i >= 0; i--) {
- if (closingApps.valueAt(i).visibleIgnoringKeyguard) {
- return TRANSIT_OLD_ACTIVITY_CLOSE;
- }
- }
- // Skip close activity transition since no closing app can be visible
- return WindowManager.TRANSIT_OLD_UNSET;
- }
- }
- if (appTransition.containsTransitRequest(TRANSIT_RELAUNCH)
- && !openingWcs.isEmpty() && !openingApps.isEmpty()) {
- return TRANSIT_OLD_ACTIVITY_RELAUNCH;
- }
- return TRANSIT_OLD_NONE;
- }
-
- @TransitContainerType
- private static int getTransitContainerType(@Nullable WindowContainer<?> container) {
- if (container == null) {
- return TYPE_NONE;
- }
- if (container.asTask() != null) {
- return TYPE_TASK;
- }
- if (container.asTaskFragment() != null) {
- return TYPE_TASK_FRAGMENT;
- }
- if (container.asActivityRecord() != null) {
- return TYPE_ACTIVITY;
- }
- return TYPE_NONE;
- }
-
- @Nullable
- private static WindowManager.LayoutParams getAnimLp(ActivityRecord activity) {
- final WindowState mainWindow = activity != null ? activity.findMainWindow() : null;
- return mainWindow != null ? mainWindow.mAttrs : null;
- }
-
- RemoteAnimationAdapter getRemoteAnimationOverride(@Nullable WindowContainer container,
- @TransitionOldType int transit, ArraySet<Integer> activityTypes) {
- if (container != null) {
- final RemoteAnimationDefinition definition = container.getRemoteAnimationDefinition();
- if (definition != null) {
- final RemoteAnimationAdapter adapter = definition.getAdapter(transit,
- activityTypes);
- if (adapter != null) {
- return adapter;
- }
- }
- }
- return mRemoteAnimationDefinition != null
- ? mRemoteAnimationDefinition.getAdapter(transit, activityTypes)
- : null;
- }
-
- private boolean transitionMayContainNonAppWindows(@TransitionOldType int transit) {
- // We don't want to have the client to animate any non-app windows.
- // Having {@code transit} of those types doesn't mean it will contain non-app windows, but
- // non-app windows will only be included with those transition types. And we don't currently
- // have any use case of those for TaskFragment transition.
- return shouldStartNonAppWindowAnimationsForKeyguardExit(transit)
- || shouldAttachNavBarToApp(mService, mDisplayContent, transit)
- || shouldStartWallpaperAnimation(mDisplayContent);
- }
-
- /**
- * Whether the transition contains any embedded {@link TaskFragment} that does not fill the
- * parent {@link Task} before or after the transition.
- */
- private boolean transitionContainsTaskFragmentWithBoundsOverride() {
- for (int i = mDisplayContent.mChangingContainers.size() - 1; i >= 0; i--) {
- final WindowContainer wc = mDisplayContent.mChangingContainers.valueAt(i);
- if (wc.isEmbedded()) {
- // Contains embedded TaskFragment with bounds changed.
- return true;
- }
- }
- mTempTransitionWindows.clear();
- mTempTransitionWindows.addAll(mDisplayContent.mClosingApps);
- mTempTransitionWindows.addAll(mDisplayContent.mOpeningApps);
- boolean containsTaskFragmentWithBoundsOverride = false;
- for (int i = mTempTransitionWindows.size() - 1; i >= 0; i--) {
- final ActivityRecord r = mTempTransitionWindows.get(i).asActivityRecord();
- final TaskFragment tf = r.getTaskFragment();
- if (tf != null && tf.isEmbeddedWithBoundsOverride()) {
- containsTaskFragmentWithBoundsOverride = true;
- break;
- }
- }
- mTempTransitionWindows.clear();
- return containsTaskFragmentWithBoundsOverride;
- }
-
- /**
- * Finds the common parent {@link Task} that is parent of all embedded app windows in the
- * current transition.
- * @return {@code null} if app windows in the transition are not children of the same Task, or
- * if none of the app windows is embedded.
- */
- @Nullable
- private Task findParentTaskForAllEmbeddedWindows() {
- mTempTransitionWindows.clear();
- mTempTransitionWindows.addAll(mDisplayContent.mClosingApps);
- mTempTransitionWindows.addAll(mDisplayContent.mOpeningApps);
- mTempTransitionWindows.addAll(mDisplayContent.mChangingContainers);
-
- // It should only animated by the organizer if all windows are below the same leaf Task.
- Task leafTask = null;
- for (int i = mTempTransitionWindows.size() - 1; i >= 0; i--) {
- final ActivityRecord r = getAppFromContainer(mTempTransitionWindows.get(i));
- if (r == null) {
- leafTask = null;
- break;
- }
- // There are also cases where the Task contains non-embedded activity, such as launching
- // split TaskFragments from a non-embedded activity.
- // The hierarchy may looks like this:
- // - Task
- // - Activity
- // - TaskFragment
- // - Activity
- // - TaskFragment
- // - Activity
- // We also want to have the organizer handle the transition for such case.
- final Task task = r.getTask();
- // We don't support embedding in PiP, leave the animation to the PipTaskOrganizer.
- if (task == null || task.inPinnedWindowingMode()) {
- leafTask = null;
- break;
- }
- // We don't want the organizer to handle transition of other non-embedded Task.
- if (leafTask != null && leafTask != task) {
- leafTask = null;
- break;
- }
- final ActivityRecord rootActivity = task.getRootActivity();
- // We don't want the organizer to handle transition when the whole app is closing.
- if (rootActivity == null) {
- leafTask = null;
- break;
- }
- // We don't want the organizer to handle transition of non-embedded activity of other
- // app.
- if (r.getUid() != task.effectiveUid && !r.isEmbedded()) {
- leafTask = null;
- break;
- }
- leafTask = task;
- }
- mTempTransitionWindows.clear();
- return leafTask;
- }
-
- /**
- * Finds the common {@link android.window.TaskFragmentOrganizer} that organizes all embedded
- * {@link TaskFragment} belong to the given {@link Task}.
- * @return {@code null} if there is no such organizer, or if there are more than one.
- */
- @Nullable
- private ITaskFragmentOrganizer findTaskFragmentOrganizer(@Nullable Task task) {
- if (task == null) {
- return null;
- }
- // We don't support remote animation for Task with multiple TaskFragmentOrganizers.
- final ITaskFragmentOrganizer[] organizer = new ITaskFragmentOrganizer[1];
- final boolean hasMultipleOrganizers = task.forAllLeafTaskFragments(taskFragment -> {
- final ITaskFragmentOrganizer tfOrganizer = taskFragment.getTaskFragmentOrganizer();
- if (tfOrganizer == null) {
- return false;
- }
- if (organizer[0] != null && !organizer[0].asBinder().equals(tfOrganizer.asBinder())) {
- return true;
- }
- organizer[0] = tfOrganizer;
- return false;
- });
- if (hasMultipleOrganizers) {
- ProtoLog.e(WM_DEBUG_APP_TRANSITIONS, "We don't support remote animation for"
- + " Task with multiple TaskFragmentOrganizers.");
- return null;
- }
- return organizer[0];
- }
-
- /**
- * Overrides the pending transition with the remote animation defined by the
- * {@link ITaskFragmentOrganizer} if all windows in the transition are children of
- * {@link TaskFragment} that are organized by the same organizer.
- *
- * @return {@code true} if the transition is overridden.
- */
- private boolean overrideWithTaskFragmentRemoteAnimation(@TransitionOldType int transit,
- ArraySet<Integer> activityTypes) {
- if (transitionMayContainNonAppWindows(transit)) {
- return false;
- }
- if (!transitionContainsTaskFragmentWithBoundsOverride()) {
- // No need to play TaskFragment remote animation if all embedded TaskFragment in the
- // transition fill the Task.
- return false;
- }
-
- final Task task = findParentTaskForAllEmbeddedWindows();
- final ITaskFragmentOrganizer organizer = findTaskFragmentOrganizer(task);
- final RemoteAnimationDefinition definition = organizer != null
- ? mDisplayContent.mAtmService.mTaskFragmentOrganizerController
- .getRemoteAnimationDefinition(organizer)
- : null;
- final RemoteAnimationAdapter adapter = definition != null
- ? definition.getAdapter(transit, activityTypes)
- : null;
- if (adapter == null) {
- return false;
- }
- mDisplayContent.mAppTransition.overridePendingAppTransitionRemote(
- adapter, false /* sync */, true /*isActivityEmbedding*/);
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
- "Override with TaskFragment remote animation for transit=%s",
- AppTransition.appTransitionOldToString(transit));
-
- final int organizerUid = mDisplayContent.mAtmService.mTaskFragmentOrganizerController
- .getTaskFragmentOrganizerUid(organizer);
- final boolean shouldDisableInputForRemoteAnimation = !task.isFullyTrustedEmbedding(
- organizerUid);
- final RemoteAnimationController remoteAnimationController =
- mDisplayContent.mAppTransition.getRemoteAnimationController();
- if (shouldDisableInputForRemoteAnimation && remoteAnimationController != null) {
- // We are going to use client-driven animation, Disable all input on activity windows
- // during the animation (unless it is fully trusted) to ensure it is safe to allow
- // client to animate the surfaces.
- // This is needed for all activity windows in the animation Task.
- remoteAnimationController.setOnRemoteAnimationReady(() -> {
- final Consumer<ActivityRecord> updateActivities =
- activity -> activity.setDropInputForAnimation(true);
- task.forAllActivities(updateActivities);
- });
- ProtoLog.d(WM_DEBUG_APP_TRANSITIONS, "Task=%d contains embedded TaskFragment."
- + " Disabled all input during TaskFragment remote animation.", task.mTaskId);
- }
- return true;
- }
-
- /**
- * Overrides the pending transition with the remote animation defined for the transition in the
- * set of defined remote animations in the app window token.
- */
- private void overrideWithRemoteAnimationIfSet(@Nullable ActivityRecord animLpActivity,
- @TransitionOldType int transit, ArraySet<Integer> activityTypes) {
- RemoteAnimationAdapter adapter = null;
- if (transit == TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE) {
- // The crash transition has higher priority than any involved remote animations.
- } else if (AppTransition.isKeyguardGoingAwayTransitOld(transit)) {
- adapter = mRemoteAnimationDefinition != null
- ? mRemoteAnimationDefinition.getAdapter(transit, activityTypes)
- : null;
- } else if (mDisplayContent.mAppTransition.getRemoteAnimationController() == null) {
- adapter = getRemoteAnimationOverride(animLpActivity, transit, activityTypes);
- }
- if (adapter != null) {
- mDisplayContent.mAppTransition.overridePendingAppTransitionRemote(adapter);
- }
- }
-
- @Nullable
- static Task findRootTaskFromContainer(WindowContainer wc) {
- return wc.asTaskFragment() != null ? wc.asTaskFragment().getRootTask()
- : wc.asActivityRecord().getRootTask();
- }
-
- @Nullable
- static ActivityRecord getAppFromContainer(WindowContainer wc) {
- return wc.asTaskFragment() != null ? wc.asTaskFragment().getTopNonFinishingActivity()
- : wc.asActivityRecord();
- }
-
- /**
- * @return The window token that determines the animation theme.
- */
- @Nullable
- private ActivityRecord findAnimLayoutParamsToken(@TransitionOldType int transit,
- ArraySet<Integer> activityTypes, ArraySet<ActivityRecord> openingApps,
- ArraySet<ActivityRecord> closingApps, ArraySet<WindowContainer> changingApps) {
- ActivityRecord result;
-
- // Remote animations always win, but fullscreen tokens override non-fullscreen tokens.
- result = lookForHighestTokenWithFilter(closingApps, openingApps, changingApps,
- w -> w.getRemoteAnimationDefinition() != null
- && w.getRemoteAnimationDefinition().hasTransition(transit, activityTypes));
- if (result != null) {
- return result;
- }
- result = lookForHighestTokenWithFilter(closingApps, openingApps, changingApps,
- w -> w.fillsParent() && w.findMainWindow() != null);
- if (result != null) {
- return result;
- }
- return lookForHighestTokenWithFilter(closingApps, openingApps, changingApps,
- w -> w.findMainWindow() != null);
- }
-
- /**
- * @return The set of {@link android.app.WindowConfiguration.ActivityType}s contained in the set
- * of apps in {@code array1}, {@code array2}, and {@code array3}.
- */
- private static ArraySet<Integer> collectActivityTypes(ArraySet<ActivityRecord> array1,
- ArraySet<ActivityRecord> array2, ArraySet<WindowContainer> array3) {
- final ArraySet<Integer> result = new ArraySet<>();
- for (int i = array1.size() - 1; i >= 0; i--) {
- result.add(array1.valueAt(i).getActivityType());
- }
- for (int i = array2.size() - 1; i >= 0; i--) {
- result.add(array2.valueAt(i).getActivityType());
- }
- for (int i = array3.size() - 1; i >= 0; i--) {
- result.add(array3.valueAt(i).getActivityType());
- }
- return result;
- }
-
- private static ActivityRecord lookForHighestTokenWithFilter(ArraySet<ActivityRecord> array1,
- ArraySet<ActivityRecord> array2, ArraySet<WindowContainer> array3,
- Predicate<ActivityRecord> filter) {
- final int array2base = array1.size();
- final int array3base = array2.size() + array2base;
- final int count = array3base + array3.size();
- int bestPrefixOrderIndex = Integer.MIN_VALUE;
- ActivityRecord bestToken = null;
- for (int i = 0; i < count; i++) {
- final WindowContainer wtoken = i < array2base
- ? array1.valueAt(i)
- : (i < array3base
- ? array2.valueAt(i - array2base)
- : array3.valueAt(i - array3base));
- final int prefixOrderIndex = wtoken.getPrefixOrderIndex();
- final ActivityRecord r = getAppFromContainer(wtoken);
- if (r != null && filter.test(r) && prefixOrderIndex > bestPrefixOrderIndex) {
- bestPrefixOrderIndex = prefixOrderIndex;
- bestToken = r;
- }
- }
- return bestToken;
- }
-
- private boolean containsVoiceInteraction(ArraySet<ActivityRecord> apps) {
- for (int i = apps.size() - 1; i >= 0; i--) {
- if (apps.valueAt(i).mVoiceInteraction) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Apply animation to the set of window containers.
- *
- * @param wcs The list of {@link WindowContainer}s to which an app transition animation applies.
- * @param apps The list of {@link ActivityRecord}s being transitioning.
- * @param transit The current transition type.
- * @param visible {@code true} if the apps becomes visible, {@code false} if the apps becomes
- * invisible.
- * @param animLp Layout parameters in which an app transition animation runs.
- * @param voiceInteraction {@code true} if one of the apps in this transition belongs to a voice
- * interaction session driving task.
- */
- private void applyAnimations(ArraySet<WindowContainer> wcs, ArraySet<ActivityRecord> apps,
- @TransitionOldType int transit, boolean visible, LayoutParams animLp,
- boolean voiceInteraction) {
- final int wcsCount = wcs.size();
- for (int i = 0; i < wcsCount; i++) {
- final WindowContainer wc = wcs.valueAt(i);
- // If app transition animation target is promoted to higher level, SurfaceAnimator
- // triggers WC#onAnimationFinished only on the promoted target. So we need to take care
- // of triggering AR#onAnimationFinished on each ActivityRecord which is a part of the
- // app transition.
- final ArrayList<ActivityRecord> transitioningDescendants = new ArrayList<>();
- for (int j = 0; j < apps.size(); ++j) {
- final ActivityRecord app = apps.valueAt(j);
- if (app.isDescendantOf(wc)) {
- transitioningDescendants.add(app);
- }
- }
- wc.applyAnimation(animLp, transit, visible, voiceInteraction, transitioningDescendants);
- }
- }
-
- /**
- * Returns {@code true} if a given {@link WindowContainer} is an embedded Task in
- * {@link TaskView}.
- *
- * Note that this is a short term workaround to support Android Auto until it migrate to
- * ShellTransition. This should only be used by {@link #getAnimationTargets}.
- *
- * TODO(b/213312721): Remove this predicate and its callers once ShellTransition is enabled.
- */
- static boolean isTaskViewTask(WindowContainer wc) {
- // Use Task#mRemoveWithTaskOrganizer to identify an embedded Task, but this is a hack and
- // it is not guaranteed to work this logic in the future version.
- boolean isTaskViewTask = wc instanceof Task && ((Task) wc).mRemoveWithTaskOrganizer;
- if (isTaskViewTask) {
- return true;
- }
-
- WindowContainer parent = wc.getParent();
- boolean isParentATaskViewTask = parent != null
- && parent instanceof Task
- && ((Task) parent).mRemoveWithTaskOrganizer;
- return isParentATaskViewTask;
- }
-
- /**
- * Find WindowContainers to be animated from a set of opening and closing apps. We will promote
- * animation targets to higher level in the window hierarchy if possible.
- *
- * @param visible {@code true} to get animation targets for opening apps, {@code false} to get
- * animation targets for closing apps.
- * @return {@link WindowContainer}s to be animated.
- */
- @VisibleForTesting
- static ArraySet<WindowContainer> getAnimationTargets(
- ArraySet<ActivityRecord> openingApps, ArraySet<ActivityRecord> closingApps,
- boolean visible) {
-
- // The candidates of animation targets, which might be able to promote to higher level.
- final ArrayDeque<WindowContainer> candidates = new ArrayDeque<>();
- final ArraySet<ActivityRecord> apps = visible ? openingApps : closingApps;
- for (int i = 0; i < apps.size(); ++i) {
- final ActivityRecord app = apps.valueAt(i);
- if (app.shouldApplyAnimation(visible)) {
- candidates.add(app);
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
- "Changing app %s visible=%b performLayout=%b",
- app, app.isVisible(), false);
- }
- }
-
- final ArraySet<ActivityRecord> otherApps = visible ? closingApps : openingApps;
- // Ancestors of closing apps while finding animation targets for opening apps, or ancestors
- // of opening apps while finding animation targets for closing apps.
- final ArraySet<WindowContainer> otherAncestors = new ArraySet<>();
- for (int i = 0; i < otherApps.size(); ++i) {
- for (WindowContainer wc = otherApps.valueAt(i); wc != null; wc = wc.getParent()) {
- otherAncestors.add(wc);
- }
- }
-
- // The final animation targets which cannot promote to higher level anymore.
- final ArraySet<WindowContainer> targets = new ArraySet<>();
- final ArrayList<WindowContainer> siblings = new ArrayList<>();
- while (!candidates.isEmpty()) {
- final WindowContainer current = candidates.removeFirst();
- final WindowContainer parent = current.getParent();
- siblings.clear();
- siblings.add(current);
- boolean canPromote = true;
-
- if (isTaskViewTask(current)) {
- // Don't animate an embedded Task in app transition. This is a short term workaround
- // to prevent conflict of surface hierarchy changes between legacy app transition
- // and TaskView (b/205189147).
- // TODO(b/213312721): Remove this once ShellTransition is enabled.
- continue;
- } else if (parent == null || !parent.canCreateRemoteAnimationTarget()
- // We cannot promote the animation on Task's parent when the task is in
- // clearing task in case the animating get stuck when performing the opening
- // task that behind it.
- || (current.asTask() != null && current.asTask().mInRemoveTask)
- // We cannot promote the animation to changing window. This may happen when an
- // activity is open in a TaskFragment that is resizing, while the existing
- // activity in the TaskFragment is reparented to another TaskFragment.
- || parent.isChangingAppTransition()) {
- canPromote = false;
- } else {
- // In case a descendant of the parent belongs to the other group, we cannot promote
- // the animation target from "current" to the parent.
- //
- // Example: Imagine we're checking if we can animate a Task instead of a set of
- // ActivityRecords. In case an activity starts a new activity within a same Task,
- // an ActivityRecord of an existing activity belongs to the opening apps, at the
- // same time, the other ActivityRecord of a new activity belongs to the closing
- // apps. In this case, we cannot promote the animation target to Task level, but
- // need to animate each individual activity.
- //
- // [Task] +- [ActivityRecord1] (in opening apps)
- // +- [ActivityRecord2] (in closing apps)
- if (otherAncestors.contains(parent)) {
- canPromote = false;
- }
-
- // If the current window container is a task with adjacent task set, the both
- // adjacent tasks will be opened or closed together. To get their opening or
- // closing animation target independently, skip promoting their animation targets.
- if (current.asTask() != null && current.asTask().hasAdjacentTask()) {
- canPromote = false;
- }
-
- // Find all siblings of the current WindowContainer in "candidates", move them into
- // a separate list "siblings", and checks if an animation target can be promoted
- // to its parent.
- //
- // We can promote an animation target to its parent if and only if all visible
- // siblings will be animating.
- //
- // Example: Imagine that a Task contains two visible activity record, but only one
- // of them is included in the opening apps and the other belongs to neither opening
- // or closing apps. This happens when an activity launches another translucent
- // activity in the same Task. In this case, we cannot animate Task, but have to
- // animate each activity, otherwise an activity behind the translucent activity also
- // animates.
- //
- // [Task] +- [ActivityRecord1] (visible, in opening apps)
- // +- [ActivityRecord2] (visible, not in opening apps)
- for (int j = 0; j < parent.getChildCount(); ++j) {
- final WindowContainer sibling = parent.getChildAt(j);
- if (candidates.remove(sibling)) {
- if (!isTaskViewTask(sibling)) {
- // Don't animate an embedded Task in app transition. This is a short
- // term workaround to prevent conflict of surface hierarchy changes
- // between legacy app transition and TaskView (b/205189147).
- // TODO(b/213312721): Remove this once ShellTransition is enabled.
- siblings.add(sibling);
- }
- } else if (sibling != current && sibling.isVisible()) {
- canPromote = false;
- }
- }
- }
-
- if (canPromote) {
- candidates.add(parent);
- } else {
- targets.addAll(siblings);
- }
- }
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS_ANIM, "getAnimationTarget in=%s, out=%s",
- apps, targets);
- return targets;
- }
-
- /**
- * Apply an app transition animation based on a set of {@link ActivityRecord}
- *
- * @param openingApps The list of opening apps to which an app transition animation applies.
- * @param closingApps The list of closing apps to which an app transition animation applies.
- * @param transit The current transition type.
- * @param animLp Layout parameters in which an app transition animation runs.
- * @param voiceInteraction {@code true} if one of the apps in this transition belongs to a voice
- * interaction session driving task.
- */
- private void applyAnimations(ArraySet<ActivityRecord> openingApps,
- ArraySet<ActivityRecord> closingApps, @TransitionOldType int transit,
- LayoutParams animLp, boolean voiceInteraction) {
- if (transit == WindowManager.TRANSIT_OLD_UNSET
- || (openingApps.isEmpty() && closingApps.isEmpty())) {
- return;
- }
-
- if (AppTransition.isActivityTransitOld(transit)) {
- final ArrayList<Pair<ActivityRecord, Rect>> closingLetterboxes = new ArrayList();
- for (int i = 0; i < closingApps.size(); ++i) {
- ActivityRecord closingApp = closingApps.valueAt(i);
- if (closingApp.areBoundsLetterboxed()) {
- final Rect insets = closingApp.getLetterboxInsets();
- closingLetterboxes.add(new Pair(closingApp, insets));
- }
- }
-
- for (int i = 0; i < openingApps.size(); ++i) {
- ActivityRecord openingApp = openingApps.valueAt(i);
- if (openingApp.areBoundsLetterboxed()) {
- final Rect openingInsets = openingApp.getLetterboxInsets();
- for (Pair<ActivityRecord, Rect> closingLetterbox : closingLetterboxes) {
- final Rect closingInsets = closingLetterbox.second;
- if (openingInsets.equals(closingInsets)) {
- ActivityRecord closingApp = closingLetterbox.first;
- openingApp.setNeedsLetterboxedAnimation(true);
- closingApp.setNeedsLetterboxedAnimation(true);
- }
- }
- }
- }
- }
-
- final ArraySet<WindowContainer> openingWcs = getAnimationTargets(
- openingApps, closingApps, true /* visible */);
- final ArraySet<WindowContainer> closingWcs = getAnimationTargets(
- openingApps, closingApps, false /* visible */);
- applyAnimations(openingWcs, openingApps, transit, true /* visible */, animLp,
- voiceInteraction);
- applyAnimations(closingWcs, closingApps, transit, false /* visible */, animLp,
- voiceInteraction);
-
- for (int i = 0; i < openingApps.size(); ++i) {
- openingApps.valueAtUnchecked(i).mOverrideTaskTransition = false;
- }
- for (int i = 0; i < closingApps.size(); ++i) {
- closingApps.valueAtUnchecked(i).mOverrideTaskTransition = false;
- }
-
- final AccessibilityController accessibilityController =
- mDisplayContent.mWmService.mAccessibilityController;
- if (accessibilityController.hasCallbacks()) {
- accessibilityController.onAppWindowTransition(mDisplayContent.getDisplayId(), transit);
- }
- }
-
- private void handleOpeningApps() {
- final ArraySet<ActivityRecord> openingApps = mDisplayContent.mOpeningApps;
- final int appsCount = openingApps.size();
-
- for (int i = 0; i < appsCount; i++) {
- final ActivityRecord app = openingApps.valueAt(i);
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Now opening app %s", app);
-
- app.commitVisibility(true /* visible */, false /* performLayout */);
-
- // In case a trampoline activity is used, it can happen that a new ActivityRecord is
- // added and a new app transition starts before the previous app transition animation
- // ends. So we cannot simply use app.isAnimating(PARENTS) to determine if the app must
- // to be added to the list of tokens to be notified of app transition complete.
- final WindowContainer wc = app.getAnimatingContainer(PARENTS,
- ANIMATION_TYPE_APP_TRANSITION);
- if (wc == null || !wc.getAnimationSources().contains(app)) {
- // This token isn't going to be animating. Add it to the list of tokens to
- // be notified of app transition complete since the notification will not be
- // sent be the app window animator.
- mDisplayContent.mNoAnimationNotifyOnTransitionFinished.add(app.token);
- }
- app.updateReportedVisibilityLocked();
- app.showAllWindowsLocked();
-
- if (mDisplayContent.mAppTransition.isNextAppTransitionThumbnailUp()) {
- app.attachThumbnailAnimation();
- } else if (mDisplayContent.mAppTransition.isNextAppTransitionOpenCrossProfileApps()) {
- app.attachCrossProfileAppsThumbnailAnimation();
- }
- }
- }
-
- private void handleClosingApps() {
- final ArraySet<ActivityRecord> closingApps = mDisplayContent.mClosingApps;
- final int appsCount = closingApps.size();
-
- for (int i = 0; i < appsCount; i++) {
- final ActivityRecord app = closingApps.valueAt(i);
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Now closing app %s", app);
-
- app.commitVisibility(false /* visible */, false /* performLayout */);
- app.updateReportedVisibilityLocked();
- // Force the allDrawn flag, because we want to start
- // this guy's animations regardless of whether it's
- // gotten drawn.
- app.allDrawn = true;
- // Ensure that apps that are mid-starting are also scheduled to have their
- // starting windows removed after the animation is complete
- if (app.mStartingWindow != null && !app.mStartingWindow.mAnimatingExit) {
- app.removeStartingWindow();
- }
-
- if (mDisplayContent.mAppTransition.isNextAppTransitionThumbnailDown()) {
- app.attachThumbnailAnimation();
- }
- }
- }
-
- private void handleClosingChangingContainers() {
- final ArrayMap<WindowContainer, Rect> containers =
- mDisplayContent.mClosingChangingContainers;
- while (!containers.isEmpty()) {
- final WindowContainer container = containers.keyAt(0);
- containers.remove(container);
-
- // For closing changing windows that are part of the transition, they should have been
- // removed from mClosingChangingContainers in WindowContainer#getAnimationAdapter()
- // If the closing changing TaskFragment is not part of the transition, update its
- // surface after removing it from mClosingChangingContainers.
- final TaskFragment taskFragment = container.asTaskFragment();
- if (taskFragment != null) {
- taskFragment.updateOrganizedTaskFragmentSurface();
- }
- }
- }
-
- private void handleChangingApps(@TransitionOldType int transit) {
- final ArraySet<WindowContainer> apps = mDisplayContent.mChangingContainers;
- final int appsCount = apps.size();
- for (int i = 0; i < appsCount; i++) {
- WindowContainer wc = apps.valueAt(i);
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Now changing app %s", wc);
- wc.applyAnimation(null, transit, true, false, null /* sources */);
- }
- }
-
- private boolean transitionGoodToGo(ArraySet<? extends WindowContainer> apps,
- ArrayMap<WindowContainer, Integer> outReasons) {
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
- "Checking %d opening apps (timeout=%b)...", apps.size(),
- mDisplayContent.mAppTransition.isTimeout());
- if (mDisplayContent.mAppTransition.isTimeout()) {
- return true;
- }
-
- for (int i = 0; i < apps.size(); i++) {
- WindowContainer wc = apps.valueAt(i);
- final ActivityRecord activity = getAppFromContainer(wc);
- if (activity == null) {
- continue;
- }
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
- "Check opening app=%s: allDrawn=%b startingDisplayed=%b "
- + "startingMoved=%b isRelaunching()=%b startingWindow=%s",
- activity, activity.allDrawn, activity.isStartingWindowDisplayed(),
- activity.startingMoved, activity.isRelaunching(),
- activity.mStartingWindow);
- final boolean allDrawn = activity.allDrawn && !activity.isRelaunching();
- if (!allDrawn && !activity.isStartingWindowDisplayed() && !activity.startingMoved) {
- return false;
- }
- if (allDrawn) {
- outReasons.put(activity, APP_TRANSITION_WINDOWS_DRAWN);
- } else {
- outReasons.put(activity,
- activity.mStartingData instanceof SplashScreenStartingData
- ? APP_TRANSITION_SPLASH_SCREEN
- : APP_TRANSITION_SNAPSHOT);
- }
- }
-
- // We also need to wait for the specs to be fetched, if needed.
- if (mDisplayContent.mAppTransition.isFetchingAppTransitionsSpecs()) {
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "isFetchingAppTransitionSpecs=true");
- return false;
- }
-
- if (!mDisplayContent.mUnknownAppVisibilityController.allResolved()) {
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "unknownApps is not empty: %s",
- mDisplayContent.mUnknownAppVisibilityController.getDebugMessage());
- return false;
- }
-
- // If the wallpaper is visible, we need to check it's ready too.
- return !mWallpaperControllerLocked.isWallpaperVisible()
- || mWallpaperControllerLocked.wallpaperTransitionReady();
- }
-
- private boolean transitionGoodToGoForTaskFragments() {
- if (mDisplayContent.mAppTransition.isTimeout()) {
- return true;
- }
-
- // Check all Tasks in this transition. This is needed because new TaskFragment created for
- // launching activity may not be in the tracking lists, but we still want to wait for the
- // activity launch to start the transition.
- final ArraySet<Task> rootTasks = new ArraySet<>();
- for (int i = mDisplayContent.mOpeningApps.size() - 1; i >= 0; i--) {
- rootTasks.add(mDisplayContent.mOpeningApps.valueAt(i).getRootTask());
- }
- for (int i = mDisplayContent.mClosingApps.size() - 1; i >= 0; i--) {
- rootTasks.add(mDisplayContent.mClosingApps.valueAt(i).getRootTask());
- }
- for (int i = mDisplayContent.mChangingContainers.size() - 1; i >= 0; i--) {
- rootTasks.add(
- findRootTaskFromContainer(mDisplayContent.mChangingContainers.valueAt(i)));
- }
-
- // Organized TaskFragment can be empty for two situations:
- // 1. New created and is waiting for Activity launch. In this case, we want to wait for
- // the Activity launch to trigger the transition.
- // 2. Last Activity is just removed. In this case, we want to wait for organizer to
- // remove the TaskFragment because it may also want to change other TaskFragments in
- // the same transition.
- for (int i = rootTasks.size() - 1; i >= 0; i--) {
- final Task rootTask = rootTasks.valueAt(i);
- if (rootTask == null) {
- // It is possible that one activity may have been removed from the hierarchy. No
- // need to check for this case.
- continue;
- }
- final boolean notReady = rootTask.forAllLeafTaskFragments(taskFragment -> {
- if (!taskFragment.isReadyToTransit()) {
- ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "Organized TaskFragment is not ready= %s",
- taskFragment);
- return true;
- }
- return false;
- });
- if (notReady) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Identifies whether the current transition occurs within a single task or not. This is used
- * to determine whether animations should be clipped to the task bounds instead of root task
- * bounds.
- */
- @VisibleForTesting
- boolean isTransitWithinTask(@TransitionOldType int transit, Task task) {
- if (task == null
- || !mDisplayContent.mChangingContainers.isEmpty()) {
- // if there is no task, then we can't constrain to the task.
- // if anything is changing, it can animate outside its task.
- return false;
- }
- if (!(transit == TRANSIT_OLD_ACTIVITY_OPEN
- || transit == TRANSIT_OLD_ACTIVITY_CLOSE
- || transit == TRANSIT_OLD_ACTIVITY_RELAUNCH)) {
- // only activity-level transitions will be within-task.
- return false;
- }
- // check that all components are in the task.
- for (ActivityRecord activity : mDisplayContent.mOpeningApps) {
- Task activityTask = activity.getTask();
- if (activityTask != task) {
- return false;
- }
- }
- for (ActivityRecord activity : mDisplayContent.mClosingApps) {
- if (activity.getTask() != task) {
- return false;
- }
- }
- return true;
- }
-
- private static boolean canBeWallpaperTarget(ArraySet<ActivityRecord> apps) {
- for (int i = apps.size() - 1; i >= 0; i--) {
- if (apps.valueAt(i).windowsCanBeWallpaperTarget()) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Finds the top app in a list of apps, using its {@link ActivityRecord#getPrefixOrderIndex} to
- * compare z-order.
- *
- * @param apps The list of apps to search.
- * @param ignoreInvisible If set to true, ignores apps that are not
- * {@link ActivityRecord#isVisible}.
- * @return The top {@link ActivityRecord}.
- */
- private static ActivityRecord getTopApp(ArraySet<? extends WindowContainer> apps,
- boolean ignoreInvisible) {
- int topPrefixOrderIndex = Integer.MIN_VALUE;
- ActivityRecord topApp = null;
- for (int i = apps.size() - 1; i >= 0; i--) {
- final ActivityRecord app = getAppFromContainer(apps.valueAt(i));
- if (app == null || ignoreInvisible && !app.isVisible()) {
- continue;
- }
- final int prefixOrderIndex = app.getPrefixOrderIndex();
- if (prefixOrderIndex > topPrefixOrderIndex) {
- topPrefixOrderIndex = prefixOrderIndex;
- topApp = app;
- }
- }
- return topApp;
- }
-}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index c87087f84399..682f3d8cf1e5 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -226,7 +226,6 @@ import android.view.InsetsSource;
import android.view.InsetsState;
import android.view.MagnificationSpec;
import android.view.PrivacyIndicatorBounds;
-import android.view.RemoteAnimationDefinition;
import android.view.RoundedCorners;
import android.view.Surface;
import android.view.Surface.Rotation;
@@ -367,8 +366,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
private int mMaxUiWidth = 0;
final AppTransition mAppTransition;
- final AppTransitionController mAppTransitionController;
- boolean mSkipAppTransitionAnimation = false;
final ArraySet<ActivityRecord> mOpeningApps = new ArraySet<>();
final ArraySet<ActivityRecord> mClosingApps = new ArraySet<>();
@@ -1161,7 +1158,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mAppTransition = new AppTransition(mWmService.mContext, mWmService, this);
mAppTransition.registerListenerLocked(mWmService.mActivityManagerAppTransitionNotifier);
mAppTransition.registerListenerLocked(mFixedRotationTransitionListener);
- mAppTransitionController = new AppTransitionController(mWmService, this);
mTransitionController.registerLegacyListener(mFixedRotationTransitionListener);
mUnknownAppVisibilityController = new UnknownAppVisibilityController(mWmService, this);
mRemoteDisplayChangeController = new RemoteDisplayChangeController(this);
@@ -1553,10 +1549,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
return mInputMethodSurfaceParentWindow;
}
- void registerRemoteAnimations(RemoteAnimationDefinition definition) {
- mAppTransitionController.registerRemoteAnimations(definition);
- }
-
void reconfigureDisplayLocked() {
if (!isReady()) {
return;
@@ -5604,20 +5596,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
/**
- * Transfer app transition from other display to this display.
- *
- * @param from Display from where the app transition is transferred.
- *
- * TODO(new-app-transition): Remove this once the shell handles app transition.
- */
- void transferAppTransitionFrom(DisplayContent from) {
- final boolean prepared = mAppTransition.transferFrom(from.mAppTransition);
- if (prepared && okToAnimate()) {
- mSkipAppTransitionAnimation = false;
- }
- }
-
- /**
* @deprecated new transition should use {@link #requestTransitionAndLegacyPrepare(int, int)}
*/
@Deprecated
@@ -5631,10 +5609,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
@Deprecated
void prepareAppTransition(@WindowManager.TransitionType int transit,
@WindowManager.TransitionFlags int flags) {
- final boolean prepared = mAppTransition.prepareAppTransition(transit, flags);
- if (prepared && okToAnimate() && transit != TRANSIT_NONE) {
- mSkipAppTransitionAnimation = false;
- }
+ mAppTransition.prepareAppTransition(transit, flags);
}
/**
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 95d9b3e612ac..c93efd327096 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -35,7 +35,6 @@ import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_OCCLUDING;
import static android.view.WindowManager.TRANSIT_NONE;
import static android.view.WindowManager.TRANSIT_PIP;
import static android.view.WindowManager.TRANSIT_SLEEP;
-import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.view.WindowManager.TRANSIT_WAKE;
import static com.android.internal.protolog.WmProtoLogGroups.WM_DEBUG_FOCUS_LIGHT;
@@ -68,7 +67,6 @@ import static com.android.server.wm.ActivityTaskSupervisor.DEFER_RESUME;
import static com.android.server.wm.ActivityTaskSupervisor.ON_TOP;
import static com.android.server.wm.ActivityTaskSupervisor.dumpHistoryList;
import static com.android.server.wm.ActivityTaskSupervisor.printThisActivity;
-import static com.android.server.wm.KeyguardController.KEYGUARD_SLEEP_TOKEN_TAG;
import static com.android.server.wm.RootWindowContainerProto.IS_HOME_RECENTS_COMPONENT;
import static com.android.server.wm.RootWindowContainerProto.KEYGUARD_CONTROLLER;
import static com.android.server.wm.RootWindowContainerProto.WINDOW_CONTAINER;
@@ -803,8 +801,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
mWmService.mAtmService.mTaskFragmentOrganizerController.dispatchPendingEvents();
mWmService.mSyncEngine.onSurfacePlacement();
- checkAppTransitionReady(surfacePlacer);
-
mWmService.mAtmService.mBackNavigationController
.checkAnimationReady(defaultDisplay.mWallpaperController);
@@ -898,38 +894,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
if (DEBUG_WINDOW_TRACE) Slog.e(TAG, "performSurfacePlacementInner exit");
}
- private void checkAppTransitionReady(WindowSurfacePlacer surfacePlacer) {
- // Trace all displays app transition by Z-order for pending layout change.
- for (int i = mChildren.size() - 1; i >= 0; --i) {
- final DisplayContent curDisplay = mChildren.get(i);
-
- // If we are ready to perform an app transition, check through all of the app tokens
- // to be shown and see if they are ready to go.
- if (curDisplay.mAppTransition.isReady()) {
- // handleAppTransitionReady may modify curDisplay.pendingLayoutChanges.
- curDisplay.mAppTransitionController.handleAppTransitionReady();
- if (DEBUG_LAYOUT_REPEATS) {
- surfacePlacer.debugLayoutRepeats("after handleAppTransitionReady",
- curDisplay.pendingLayoutChanges);
- }
- }
-
- if (curDisplay.mAppTransition.isRunning() && !curDisplay.isAppTransitioning()) {
- // We have finished the animation of an app transition. To do this, we have
- // delayed a lot of operations like showing and hiding apps, moving apps in
- // Z-order, etc.
- // The app token list reflects the correct Z-order, but the window list may now
- // be out of sync with it. So here we will just rebuild the entire app window
- // list. Fun!
- curDisplay.handleAnimatingStoppedAndTransition();
- if (DEBUG_LAYOUT_REPEATS) {
- surfacePlacer.debugLayoutRepeats("after handleAnimStopAndXitionLock",
- curDisplay.pendingLayoutChanges);
- }
- }
- }
- }
-
private void applySurfaceChangesTransaction() {
// TODO(multi-display): Support these features on secondary screens.
final DisplayContent defaultDc = mDefaultDisplay;
@@ -2266,20 +2230,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
// Ensure the leash of new task is in sync with its current bounds after reparent.
rootTask.maybeApplyLastRecentsAnimationTransaction();
-
- // In the case of this activity entering PIP due to it being moved to the back,
- // the old activity would have a TRANSIT_TASK_TO_BACK transition that needs to be
- // ran. But, since its visibility did not change (note how it was STOPPED/not
- // visible, and with it now at the back stack, it remains not visible), the logic to
- // add the transition is automatically skipped. We then add this activity manually
- // to the list of apps being closed, and request its transition to be ran.
- final ActivityRecord oldTopActivity = task.getTopMostActivity();
- if (oldTopActivity != null && oldTopActivity.isState(STOPPED)
- && task.getDisplayContent().mAppTransition.containsTransitRequest(
- TRANSIT_TO_BACK)) {
- task.getDisplayContent().mClosingApps.add(oldTopActivity);
- oldTopActivity.mRequestForceTransition = true;
- }
}
// TODO(remove-legacy-transit): Move this to the `singleActivity` case when removing
@@ -2958,20 +2908,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
display.mAllSleepTokens.remove(token);
if (display.mAllSleepTokens.isEmpty()) {
mService.updateSleepIfNeededLocked();
- // Assuming no lock screen is set and a user launches an activity, turns off the screen
- // and turn on the screen again, then the launched activity should be displayed on the
- // screen without app transition animation. When the screen turns on, both keyguard
- // sleep token and display off sleep token are removed, but the order is
- // non-deterministic.
- // Note: Display#mSkipAppTransitionAnimation will be ignored when keyguard related
- // transition exists, so this affects only when no lock screen is set. Otherwise
- // keyguard going away animation will be played.
- // See also AppTransitionController#getTransitCompatType for more details.
- if ((!mTaskSupervisor.getKeyguardController().isKeyguardOccluded(display.mDisplayId)
- && token.mTag.equals(KEYGUARD_SLEEP_TOKEN_TAG))
- || token.mTag.equals(DISPLAY_OFF_SLEEP_TOKEN_TAG)) {
- display.mSkipAppTransitionAnimation = true;
- }
}
}
diff --git a/services/core/java/com/android/server/wm/SnapshotController.java b/services/core/java/com/android/server/wm/SnapshotController.java
index dcdffa416e33..2664dcd3ae3f 100644
--- a/services/core/java/com/android/server/wm/SnapshotController.java
+++ b/services/core/java/com/android/server/wm/SnapshotController.java
@@ -72,11 +72,6 @@ class SnapshotController {
mActivitySnapshotController.notifyAppVisibilityChanged(appWindowToken, visible);
}
- // For legacy transition, which won't support activity snapshot
- void onTransitionStarting(DisplayContent displayContent) {
- mTaskSnapshotController.handleClosingApps(displayContent.mClosingApps);
- }
-
// For shell transition, record snapshots before transaction start.
void onTransactionReady(@WindowManager.TransitionType int type,
ArrayList<Transition.ChangeInfo> changeInfos) {
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java
index 3dfff39e9b68..c5425fedf2ac 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimator.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java
@@ -132,10 +132,7 @@ public class SurfaceAnimator {
animationFinishCallback.onAnimationFinished(type, anim);
}
};
- // If both the Animatable and AnimationAdapter requests to be deferred, only the
- // first one will be called.
- if (!(mAnimatable.shouldDeferAnimationFinish(resetAndInvokeFinish)
- || anim.shouldDeferAnimationFinish(resetAndInvokeFinish))) {
+ if (!anim.shouldDeferAnimationFinish(resetAndInvokeFinish)) {
resetAndInvokeFinish.run();
}
mAnimationFinished = true;
@@ -639,23 +636,5 @@ public class SurfaceAnimator {
* @return The height of the surface to be animated.
*/
int getSurfaceHeight();
-
- /**
- * Gets called when the animation is about to finish and gives the client the opportunity to
- * defer finishing the animation, i.e. it keeps the leash around until the client calls
- * {@link #cancelAnimation}.
- * <p>
- * {@link AnimationAdapter} has a similar method which is called only if this method returns
- * false. This mean that if both this {@link Animatable} and the {@link AnimationAdapter}
- * request to be deferred, this method is the sole responsible to call
- * endDeferFinishCallback. On the other hand, the animation finish might still be deferred
- * if this method return false and the one from the {@link AnimationAdapter} returns true.
- *
- * @param endDeferFinishCallback The callback to call when defer finishing should be ended.
- * @return Whether the client would like to defer the animation finish.
- */
- default boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
- return false;
- }
}
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index f75e7175b4d2..3abab8bf62c2 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -508,9 +508,6 @@ class Task extends TaskFragment {
*/
boolean mAllowForceResizeOverride = true;
- private final AnimatingActivityRegistry mAnimatingActivityRegistry =
- new AnimatingActivityRegistry();
-
private static final int TRANSLUCENT_TIMEOUT_MSG = FIRST_ACTIVITY_TASK_MSG + 1;
private final Handler mHandler;
@@ -1122,17 +1119,6 @@ class Task extends TaskFragment {
// already ran fully within super.onParentChanged
updateTaskOrganizerState();
- // TODO(b/168037178): The check for null display content and setting it to null doesn't
- // really make sense here...
-
- // TODO(b/168037178): This is mostly taking care of the case where the stask is removing
- // from the display, so we should probably consolidate it there instead.
-
- if (getParent() == null && mDisplayContent != null) {
- mDisplayContent = null;
- mWmService.mWindowPlacerLocked.requestTraversal();
- }
-
if (oldParent != null) {
final Task oldParentTask = oldParent.asTask();
if (oldParentTask != null) {
@@ -1185,9 +1171,6 @@ class Task extends TaskFragment {
}
mRootWindowContainer.updateUIDsPresentOnDisplay();
-
- // Ensure all animations are finished at same time in split-screen mode.
- forAllActivities(ActivityRecord::updateAnimatingActivityRegistry);
}
@Override
@@ -2770,6 +2753,7 @@ class Task extends TaskFragment {
}
super.removeImmediately();
+ mDisplayContent = null;
mRemoving = false;
}
@@ -3345,13 +3329,6 @@ class Task extends TaskFragment {
mLastSurfaceShowing = show;
}
- @Override
- void dump(PrintWriter pw, String prefix, boolean dumpAll) {
- super.dump(pw, prefix, dumpAll);
- mAnimatingActivityRegistry.dump(pw, "AnimatingApps:", prefix);
- }
-
-
/**
* Fills in a {@link TaskInfo} with information from this task. Note that the base intent in the
* task info will not include any extras or clip data.
@@ -6313,10 +6290,6 @@ class Task extends TaskFragment {
return mDisplayContent.getDisplayInfo();
}
- AnimatingActivityRegistry getAnimatingActivityRegistry() {
- return mAnimatingActivityRegistry;
- }
-
private Rect getRawBounds() {
return super.getBounds();
}
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index 324852d1a410..97a1a34336e9 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -394,6 +394,12 @@ class TaskFragment extends WindowContainer<WindowContainer> {
*/
private boolean mAllowTransitionWhenEmpty;
+ /**
+ * Specifies which configuration changes should trigger TaskFragment info changed callbacks.
+ * Only system TaskFragment organizers are allowed to set this value.
+ */
+ private @ActivityInfo.Config int mConfigurationChangeMaskForOrganizer;
+
/** When set, will force the task to report as invisible. */
static final int FLAG_FORCE_HIDDEN_FOR_PINNED_TASK = 1;
static final int FLAG_FORCE_HIDDEN_FOR_TASK_ORG = 1 << 1;
@@ -656,6 +662,17 @@ class TaskFragment extends WindowContainer<WindowContainer> {
mAllowTransitionWhenEmpty = allowTransitionWhenEmpty;
}
+ void setConfigurationChangeMaskForOrganizer(@ActivityInfo.Config int mask) {
+ // Only system organizers are allowed to set configuration change mask.
+ if (mTaskFragmentOrganizerController.isSystemOrganizer(mTaskFragmentOrganizer.asBinder())) {
+ mConfigurationChangeMaskForOrganizer = mask;
+ }
+ }
+
+ @ActivityInfo.Config int getConfigurationChangeMaskForOrganizer() {
+ return mConfigurationChangeMaskForOrganizer;
+ }
+
/** @see #mIsolatedNav */
boolean isIsolatedNav() {
return isEmbedded() && mIsolatedNav;
diff --git a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
index e63107cdc720..ae329d787156 100644
--- a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
@@ -349,8 +349,10 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
// Check if the info is different from the last reported info.
final TaskFragmentInfo info = tf.getTaskFragmentInfo();
final TaskFragmentInfo lastInfo = mLastSentTaskFragmentInfos.get(tf);
- if (info.equalsForTaskFragmentOrganizer(lastInfo) && configurationsAreEqualForOrganizer(
- info.getConfiguration(), lastInfo.getConfiguration())) {
+ final int configurationChangeMask = tf.getConfigurationChangeMaskForOrganizer();
+ if (info.equalsForTaskFragmentOrganizer(lastInfo)
+ && configurationsAreEqualForOrganizer(info.getConfiguration(),
+ lastInfo.getConfiguration(), configurationChangeMask)) {
return null;
}
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index 432ed1d0b61d..8a937721b347 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -113,27 +113,6 @@ class TaskSnapshotController extends AbsAppSnapshotController<Task, TaskSnapshot
enableLowResSnapshots, lowResScaleFactor, use16BitFormat);
}
- // Still needed for legacy transition.(AppTransitionControllerTest)
- void handleClosingApps(ArraySet<ActivityRecord> closingApps) {
- if (shouldDisableSnapshots()) {
- return;
- }
- // We need to take a snapshot of the task if and only if all activities of the task are
- // either closing or hidden.
- mTmpTasks.clear();
- for (int i = closingApps.size() - 1; i >= 0; i--) {
- final ActivityRecord activity = closingApps.valueAt(i);
- if (activity.isActivityTypeHome()) continue;
- final Task task = activity.getTask();
- if (task == null) continue;
-
- getClosingTasksInner(task, mTmpTasks);
- }
- snapshotTasks(mTmpTasks);
- mTmpTasks.clear();
- mSkipClosingAppSnapshotTasks.clear();
- }
-
/**
* Adds the given {@param tasks} to the list of tasks which should not have their snapshots
* taken upon the next processing of the set of closing apps. The caller is responsible for
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 55c2668f62d0..7af542f10127 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -3359,7 +3359,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
private Animation loadAnimation(WindowManager.LayoutParams lp, int transit, boolean enter,
boolean isVoiceInteraction) {
- if (AppTransitionController.isTaskViewTask(this) || (isOrganized()
+ if ((isOrganized()
// TODO(b/161711458): Clean-up when moved to shell.
&& getWindowingMode() != WINDOWING_MODE_FULLSCREEN
&& getWindowingMode() != WINDOWING_MODE_FREEFORM
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index bb669915e366..d699a689459e 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -347,7 +347,6 @@ import com.android.server.AnimationThread;
import com.android.server.DisplayThread;
import com.android.server.FgThread;
import com.android.server.LocalServices;
-import com.android.server.SystemConfig;
import com.android.server.UiThread;
import com.android.server.Watchdog;
import com.android.server.input.InputManagerService;
@@ -449,11 +448,6 @@ public class WindowManagerService extends IWindowManager.Stub
/**
* Use WMShell for app transition.
*/
- private static final String ENABLE_SHELL_TRANSITIONS = "persist.wm.debug.shell_transit";
-
- /**
- * @see #ENABLE_SHELL_TRANSITIONS
- */
public static final boolean sEnableShellTransitions = getShellTransitEnabled();
/**
@@ -10311,11 +10305,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
private static boolean getShellTransitEnabled() {
- android.content.pm.FeatureInfo autoFeature = SystemConfig.getInstance()
- .getAvailableFeatures().get(PackageManager.FEATURE_AUTOMOTIVE);
- if (autoFeature != null && autoFeature.version >= 0) {
- return SystemProperties.getBoolean(ENABLE_SHELL_TRANSITIONS, true);
- }
return true;
}
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 924b9de5a562..3b6a4dc6e1b0 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -2455,10 +2455,28 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
/** Whether the configuration changes are important to report back to an organizer. */
static boolean configurationsAreEqualForOrganizer(
Configuration newConfig, @Nullable Configuration oldConfig) {
+ return configurationsAreEqualForOrganizer(newConfig, oldConfig, 0 /* additionalMask */);
+ }
+
+ /**
+ * Whether the configuration changes are important to report back to an organizer.
+ *
+ * @param newConfig the new configuration
+ * @param oldConfig the old configuration
+ * @param additionalMask specifies additional configuration changes that the organizer is
+ * interested in. If the configuration change matches any bit in the mask,
+ * {@code false} is returned.
+ */
+ static boolean configurationsAreEqualForOrganizer(
+ Configuration newConfig, @Nullable Configuration oldConfig,
+ @ActivityInfo.Config int additionalMask) {
if (oldConfig == null) {
return false;
}
int cfgChanges = newConfig.diff(oldConfig);
+ if ((cfgChanges & additionalMask) != 0) {
+ return false;
+ }
final int winCfgChanges = (cfgChanges & ActivityInfo.CONFIG_WINDOW_CONFIGURATION) != 0
? (int) newConfig.windowConfiguration.diff(oldConfig.windowConfiguration,
true /* compareUndefined */) : 0;
@@ -2665,6 +2683,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
ownerActivity.getUid(), ownerActivity.info.processName);
if (mTaskFragmentOrganizerController.isSystemOrganizer(organizerToken.asBinder())) {
taskFragment.setOverrideOrientation(creationParams.getOverrideOrientation());
+ taskFragment.setConfigurationChangeMaskForOrganizer(
+ creationParams.getConfigurationChangeMask());
}
final int position;
if (creationParams.getPairedPrimaryFragmentToken() != null) {
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 883cab07914f..f07e6722d836 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -668,8 +668,10 @@ void NativeInputManager::setDisplayTopology(JNIEnv* env, jobject topologyGraph)
}
// TODO(b/383092013): Add topology validation
- mInputManager->getChoreographer().setDisplayTopology(
- android_hardware_display_DisplayTopologyGraph_toNative(env, topologyGraph));
+ const DisplayTopologyGraph displayTopology =
+ android_hardware_display_DisplayTopologyGraph_toNative(env, topologyGraph);
+ mInputManager->getDispatcher().setDisplayTopology(displayTopology);
+ mInputManager->getChoreographer().setDisplayTopology(displayTopology);
}
base::Result<std::unique_ptr<InputChannel>> NativeInputManager::createInputChannel(
diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java
index 2aa0c6b6dd0b..440eae5f7dea 100644
--- a/services/credentials/java/com/android/server/credentials/RequestSession.java
+++ b/services/credentials/java/com/android/server/credentials/RequestSession.java
@@ -446,7 +446,7 @@ abstract class RequestSession<T, U, V> implements CredentialManagerUi.Credential
@Override
public void binderDied() {
Slog.d(TAG, "Client binder died - clearing session");
- finishSession(isUiWaitingForData(), ApiStatus.CLIENT_CANCELED.getMetricCode());
+ finishSession(isUiWaitingForData(), ApiStatus.BINDER_DIED.getMetricCode());
}
}
diff --git a/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java b/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java
index ece729fe5b32..c21e645d797f 100644
--- a/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java
+++ b/services/credentials/java/com/android/server/credentials/metrics/ApiStatus.java
@@ -16,6 +16,7 @@
package com.android.server.credentials.metrics;
+import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_BINDER_DIED;
import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_CLIENT_CANCELED;
import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_FAILURE;
import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_SUCCESS;
@@ -27,7 +28,9 @@ public enum ApiStatus {
CLIENT_CANCELED(
CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_CLIENT_CANCELED),
USER_CANCELED(
- CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_USER_CANCELED);
+ CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_USER_CANCELED),
+ BINDER_DIED(
+ CREDENTIAL_MANAGER_FINAL_PHASE_REPORTED__API_STATUS__API_STATUS_BINDER_DIED);
private final int mInnerMetricCode;
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index e11c31c88c87..191c21e661d0 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -8288,8 +8288,11 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
Preconditions.checkCallAuthorization(isSystemUid(caller));
// Managed Profile password can only be changed when it has a separate challenge.
if (!isSeparateProfileChallengeEnabled(userId)) {
- Preconditions.checkCallAuthorization(!isManagedProfile(userId), "You can "
- + "not set the active password for a managed profile, userId = %d", userId);
+ if (isManagedProfile(userId)) {
+ Slogf.i(LOG_TAG, "You can not set the active password for a managed profile,"
+ + " userId = %d", userId);
+ return;
+ }
}
DevicePolicyData policy = getUserData(userId);
@@ -15993,8 +15996,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
@Override
public void notifyUnsafeOperationStateChanged(DevicePolicySafetyChecker checker, int reason,
boolean isSafe) {
- // TODO(b/178494483): use EventLog instead
- // TODO(b/178494483): log metrics?
if (VERBOSE_LOG) {
Slogf.v(LOG_TAG, "notifyUnsafeOperationStateChanged(): %s=%b",
DevicePolicyManager.operationSafetyReasonToString(reason), isSafe);
@@ -16006,16 +16007,20 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
extras.putInt(DeviceAdminReceiver.EXTRA_OPERATION_SAFETY_REASON, reason);
extras.putBoolean(DeviceAdminReceiver.EXTRA_OPERATION_SAFETY_STATE, isSafe);
- if (mOwners.hasDeviceOwner()) {
- if (VERBOSE_LOG) Slogf.v(LOG_TAG, "Notifying DO");
- sendDeviceOwnerCommand(DeviceAdminReceiver.ACTION_OPERATION_SAFETY_STATE_CHANGED,
- extras);
- }
- for (int profileOwnerId : mOwners.getProfileOwnerKeys()) {
- if (VERBOSE_LOG) Slogf.v(LOG_TAG, "Notifying PO for user " + profileOwnerId);
- sendProfileOwnerCommand(DeviceAdminReceiver.ACTION_OPERATION_SAFETY_STATE_CHANGED,
- extras, profileOwnerId);
- }
+ mInjector.binderWithCleanCallingIdentity(() -> {
+ if (mOwners.hasDeviceOwner()) {
+ if (VERBOSE_LOG) Slogf.v(LOG_TAG, "Notifying DO");
+ sendDeviceOwnerCommand(
+ DeviceAdminReceiver.ACTION_OPERATION_SAFETY_STATE_CHANGED,
+ extras);
+ }
+ for (int profileOwnerId : mOwners.getProfileOwnerKeys()) {
+ if (VERBOSE_LOG) Slogf.v(LOG_TAG, "Notifying PO for user " + profileOwnerId);
+ sendProfileOwnerCommand(
+ DeviceAdminReceiver.ACTION_OPERATION_SAFETY_STATE_CHANGED,
+ extras, profileOwnerId);
+ }
+ });
}
private @Mode int findInteractAcrossProfilesResetMode(String packageName) {
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index dae481a3c215..36947a2a6d62 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -3198,8 +3198,10 @@ void IncrementalService::DataLoaderStub::onDump(int fd) {
dprintf(fd, " }\n");
}
-void IncrementalService::AppOpsListener::opChanged(int32_t, const String16&) {
+binder::Status IncrementalService::AppOpsListener::opChanged(int32_t, int32_t,
+ const String16&, const String16&) {
incrementalService.onAppOpChanged(packageName);
+ return binder::Status::ok();
}
binder::Status IncrementalService::IncrementalServiceConnector::setStorageParams(
diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h
index b81e1b1b071c..4ee1a70dc34c 100644
--- a/services/incremental/IncrementalService.h
+++ b/services/incremental/IncrementalService.h
@@ -26,7 +26,7 @@
#include <android/os/incremental/BnStorageLoadingProgressListener.h>
#include <android/os/incremental/PerUidReadTimeouts.h>
#include <android/os/incremental/StorageHealthCheckParams.h>
-#include <binder/IAppOpsCallback.h>
+#include <binder/AppOpsManager.h>
#include <binder/PersistableBundle.h>
#include <utils/String16.h>
#include <utils/StrongPointer.h>
@@ -200,11 +200,12 @@ public:
void getMetrics(int32_t storageId, android::os::PersistableBundle* _aidl_return);
- class AppOpsListener : public android::BnAppOpsCallback {
+ class AppOpsListener : public com::android::internal::app::BnAppOpsCallback {
public:
AppOpsListener(IncrementalService& incrementalService, std::string packageName)
: incrementalService(incrementalService), packageName(std::move(packageName)) {}
- void opChanged(int32_t op, const String16& packageName) final;
+ binder::Status opChanged(int32_t op, int32_t uid, const String16& packageName,
+ const String16& persistentDeviceId) final;
private:
IncrementalService& incrementalService;
diff --git a/services/incremental/ServiceWrappers.h b/services/incremental/ServiceWrappers.h
index 39e2ee324e0c..36a5b7f4a75d 100644
--- a/services/incremental/ServiceWrappers.h
+++ b/services/incremental/ServiceWrappers.h
@@ -23,7 +23,7 @@
#include <android/content/pm/IDataLoader.h>
#include <android/content/pm/IDataLoaderStatusListener.h>
#include <android/os/incremental/PerUidReadTimeouts.h>
-#include <binder/IAppOpsCallback.h>
+#include <binder/AppOpsManager.h>
#include <binder/IServiceManager.h>
#include <binder/Status.h>
#include <incfs.h>
@@ -133,6 +133,7 @@ public:
class AppOpsManagerWrapper {
public:
+ using IAppOpsCallback = ::com::android::internal::app::IAppOpsCallback;
virtual ~AppOpsManagerWrapper() = default;
virtual binder::Status checkPermission(const char* permission, const char* operation,
const char* package) const = 0;
diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp
index d9d3d62e92e2..73849a3e0e00 100644
--- a/services/incremental/test/IncrementalServiceTest.cpp
+++ b/services/incremental/test/IncrementalServiceTest.cpp
@@ -1678,7 +1678,7 @@ TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChang
{}, {}));
ASSERT_GE(mDataLoader->setStorageParams(true), 0);
ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
- mAppOpsManager->mStoredCallback->opChanged(0, {});
+ mAppOpsManager->mStoredCallback->opChanged(0, 0, {}, {});
}
TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsCheckPermissionFails) {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index c974d9e1dc87..2bbd69c65eb8 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -894,6 +894,17 @@ public final class SystemServer implements Dumpable {
SystemServiceRegistry.sEnableServiceNotFoundWtf = true;
+ // Prepare the thread pool for init tasks that can be parallelized
+ SystemServerInitThreadPool tp = SystemServerInitThreadPool.start();
+ mDumper.addDumpable(tp);
+
+ if (android.server.Flags.earlySystemConfigInit()) {
+ // SystemConfig init is expensive, so enqueue the work as early as possible to allow
+ // concurrent execution before it's needed (typically by ActivityManagerService).
+ // As native library loading is also expensive, this is a good place to start.
+ startSystemConfigInit(t);
+ }
+
// Initialize native services.
System.loadLibrary("android_servers");
@@ -926,9 +937,6 @@ public final class SystemServer implements Dumpable {
mDumper.addDumpable(mSystemServiceManager);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
- // Prepare the thread pool for init tasks that can be parallelized
- SystemServerInitThreadPool tp = SystemServerInitThreadPool.start();
- mDumper.addDumpable(tp);
// Lazily load the pre-installed system font map in SystemServer only if we're not doing
// the optimized font loading in the FontManagerService.
@@ -1093,6 +1101,14 @@ public final class SystemServer implements Dumpable {
}
}
+ private void startSystemConfigInit(TimingsTraceAndSlog t) {
+ Slog.i(TAG, "Reading configuration...");
+ final String tagSystemConfig = "ReadingSystemConfig";
+ t.traceBegin(tagSystemConfig);
+ SystemServerInitThreadPool.submit(SystemConfig::getInstance, tagSystemConfig);
+ t.traceEnd();
+ }
+
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
@@ -1131,11 +1147,11 @@ public final class SystemServer implements Dumpable {
mDumper.addDumpable(watchdog);
t.traceEnd();
- Slog.i(TAG, "Reading configuration...");
- final String TAG_SYSTEM_CONFIG = "ReadingSystemConfig";
- t.traceBegin(TAG_SYSTEM_CONFIG);
- SystemServerInitThreadPool.submit(SystemConfig::getInstance, TAG_SYSTEM_CONFIG);
- t.traceEnd();
+ // Legacy entry point for starting SystemConfig init, only needed if the early init flag is
+ // disabled and we haven't already triggered init before bootstrap services.
+ if (!android.server.Flags.earlySystemConfigInit()) {
+ startSystemConfigInit(t);
+ }
// Orchestrates some ProtoLogging functionality.
if (android.tracing.Flags.clientSideProtoLogging()) {
diff --git a/services/java/com/android/server/flags.aconfig b/services/java/com/android/server/flags.aconfig
index 4d021ec2c0d3..86ccd878de7c 100644
--- a/services/java/com/android/server/flags.aconfig
+++ b/services/java/com/android/server/flags.aconfig
@@ -10,6 +10,13 @@ flag {
}
flag {
+ namespace: "system_performance"
+ name: "early_system_config_init"
+ description: "Perform earlier initialization of SystemConfig in system server startup."
+ bug: "383869534"
+}
+
+flag {
name: "remove_text_service"
namespace: "wear_frameworks"
description: "Remove TextServiceManagerService on Wear"
diff --git a/services/proguard.flags b/services/proguard.flags
index 0e1f68e03d7d..8d8b418ced0b 100644
--- a/services/proguard.flags
+++ b/services/proguard.flags
@@ -15,7 +15,10 @@
# APIs referenced by dependent JAR files and modules
# TODO(b/300514883): Pull @SystemApi keep rules from system-api.pro.
--keep interface android.annotation.SystemApi
+# TODO(b/373579455): Evaluate if <init> needs to be kept.
+-keep interface android.annotation.SystemApi {
+ void <init>();
+}
-keep @android.annotation.SystemApi class * {
public protected *;
}
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
index a103b0583eac..72e9cc566497 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
@@ -18,6 +18,10 @@ package com.android.inputmethodservice;
import static android.view.WindowInsets.Type.captionBar;
+import static com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper.EVENT_CONFIG;
+import static com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper.EVENT_HIDE;
+import static com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper.EVENT_SHOW;
+import static com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper.eventToString;
import static com.android.compatibility.common.util.SystemUtil.eventually;
import static com.android.cts.input.injectinputinprocess.InjectInputInProcessKt.clickOnViewCenter;
import static com.android.internal.inputmethod.InputMethodNavButtonFlags.IME_DRAWS_IME_NAV_BAR;
@@ -31,7 +35,6 @@ import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;
import android.app.Instrumentation;
-import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Insets;
import android.os.RemoteException;
@@ -42,7 +45,6 @@ import android.provider.Settings;
import android.server.wm.WindowManagerStateHelper;
import android.util.Log;
import android.view.WindowManagerGlobal;
-import android.view.WindowManagerPolicyConstants;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.Flags;
import android.view.inputmethod.InputMethodManager;
@@ -58,7 +60,9 @@ import androidx.test.uiautomator.UiObject2;
import androidx.test.uiautomator.Until;
import com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper;
+import com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper.Event;
import com.android.apps.inputmethod.simpleime.testing.TestActivity;
+import com.android.compatibility.common.util.GestureNavSwitchHelper;
import com.android.compatibility.common.util.SystemUtil;
import org.junit.After;
@@ -90,6 +94,8 @@ public class InputMethodServiceTest {
private final WindowManagerStateHelper mWmState = new WindowManagerStateHelper();
+ private final GestureNavSwitchHelper mGestureNavSwitchHelper = new GestureNavSwitchHelper();
+
private final DeviceFlagsValueProvider mFlagsValueProvider = new DeviceFlagsValueProvider();
@Rule
@@ -100,7 +106,6 @@ public class InputMethodServiceTest {
private Instrumentation mInstrumentation;
private UiDevice mUiDevice;
- private Context mContext;
private InputMethodManager mImm;
private String mTargetPackageName;
private String mInputMethodId;
@@ -112,8 +117,7 @@ public class InputMethodServiceTest {
public void setUp() throws Exception {
mInstrumentation = InstrumentationRegistry.getInstrumentation();
mUiDevice = UiDevice.getInstance(mInstrumentation);
- mContext = mInstrumentation.getContext();
- mImm = mContext.getSystemService(InputMethodManager.class);
+ mImm = mInstrumentation.getContext().getSystemService(InputMethodManager.class);
mTargetPackageName = mInstrumentation.getTargetContext().getPackageName();
mInputMethodId = getInputMethodId();
prepareIme();
@@ -169,6 +173,7 @@ public class InputMethodServiceTest {
Log.i(TAG, "Click on EditText");
verifyInputViewStatus(
() -> clickOnViewCenter(mActivity.getEditText()),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -185,6 +190,7 @@ public class InputMethodServiceTest {
verifyInputViewStatus(
() -> assertWithMessage("Home key press was handled")
.that(mUiDevice.pressHome()).isTrue(),
+ EVENT_HIDE,
true /* expected */,
false /* inputViewStarted */);
assertWithMessage("IME is not shown")
@@ -202,6 +208,7 @@ public class InputMethodServiceTest {
// Triggers to show IME via public API.
verifyInputViewStatusOnMainSync(
() -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -209,6 +216,7 @@ public class InputMethodServiceTest {
// Triggers to hide IME via public API.
verifyInputViewStatusOnMainSync(
() -> assertThat(mActivity.hideImeWithInputMethodManager(0 /* flags */)).isTrue(),
+ EVENT_HIDE,
true /* expected */,
false /* inputViewStarted */);
if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
@@ -232,6 +240,7 @@ public class InputMethodServiceTest {
// Triggers to show IME via public API.
verifyInputViewStatusOnMainSync(
() -> mActivity.showImeWithWindowInsetsController(),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -239,6 +248,7 @@ public class InputMethodServiceTest {
// Triggers to hide IME via public API.
verifyInputViewStatusOnMainSync(
() -> mActivity.hideImeWithWindowInsetsController(),
+ EVENT_HIDE,
true /* expected */,
false /* inputViewStarted */);
if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
@@ -267,6 +277,7 @@ public class InputMethodServiceTest {
Log.i(TAG, "Call IMS#requestShowSelf(0)");
verifyInputViewStatusOnMainSync(
() -> mInputMethodService.requestShowSelf(0 /* flags */),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -277,6 +288,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(
() -> mInputMethodService.requestHideSelf(
InputMethodManager.HIDE_IMPLICIT_ONLY),
+ EVENT_HIDE,
false /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is still shown after HIDE_IMPLICIT_ONLY")
@@ -287,6 +299,7 @@ public class InputMethodServiceTest {
Log.i(TAG, "Call IMS#requestHideSelf(0)");
verifyInputViewStatusOnMainSync(
() -> mInputMethodService.requestHideSelf(0 /* flags */),
+ EVENT_HIDE,
true /* expected */,
false /* inputViewStarted */);
if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
@@ -304,6 +317,7 @@ public class InputMethodServiceTest {
Log.i(TAG, "Call IMS#requestShowSelf(InputMethodManager.SHOW_IMPLICIT)");
verifyInputViewStatusOnMainSync(
() -> mInputMethodService.requestShowSelf(InputMethodManager.SHOW_IMPLICIT),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown with SHOW_IMPLICIT")
@@ -314,6 +328,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(
() -> mInputMethodService.requestHideSelf(
InputMethodManager.HIDE_IMPLICIT_ONLY),
+ EVENT_HIDE,
true /* expected */,
false /* inputViewStarted */);
assertWithMessage("IME is not shown after HIDE_IMPLICIT_ONLY")
@@ -409,6 +424,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(() -> assertThat(
mActivity.showImeWithInputMethodManager(
InputMethodManager.SHOW_IMPLICIT)).isTrue(),
+ EVENT_SHOW,
false /* expected */,
false /* inputViewStarted */);
assertWithMessage("IME is not shown after SHOW_IMPLICIT")
@@ -417,6 +433,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(
() -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */))
.isTrue(),
+ EVENT_SHOW,
false /* expected */,
false /* inputViewStarted */);
assertWithMessage("IME is not shown after SHOW_EXPLICIT")
@@ -438,6 +455,7 @@ public class InputMethodServiceTest {
// IME should be shown.
verifyInputViewStatusOnMainSync(
() -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -454,6 +472,7 @@ public class InputMethodServiceTest {
// the IME should be shown.
verifyInputViewStatusOnMainSync(() -> assertThat(
mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -483,6 +502,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(() -> assertThat(
mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -517,6 +537,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(() -> assertThat(
mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(),
+ EVENT_SHOW,
false /* expected */,
false /* inputViewStarted */);
assertWithMessage("IME is not shown")
@@ -540,6 +561,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(() -> assertThat(
mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -572,6 +594,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(() ->assertThat(
mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT))
.isTrue(),
+ EVENT_SHOW,
false /* expected */,
false /* inputViewStarted */);
assertWithMessage("IME is not shown")
@@ -600,6 +623,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(
() -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */))
.isTrue(),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -613,6 +637,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(
() -> mInputMethodService.onConfigurationChanged(config),
+ EVENT_CONFIG,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is still shown after a configuration change")
@@ -647,6 +672,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(() -> assertThat(
mActivity.showImeWithInputMethodManager(
InputMethodManager.SHOW_IMPLICIT)).isTrue(),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -666,6 +692,7 @@ public class InputMethodServiceTest {
// still alive.
verifyInputViewStatusOnMainSync(
() -> mInputMethodService.onConfigurationChanged(config),
+ EVENT_CONFIG,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is not shown after a configuration change")
@@ -695,6 +722,7 @@ public class InputMethodServiceTest {
// Explicit show request.
verifyInputViewStatusOnMainSync(() -> assertThat(
mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -703,6 +731,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(() -> assertThat(
mActivity.showImeWithInputMethodManager(
InputMethodManager.SHOW_IMPLICIT)).isTrue(),
+ EVENT_SHOW,
false /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is still shown")
@@ -713,6 +742,7 @@ public class InputMethodServiceTest {
// explicit show request, and thus not hide the IME.
verifyInputViewStatusOnMainSync(
() -> mInputMethodService.onConfigurationChanged(config),
+ EVENT_CONFIG,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is still shown after a configuration change")
@@ -739,12 +769,14 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(() -> assertThat(
mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_FORCED)).isTrue(),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
verifyInputViewStatusOnMainSync(() -> assertThat(
mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(),
+ EVENT_SHOW,
false /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is still shown")
@@ -753,6 +785,7 @@ public class InputMethodServiceTest {
verifyInputViewStatusOnMainSync(() -> assertThat(
mActivity.hideImeWithInputMethodManager(InputMethodManager.HIDE_NOT_ALWAYS))
.isTrue(),
+ EVENT_HIDE,
false /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is still shown after HIDE_NOT_ALWAYS")
@@ -812,6 +845,7 @@ public class InputMethodServiceTest {
setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
mActivity.showImeWithWindowInsetsController();
},
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -849,6 +883,7 @@ public class InputMethodServiceTest {
setDrawsImeNavBarAndSwitcherButton(false /* enabled */);
mActivity.showImeWithWindowInsetsController();
},
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -872,35 +907,34 @@ public class InputMethodServiceTest {
* Verifies that clicking on the IME navigation bar back button hides the IME.
*/
@Test
- public void testBackButtonClick() {
+ public void testBackButtonClick() throws Exception {
assumeTrue("Must have a navigation bar", hasNavigationBar());
- assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled());
waitUntilActivityReadyForInputInjection(mActivity);
setShowImeWithHardKeyboard(true /* enabled */);
- verifyInputViewStatusOnMainSync(
- () -> {
- setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
- mActivity.showImeWithWindowInsetsController();
- },
- true /* expected */,
- true /* inputViewStarted */);
- assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+ try (var ignored = mGestureNavSwitchHelper.withGestureNavigationMode()) {
+ verifyInputViewStatusOnMainSync(
+ () -> mActivity.showImeWithWindowInsetsController(),
+ EVENT_SHOW,
+ true /* expected */,
+ true /* inputViewStarted */);
+ assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
- final var backButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_BACK_ID));
- backButtonUiObject.click();
- mInstrumentation.waitForIdleSync();
+ final var backButton = getUiObject(By.res(INPUT_METHOD_NAV_BACK_ID));
+ backButton.click();
+ mInstrumentation.waitForIdleSync();
- if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
- // The IME visibility is only sent at the end of the animation. Therefore, we have to
- // wait until the visibility was sent to the server and the IME window hidden.
- eventually(() -> assertWithMessage("IME is not shown")
- .that(mInputMethodService.isInputViewShown()).isFalse());
- } else {
- assertWithMessage("IME is not shown")
- .that(mInputMethodService.isInputViewShown()).isFalse();
+ if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
+ // The IME visibility is only sent at the end of the animation. Therefore, we have
+ // to wait until the visibility was sent to the server and the IME window hidden.
+ eventually(() -> assertWithMessage("IME is not shown")
+ .that(mInputMethodService.isInputViewShown()).isFalse());
+ } else {
+ assertWithMessage("IME is not shown")
+ .that(mInputMethodService.isInputViewShown()).isFalse();
+ }
}
}
@@ -908,35 +942,34 @@ public class InputMethodServiceTest {
* Verifies that long clicking on the IME navigation bar back button hides the IME.
*/
@Test
- public void testBackButtonLongClick() {
+ public void testBackButtonLongClick() throws Exception {
assumeTrue("Must have a navigation bar", hasNavigationBar());
- assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled());
waitUntilActivityReadyForInputInjection(mActivity);
setShowImeWithHardKeyboard(true /* enabled */);
- verifyInputViewStatusOnMainSync(
- () -> {
- setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
- mActivity.showImeWithWindowInsetsController();
- },
- true /* expected */,
- true /* inputViewStarted */);
- assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+ try (var ignored = mGestureNavSwitchHelper.withGestureNavigationMode()) {
+ verifyInputViewStatusOnMainSync(
+ () -> mActivity.showImeWithWindowInsetsController(),
+ EVENT_SHOW,
+ true /* expected */,
+ true /* inputViewStarted */);
+ assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
- final var backButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_BACK_ID));
- backButtonUiObject.longClick();
- mInstrumentation.waitForIdleSync();
+ final var backButton = getUiObject(By.res(INPUT_METHOD_NAV_BACK_ID));
+ backButton.longClick();
+ mInstrumentation.waitForIdleSync();
- if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
- // The IME visibility is only sent at the end of the animation. Therefore, we have to
- // wait until the visibility was sent to the server and the IME window hidden.
- eventually(() -> assertWithMessage("IME is not shown")
- .that(mInputMethodService.isInputViewShown()).isFalse());
- } else {
- assertWithMessage("IME is not shown")
- .that(mInputMethodService.isInputViewShown()).isFalse();
+ if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) {
+ // The IME visibility is only sent at the end of the animation. Therefore, we have
+ // to wait until the visibility was sent to the server and the IME window hidden.
+ eventually(() -> assertWithMessage("IME is not shown")
+ .that(mInputMethodService.isInputViewShown()).isFalse());
+ } else {
+ assertWithMessage("IME is not shown")
+ .that(mInputMethodService.isInputViewShown()).isFalse();
+ }
}
}
@@ -945,103 +978,108 @@ public class InputMethodServiceTest {
* or switches the input method.
*/
@Test
- public void testImeSwitchButtonClick() {
+ public void testImeSwitchButtonClick() throws Exception {
assumeTrue("Must have a navigation bar", hasNavigationBar());
- assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled());
waitUntilActivityReadyForInputInjection(mActivity);
setShowImeWithHardKeyboard(true /* enabled */);
- verifyInputViewStatusOnMainSync(
- () -> {
- setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
- mActivity.showImeWithWindowInsetsController();
- },
- true /* expected */,
- true /* inputViewStarted */);
- assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+ try (var ignored = mGestureNavSwitchHelper.withGestureNavigationMode()) {
+ verifyInputViewStatusOnMainSync(
+ () -> {
+ setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
+ mActivity.showImeWithWindowInsetsController();
+ },
+ EVENT_SHOW,
+ true /* expected */,
+ true /* inputViewStarted */);
+ assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
- final var initialInfo = mImm.getCurrentInputMethodInfo();
+ final var initialInfo = mImm.getCurrentInputMethodInfo();
- final var imeSwitchButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_IME_SWITCHER_ID));
- imeSwitchButtonUiObject.click();
- mInstrumentation.waitForIdleSync();
+ final var imeSwitcherButton = getUiObject(By.res(INPUT_METHOD_NAV_IME_SWITCHER_ID));
+ imeSwitcherButton.click();
+ mInstrumentation.waitForIdleSync();
- final var newInfo = mImm.getCurrentInputMethodInfo();
+ final var newInfo = mImm.getCurrentInputMethodInfo();
- assertWithMessage("Input Method Switcher Menu is shown or input method was switched")
- .that(isInputMethodPickerShown(mImm) || !Objects.equals(initialInfo, newInfo))
- .isTrue();
+ assertWithMessage("Input Method Switcher Menu is shown or input method was switched")
+ .that(isInputMethodPickerShown(mImm) || !Objects.equals(initialInfo, newInfo))
+ .isTrue();
- assertWithMessage("IME is still shown after IME Switcher button was clicked")
- .that(mInputMethodService.isInputViewShown()).isTrue();
+ assertWithMessage("IME is still shown after IME Switcher button was clicked")
+ .that(mInputMethodService.isInputViewShown()).isTrue();
- // Hide the IME Switcher Menu before finishing.
- mUiDevice.pressBack();
+ // Hide the IME Switcher Menu before finishing.
+ mUiDevice.pressBack();
+ }
}
/**
* Verifies that long clicking on the IME switch button shows the Input Method Switcher Menu.
*/
@Test
- public void testImeSwitchButtonLongClick() {
+ public void testImeSwitchButtonLongClick() throws Exception {
assumeTrue("Must have a navigation bar", hasNavigationBar());
- assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled());
waitUntilActivityReadyForInputInjection(mActivity);
setShowImeWithHardKeyboard(true /* enabled */);
- verifyInputViewStatusOnMainSync(
- () -> {
- setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
- mActivity.showImeWithWindowInsetsController();
- },
- true /* expected */,
- true /* inputViewStarted */);
- assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
+ try (var ignored = mGestureNavSwitchHelper.withGestureNavigationMode()) {
+ verifyInputViewStatusOnMainSync(
+ () -> {
+ setDrawsImeNavBarAndSwitcherButton(true /* enabled */);
+ mActivity.showImeWithWindowInsetsController();
+ },
+ EVENT_SHOW,
+ true /* expected */,
+ true /* inputViewStarted */);
+ assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
- final var imeSwitchButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_IME_SWITCHER_ID));
- imeSwitchButtonUiObject.longClick();
- mInstrumentation.waitForIdleSync();
+ final var imeSwitcherButton = getUiObject(By.res(INPUT_METHOD_NAV_IME_SWITCHER_ID));
+ imeSwitcherButton.longClick();
+ mInstrumentation.waitForIdleSync();
- assertWithMessage("Input Method Switcher Menu is shown")
- .that(isInputMethodPickerShown(mImm)).isTrue();
- assertWithMessage("IME is still shown after IME Switcher button was long clicked")
- .that(mInputMethodService.isInputViewShown()).isTrue();
+ assertWithMessage("Input Method Switcher Menu is shown")
+ .that(isInputMethodPickerShown(mImm)).isTrue();
+ assertWithMessage("IME is still shown after IME Switcher button was long clicked")
+ .that(mInputMethodService.isInputViewShown()).isTrue();
- // Hide the IME Switcher Menu before finishing.
- mUiDevice.pressBack();
+ // Hide the IME Switcher Menu before finishing.
+ mUiDevice.pressBack();
+ }
}
- private void verifyInputViewStatus(@NonNull Runnable runnable, boolean expected,
- boolean inputViewStarted) {
- verifyInputViewStatusInternal(runnable, expected, inputViewStarted,
+ private void verifyInputViewStatus(@NonNull Runnable runnable, @Event int event,
+ boolean expected, boolean inputViewStarted) {
+ verifyInputViewStatusInternal(runnable, event, expected, inputViewStarted,
false /* runOnMainSync */);
}
- private void verifyInputViewStatusOnMainSync(@NonNull Runnable runnable, boolean expected,
- boolean inputViewStarted) {
- verifyInputViewStatusInternal(runnable, expected, inputViewStarted,
+ private void verifyInputViewStatusOnMainSync(@NonNull Runnable runnable, @Event int event,
+ boolean expected, boolean inputViewStarted) {
+ verifyInputViewStatusInternal(runnable, event, expected, inputViewStarted,
true /* runOnMainSync */);
}
/**
- * Verifies the status of the Input View after executing the given runnable.
+ * Verifies the status of the Input View after executing the given runnable, and waiting that
+ * the event was either triggered or not, based on the given expectation.
*
- * @param runnable the runnable to execute for showing or hiding the IME.
- * @param expected whether the runnable is expected to trigger the signal.
+ * @param runnable the runnable to trigger the event
+ * @param event the event to await.
+ * @param expected whether the event is expected to be triggered.
* @param inputViewStarted the expected state of the Input View after executing the runnable.
* @param runOnMainSync whether to execute the runnable on the main thread.
*/
- private void verifyInputViewStatusInternal(@NonNull Runnable runnable, boolean expected,
- boolean inputViewStarted, boolean runOnMainSync) {
+ private void verifyInputViewStatusInternal(@NonNull Runnable runnable, @Event int event,
+ boolean expected, boolean inputViewStarted, boolean runOnMainSync) {
final boolean completed;
try {
final var latch = new CountDownLatch(1);
- mInputMethodService.setCountDownLatchForTesting(latch);
- // Trigger onStartInputView() / onFinishInputView() / onConfigurationChanged()
+ mInputMethodService.setCountDownLatchForTesting(latch, event);
if (runOnMainSync) {
mInstrumentation.runOnMainSync(runnable);
} else {
@@ -1053,15 +1091,13 @@ public class InputMethodServiceTest {
fail("Interrupted while waiting for latch: " + e.getMessage());
return;
} finally {
- mInputMethodService.setCountDownLatchForTesting(null);
+ mInputMethodService.setCountDownLatchForTesting(null /* latch */, event);
}
if (expected && !completed) {
- fail("Timed out waiting for"
- + " onStartInputView() / onFinishInputView() / onConfigurationChanged()");
+ fail("Timed out waiting for " + eventToString(event));
} else if (!expected && completed) {
- fail("Unexpected call"
- + " onStartInputView() / onFinishInputView() / onConfigurationChanged()");
+ fail("Unexpected call " + eventToString(event));
}
// Input is not finished.
assertWithMessage("Input connection is still started")
@@ -1097,7 +1133,7 @@ public class InputMethodServiceTest {
*/
private void verifyFullscreenMode(@NonNull Runnable runnable, boolean expected,
boolean orientationPortrait) {
- verifyInputViewStatus(runnable, expected, false /* inputViewStarted */);
+ verifyInputViewStatus(runnable, EVENT_CONFIG, expected, false /* inputViewStarted */);
if (expected) {
// Wait for the TestActivity to be recreated.
eventually(() -> assertWithMessage("Activity was re-created after rotation")
@@ -1105,10 +1141,14 @@ public class InputMethodServiceTest {
// Get the new TestActivity.
mActivity = TestActivity.getLastCreatedInstance();
assertWithMessage("Re-created activity is not null").that(mActivity).isNotNull();
+ // Wait for the new EditText to be served by InputMethodManager.
+ eventually(() -> assertWithMessage("Has an input connection to the re-created Activity")
+ .that(mImm.hasActiveInputConnection(mActivity.getEditText())).isTrue());
}
verifyInputViewStatusOnMainSync(
() -> mActivity.showImeWithWindowInsetsController(),
+ EVENT_SHOW,
true /* expected */,
true /* inputViewStarted */);
assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue();
@@ -1134,6 +1174,7 @@ public class InputMethodServiceTest {
// Hide IME before finishing the run.
verifyInputViewStatusOnMainSync(
() -> mActivity.hideImeWithWindowInsetsController(),
+ EVENT_HIDE,
true /* expected */,
false /* inputViewStarted */);
@@ -1214,18 +1255,12 @@ public class InputMethodServiceTest {
return uiObject;
}
- /** Checks whether gesture navigation move is enabled. */
- private boolean isGestureNavEnabled() {
- return mContext.getResources().getInteger(
- com.android.internal.R.integer.config_navBarInteractionMode)
- == WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
- }
-
/** Checks whether the device has a navigation bar on the IME's display. */
private boolean hasNavigationBar() {
try {
return WindowManagerGlobal.getWindowManagerService()
- .hasNavigationBar(mInputMethodService.getDisplayId());
+ .hasNavigationBar(mInputMethodService.getDisplayId())
+ && mGestureNavSwitchHelper.hasNavigationBar();
} catch (RemoteException e) {
fail("Failed to check whether the device has a navigation bar: " + e.getMessage());
return false;
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/Android.bp b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/Android.bp
index 8a12dcd0add4..e2362f7fa24f 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/Android.bp
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/Android.bp
@@ -53,6 +53,9 @@ android_library {
srcs: [
"src/com/android/apps/inputmethod/simpleime/ims/*.java",
],
+ static_libs: [
+ "androidx.annotation_annotation",
+ ],
sdk_version: "current",
}
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/AndroidManifest.xml b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/AndroidManifest.xml
index cf7d660a68ef..00873de4aaed 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/AndroidManifest.xml
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/AndroidManifest.xml
@@ -42,6 +42,7 @@
<activity android:name="com.android.apps.inputmethod.simpleime.testing.TestActivity"
android:exported="false"
android:label="TestActivity"
+ android:configChanges="assetsPaths"
android:launchMode="singleInstance"
android:excludeFromRecents="true"
android:noHistory="true"
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/res/layout/input_view.xml b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/res/layout/input_view.xml
deleted file mode 100644
index f2292701e795..000000000000
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/res/layout/input_view.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2022 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/input"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/> \ No newline at end of file
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/KeyCodeConstants.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/KeyCodeConstants.java
index 990fa24aad22..428ce1f6e1f6 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/KeyCodeConstants.java
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/KeyCodeConstants.java
@@ -18,51 +18,58 @@ package com.android.apps.inputmethod.simpleime;
import android.view.KeyEvent;
-import java.util.HashMap;
+import androidx.annotation.NonNull;
/** Holder of key codes and their name. */
-public final class KeyCodeConstants {
- private KeyCodeConstants() {}
+final class KeyCodeConstants {
- static final HashMap<String, Integer> KEY_NAME_TO_CODE_MAP = new HashMap<>();
+ private KeyCodeConstants() {
+ }
- static {
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_A", KeyEvent.KEYCODE_A);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_B", KeyEvent.KEYCODE_B);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_C", KeyEvent.KEYCODE_C);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_D", KeyEvent.KEYCODE_D);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_E", KeyEvent.KEYCODE_E);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_F", KeyEvent.KEYCODE_F);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_G", KeyEvent.KEYCODE_G);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_H", KeyEvent.KEYCODE_H);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_I", KeyEvent.KEYCODE_I);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_J", KeyEvent.KEYCODE_J);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_K", KeyEvent.KEYCODE_K);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_L", KeyEvent.KEYCODE_L);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_M", KeyEvent.KEYCODE_M);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_N", KeyEvent.KEYCODE_N);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_O", KeyEvent.KEYCODE_O);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_P", KeyEvent.KEYCODE_P);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_Q", KeyEvent.KEYCODE_Q);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_R", KeyEvent.KEYCODE_R);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_S", KeyEvent.KEYCODE_S);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_T", KeyEvent.KEYCODE_T);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_U", KeyEvent.KEYCODE_U);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_V", KeyEvent.KEYCODE_V);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_W", KeyEvent.KEYCODE_W);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_X", KeyEvent.KEYCODE_X);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_Y", KeyEvent.KEYCODE_Y);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_Z", KeyEvent.KEYCODE_Z);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_SHIFT", KeyEvent.KEYCODE_SHIFT_LEFT);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_DEL", KeyEvent.KEYCODE_DEL);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_SPACE", KeyEvent.KEYCODE_SPACE);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_ENTER", KeyEvent.KEYCODE_ENTER);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_COMMA", KeyEvent.KEYCODE_COMMA);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_PERIOD", KeyEvent.KEYCODE_PERIOD);
- KEY_NAME_TO_CODE_MAP.put("KEYCODE_TAB", KeyEvent.KEYCODE_TAB);
+ /**
+ * Returns the keyCode value corresponding to the given keyCode name.
+ *
+ * @param keyCodeName the keyCode name.
+ */
+ static int getKeyCode(@NonNull String keyCodeName) {
+ return switch (keyCodeName) {
+ case "KEYCODE_A" -> KeyEvent.KEYCODE_A;
+ case "KEYCODE_B" -> KeyEvent.KEYCODE_B;
+ case "KEYCODE_C" -> KeyEvent.KEYCODE_C;
+ case "KEYCODE_D" -> KeyEvent.KEYCODE_D;
+ case "KEYCODE_E" -> KeyEvent.KEYCODE_E;
+ case "KEYCODE_F" -> KeyEvent.KEYCODE_F;
+ case "KEYCODE_G" -> KeyEvent.KEYCODE_G;
+ case "KEYCODE_H" -> KeyEvent.KEYCODE_H;
+ case "KEYCODE_I" -> KeyEvent.KEYCODE_I;
+ case "KEYCODE_J" -> KeyEvent.KEYCODE_J;
+ case "KEYCODE_K" -> KeyEvent.KEYCODE_K;
+ case "KEYCODE_L" -> KeyEvent.KEYCODE_L;
+ case "KEYCODE_M" -> KeyEvent.KEYCODE_M;
+ case "KEYCODE_N" -> KeyEvent.KEYCODE_N;
+ case "KEYCODE_O" -> KeyEvent.KEYCODE_O;
+ case "KEYCODE_P" -> KeyEvent.KEYCODE_P;
+ case "KEYCODE_Q" -> KeyEvent.KEYCODE_Q;
+ case "KEYCODE_R" -> KeyEvent.KEYCODE_R;
+ case "KEYCODE_S" -> KeyEvent.KEYCODE_S;
+ case "KEYCODE_T" -> KeyEvent.KEYCODE_T;
+ case "KEYCODE_U" -> KeyEvent.KEYCODE_U;
+ case "KEYCODE_V" -> KeyEvent.KEYCODE_V;
+ case "KEYCODE_W" -> KeyEvent.KEYCODE_W;
+ case "KEYCODE_X" -> KeyEvent.KEYCODE_X;
+ case "KEYCODE_Y" -> KeyEvent.KEYCODE_Y;
+ case "KEYCODE_Z" -> KeyEvent.KEYCODE_Z;
+ case "KEYCODE_SHIFT" -> KeyEvent.KEYCODE_SHIFT_LEFT;
+ case "KEYCODE_DEL" -> KeyEvent.KEYCODE_DEL;
+ case "KEYCODE_SPACE" -> KeyEvent.KEYCODE_SPACE;
+ case "KEYCODE_ENTER" -> KeyEvent.KEYCODE_ENTER;
+ case "KEYCODE_COMMA" -> KeyEvent.KEYCODE_COMMA;
+ case "KEYCODE_PERIOD" -> KeyEvent.KEYCODE_PERIOD;
+ default -> KeyEvent.KEYCODE_UNKNOWN;
+ };
}
- public static boolean isAlphaKeyCode(int keyCode) {
+ static boolean isAlphaKeyCode(int keyCode) {
return keyCode >= KeyEvent.KEYCODE_A && keyCode <= KeyEvent.KEYCODE_Z;
}
}
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java
index 61d1bb931a96..de9b5289be9d 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java
@@ -20,45 +20,41 @@ import android.inputmethodservice.InputMethodService;
import android.os.SystemClock;
import android.util.Log;
import android.view.KeyEvent;
-import android.view.LayoutInflater;
import android.view.View;
-import android.view.inputmethod.EditorInfo;
-import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper;
-/** The {@link InputMethodService} implementation for SimpleTestIme app. */
+/** A simple implementation of an {@link InputMethodService}. */
public final class SimpleInputMethodService extends InputMethodServiceWrapper {
private static final String TAG = "SimpleIMS";
- private FrameLayout mInputView;
-
@Override
public View onCreateInputView() {
Log.i(TAG, "onCreateInputView()");
- mInputView = (FrameLayout) LayoutInflater.from(this).inflate(R.layout.input_view, null);
- return mInputView;
- }
-
- @Override
- public void onStartInputView(EditorInfo info, boolean restarting) {
- super.onStartInputView(info, restarting);
- mInputView.removeAllViews();
- final var keyboard = new SimpleKeyboard(this, R.layout.qwerty_10_9_9);
- mInputView.addView(keyboard.inflateKeyboardView(LayoutInflater.from(this), mInputView));
+ final var simpleKeyboard = new SimpleKeyboardView(this);
+ simpleKeyboard.setKeyPressListener(this::onKeyPress);
+ return simpleKeyboard;
}
- void handleKeyPress(@NonNull String keyCodeName, int keyboardState) {
- final Integer keyCode = KeyCodeConstants.KEY_NAME_TO_CODE_MAP.get(keyCodeName);
- Log.v(TAG, "keyCode: " + keyCode);
- if (keyCode != null) {
- final var downTime = SystemClock.uptimeMillis();
- getCurrentInputConnection().sendKeyEvent(new KeyEvent(downTime, downTime,
- KeyEvent.ACTION_DOWN, keyCode, 0 /* repeat */,
- KeyCodeConstants.isAlphaKeyCode(keyCode) ? keyboardState : 0) /* metaState */);
+ /**
+ * Called when a key is pressed.
+ *
+ * @param keyCodeName the keycode of the key, as a string.
+ * @param metaState the flags indicating which meta keys are currently pressed.
+ */
+ private void onKeyPress(@NonNull String keyCodeName, int metaState) {
+ final int keyCode = KeyCodeConstants.getKeyCode(keyCodeName);
+ Log.v(TAG, "onKeyPress: " + keyCode);
+ if (keyCode != KeyEvent.KEYCODE_UNKNOWN) {
+ final var ic = getCurrentInputConnection();
+ if (ic != null) {
+ final var downTime = SystemClock.uptimeMillis();
+ ic.sendKeyEvent(new KeyEvent(downTime, downTime, KeyEvent.ACTION_DOWN, keyCode,
+ 0 /* repeat */, KeyCodeConstants.isAlphaKeyCode(keyCode) ? metaState : 0));
+ }
}
}
}
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboard.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboard.java
deleted file mode 100644
index 62d90c8d56b5..000000000000
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboard.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.apps.inputmethod.simpleime;
-
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-/** Controls the visible virtual keyboard view. */
-final class SimpleKeyboard {
-
- private static final String TAG = "SimpleKeyboard";
-
- private static final int[] SOFT_KEY_IDS = new int[]{
- R.id.key_pos_0_0,
- R.id.key_pos_0_1,
- R.id.key_pos_0_2,
- R.id.key_pos_0_3,
- R.id.key_pos_0_4,
- R.id.key_pos_0_5,
- R.id.key_pos_0_6,
- R.id.key_pos_0_7,
- R.id.key_pos_0_8,
- R.id.key_pos_0_9,
- R.id.key_pos_1_0,
- R.id.key_pos_1_1,
- R.id.key_pos_1_2,
- R.id.key_pos_1_3,
- R.id.key_pos_1_4,
- R.id.key_pos_1_5,
- R.id.key_pos_1_6,
- R.id.key_pos_1_7,
- R.id.key_pos_1_8,
- R.id.key_pos_2_0,
- R.id.key_pos_2_1,
- R.id.key_pos_2_2,
- R.id.key_pos_2_3,
- R.id.key_pos_2_4,
- R.id.key_pos_2_5,
- R.id.key_pos_2_6,
- R.id.key_pos_shift,
- R.id.key_pos_del,
- R.id.key_pos_symbol,
- R.id.key_pos_comma,
- R.id.key_pos_space,
- R.id.key_pos_period,
- R.id.key_pos_enter,
- };
-
- @NonNull
- private final SimpleInputMethodService mSimpleInputMethodService;
- private final int mViewResId;
- private final SparseArray<TextView> mSoftKeyViews = new SparseArray<>();
- private View mKeyboardView;
- private int mKeyboardState;
-
- SimpleKeyboard(@NonNull SimpleInputMethodService simpleInputMethodService, int viewResId) {
- mSimpleInputMethodService = simpleInputMethodService;
- mViewResId = viewResId;
- mKeyboardState = 0;
- }
-
- @NonNull
- View inflateKeyboardView(@NonNull LayoutInflater inflater, @NonNull ViewGroup inputView) {
- mKeyboardView = inflater.inflate(mViewResId, inputView, false);
- mapSoftKeys();
- return mKeyboardView;
- }
-
- private void mapSoftKeys() {
- for (int id : SOFT_KEY_IDS) {
- final TextView softKeyView = mKeyboardView.requireViewById(id);
- mSoftKeyViews.put(id, softKeyView);
- final var keyCodeName = softKeyView.getTag() != null
- ? softKeyView.getTag().toString() : null;
- softKeyView.setOnClickListener(v -> handleKeyPress(keyCodeName));
- }
- }
-
- private void handleKeyPress(@Nullable String keyCodeName) {
- Log.i(TAG, "handle(): " + keyCodeName);
- if (TextUtils.isEmpty(keyCodeName)) {
- return;
- }
- if ("KEYCODE_SHIFT".equals(keyCodeName)) {
- handleShift();
- return;
- }
-
- mSimpleInputMethodService.handleKeyPress(keyCodeName, mKeyboardState);
- }
-
- private void handleShift() {
- mKeyboardState = toggleShiftState(mKeyboardState);
- Log.v(TAG, "currentKeyboardState: " + mKeyboardState);
- final boolean isShiftOn = isShiftOn(mKeyboardState);
- for (int i = 0; i < mSoftKeyViews.size(); i++) {
- TextView softKeyView = mSoftKeyViews.valueAt(i);
- softKeyView.setAllCaps(isShiftOn);
- }
- }
-
- private static boolean isShiftOn(int state) {
- return (state & KeyEvent.META_SHIFT_ON) == KeyEvent.META_SHIFT_ON;
- }
-
- private static int toggleShiftState(int state) {
- return state ^ KeyEvent.META_SHIFT_ON;
- }
-}
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboardView.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboardView.java
new file mode 100644
index 000000000000..55d1b451c6b0
--- /dev/null
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboardView.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.apps.inputmethod.simpleime;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import androidx.annotation.AttrRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/** A simple implementation of a software keyboard view. */
+final class SimpleKeyboardView extends FrameLayout {
+
+ private static final String TAG = "SimpleKeyboard";
+
+ private static final int[] SOFT_KEY_IDS = new int[]{
+ R.id.key_pos_0_0,
+ R.id.key_pos_0_1,
+ R.id.key_pos_0_2,
+ R.id.key_pos_0_3,
+ R.id.key_pos_0_4,
+ R.id.key_pos_0_5,
+ R.id.key_pos_0_6,
+ R.id.key_pos_0_7,
+ R.id.key_pos_0_8,
+ R.id.key_pos_0_9,
+ R.id.key_pos_1_0,
+ R.id.key_pos_1_1,
+ R.id.key_pos_1_2,
+ R.id.key_pos_1_3,
+ R.id.key_pos_1_4,
+ R.id.key_pos_1_5,
+ R.id.key_pos_1_6,
+ R.id.key_pos_1_7,
+ R.id.key_pos_1_8,
+ R.id.key_pos_2_0,
+ R.id.key_pos_2_1,
+ R.id.key_pos_2_2,
+ R.id.key_pos_2_3,
+ R.id.key_pos_2_4,
+ R.id.key_pos_2_5,
+ R.id.key_pos_2_6,
+ R.id.key_pos_shift,
+ R.id.key_pos_del,
+ R.id.key_pos_symbol,
+ R.id.key_pos_comma,
+ R.id.key_pos_space,
+ R.id.key_pos_period,
+ R.id.key_pos_enter,
+ };
+
+ private final SparseArray<TextView> mSoftKeyViews = new SparseArray<>();
+
+ @FunctionalInterface
+ interface KeyPressListener {
+
+ /**
+ * Called when a key is pressed.
+ *
+ * @param keyCodeName the keycode of the key, as a string.
+ * @param metaState the flags indicating which meta keys are currently pressed.
+ */
+ void onKeyPress(@NonNull String keyCodeName, int metaState);
+ }
+
+ /** A listener to react to key presses. */
+ @Nullable
+ private KeyPressListener mKeyPressListener;
+
+ /** The flags indicating which meta keys are currently pressed. */
+ private int mMetaState;
+
+ SimpleKeyboardView(@NonNull Context context) {
+ this(context, null);
+ }
+
+ SimpleKeyboardView(@NonNull Context context, @Nullable AttributeSet attrs) {
+ this(context, attrs, 0 /* defStyleAttr */);
+ }
+
+ SimpleKeyboardView(@NonNull Context context, @Nullable AttributeSet attrs,
+ @AttrRes int defStyleAttr) {
+ super(context, attrs, defStyleAttr, 0 /* defStyleRes */);
+ LayoutInflater.from(context).inflate(R.layout.qwerty_10_9_9, this, true);
+ mapSoftKeys();
+ }
+
+ /**
+ * Sets the key press listener.
+ *
+ * @param listener the listener to set.
+ */
+ void setKeyPressListener(@NonNull KeyPressListener listener) {
+ mKeyPressListener = listener;
+ }
+
+ /** Maps the soft key ids to their corresponding views, and sets their on click listener. */
+ private void mapSoftKeys() {
+ for (final int id : SOFT_KEY_IDS) {
+ final TextView softKeyView = requireViewById(id);
+ mSoftKeyViews.put(id, softKeyView);
+ final var keyCodeName = softKeyView.getTag() != null
+ ? softKeyView.getTag().toString() : null;
+ softKeyView.setOnClickListener(v -> onKeyPress(keyCodeName));
+ }
+ }
+
+ /**
+ * Called when a key is pressed.
+ *
+ * @param keyCodeName the keycode of the key, as a string.
+ */
+ private void onKeyPress(@Nullable String keyCodeName) {
+ Log.i(TAG, "onKeyPress: " + keyCodeName);
+ if (TextUtils.isEmpty(keyCodeName)) {
+ return;
+ }
+ if ("KEYCODE_SHIFT".equals(keyCodeName)) {
+ onShiftPress();
+ return;
+ }
+
+ if (mKeyPressListener != null) {
+ mKeyPressListener.onKeyPress(keyCodeName, mMetaState);
+ }
+ }
+
+ /**
+ * Called when the shift key is pressed. This will toggle the capitalization of all the keys.
+ */
+ private void onShiftPress() {
+ mMetaState = toggleShiftState(mMetaState);
+ Log.v(TAG, "onShiftPress, new metaState: " + mMetaState);
+ final boolean isShiftOn = isShiftOn(mMetaState);
+ for (int i = 0; i < mSoftKeyViews.size(); i++) {
+ final TextView softKeyView = mSoftKeyViews.valueAt(i);
+ softKeyView.setAllCaps(isShiftOn);
+ }
+ }
+
+ /**
+ * Checks whether the shift meta key is pressed.
+ *
+ * @param state the flags indicating which meta keys are currently pressed.
+ */
+ private static boolean isShiftOn(int state) {
+ return (state & KeyEvent.META_SHIFT_ON) == KeyEvent.META_SHIFT_ON;
+ }
+
+ /**
+ * Toggles the value of the shift meta key being pressed.
+ *
+ * @param state the flags indicating which meta keys are currently pressed.
+ * @return a new flag state, with the shift meta key value flipped.
+ */
+ private static int toggleShiftState(int state) {
+ return state ^ KeyEvent.META_SHIFT_ON;
+ }
+}
diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java
index be59dd2cb7a3..3a7abbb167ec 100644
--- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java
+++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java
@@ -21,6 +21,12 @@ import android.inputmethodservice.InputMethodService;
import android.util.Log;
import android.view.inputmethod.EditorInfo;
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.CountDownLatch;
/** Wrapper of {@link InputMethodService} to expose interfaces for testing purpose. */
@@ -29,16 +35,41 @@ public class InputMethodServiceWrapper extends InputMethodService {
private static final String TAG = "InputMethodServiceWrapper";
/** Last created instance of this wrapper. */
+ @Nullable
private static InputMethodServiceWrapper sInstance;
+ /** IME show event ({@link #onStartInputView}). */
+ public static final int EVENT_SHOW = 0;
+
+ /** IME hide event ({@link #onFinishInputView}). */
+ public static final int EVENT_HIDE = 1;
+
+ /** IME configuration change event ({@link #onConfigurationChanged}). */
+ public static final int EVENT_CONFIG = 2;
+
+ /** The type of event that can be waited with a latch. */
+ @IntDef(value = {
+ EVENT_SHOW,
+ EVENT_HIDE,
+ EVENT_CONFIG,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Event {}
+
+ /** The IME event type that the current latch, if any, waits on. */
+ @Event
+ private int mLatchEvent;
+
private boolean mInputViewStarted;
/**
* @see #setCountDownLatchForTesting
*/
- private CountDownLatch mCountDownLatchForTesting;
+ @Nullable
+ private CountDownLatch mCountDownLatch;
/** Gets the last created instance of this wrapper, if available. */
+ @Nullable
public static InputMethodServiceWrapper getInstance() {
return sInstance;
}
@@ -48,14 +79,14 @@ public class InputMethodServiceWrapper extends InputMethodService {
}
/**
- * Sets the latch used to wait for the IME to start showing ({@link #onStartInputView},
- * start hiding ({@link #onFinishInputView}) or receive a configuration change
- * ({@link #onConfigurationChanged}).
+ * Sets the latch used to wait for the IME event.
*
- * @param countDownLatchForTesting the latch to wait on.
+ * @param latch the latch to wait on.
+ * @param latchEvent the event to set the latch on.
*/
- public void setCountDownLatchForTesting(CountDownLatch countDownLatchForTesting) {
- mCountDownLatchForTesting = countDownLatchForTesting;
+ public void setCountDownLatchForTesting(@Nullable CountDownLatch latch, @Event int latchEvent) {
+ mCountDownLatch = latch;
+ mLatchEvent = latchEvent;
}
@Override
@@ -77,8 +108,8 @@ public class InputMethodServiceWrapper extends InputMethodService {
+ ", restarting=" + restarting);
super.onStartInputView(info, restarting);
mInputViewStarted = true;
- if (mCountDownLatchForTesting != null) {
- mCountDownLatchForTesting.countDown();
+ if (mCountDownLatch != null && mLatchEvent == EVENT_SHOW) {
+ mCountDownLatch.countDown();
}
}
@@ -94,8 +125,8 @@ public class InputMethodServiceWrapper extends InputMethodService {
super.onFinishInputView(finishingInput);
mInputViewStarted = false;
- if (mCountDownLatchForTesting != null) {
- mCountDownLatchForTesting.countDown();
+ if (mCountDownLatch != null && mLatchEvent == EVENT_HIDE) {
+ mCountDownLatch.countDown();
}
}
@@ -110,11 +141,27 @@ public class InputMethodServiceWrapper extends InputMethodService {
Log.i(TAG, "onConfigurationChanged() " + newConfig);
super.onConfigurationChanged(newConfig);
- if (mCountDownLatchForTesting != null) {
- mCountDownLatchForTesting.countDown();
+ if (mCountDownLatch != null && mLatchEvent == EVENT_CONFIG) {
+ mCountDownLatch.countDown();
}
}
+ /**
+ * Gets the string representation of the IME event that is being waited on.
+ *
+ * @param event the IME event.
+ */
+ @NonNull
+ public static String eventToString(@Event int event) {
+ return switch (event) {
+ case EVENT_SHOW -> "onStartInputView";
+ case EVENT_HIDE -> "onFinishInputView";
+ case EVENT_CONFIG -> "onConfigurationChanged";
+ default -> "unknownEvent";
+ };
+ }
+
+ @NonNull
private String dumpEditorInfo(EditorInfo info) {
if (info == null) {
return "null";
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueImplTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueImplTest.java
index 317e19abe511..409706b14c56 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueImplTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueImplTest.java
@@ -1550,6 +1550,7 @@ public final class BroadcastQueueImplTest extends BaseBroadcastQueueTest {
verifyPendingRecords(queue, List.of(closeSystemDialogs1, closeSystemDialogs2));
}
+ @SuppressWarnings("GuardedBy")
@Test
public void testDeliveryGroupPolicy_sameAction_multiplePolicies() {
// Create a PACKAGE_CHANGED broadcast corresponding to a change in the whole PACKAGE_GREEN
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java
index f79cb1105611..360d6ebfe1bd 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java
@@ -19,6 +19,11 @@ import static android.content.pm.PackageManager.FEATURE_AUTOMOTIVE;
import static android.content.pm.PackageManager.FEATURE_EMBEDDED;
import static android.content.pm.PackageManager.FEATURE_LEANBACK;
import static android.content.pm.PackageManager.FEATURE_WATCH;
+import static android.multiuser.Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION;
+import static android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES;
+import static android.multiuser.Flags.FLAG_LOGOUT_USER_API;
+import static android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE;
+import static android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE;
import static android.os.UserManager.DISALLOW_OUTGOING_CALLS;
import static android.os.UserManager.DISALLOW_SMS;
import static android.os.UserManager.DISALLOW_USER_SWITCH;
@@ -54,7 +59,6 @@ import android.content.Context;
import android.content.pm.PackageManagerInternal;
import android.content.pm.UserInfo;
import android.content.res.Resources;
-import android.multiuser.Flags;
import android.os.PowerManager;
import android.os.ServiceSpecificException;
import android.os.SystemProperties;
@@ -401,15 +405,27 @@ public final class UserManagerServiceTest {
}
@Test
- public void testGetBootUser_Headless_ThrowsIfOnlySystemUserExists() throws Exception {
+ public void testGetBootUser_CannotSwitchToHeadlessSystemUser_ThrowsIfOnlySystemUserExists()
+ throws Exception {
setSystemUserHeadless(true);
removeNonSystemUsers();
+ mockCanSwitchToHeadlessSystemUser(false);
assertThrows(UserManager.CheckedUserOperationException.class,
() -> mUmi.getBootUser(/* waitUntilSet= */ false));
}
@Test
+ public void testGetBootUser_CanSwitchToHeadlessSystemUser_NoThrowIfOnlySystemUserExists()
+ throws Exception {
+ setSystemUserHeadless(true);
+ removeNonSystemUsers();
+ mockCanSwitchToHeadlessSystemUser(true);
+
+ assertThat(mUmi.getBootUser(/* waitUntilSet= */ false)).isEqualTo(UserHandle.USER_SYSTEM);
+ }
+
+ @Test
public void testGetPreviousFullUserToEnterForeground() throws Exception {
addUser(USER_ID);
setLastForegroundTime(USER_ID, 1_000_000L);
@@ -601,9 +617,8 @@ public final class UserManagerServiceTest {
}
@Test
+ @EnableFlags({FLAG_ALLOW_PRIVATE_PROFILE, FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
public void testAutoLockPrivateProfile() {
- mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
int mainUser = mUms.getMainUserId();
assumeTrue(mUms.canAddPrivateProfile(mainUser));
UserManagerService mSpiedUms = spy(mUms);
@@ -622,10 +637,12 @@ public final class UserManagerServiceTest {
}
@Test
+ @EnableFlags({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+ FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE
+ })
public void testAutoLockOnDeviceLockForPrivateProfile() {
- mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
- mSetFlagsRule.enableFlags(Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
int mainUser = mUms.getMainUserId();
assumeTrue(mUms.canAddPrivateProfile(mainUser));
UserManagerService mSpiedUms = spy(mUms);
@@ -645,10 +662,12 @@ public final class UserManagerServiceTest {
}
@Test
+ @EnableFlags({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+ FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE
+ })
public void testAutoLockOnDeviceLockForPrivateProfile_keyguardUnlocked() {
- mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
- mSetFlagsRule.enableFlags(Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
assumeTrue(mUms.canAddPrivateProfile(0));
UserManagerService mSpiedUms = spy(mUms);
UserInfo privateProfileUser =
@@ -665,10 +684,9 @@ public final class UserManagerServiceTest {
}
@Test
+ @EnableFlags({FLAG_ALLOW_PRIVATE_PROFILE, FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+ @DisableFlags(FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE)
public void testAutoLockOnDeviceLockForPrivateProfile_flagDisabled() {
- mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
- mSetFlagsRule.disableFlags(Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
int mainUser = mUms.getMainUserId();
assumeTrue(mUms.canAddPrivateProfile(mainUser));
UserManagerService mSpiedUms = spy(mUms);
@@ -687,10 +705,12 @@ public final class UserManagerServiceTest {
}
@Test
+ @EnableFlags({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+ FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE
+ })
public void testAutoLockAfterInactityForPrivateProfile() {
- mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
- mSetFlagsRule.enableFlags(Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
int mainUser = mUms.getMainUserId();
assumeTrue(mUms.canAddPrivateProfile(mainUser));
UserManagerService mSpiedUms = spy(mUms);
@@ -711,11 +731,12 @@ public final class UserManagerServiceTest {
}
@Test
+ @EnableFlags({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+ FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE
+ })
public void testSetOrUpdateAutoLockPreference_noPrivateProfile() {
- mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
- mSetFlagsRule.enableFlags(Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
-
mUms.setOrUpdateAutoLockPreferenceForPrivateProfile(
Settings.Secure.PRIVATE_SPACE_AUTO_LOCK_AFTER_INACTIVITY);
@@ -726,10 +747,12 @@ public final class UserManagerServiceTest {
}
@Test
+ @EnableFlags({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+ FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE
+ })
public void testSetOrUpdateAutoLockPreference() {
- mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
- mSetFlagsRule.enableFlags(Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
int mainUser = mUms.getMainUserId();
assumeTrue(mUms.canAddPrivateProfile(mainUser));
mUms.createProfileForUserEvenWhenDisallowedWithThrow(PRIVATE_PROFILE_NAME,
@@ -780,10 +803,12 @@ public final class UserManagerServiceTest {
}
@Test
+ @EnableFlags({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES,
+ android.multiuser.Flags.FLAG_ENABLE_HIDING_PROFILES
+ })
public void testGetProfileIdsExcludingHidden() {
- mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
- mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_HIDING_PROFILES);
assumeTrue(mUms.canAddPrivateProfile(0));
UserInfo privateProfileUser =
mUms.createProfileForUserEvenWhenDisallowedWithThrow("TestPrivateProfile",
@@ -794,8 +819,11 @@ public final class UserManagerServiceTest {
}
@Test
- @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+ @RequiresFlagsEnabled({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+ })
public void testCreatePrivateProfileOnHeadlessSystemUser_shouldAllowCreation() {
UserManagerService mSpiedUms = spy(mUms);
assumeTrue(mUms.isHeadlessSystemUserMode());
@@ -807,8 +835,11 @@ public final class UserManagerServiceTest {
}
@Test
- @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+ @RequiresFlagsEnabled({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+ })
public void testCreatePrivateProfileOnSecondaryUser_shouldNotAllowCreation() {
assumeTrue(mUms.canAddMoreUsersOfType(USER_TYPE_FULL_SECONDARY));
UserInfo user = mUms.createUserWithThrow(generateLongString(), USER_TYPE_FULL_SECONDARY, 0);
@@ -819,8 +850,11 @@ public final class UserManagerServiceTest {
}
@Test
- @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+ @RequiresFlagsEnabled({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+ })
public void testCreatePrivateProfileOnAutoDevices_shouldNotAllowCreation() {
doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_AUTOMOTIVE), anyInt());
int mainUser = mUms.getMainUserId();
@@ -831,8 +865,11 @@ public final class UserManagerServiceTest {
}
@Test
- @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+ @RequiresFlagsEnabled({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+ })
public void testCreatePrivateProfileOnTV_shouldNotAllowCreation() {
doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_LEANBACK), anyInt());
int mainUser = mUms.getMainUserId();
@@ -843,8 +880,11 @@ public final class UserManagerServiceTest {
}
@Test
- @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+ @RequiresFlagsEnabled({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+ })
public void testCreatePrivateProfileOnEmbedded_shouldNotAllowCreation() {
doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_EMBEDDED), anyInt());
int mainUser = mUms.getMainUserId();
@@ -855,8 +895,11 @@ public final class UserManagerServiceTest {
}
@Test
- @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
+ @RequiresFlagsEnabled({
+ FLAG_ALLOW_PRIVATE_PROFILE,
+ FLAG_BLOCK_PRIVATE_SPACE_CREATION,
+ FLAG_ENABLE_PRIVATE_SPACE_FEATURES
+ })
public void testCreatePrivateProfileOnWatch_shouldNotAllowCreation() {
doReturn(true).when(mMockPms).hasSystemFeature(eq(FEATURE_WATCH), anyInt());
int mainUser = mUms.getMainUserId();
@@ -910,7 +953,7 @@ public final class UserManagerServiceTest {
}
@Test
- @EnableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+ @EnableFlags(FLAG_LOGOUT_USER_API)
public void testGetUserLogoutability_HsumAndInteractiveHeadlessSystem_UserCanLogout()
throws Exception {
setSystemUserHeadless(true);
@@ -926,7 +969,7 @@ public final class UserManagerServiceTest {
}
@Test
- @EnableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+ @EnableFlags(FLAG_LOGOUT_USER_API)
public void testGetUserLogoutability_HsumAndNonInteractiveHeadlessSystem_UserCannotLogout()
throws Exception {
setSystemUserHeadless(true);
@@ -941,7 +984,7 @@ public final class UserManagerServiceTest {
}
@Test
- @EnableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+ @EnableFlags(FLAG_LOGOUT_USER_API)
public void testGetUserLogoutability_Hsum_SystemUserCannotLogout() throws Exception {
setSystemUserHeadless(true);
mockCurrentUser(UserHandle.USER_SYSTEM);
@@ -950,7 +993,7 @@ public final class UserManagerServiceTest {
}
@Test
- @EnableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+ @EnableFlags(FLAG_LOGOUT_USER_API)
public void testGetUserLogoutability_NonHsum_SystemUserCannotLogout() throws Exception {
setSystemUserHeadless(false);
mockCurrentUser(UserHandle.USER_SYSTEM);
@@ -960,7 +1003,7 @@ public final class UserManagerServiceTest {
}
@Test
- @EnableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+ @EnableFlags(FLAG_LOGOUT_USER_API)
public void testGetUserLogoutability_CannotSwitch_CannotLogout() throws Exception {
setSystemUserHeadless(true);
addUser(USER_ID);
@@ -973,7 +1016,7 @@ public final class UserManagerServiceTest {
}
@Test
- @DisableFlags(android.multiuser.Flags.FLAG_LOGOUT_USER_API)
+ @DisableFlags(FLAG_LOGOUT_USER_API)
public void testGetUserLogoutability_LogoutDisabled() throws Exception {
assertThrows(UnsupportedOperationException.class, () -> mUms.getUserLogoutability(USER_ID));
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickTypePanelTest.java b/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickTypePanelTest.java
index 7b8824cb0e3d..00cc7264c1d0 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickTypePanelTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/autoclick/AutoclickTypePanelTest.java
@@ -18,6 +18,11 @@ package com.android.server.accessibility.autoclick;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AUTOCLICK_TYPE_LEFT_CLICK;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AUTOCLICK_TYPE_SCROLL;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.AutoclickType;
+import static com.android.server.accessibility.autoclick.AutoclickTypePanel.ClickPanelControllerInterface;
+
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
@@ -59,11 +64,25 @@ public class AutoclickTypePanelTest {
private LinearLayout mDragButton;
private LinearLayout mScrollButton;
+ private @AutoclickType int mActiveClickType = AUTOCLICK_TYPE_LEFT_CLICK;
+
+ private final ClickPanelControllerInterface clickPanelController =
+ new ClickPanelControllerInterface() {
+ @Override
+ public void handleAutoclickTypeChange(@AutoclickType int clickType) {
+ mActiveClickType = clickType;
+ }
+
+ @Override
+ public void toggleAutoclickPause() {}
+ };
+
@Before
public void setUp() {
mTestableContext.addMockSystemService(Context.WINDOW_SERVICE, mMockWindowManager);
- mAutoclickTypePanel = new AutoclickTypePanel(mTestableContext, mMockWindowManager);
+ mAutoclickTypePanel =
+ new AutoclickTypePanel(mTestableContext, mMockWindowManager, clickPanelController);
View contentView = mAutoclickTypePanel.getContentViewForTesting();
mLeftClickButton = contentView.findViewById(R.id.accessibility_autoclick_left_click_layout);
mRightClickButton =
@@ -136,6 +155,17 @@ public class AutoclickTypePanelTest {
verifyButtonHasSelectedStyle(mScrollButton);
}
+ @Test
+ public void togglePanelExpansion_selectButton_correctActiveClickType() {
+ // By first click, the panel is expanded.
+ mLeftClickButton.callOnClick();
+
+ // Clicks any button in the expanded state to select a type button.
+ mScrollButton.callOnClick();
+
+ assertThat(mActiveClickType).isEqualTo(AUTOCLICK_TYPE_SCROLL);
+ }
+
private void verifyButtonHasSelectedStyle(@NonNull LinearLayout button) {
GradientDrawable gradientDrawable = (GradientDrawable) button.getBackground();
assertThat(gradientDrawable.getColor().getDefaultColor())
diff --git a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
index 17f5ebb3b02a..7349c5f463a6 100644
--- a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
@@ -116,6 +116,10 @@ public class GameManagerServiceSettingsTests {
deleteFolder(InstrumentationRegistry.getTargetContext().getFilesDir());
}
+ static {
+ System.loadLibrary("servicestestjni");
+ }
+
@Test
public void testReadGameServiceSettings() {
writeOldFiles();
diff --git a/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java b/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java
index 04d075211297..a4e77c00d647 100644
--- a/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java
+++ b/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java
@@ -20,10 +20,12 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.hardware.contexthub.EndpointInfo;
import android.hardware.contexthub.ErrorCode;
import android.hardware.contexthub.HubEndpointInfo;
import android.hardware.contexthub.HubEndpointInfo.HubEndpointIdentifier;
@@ -32,6 +34,7 @@ import android.hardware.contexthub.IContextHubEndpoint;
import android.hardware.contexthub.IContextHubEndpointCallback;
import android.hardware.contexthub.IEndpointCommunication;
import android.hardware.contexthub.MessageDeliveryStatus;
+import android.hardware.contexthub.Reason;
import android.os.Binder;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
@@ -61,6 +64,9 @@ public class ContextHubEndpointTest {
private static final int ENDPOINT_ID = 1;
private static final String ENDPOINT_PACKAGE_NAME = "com.android.server.location.contexthub";
+ private static final String TARGET_ENDPOINT_NAME = "Example target endpoint";
+ private static final int TARGET_ENDPOINT_ID = 1;
+
private ContextHubClientManager mClientManager;
private ContextHubEndpointManager mEndpointManager;
private HubInfoRegistry mHubInfoRegistry;
@@ -95,23 +101,8 @@ public class ContextHubEndpointTest {
@Test
public void testRegisterEndpoint() throws RemoteException {
- // Register an endpoint and confirm we can get a valid IContextHubEndoint reference
- HubEndpointInfo info =
- new HubEndpointInfo(
- ENDPOINT_NAME, ENDPOINT_ID, ENDPOINT_PACKAGE_NAME, Collections.emptyList());
- IContextHubEndpoint endpoint =
- mEndpointManager.registerEndpoint(
- info, mMockCallback, ENDPOINT_PACKAGE_NAME, /* attributionTag= */ null);
- assertThat(mEndpointManager.getNumRegisteredClients()).isEqualTo(1);
- assertThat(endpoint).isNotNull();
- HubEndpointInfo assignedInfo = endpoint.getAssignedHubEndpointInfo();
- assertThat(assignedInfo).isNotNull();
- HubEndpointIdentifier assignedIdentifier = assignedInfo.getIdentifier();
- assertThat(assignedIdentifier).isNotNull();
-
- // Unregister the endpoint and confirm proper clean-up
- mEndpointManager.unregisterEndpoint(assignedIdentifier.getEndpoint());
- assertThat(mEndpointManager.getNumRegisteredClients()).isEqualTo(0);
+ IContextHubEndpoint endpoint = registerExampleEndpoint();
+ unregisterExampleEndpoint(endpoint);
}
@Test
@@ -146,4 +137,107 @@ public class ContextHubEndpointTest {
assertThat(statusCaptor.getValue().messageSequenceNumber).isEqualTo(sequenceNumber);
assertThat(statusCaptor.getValue().errorCode).isEqualTo(ErrorCode.DESTINATION_NOT_FOUND);
}
+
+ @Test
+ public void testHalRestart() throws RemoteException {
+ IContextHubEndpoint endpoint = registerExampleEndpoint();
+
+ // Verify that the endpoint is still registered after a HAL restart
+ HubEndpointInfo assignedInfo = endpoint.getAssignedHubEndpointInfo();
+ HubEndpointIdentifier assignedIdentifier = assignedInfo.getIdentifier();
+ mEndpointManager.onHalRestart();
+ ArgumentCaptor<EndpointInfo> statusCaptor = ArgumentCaptor.forClass(EndpointInfo.class);
+ verify(mMockEndpointCommunications, times(2)).registerEndpoint(statusCaptor.capture());
+ assertThat(statusCaptor.getValue().id.id).isEqualTo(assignedIdentifier.getEndpoint());
+ assertThat(statusCaptor.getValue().id.hubId).isEqualTo(assignedIdentifier.getHub());
+
+ unregisterExampleEndpoint(endpoint);
+ }
+
+ @Test
+ public void testHalRestartOnOpenSession() throws RemoteException {
+ assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE);
+ IContextHubEndpoint endpoint = registerExampleEndpoint();
+
+ HubEndpointInfo targetInfo =
+ new HubEndpointInfo(
+ TARGET_ENDPOINT_NAME,
+ TARGET_ENDPOINT_ID,
+ ENDPOINT_PACKAGE_NAME,
+ Collections.emptyList());
+ int sessionId = endpoint.openSession(targetInfo, /* serviceDescriptor= */ null);
+ mEndpointManager.onEndpointSessionOpenComplete(sessionId);
+ assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE - 1);
+
+ mEndpointManager.onHalRestart();
+
+ HubEndpointInfo assignedInfo = endpoint.getAssignedHubEndpointInfo();
+ HubEndpointIdentifier assignedIdentifier = assignedInfo.getIdentifier();
+ ArgumentCaptor<EndpointInfo> statusCaptor = ArgumentCaptor.forClass(EndpointInfo.class);
+ verify(mMockEndpointCommunications, times(2)).registerEndpoint(statusCaptor.capture());
+ assertThat(statusCaptor.getValue().id.id).isEqualTo(assignedIdentifier.getEndpoint());
+ assertThat(statusCaptor.getValue().id.hubId).isEqualTo(assignedIdentifier.getHub());
+
+ verify(mMockCallback)
+ .onSessionClosed(
+ sessionId, ContextHubServiceUtil.toAppHubEndpointReason(Reason.HUB_RESET));
+
+ unregisterExampleEndpoint(endpoint);
+ assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE);
+ }
+
+ @Test
+ public void testOpenSessionOnUnregistration() throws RemoteException {
+ assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE);
+ IContextHubEndpoint endpoint = registerExampleEndpoint();
+
+ HubEndpointInfo targetInfo =
+ new HubEndpointInfo(
+ TARGET_ENDPOINT_NAME,
+ TARGET_ENDPOINT_ID,
+ ENDPOINT_PACKAGE_NAME,
+ Collections.emptyList());
+ int sessionId = endpoint.openSession(targetInfo, /* serviceDescriptor= */ null);
+ mEndpointManager.onEndpointSessionOpenComplete(sessionId);
+ assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE - 1);
+
+ unregisterExampleEndpoint(endpoint);
+ verify(mMockEndpointCommunications).closeEndpointSession(sessionId, Reason.ENDPOINT_GONE);
+ assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE);
+ }
+
+ private IContextHubEndpoint registerExampleEndpoint() throws RemoteException {
+ HubEndpointInfo info =
+ new HubEndpointInfo(
+ ENDPOINT_NAME, ENDPOINT_ID, ENDPOINT_PACKAGE_NAME, Collections.emptyList());
+ IContextHubEndpoint endpoint =
+ mEndpointManager.registerEndpoint(
+ info, mMockCallback, ENDPOINT_PACKAGE_NAME, /* attributionTag= */ null);
+ assertThat(endpoint).isNotNull();
+ HubEndpointInfo assignedInfo = endpoint.getAssignedHubEndpointInfo();
+ assertThat(assignedInfo).isNotNull();
+ HubEndpointIdentifier assignedIdentifier = assignedInfo.getIdentifier();
+ assertThat(assignedIdentifier).isNotNull();
+
+ // Confirm registerEndpoint was called with the right contents
+ ArgumentCaptor<EndpointInfo> statusCaptor = ArgumentCaptor.forClass(EndpointInfo.class);
+ verify(mMockEndpointCommunications).registerEndpoint(statusCaptor.capture());
+ assertThat(statusCaptor.getValue().id.id).isEqualTo(assignedIdentifier.getEndpoint());
+ assertThat(statusCaptor.getValue().id.hubId).isEqualTo(assignedIdentifier.getHub());
+ assertThat(mEndpointManager.getNumRegisteredClients()).isEqualTo(1);
+
+ return endpoint;
+ }
+
+ private void unregisterExampleEndpoint(IContextHubEndpoint endpoint) throws RemoteException {
+ HubEndpointInfo expectedInfo = endpoint.getAssignedHubEndpointInfo();
+ endpoint.unregister();
+ ArgumentCaptor<EndpointInfo> statusCaptor = ArgumentCaptor.forClass(EndpointInfo.class);
+ verify(mMockEndpointCommunications).unregisterEndpoint(statusCaptor.capture());
+ assertThat(statusCaptor.getValue().id.id)
+ .isEqualTo(expectedInfo.getIdentifier().getEndpoint());
+ assertThat(statusCaptor.getValue().id.hubId)
+ .isEqualTo(expectedInfo.getIdentifier().getHub());
+ assertThat(mEndpointManager.getNumRegisteredClients()).isEqualTo(0);
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
index c6b431ce0b18..8e2cea7a8c78 100644
--- a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
@@ -402,9 +402,6 @@ public class KeyGestureEventTests extends ShortcutKeyTestBase {
@Test
@EnableFlags({com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL,
- com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG,
- com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG,
- com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG,
com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS})
@DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER)
public void testKeyboardAccessibilityToggleShortcutPress() {
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 440f43e9b926..bb296148dad1 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -2881,7 +2881,6 @@ public class ActivityRecordTests extends WindowTestsBase {
activity2.addStartingWindow(mPackageName, android.R.style.Theme, activity1, true, true,
false, true, false, false, false);
waitUntilHandlersIdle();
- assertFalse(mDisplayContent.mSkipAppTransitionAnimation);
assertNoStartingWindow(activity1);
assertHasStartingWindow(activity2);
}
@@ -2965,7 +2964,6 @@ public class ActivityRecordTests extends WindowTestsBase {
false /* newTask */, false /* isTaskSwitch */, null /* options */,
null /* sourceRecord */);
- assertTrue(mDisplayContent.mSkipAppTransitionAnimation);
assertNull(middle.mStartingWindow);
assertHasStartingWindow(top);
assertTrue(top.isVisible());
@@ -3265,26 +3263,6 @@ public class ActivityRecordTests extends WindowTestsBase {
> activity.getConfiguration().windowConfiguration.getAppBounds().height());
}
- @Test
- public void testSetVisibility_visibleToVisible() {
- final ActivityRecord activity = new ActivityBuilder(mAtm)
- .setCreateTask(true).build();
- // By default, activity is visible.
- assertTrue(activity.isVisible());
- assertTrue(activity.isVisibleRequested());
- assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
-
- // Request the activity to be visible. Although the activity is already visible, app
- // transition animation should be applied on this activity. This might be unnecessary, but
- // until we verify no logic relies on this behavior, we'll keep this as is.
- mDisplayContent.prepareAppTransition(0);
- activity.setVisibility(true);
- assertTrue(activity.isVisible());
- assertTrue(activity.isVisibleRequested());
- assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
- assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
- }
-
@SetupWindows(addWindows = W_ACTIVITY)
@Test
public void testSetVisibility_visibleToInvisible() {
@@ -3316,50 +3294,30 @@ public class ActivityRecordTests extends WindowTestsBase {
public void testSetVisibility_invisibleToVisible() {
final ActivityRecord activity = new ActivityBuilder(mAtm)
.setCreateTask(true).setVisible(false).build();
- // Activiby is invisible. However ATMS requests it to become visible, since this is a top
- // activity.
assertFalse(activity.isVisible());
- assertTrue(activity.isVisibleRequested());
- assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
+ assertFalse(activity.isVisibleRequested());
// Request the activity to be visible. Since the visibility changes, app transition
// animation should be applied on this activity.
- activity.setVisibility(true);
+ requestTransition(activity, WindowManager.TRANSIT_OPEN);
+ mWm.mRoot.resumeFocusedTasksTopActivities();
assertFalse(activity.isVisible());
assertTrue(activity.isVisibleRequested());
- assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
- assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
-
- // There should still be animation (add to opening) if keyguard is going away while the
- // screen is off because it will be visible after screen is turned on by unlocking.
- mDisplayContent.mOpeningApps.remove(activity);
- mDisplayContent.mClosingApps.remove(activity);
- activity.commitVisibility(false /* visible */, false /* performLayout */);
- mDisplayContent.getDisplayPolicy().screenTurnedOff(false /* acquireSleepToken */);
- final KeyguardController controller = mSupervisor.getKeyguardController();
- doReturn(true).when(controller).isKeyguardGoingAway(anyInt());
- activity.setVisibility(true);
- assertTrue(mDisplayContent.mOpeningApps.contains(activity));
+ assertTrue(activity.inTransition());
}
@Test
public void testSetVisibility_invisibleToInvisible() {
final ActivityRecord activity = new ActivityBuilder(mAtm)
.setCreateTask(true).setVisible(false).build();
- // Activiby is invisible. However ATMS requests it to become visible, since this is a top
- // activity.
- assertFalse(activity.isVisible());
- assertTrue(activity.isVisibleRequested());
- assertTrue(activity.mDisplayContent.mOpeningApps.contains(activity));
- assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
+ requestTransition(activity, WindowManager.TRANSIT_CLOSE);
// Request the activity to be invisible. Since the activity is already invisible, no app
// transition should be applied on this activity.
activity.setVisibility(false);
assertFalse(activity.isVisible());
assertFalse(activity.isVisibleRequested());
- assertFalse(activity.mDisplayContent.mOpeningApps.contains(activity));
- assertFalse(activity.mDisplayContent.mClosingApps.contains(activity));
+ assertFalse(activity.inTransition());
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java b/services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java
deleted file mode 100644
index 8871056988ef..000000000000
--- a/services/tests/wmtests/src/com/android/server/wm/AnimatingActivityRegistryTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyZeroInteractions;
-import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
-import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.platform.test.annotations.Presubmit;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-/**
- * Tests for the {@link ActivityStack} class.
- *
- * Build/Install/Run:
- * atest WmTests:AnimatingActivityRegistryTest
- */
-@SmallTest
-@Presubmit
-@RunWith(WindowTestRunner.class)
-public class AnimatingActivityRegistryTest extends WindowTestsBase {
-
- @Mock
- AnimationAdapter mAdapter;
-
- @Mock
- Runnable mMockEndDeferFinishCallback1;
- @Mock
- Runnable mMockEndDeferFinishCallback2;
-
- @Before
- public void setUp() throws Exception {
- MockitoAnnotations.initMocks(this);
- }
-
- @Test
- public void testDeferring() {
- final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
- final ActivityRecord activity2 = createAppWindow(activity1.getTask(), ACTIVITY_TYPE_STANDARD,
- "activity2").mActivityRecord;
- final AnimatingActivityRegistry registry =
- activity1.getRootTask().getAnimatingActivityRegistry();
-
- activity1.startAnimation(activity1.getPendingTransaction(), mAdapter, false /* hidden */,
- ANIMATION_TYPE_APP_TRANSITION);
- activity2.startAnimation(activity1.getPendingTransaction(), mAdapter, false /* hidden */,
- ANIMATION_TYPE_APP_TRANSITION);
- assertTrue(activity1.isAnimating(TRANSITION));
- assertTrue(activity2.isAnimating(TRANSITION));
-
- // Make sure that first animation finish is deferred, second one is not deferred, and first
- // one gets cancelled.
- assertTrue(registry.notifyAboutToFinish(activity1, mMockEndDeferFinishCallback1));
- assertFalse(registry.notifyAboutToFinish(activity2, mMockEndDeferFinishCallback2));
- verify(mMockEndDeferFinishCallback1).run();
- verifyZeroInteractions(mMockEndDeferFinishCallback2);
- }
-
- @Test
- public void testContainerRemoved() {
- final ActivityRecord window1 = createActivityRecord(mDisplayContent);
- final ActivityRecord window2 = createAppWindow(window1.getTask(), ACTIVITY_TYPE_STANDARD,
- "window2").mActivityRecord;
- final AnimatingActivityRegistry registry =
- window1.getRootTask().getAnimatingActivityRegistry();
-
- window1.startAnimation(window1.getPendingTransaction(), mAdapter, false /* hidden */,
- ANIMATION_TYPE_APP_TRANSITION);
- window2.startAnimation(window1.getPendingTransaction(), mAdapter, false /* hidden */,
- ANIMATION_TYPE_APP_TRANSITION);
- assertTrue(window1.isAnimating(TRANSITION));
- assertTrue(window2.isAnimating(TRANSITION));
-
- // Make sure that first animation finish is deferred, and removing the second window stops
- // finishes all pending deferred finishings.
- registry.notifyAboutToFinish(window1, mMockEndDeferFinishCallback1);
- window2.setParent(null);
- verify(mMockEndDeferFinishCallback1).run();
- }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java
deleted file mode 100644
index c294bc62c7ac..000000000000
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java
+++ /dev/null
@@ -1,1306 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
-import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
-import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
-import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
-import static android.view.WindowManager.TRANSIT_CHANGE;
-import static android.view.WindowManager.TRANSIT_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_DREAM_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_DREAM_ACTIVITY_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_UNOCCLUDE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CHANGE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN;
-import static android.view.WindowManager.TRANSIT_OPEN;
-import static android.view.WindowManager.TRANSIT_TO_FRONT;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.server.wm.WindowContainer.POSITION_BOTTOM;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeFalse;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.clearInvocations;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-import android.annotation.Nullable;
-import android.graphics.Rect;
-import android.gui.DropInputMode;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.platform.test.annotations.Presubmit;
-import android.util.ArraySet;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.view.IRemoteAnimationRunner;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationDefinition;
-import android.view.RemoteAnimationTarget;
-import android.view.WindowManager;
-import android.window.ITaskFragmentOrganizer;
-import android.window.TaskFragmentOrganizer;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Build/Install/Run:
- * atest WmTests:AppTransitionControllerTest
- */
-@SmallTest
-@Presubmit
-@RunWith(WindowTestRunner.class)
-public class AppTransitionControllerTest extends WindowTestsBase {
-
- private AppTransitionController mAppTransitionController;
-
- @Before
- public void setUp() throws Exception {
- assumeFalse(WindowManagerService.sEnableShellTransitions);
- mAppTransitionController = new AppTransitionController(mWm, mDisplayContent);
- mWm.mAnimator.ready();
- }
-
- @Test
- public void testSkipOccludedActivityCloseTransition() {
- final ActivityRecord behind = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- final ActivityRecord topOpening = createActivityRecord(behind.getTask());
- topOpening.setOccludesParent(true);
- topOpening.setVisible(true);
-
- mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
- mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
- mDisplayContent.mClosingApps.add(behind);
-
- assertEquals(WindowManager.TRANSIT_OLD_UNSET,
- AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null, null, false));
- }
-
- @Test
- public void testClearTaskSkipAppExecuteTransition() {
- final ActivityRecord behind = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- final Task task = behind.getTask();
- final ActivityRecord top = createActivityRecord(task);
- top.setState(ActivityRecord.State.RESUMED, "test");
- behind.setState(ActivityRecord.State.STARTED, "test");
- behind.setVisibleRequested(true);
-
- task.removeActivities("test", false /* excludingTaskOverlay */);
- assertFalse(mDisplayContent.mAppTransition.isReady());
- }
-
- @Test
- public void testTranslucentOpen() {
- final ActivityRecord behind = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- final ActivityRecord translucentOpening = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- doReturn(false).when(translucentOpening).fillsParent();
- translucentOpening.setVisible(false);
- mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
- mDisplayContent.mOpeningApps.add(behind);
- mDisplayContent.mOpeningApps.add(translucentOpening);
-
- assertEquals(WindowManager.TRANSIT_OLD_TRANSLUCENT_ACTIVITY_OPEN,
- AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null, null, false));
- }
-
- @Test
- public void testTranslucentClose() {
- final ActivityRecord behind = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- final ActivityRecord translucentClosing = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- doReturn(false).when(translucentClosing).fillsParent();
- mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
- mDisplayContent.mClosingApps.add(translucentClosing);
- assertEquals(WindowManager.TRANSIT_OLD_TRANSLUCENT_ACTIVITY_CLOSE,
- AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null, null, false));
- }
-
- @Test
- public void testDreamActivityOpenTransition() {
- final ActivityRecord dreamActivity = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_DREAM);
- mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
- mDisplayContent.mOpeningApps.add(dreamActivity);
-
- assertEquals(TRANSIT_OLD_DREAM_ACTIVITY_OPEN,
- AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null, null, false));
- }
-
- @Test
- public void testDreamActivityCloseTransition() {
- final ActivityRecord dreamActivity = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_DREAM);
- mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
- mDisplayContent.mClosingApps.add(dreamActivity);
-
- assertEquals(TRANSIT_OLD_DREAM_ACTIVITY_CLOSE,
- AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null, null, false));
- }
-
- @Test
- public void testChangeIsNotOverwritten() {
- final ActivityRecord behind = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- final ActivityRecord translucentOpening = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- translucentOpening.setOccludesParent(false);
- translucentOpening.setVisible(false);
- mDisplayContent.prepareAppTransition(TRANSIT_CHANGE);
- mDisplayContent.mOpeningApps.add(behind);
- mDisplayContent.mOpeningApps.add(translucentOpening);
- mDisplayContent.mChangingContainers.add(translucentOpening.getTask());
- assertEquals(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE,
- AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null, null, false));
- }
-
- @Test
- public void testTransitWithinTask() {
- final ActivityRecord opening = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD);
- opening.setOccludesParent(false);
- final ActivityRecord closing = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD);
- closing.setOccludesParent(false);
- final Task task = opening.getTask();
- mDisplayContent.mOpeningApps.add(opening);
- mDisplayContent.mClosingApps.add(closing);
- assertFalse(mAppTransitionController.isTransitWithinTask(TRANSIT_OLD_ACTIVITY_OPEN, task));
- closing.getTask().removeChild(closing);
- task.addChild(closing, 0);
- assertTrue(mAppTransitionController.isTransitWithinTask(TRANSIT_OLD_ACTIVITY_OPEN, task));
- assertFalse(mAppTransitionController.isTransitWithinTask(TRANSIT_OLD_TASK_OPEN, task));
- }
-
-
- @Test
- public void testIntraWallpaper_open() {
- final ActivityRecord opening = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- opening.setVisible(false);
- final WindowManager.LayoutParams attrOpening = new WindowManager.LayoutParams(
- TYPE_BASE_APPLICATION);
- attrOpening.setTitle("WallpaperOpening");
- attrOpening.flags |= FLAG_SHOW_WALLPAPER;
- final TestWindowState appWindowOpening = createWindowState(attrOpening, opening);
- opening.addWindow(appWindowOpening);
-
- final ActivityRecord closing = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- final WindowManager.LayoutParams attrClosing = new WindowManager.LayoutParams(
- TYPE_BASE_APPLICATION);
- attrOpening.setTitle("WallpaperClosing");
- attrClosing.flags |= FLAG_SHOW_WALLPAPER;
- final TestWindowState appWindowClosing = createWindowState(attrClosing, closing);
- closing.addWindow(appWindowClosing);
-
- mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
- mDisplayContent.mOpeningApps.add(opening);
- mDisplayContent.mClosingApps.add(closing);
-
- assertEquals(WindowManager.TRANSIT_OLD_WALLPAPER_INTRA_OPEN,
- AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, appWindowClosing, null, false));
- }
-
- @Test
- public void testIntraWallpaper_toFront() {
- final ActivityRecord opening = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- opening.setVisible(false);
- final WindowManager.LayoutParams attrOpening = new WindowManager.LayoutParams(
- TYPE_BASE_APPLICATION);
- attrOpening.setTitle("WallpaperOpening");
- attrOpening.flags |= FLAG_SHOW_WALLPAPER;
- final TestWindowState appWindowOpening = createWindowState(attrOpening, opening);
- opening.addWindow(appWindowOpening);
-
- final ActivityRecord closing = createActivityRecord(mDisplayContent,
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
- final WindowManager.LayoutParams attrClosing = new WindowManager.LayoutParams(
- TYPE_BASE_APPLICATION);
- attrOpening.setTitle("WallpaperClosing");
- attrClosing.flags |= FLAG_SHOW_WALLPAPER;
- final TestWindowState appWindowClosing = createWindowState(attrClosing, closing);
- closing.addWindow(appWindowClosing);
-
- mDisplayContent.prepareAppTransition(TRANSIT_TO_FRONT);
- mDisplayContent.mOpeningApps.add(opening);
- mDisplayContent.mClosingApps.add(closing);
-
- assertEquals(WindowManager.TRANSIT_OLD_WALLPAPER_INTRA_OPEN,
- AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, appWindowClosing, null, false));
- }
-
- @Test
- public void testGetAnimationTargets_visibilityAlreadyUpdated() {
- // [DisplayContent] -+- [Task1] - [ActivityRecord1] (opening, visible)
- // +- [Task2] - [ActivityRecord2] (closing, invisible)
- final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
-
- final ActivityRecord activity2 = createActivityRecord(mDisplayContent);
- activity2.setVisible(false);
- activity2.setVisibleRequested(false);
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity2);
-
- // No animation, since visibility of the opening and closing apps are already updated
- // outside of AppTransition framework.
- assertEquals(
- new ArraySet<>(),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(
- new ArraySet<>(),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
- @Test
- public void testGetAnimationTargets_visibilityAlreadyUpdated_butForcedTransitionRequested() {
- // [DisplayContent] -+- [Task1] - [ActivityRecord1] (closing, invisible)
- // +- [Task2] - [ActivityRecord2] (opening, visible)
- final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
- activity1.setVisible(true);
- activity1.setVisibleRequested(true);
- activity1.mRequestForceTransition = true;
-
- final ActivityRecord activity2 = createActivityRecord(mDisplayContent);
- activity2.setVisible(false);
- activity2.setVisibleRequested(false);
- activity2.mRequestForceTransition = true;
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity2);
-
- // The visibility are already updated, but since forced transition is requested, it will
- // be included.
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity1.getRootTask()}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity2.getRootTask()}),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
- @Test
- public void testGetAnimationTargets_exitingBeforeTransition() {
- // Create another non-empty task so the animation target won't promote to task display area.
- createActivityRecord(mDisplayContent);
- final ActivityRecord activity = createActivityRecord(mDisplayContent);
- activity.setVisible(false);
- activity.mIsExiting = true;
-
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity);
-
- // Animate closing apps even if it's not visible when it is exiting before we had a chance
- // to play the transition animation.
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity.getRootTask()}),
- AppTransitionController.getAnimationTargets(
- new ArraySet<>(), closing, false /* visible */));
- }
-
- @Test
- public void testExitAnimationDone_beforeAppTransition() {
- final Task task = createTask(mDisplayContent);
- final WindowState win = createAppWindow(task, ACTIVITY_TYPE_STANDARD, "Win");
- spyOn(win);
- win.mAnimatingExit = true;
- mDisplayContent.mAppTransition.setTimeout();
- mDisplayContent.mAppTransitionController.handleAppTransitionReady();
-
- verify(win).onExitAnimationDone();
- }
-
- @Test
- public void testGetAnimationTargets_openingClosingInDifferentTask() {
- // [DisplayContent] -+- [Task1] -+- [ActivityRecord1] (opening, invisible)
- // | +- [ActivityRecord2] (invisible)
- // |
- // +- [Task2] -+- [ActivityRecord3] (closing, visible)
- // +- [ActivityRecord4] (invisible)
- final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
- activity1.setVisible(false);
- activity1.setVisibleRequested(true);
- final ActivityRecord activity2 = createActivityRecord(mDisplayContent,
- activity1.getTask());
- activity2.setVisible(false);
- activity2.setVisibleRequested(false);
-
- final ActivityRecord activity3 = createActivityRecord(mDisplayContent);
- final ActivityRecord activity4 = createActivityRecord(mDisplayContent,
- activity3.getTask());
- activity4.setVisible(false);
- activity4.setVisibleRequested(false);
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity3);
-
- // Promote animation targets to root Task level. Invisible ActivityRecords don't affect
- // promotion decision.
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity1.getRootTask()}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity3.getRootTask()}),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
- @Test
- public void testGetAnimationTargets_openingClosingInSameTask() {
- // [DisplayContent] - [Task] -+- [ActivityRecord1] (opening, invisible)
- // +- [ActivityRecord2] (closing, visible)
- final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
- activity1.setVisible(false);
- activity1.setVisibleRequested(true);
- final ActivityRecord activity2 = createActivityRecord(mDisplayContent,
- activity1.getTask());
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity2);
-
- // Don't promote an animation target to Task level, since the same task contains both
- // opening and closing app.
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity1}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity2}),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
- @Test
- public void testGetAnimationTargets_animateOnlyTranslucentApp() {
- // [DisplayContent] -+- [Task1] -+- [ActivityRecord1] (opening, invisible)
- // | +- [ActivityRecord2] (visible)
- // |
- // +- [Task2] -+- [ActivityRecord3] (closing, visible)
- // +- [ActivityRecord4] (visible)
-
- final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
- activity1.setVisible(false);
- activity1.setVisibleRequested(true);
- activity1.setOccludesParent(false);
-
- final ActivityRecord activity2 = createActivityRecord(mDisplayContent,
- activity1.getTask());
-
- final ActivityRecord activity3 = createActivityRecord(mDisplayContent);
- activity3.setOccludesParent(false);
- final ActivityRecord activity4 = createActivityRecord(mDisplayContent,
- activity3.getTask());
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity3);
-
- // Don't promote an animation target to Task level, since opening (closing) app is
- // translucent and is displayed over other non-animating app.
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity1}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity3}),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
- @Test
- public void testGetAnimationTargets_animateTranslucentAndOpaqueApps() {
- // [DisplayContent] -+- [Task1] -+- [ActivityRecord1] (opening, invisible)
- // | +- [ActivityRecord2] (opening, invisible)
- // |
- // +- [Task2] -+- [ActivityRecord3] (closing, visible)
- // +- [ActivityRecord4] (closing, visible)
-
- final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
- activity1.setVisible(false);
- activity1.setVisibleRequested(true);
- activity1.setOccludesParent(false);
-
- final ActivityRecord activity2 = createActivityRecord(mDisplayContent,
- activity1.getTask());
- activity2.setVisible(false);
- activity2.setVisibleRequested(true);
-
- final ActivityRecord activity3 = createActivityRecord(mDisplayContent);
- activity3.setOccludesParent(false);
- final ActivityRecord activity4 = createActivityRecord(mDisplayContent,
- activity3.getTask());
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- opening.add(activity2);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity3);
- closing.add(activity4);
-
- // Promote animation targets to TaskStack level even though opening (closing) app is
- // translucent as long as all visible siblings animate at the same time.
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity1.getRootTask()}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity3.getRootTask()}),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
- @Test
- public void testGetAnimationTargets_taskContainsMultipleTasks() {
- // [DisplayContent] - [Task] -+- [Task1] - [ActivityRecord1] (opening, invisible)
- // +- [Task2] - [ActivityRecord2] (closing, visible)
- final Task parentTask = createTask(mDisplayContent);
- final ActivityRecord activity1 = createActivityRecordWithParentTask(parentTask);
- activity1.setVisible(false);
- activity1.setVisibleRequested(true);
- final ActivityRecord activity2 = createActivityRecordWithParentTask(parentTask);
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity2);
-
- // Promote animation targets up to Task level, not beyond.
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity1.getTask()}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity2.getTask()}),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
- @Test
- public void testGetAnimationTargets_splitScreenOpening() {
- // [DisplayContent] - [Task] -+- [split task 1] -+- [Task1] - [AR1] (opening, invisible)
- // +- [split task 2] -+- [Task2] - [AR2] (opening, invisible)
- final Task singleTopRoot = createTask(mDisplayContent);
- final TaskBuilder builder = new TaskBuilder(mSupervisor)
- .setWindowingMode(WINDOWING_MODE_MULTI_WINDOW)
- .setParentTask(singleTopRoot)
- .setCreatedByOrganizer(true);
- final Task splitRoot1 = builder.build();
- final Task splitRoot2 = builder.build();
- splitRoot1.setAdjacentTaskFragment(splitRoot2);
- final ActivityRecord activity1 = createActivityRecordWithParentTask(splitRoot1);
- activity1.setVisible(false);
- activity1.setVisibleRequested(true);
- final ActivityRecord activity2 = createActivityRecordWithParentTask(splitRoot2);
- activity2.setVisible(false);
- activity2.setVisibleRequested(true);
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- opening.add(activity2);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
-
- // Promote animation targets up to Task level, not beyond.
- assertEquals(
- new ArraySet<>(new WindowContainer[]{splitRoot1, splitRoot2}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- }
-
- @Test
- public void testGetAnimationTargets_openingClosingTaskFragment() {
- // [DefaultTDA] - [Task] -+- [TaskFragment1] - [ActivityRecord1] (opening, invisible)
- // +- [TaskFragment2] - [ActivityRecord2] (closing, visible)
- final Task parentTask = createTask(mDisplayContent);
- final TaskFragment taskFragment1 = createTaskFragmentWithActivity(parentTask);
- final ActivityRecord activity1 = taskFragment1.getTopMostActivity();
- activity1.setVisible(false);
- activity1.setVisibleRequested(true);
-
- final TaskFragment taskFragment2 = createTaskFragmentWithActivity(parentTask);
- final ActivityRecord activity2 = taskFragment2.getTopMostActivity();
- activity2.setVisible(true);
- activity2.setVisibleRequested(false);
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity2);
-
- // Promote animation targets up to TaskFragment level, not beyond.
- assertEquals(new ArraySet<>(new WindowContainer[]{taskFragment1}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(new ArraySet<>(new WindowContainer[]{taskFragment2}),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
- @Test
- public void testGetAnimationTargets_openingTheOnlyTaskFragmentInTask() {
- // [DefaultTDA] -+- [Task1] - [TaskFragment1] - [ActivityRecord1] (opening, invisible)
- // +- [Task2] - [ActivityRecord2] (closing, visible)
- final Task task1 = createTask(mDisplayContent);
- final TaskFragment taskFragment1 = createTaskFragmentWithActivity(task1);
- final ActivityRecord activity1 = taskFragment1.getTopMostActivity();
- activity1.setVisible(false);
- activity1.setVisibleRequested(true);
-
- final ActivityRecord activity2 = createActivityRecord(mDisplayContent);
- activity2.setVisible(true);
- activity2.setVisibleRequested(false);
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity2);
-
- // Promote animation targets up to leaf Task level because there's only one TaskFragment in
- // the Task.
- assertEquals(new ArraySet<>(new WindowContainer[]{task1}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(new ArraySet<>(new WindowContainer[]{activity2.getTask()}),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
- @Test
- public void testGetAnimationTargets_closingTheOnlyTaskFragmentInTask() {
- // [DefaultTDA] -+- [Task1] - [TaskFragment1] - [ActivityRecord1] (closing, visible)
- // +- [Task2] - [ActivityRecord2] (opening, invisible)
- final Task task1 = createTask(mDisplayContent);
- final TaskFragment taskFragment1 = createTaskFragmentWithActivity(task1);
- final ActivityRecord activity1 = taskFragment1.getTopMostActivity();
- activity1.setVisible(true);
- activity1.setVisibleRequested(false);
-
- final ActivityRecord activity2 = createActivityRecord(mDisplayContent);
- activity2.setVisible(false);
- activity2.setVisibleRequested(true);
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity2);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity1);
-
- // Promote animation targets up to leaf Task level because there's only one TaskFragment in
- // the Task.
- assertEquals(new ArraySet<>(new WindowContainer[]{activity2.getTask()}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(new ArraySet<>(new WindowContainer[]{task1}),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
- @Test
- public void testGetAnimationTargets_embeddedTask() {
- // [DisplayContent] -+- [Task1] - [ActivityRecord1] (opening, invisible)
- // +- [Task2] (embedded) - [ActivityRecord2] (opening, invisible)
- final ActivityRecord activity1 = createActivityRecord(mDisplayContent);
- activity1.setVisible(false);
- activity1.setVisibleRequested(true);
-
- final Task task2 = createTask(mDisplayContent);
- task2.mRemoveWithTaskOrganizer = true;
- final ActivityRecord activity2 = createActivityRecord(task2);
- activity2.setVisible(false);
- activity2.setVisibleRequested(true);
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- opening.add(activity2);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
-
- // No animation on the embedded task.
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity1.getTask()}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(
- new ArraySet<>(),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
-
- @Test
- public void testGetAnimationTargets_activityInEmbeddedTask() {
- // [DisplayContent] - [Task] (embedded)-+- [ActivityRecord1] (opening, invisible)
- // +- [ActivityRecord2] (closing, visible)
- final Task task = createTask(mDisplayContent);
- task.mRemoveWithTaskOrganizer = true;
-
- final ActivityRecord activity1 = createActivityRecord(task);
- activity1.setVisible(false);
- activity1.setVisibleRequested(true);
- final ActivityRecord activity2 = createActivityRecord(task);
-
- final ArraySet<ActivityRecord> opening = new ArraySet<>();
- opening.add(activity1);
- final ArraySet<ActivityRecord> closing = new ArraySet<>();
- closing.add(activity2);
-
- // Even though embedded task itself doesn't animate, activities in an embedded task
- // animate.
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity1}),
- AppTransitionController.getAnimationTargets(
- opening, closing, true /* visible */));
- assertEquals(
- new ArraySet<>(new WindowContainer[]{activity2}),
- AppTransitionController.getAnimationTargets(
- opening, closing, false /* visible */));
- }
-
- static class TestRemoteAnimationRunner implements IRemoteAnimationRunner {
- private IRemoteAnimationFinishedCallback mFinishedCallback;
-
- @Override
- public void onAnimationStart(int transit, RemoteAnimationTarget[] apps,
- RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps,
- IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException {
- mFinishedCallback = finishedCallback;
- }
-
- @Override
- public void onAnimationCancelled() throws RemoteException {
- mFinishedCallback = null;
- }
-
- @Override
- public IBinder asBinder() {
- return new Binder();
- }
-
- boolean isAnimationStarted() {
- return mFinishedCallback != null;
- }
-
- void finishAnimation() {
- try {
- mFinishedCallback.onAnimationFinished();
- } catch (RemoteException e) {
- fail();
- }
- }
- }
-
- @Test
- public void testGetRemoteAnimationOverrideEmpty() {
- final ActivityRecord activity = createActivityRecord(mDisplayContent);
- assertNull(mAppTransitionController.getRemoteAnimationOverride(activity,
- TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
- }
-
- @Test
- public void testGetRemoteAnimationOverrideWindowContainer() {
- final ActivityRecord activity = createActivityRecord(mDisplayContent);
- final RemoteAnimationDefinition definition = new RemoteAnimationDefinition();
- final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
- new TestRemoteAnimationRunner(), 10, 1);
- definition.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter);
- activity.registerRemoteAnimations(definition);
-
- assertEquals(adapter,
- mAppTransitionController.getRemoteAnimationOverride(
- activity, TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
- assertNull(mAppTransitionController.getRemoteAnimationOverride(
- null, TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
- }
-
- @Test
- public void testGetRemoteAnimationOverrideTransitionController() {
- final ActivityRecord activity = createActivityRecord(mDisplayContent);
- final RemoteAnimationDefinition definition = new RemoteAnimationDefinition();
- final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
- new TestRemoteAnimationRunner(), 10, 1);
- definition.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter);
- mAppTransitionController.registerRemoteAnimations(definition);
-
- assertEquals(adapter,
- mAppTransitionController.getRemoteAnimationOverride(
- activity, TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
- assertEquals(adapter,
- mAppTransitionController.getRemoteAnimationOverride(
- null, TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
- }
-
- @Test
- public void testGetRemoteAnimationOverrideBoth() {
- final ActivityRecord activity = createActivityRecord(mDisplayContent);
- final RemoteAnimationDefinition definition1 = new RemoteAnimationDefinition();
- final RemoteAnimationAdapter adapter1 = new RemoteAnimationAdapter(
- new TestRemoteAnimationRunner(), 10, 1);
- definition1.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter1);
- activity.registerRemoteAnimations(definition1);
-
- final RemoteAnimationDefinition definition2 = new RemoteAnimationDefinition();
- final RemoteAnimationAdapter adapter2 = new RemoteAnimationAdapter(
- new TestRemoteAnimationRunner(), 10, 1);
- definition2.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_UNOCCLUDE, adapter2);
- mAppTransitionController.registerRemoteAnimations(definition2);
-
- assertEquals(adapter2,
- mAppTransitionController.getRemoteAnimationOverride(
- activity, TRANSIT_OLD_KEYGUARD_UNOCCLUDE, new ArraySet<Integer>()));
- assertEquals(adapter2,
- mAppTransitionController.getRemoteAnimationOverride(
- null, TRANSIT_OLD_KEYGUARD_UNOCCLUDE, new ArraySet<Integer>()));
- }
-
- @Test
- public void testGetRemoteAnimationOverrideWindowContainerHasPriority() {
- final ActivityRecord activity = createActivityRecord(mDisplayContent);
- final RemoteAnimationDefinition definition1 = new RemoteAnimationDefinition();
- final RemoteAnimationAdapter adapter1 = new RemoteAnimationAdapter(
- new TestRemoteAnimationRunner(), 10, 1);
- definition1.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter1);
- activity.registerRemoteAnimations(definition1);
-
- final RemoteAnimationDefinition definition2 = new RemoteAnimationDefinition();
- final RemoteAnimationAdapter adapter2 = new RemoteAnimationAdapter(
- new TestRemoteAnimationRunner(), 10, 1);
- definition2.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter2);
- mAppTransitionController.registerRemoteAnimations(definition2);
-
- assertEquals(adapter1,
- mAppTransitionController.getRemoteAnimationOverride(
- activity, TRANSIT_OLD_ACTIVITY_OPEN, new ArraySet<Integer>()));
- }
-
- @Test
- public void testOverrideTaskFragmentAdapter_overrideWithEmbeddedActivity() {
- final Task task = createTask(mDisplayContent);
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
- setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
- // Create a TaskFragment with embedded activity.
- final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
- final ActivityRecord activity = taskFragment.getTopMostActivity();
- prepareActivityForAppTransition(activity);
- spyOn(mDisplayContent.mAppTransition);
-
- // Prepare and start transition.
- prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
- waitUntilWindowAnimatorIdle();
-
- // Animation run by the remote handler.
- assertTrue(remoteAnimationRunner.isAnimationStarted());
- }
-
- @Test
- public void testOverrideTaskFragmentAdapter_noOverrideWithOnlyTaskFragmentFillingTask() {
- final Task task = createTask(mDisplayContent);
- final ActivityRecord closingActivity = createActivityRecord(task);
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
- setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
- // Create a TaskFragment with embedded activity.
- final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
-
- // Make sure the TaskFragment is not embedded.
- assertFalse(taskFragment.isEmbeddedWithBoundsOverride());
- final ActivityRecord openingActivity = taskFragment.getTopMostActivity();
- prepareActivityForAppTransition(closingActivity);
- prepareActivityForAppTransition(openingActivity);
- final int uid = 12345;
- closingActivity.info.applicationInfo.uid = uid;
- openingActivity.info.applicationInfo.uid = uid;
- task.effectiveUid = uid;
- spyOn(mDisplayContent.mAppTransition);
-
- // Prepare and start transition.
- prepareAndTriggerAppTransition(openingActivity, closingActivity,
- null /* changingTaskFragment */);
- waitUntilWindowAnimatorIdle();
-
- // Animation is not run by the remote handler because the activity is filling the Task.
- assertFalse(remoteAnimationRunner.isAnimationStarted());
- }
-
- @Test
- public void testOverrideTaskFragmentAdapter_overrideWithTaskFragmentNotFillingTask() {
- final Task task = createTask(mDisplayContent);
- final ActivityRecord closingActivity = createActivityRecord(task);
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
- setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
- // Create a TaskFragment with embedded activity.
- final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
-
- // Make sure the TaskFragment is embedded.
- taskFragment.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
- final Rect embeddedBounds = new Rect(task.getBounds());
- embeddedBounds.right = embeddedBounds.left + embeddedBounds.width() / 2;
- taskFragment.setBounds(embeddedBounds);
- assertTrue(taskFragment.isEmbeddedWithBoundsOverride());
- final ActivityRecord openingActivity = taskFragment.getTopMostActivity();
- prepareActivityForAppTransition(closingActivity);
- prepareActivityForAppTransition(openingActivity);
- final int uid = 12345;
- closingActivity.info.applicationInfo.uid = uid;
- openingActivity.info.applicationInfo.uid = uid;
- task.effectiveUid = uid;
- spyOn(mDisplayContent.mAppTransition);
-
- // Prepare and start transition.
- prepareAndTriggerAppTransition(openingActivity, closingActivity,
- null /* changingTaskFragment */);
- waitUntilWindowAnimatorIdle();
-
- // Animation run by the remote handler.
- assertTrue(remoteAnimationRunner.isAnimationStarted());
- }
-
- @Test
- public void testOverrideTaskFragmentAdapter_overrideWithNonEmbeddedActivity() {
- final Task task = createTask(mDisplayContent);
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
- setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
- // Closing non-embedded activity.
- final ActivityRecord closingActivity = createActivityRecord(task);
- prepareActivityForAppTransition(closingActivity);
- // Opening TaskFragment with embedded activity.
- final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
- final ActivityRecord openingActivity = taskFragment.getTopMostActivity();
- prepareActivityForAppTransition(openingActivity);
- task.effectiveUid = openingActivity.getUid();
- spyOn(mDisplayContent.mAppTransition);
-
- // Prepare and start transition.
- prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment);
- waitUntilWindowAnimatorIdle();
-
- // Animation run by the remote handler.
- assertTrue(remoteAnimationRunner.isAnimationStarted());
- }
-
- @Test
- public void testOverrideTaskFragmentAdapter_overrideEmbeddedActivityWithDiffUid() {
- final Task task = createTask(mDisplayContent);
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
- setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
- // Closing TaskFragment with embedded activity.
- final TaskFragment taskFragment1 = createTaskFragmentWithEmbeddedActivity(task, organizer);
- final ActivityRecord closingActivity = taskFragment1.getTopMostActivity();
- prepareActivityForAppTransition(closingActivity);
- closingActivity.info.applicationInfo.uid = 12345;
- // Opening TaskFragment with embedded activity with different UID.
- final TaskFragment taskFragment2 = createTaskFragmentWithEmbeddedActivity(task, organizer);
- final ActivityRecord openingActivity = taskFragment2.getTopMostActivity();
- prepareActivityForAppTransition(openingActivity);
- openingActivity.info.applicationInfo.uid = 54321;
- spyOn(mDisplayContent.mAppTransition);
-
- // Prepare and start transition.
- prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment1);
- waitUntilWindowAnimatorIdle();
-
- // Animation run by the remote handler.
- assertTrue(remoteAnimationRunner.isAnimationStarted());
- }
-
- @Test
- public void testOverrideTaskFragmentAdapter_noOverrideWithTwoApps() {
- final Task task = createTask(mDisplayContent);
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
- setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
- // Closing activity in Task1.
- final ActivityRecord closingActivity = createActivityRecord(mDisplayContent);
- prepareActivityForAppTransition(closingActivity);
- // Opening TaskFragment with embedded activity in Task2.
- final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
- final ActivityRecord openingActivity = taskFragment.getTopMostActivity();
- prepareActivityForAppTransition(openingActivity);
- spyOn(mDisplayContent.mAppTransition);
-
- // Prepare and start transition.
- prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment);
- waitUntilWindowAnimatorIdle();
-
- // Animation not run by the remote handler.
- assertFalse(remoteAnimationRunner.isAnimationStarted());
- }
-
- @Test
- public void testOverrideTaskFragmentAdapter_noOverrideNonEmbeddedActivityWithDiffUid() {
- final Task task = createTask(mDisplayContent);
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
- setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
- // Closing TaskFragment with embedded activity.
- final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
- final ActivityRecord closingActivity = taskFragment.getTopMostActivity();
- prepareActivityForAppTransition(closingActivity);
- closingActivity.info.applicationInfo.uid = 12345;
- task.effectiveUid = closingActivity.getUid();
- // Opening non-embedded activity with different UID.
- final ActivityRecord openingActivity = createActivityRecord(task);
- prepareActivityForAppTransition(openingActivity);
- openingActivity.info.applicationInfo.uid = 54321;
- spyOn(mDisplayContent.mAppTransition);
-
- // Prepare and start transition.
- prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment);
- waitUntilWindowAnimatorIdle();
-
- // Animation should not run by the remote handler when there are non-embedded activities of
- // different UID.
- assertFalse(remoteAnimationRunner.isAnimationStarted());
- }
-
- @Test
- public void testOverrideTaskFragmentAdapter_noOverrideWithWallpaper() {
- final Task task = createTask(mDisplayContent);
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
- setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
- // Create a TaskFragment with embedded activity.
- final TaskFragment taskFragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
- final ActivityRecord activity = taskFragment.getTopMostActivity();
- prepareActivityForAppTransition(activity);
- // Set wallpaper as visible.
- final WallpaperWindowToken wallpaperWindowToken = new WallpaperWindowToken(mWm,
- mock(IBinder.class), true, mDisplayContent, true /* ownerCanManageAppTokens */);
- spyOn(mDisplayContent.mWallpaperController);
- doReturn(true).when(mDisplayContent.mWallpaperController).isWallpaperVisible();
- spyOn(mDisplayContent.mAppTransition);
-
- // Prepare and start transition.
- prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
- waitUntilWindowAnimatorIdle();
-
- // Animation should not run by the remote handler when there is wallpaper in the transition.
- assertFalse(remoteAnimationRunner.isAnimationStarted());
- }
-
- @Test
- public void testOverrideTaskFragmentAdapter_inputProtectedForUntrustedAnimation() {
- final Task task = createTask(mDisplayContent);
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
- setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
- // Create a TaskFragment with embedded activities, one is trusted embedded, and the other
- // one is untrusted embedded.
- final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm)
- .setParentTask(task)
- .createActivityCount(2)
- .setOrganizer(organizer)
- .build();
- final ActivityRecord activity0 = taskFragment.getChildAt(0).asActivityRecord();
- final ActivityRecord activity1 = taskFragment.getChildAt(1).asActivityRecord();
- // Also create a non-embedded activity in the Task.
- final ActivityRecord activity2 = new ActivityBuilder(mAtm).build();
- task.addChild(activity2, POSITION_BOTTOM);
- prepareActivityForAppTransition(activity0);
- prepareActivityForAppTransition(activity1);
- prepareActivityForAppTransition(activity2);
- doReturn(false).when(taskFragment).isAllowedToEmbedActivityInTrustedMode(activity0);
- doReturn(true).when(taskFragment).isAllowedToEmbedActivityInTrustedMode(activity1);
- spyOn(mDisplayContent.mAppTransition);
-
- // Prepare and start transition.
- prepareAndTriggerAppTransition(activity1, null /* closingActivity */, taskFragment);
- waitUntilWindowAnimatorIdle();
-
- // The animation will be animated remotely by client and all activities are input disabled
- // for untrusted animation.
- assertTrue(remoteAnimationRunner.isAnimationStarted());
- verify(activity0).setDropInputForAnimation(true);
- verify(activity1).setDropInputForAnimation(true);
- verify(activity2).setDropInputForAnimation(true);
- verify(activity0).setDropInputMode(DropInputMode.ALL);
- verify(activity1).setDropInputMode(DropInputMode.ALL);
- verify(activity2).setDropInputMode(DropInputMode.ALL);
-
- // Reset input after animation is finished.
- clearInvocations(activity0);
- clearInvocations(activity1);
- clearInvocations(activity2);
- remoteAnimationRunner.finishAnimation();
-
- verify(activity0).setDropInputForAnimation(false);
- verify(activity1).setDropInputForAnimation(false);
- verify(activity2).setDropInputForAnimation(false);
- verify(activity0).setDropInputMode(DropInputMode.OBSCURED);
- verify(activity1).setDropInputMode(DropInputMode.NONE);
- verify(activity2).setDropInputMode(DropInputMode.NONE);
- }
-
- /**
- * Since we don't have any use case to rely on handling input during animation, disable it even
- * if it is trusted embedding so that it could cover some edge-cases when a previously trusted
- * host starts doing something bad.
- */
- @Test
- public void testOverrideTaskFragmentAdapter_inputProtectedForTrustedAnimation() {
- final Task task = createTask(mDisplayContent);
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
- setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
- // Create a TaskFragment with only trusted embedded activity
- final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm)
- .setParentTask(task)
- .createActivityCount(1)
- .setOrganizer(organizer)
- .build();
- final ActivityRecord activity = taskFragment.getChildAt(0).asActivityRecord();
- prepareActivityForAppTransition(activity);
- doReturn(true).when(taskFragment).isAllowedToEmbedActivityInTrustedMode(activity);
- spyOn(mDisplayContent.mAppTransition);
-
- // Prepare and start transition.
- prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
- waitUntilWindowAnimatorIdle();
-
- // The animation will be animated remotely by client and all activities are input disabled
- // for untrusted animation.
- assertTrue(remoteAnimationRunner.isAnimationStarted());
- verify(activity).setDropInputForAnimation(true);
- verify(activity).setDropInputMode(DropInputMode.ALL);
-
- // Reset input after animation is finished.
- clearInvocations(activity);
- remoteAnimationRunner.finishAnimation();
-
- verify(activity).setDropInputForAnimation(false);
- verify(activity).setDropInputMode(DropInputMode.NONE);
- }
-
- /**
- * We don't need to drop input for fully trusted embedding (system app, and embedding in the
- * same app). This will allow users to do fast tapping.
- */
- @Test
- public void testOverrideTaskFragmentAdapter_noInputProtectedForFullyTrustedAnimation() {
- final Task task = createTask(mDisplayContent);
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final TestRemoteAnimationRunner remoteAnimationRunner = new TestRemoteAnimationRunner();
- setupTaskFragmentRemoteAnimation(organizer, remoteAnimationRunner);
-
- // Create a TaskFragment with only trusted embedded activity
- final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm)
- .setParentTask(task)
- .createActivityCount(1)
- .setOrganizer(organizer)
- .build();
- final ActivityRecord activity = taskFragment.getChildAt(0).asActivityRecord();
- prepareActivityForAppTransition(activity);
- final int uid = mAtm.mTaskFragmentOrganizerController.getTaskFragmentOrganizerUid(
- getITaskFragmentOrganizer(organizer));
- doReturn(true).when(task).isFullyTrustedEmbedding(uid);
- spyOn(mDisplayContent.mAppTransition);
-
- // Prepare and start transition.
- prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
- waitUntilWindowAnimatorIdle();
-
- // The animation will be animated remotely by client, but input should not be dropped for
- // fully trusted.
- assertTrue(remoteAnimationRunner.isAnimationStarted());
- verify(activity, never()).setDropInputForAnimation(true);
- verify(activity, never()).setDropInputMode(DropInputMode.ALL);
- }
-
- @Test
- public void testTransitionGoodToGoForTaskFragments() {
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final Task task = createTask(mDisplayContent);
- final TaskFragment changeTaskFragment =
- createTaskFragmentWithEmbeddedActivity(task, organizer);
- final TaskFragment emptyTaskFragment = new TaskFragmentBuilder(mAtm)
- .setParentTask(task)
- .setOrganizer(organizer)
- .build();
- prepareActivityForAppTransition(changeTaskFragment.getTopMostActivity());
- spyOn(mDisplayContent.mAppTransition);
- spyOn(emptyTaskFragment);
-
- prepareAndTriggerAppTransition(
- null /* openingActivity */, null /* closingActivity*/, changeTaskFragment);
-
- // Transition not ready because there is an empty non-finishing TaskFragment.
- verify(mDisplayContent.mAppTransition, never()).goodToGo(anyInt(), any());
-
- doReturn(true).when(emptyTaskFragment).hasChild();
- emptyTaskFragment.remove(false /* withTransition */, "test");
-
- mDisplayContent.mAppTransitionController.handleAppTransitionReady();
-
- // Transition ready because the empty (no running activity) TaskFragment is requested to be
- // removed.
- verify(mDisplayContent.mAppTransition).goodToGo(anyInt(), any());
- }
-
- @Test
- public void testTransitionGoodToGoForTaskFragments_detachedApp() {
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final ITaskFragmentOrganizer iOrganizer = getITaskFragmentOrganizer(organizer);
- registerTaskFragmentOrganizer(iOrganizer);
- final Task task = createTask(mDisplayContent);
- final TaskFragment changeTaskFragment =
- createTaskFragmentWithEmbeddedActivity(task, organizer);
- final TaskFragment emptyTaskFragment = new TaskFragmentBuilder(mAtm)
- .setParentTask(task)
- .setOrganizer(organizer)
- .build();
- prepareActivityForAppTransition(changeTaskFragment.getTopMostActivity());
- // To make sure that having a detached activity won't cause any issue.
- final ActivityRecord detachedActivity = createActivityRecord(task);
- detachedActivity.removeImmediately();
- assertNull(detachedActivity.getRootTask());
- spyOn(mDisplayContent.mAppTransition);
- spyOn(emptyTaskFragment);
-
- prepareAndTriggerAppTransition(
- null /* openingActivity */, detachedActivity, changeTaskFragment);
-
- // Transition not ready because there is an empty non-finishing TaskFragment.
- verify(mDisplayContent.mAppTransition, never()).goodToGo(anyInt(), any());
-
- doReturn(true).when(emptyTaskFragment).hasChild();
- emptyTaskFragment.remove(false /* withTransition */, "test");
-
- mDisplayContent.mAppTransitionController.handleAppTransitionReady();
-
- // Transition ready because the empty (no running activity) TaskFragment is requested to be
- // removed.
- verify(mDisplayContent.mAppTransition).goodToGo(anyInt(), any());
- }
-
- /** Registers remote animation for the organizer. */
- private void setupTaskFragmentRemoteAnimation(TaskFragmentOrganizer organizer,
- TestRemoteAnimationRunner remoteAnimationRunner) {
- final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
- remoteAnimationRunner, 10, 1);
- final ITaskFragmentOrganizer iOrganizer = getITaskFragmentOrganizer(organizer);
- final RemoteAnimationDefinition definition = new RemoteAnimationDefinition();
- definition.addRemoteAnimation(TRANSIT_OLD_TASK_FRAGMENT_CHANGE, adapter);
- definition.addRemoteAnimation(TRANSIT_OLD_TASK_FRAGMENT_OPEN, adapter);
- definition.addRemoteAnimation(TRANSIT_OLD_TASK_FRAGMENT_CLOSE, adapter);
- definition.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_OPEN, adapter);
- definition.addRemoteAnimation(TRANSIT_OLD_ACTIVITY_CLOSE, adapter);
- registerTaskFragmentOrganizer(iOrganizer);
- mAtm.mTaskFragmentOrganizerController.registerRemoteAnimations(iOrganizer, definition);
- }
-
- private static ITaskFragmentOrganizer getITaskFragmentOrganizer(
- TaskFragmentOrganizer organizer) {
- return ITaskFragmentOrganizer.Stub.asInterface(organizer.getOrganizerToken().asBinder());
- }
-
- private void prepareAndTriggerAppTransition(@Nullable ActivityRecord openingActivity,
- @Nullable ActivityRecord closingActivity, @Nullable TaskFragment changingTaskFragment) {
- if (openingActivity != null) {
- mDisplayContent.mAppTransition.prepareAppTransition(TRANSIT_OPEN, 0);
- mDisplayContent.mOpeningApps.add(openingActivity);
- }
- if (closingActivity != null) {
- mDisplayContent.mAppTransition.prepareAppTransition(TRANSIT_CLOSE, 0);
- mDisplayContent.mClosingApps.add(closingActivity);
- }
- if (changingTaskFragment != null) {
- mDisplayContent.mAppTransition.prepareAppTransition(TRANSIT_CHANGE, 0);
- mDisplayContent.mChangingContainers.add(changingTaskFragment);
- }
- mDisplayContent.mAppTransitionController.handleAppTransitionReady();
- }
-
- private static void prepareActivityForAppTransition(ActivityRecord activity) {
- // Transition will wait until all participated activities to be drawn.
- activity.allDrawn = true;
- // Skip manipulate the SurfaceControl.
- doNothing().when(activity).setDropInputMode(anyInt());
- // Assume the activity contains a window.
- doReturn(true).when(activity).hasChild();
- // Make sure activity can create remote animation target.
- doReturn(mock(RemoteAnimationTarget.class)).when(activity).createRemoteAnimationTarget(
- any());
- }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
deleted file mode 100644
index 8553fbd30ab8..000000000000
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
+++ /dev/null
@@ -1,520 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
-import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
-import static android.view.WindowManager.TRANSIT_CHANGE;
-import static android.view.WindowManager.TRANSIT_CLOSE;
-import static android.view.WindowManager.TRANSIT_FLAG_APP_CRASHED;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
-import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
-import static android.view.WindowManager.TRANSIT_NONE;
-import static android.view.WindowManager.TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CHANGE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN;
-import static android.view.WindowManager.TRANSIT_OLD_UNSET;
-import static android.view.WindowManager.TRANSIT_OPEN;
-
-import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
-import static com.android.server.wm.WindowContainer.POSITION_TOP;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeFalse;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-
-import android.graphics.Rect;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.platform.test.annotations.Presubmit;
-import android.util.ArraySet;
-import android.view.Display;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.view.IRemoteAnimationRunner;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationTarget;
-import android.view.SurfaceControl;
-import android.view.WindowManager;
-import android.view.animation.Animation;
-import android.window.ITaskFragmentOrganizer;
-import android.window.TaskFragmentOrganizer;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.internal.policy.TransitionAnimation;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Test class for {@link AppTransition}.
- *
- * Build/Install/Run:
- * atest WmTests:AppTransitionTests
- */
-@SmallTest
-@Presubmit
-@RunWith(WindowTestRunner.class)
-public class AppTransitionTests extends WindowTestsBase {
- private DisplayContent mDc;
-
- @Before
- public void setUp() throws Exception {
- doNothing().when(mWm.mRoot).performSurfacePlacement();
- mDc = mWm.getDefaultDisplayContentLocked();
- }
-
- @Test
- public void testKeyguardOverride() {
- final DisplayContent dc = createNewDisplay(Display.STATE_ON);
- final ActivityRecord activity = createActivityRecord(dc);
-
- mDc.prepareAppTransition(TRANSIT_OPEN);
- mDc.prepareAppTransition(TRANSIT_KEYGUARD_OCCLUDE);
- mDc.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY);
- mDc.mOpeningApps.add(activity);
- assertEquals(TRANSIT_OLD_KEYGUARD_GOING_AWAY,
- AppTransitionController.getTransitCompatType(mDc.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
- null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
- }
-
- @Test
- public void testKeyguardUnoccludeOcclude() {
- final DisplayContent dc = createNewDisplay(Display.STATE_ON);
- final ActivityRecord activity = createActivityRecord(dc);
-
- mDc.prepareAppTransition(TRANSIT_KEYGUARD_UNOCCLUDE);
- mDc.prepareAppTransition(TRANSIT_KEYGUARD_OCCLUDE);
- mDc.mOpeningApps.add(activity);
- assertEquals(TRANSIT_NONE,
- AppTransitionController.getTransitCompatType(mDc.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
- null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
-
- }
-
- @Test
- public void testKeyguardKeep() {
- final DisplayContent dc = createNewDisplay(Display.STATE_ON);
- final ActivityRecord activity = createActivityRecord(dc);
-
- mDc.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY);
- mDc.prepareAppTransition(TRANSIT_OPEN);
- mDc.mOpeningApps.add(activity);
- assertEquals(TRANSIT_OLD_KEYGUARD_GOING_AWAY,
- AppTransitionController.getTransitCompatType(mDc.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
- null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
- }
-
- @Test
- public void testCrashing() {
- final DisplayContent dc = createNewDisplay(Display.STATE_ON);
- final ActivityRecord activity = createActivityRecord(dc);
-
- mDc.prepareAppTransition(TRANSIT_OPEN);
- mDc.prepareAppTransition(TRANSIT_CLOSE, TRANSIT_FLAG_APP_CRASHED);
- mDc.mClosingApps.add(activity);
- assertEquals(TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE,
- AppTransitionController.getTransitCompatType(mDc.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
- null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
- }
-
- @Test
- public void testKeepKeyguard_withCrashing() {
- final DisplayContent dc = createNewDisplay(Display.STATE_ON);
- final ActivityRecord activity = createActivityRecord(dc);
-
- mDc.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY);
- mDc.prepareAppTransition(TRANSIT_CLOSE, TRANSIT_FLAG_APP_CRASHED);
- mDc.mClosingApps.add(activity);
- assertEquals(TRANSIT_OLD_KEYGUARD_GOING_AWAY,
- AppTransitionController.getTransitCompatType(mDc.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
- null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
- }
-
- @Test
- public void testSkipTransitionAnimation() {
- final DisplayContent dc = createNewDisplay(Display.STATE_ON);
- final ActivityRecord activity = createActivityRecord(dc);
-
- mDc.prepareAppTransition(TRANSIT_OPEN);
- mDc.prepareAppTransition(TRANSIT_CLOSE);
- mDc.mClosingApps.add(activity);
- assertEquals(TRANSIT_OLD_UNSET,
- AppTransitionController.getTransitCompatType(mDc.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
- null /* oldWallpaper */, true /*skipAppTransitionAnimation*/));
- }
-
- @Test
- public void testTaskChangeWindowingMode() {
- final ActivityRecord activity = createActivityRecord(mDc);
-
- mDc.prepareAppTransition(TRANSIT_OPEN);
- mDc.prepareAppTransition(TRANSIT_CHANGE);
- mDc.mOpeningApps.add(activity); // Make sure TRANSIT_CHANGE has the priority
- mDc.mChangingContainers.add(activity.getTask());
-
- assertEquals(TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE,
- AppTransitionController.getTransitCompatType(mDc.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
- null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
- }
-
- @Test
- public void testTaskFragmentChange() {
- final ActivityRecord activity = createActivityRecord(mDc);
- final TaskFragment taskFragment = new TaskFragment(mAtm, new Binder(),
- true /* createdByOrganizer */, true /* isEmbedded */);
- activity.getTask().addChild(taskFragment, POSITION_TOP);
- activity.reparent(taskFragment, POSITION_TOP);
-
- mDc.prepareAppTransition(TRANSIT_OPEN);
- mDc.prepareAppTransition(TRANSIT_CHANGE);
- mDc.mOpeningApps.add(activity); // Make sure TRANSIT_CHANGE has the priority
- mDc.mChangingContainers.add(taskFragment);
-
- assertEquals(TRANSIT_OLD_TASK_FRAGMENT_CHANGE,
- AppTransitionController.getTransitCompatType(mDc.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
- null /* oldWallpaper */, false /*skipAppTransitionAnimation*/));
- }
-
- @Test
- public void testTaskFragmentOpeningTransition() {
- final ActivityRecord activity = createHierarchyForTaskFragmentTest();
- activity.setVisible(false);
-
- mDisplayContent.prepareAppTransition(TRANSIT_OPEN);
- mDisplayContent.mOpeningApps.add(activity);
- assertEquals(TRANSIT_OLD_TASK_FRAGMENT_OPEN,
- AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
- null /* oldWallpaper */, false /* skipAppTransitionAnimation */));
- }
-
- @Test
- public void testTaskFragmentClosingTransition() {
- final ActivityRecord activity = createHierarchyForTaskFragmentTest();
- activity.setVisible(true);
-
- mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
- mDisplayContent.mClosingApps.add(activity);
- assertEquals(TRANSIT_OLD_TASK_FRAGMENT_CLOSE,
- AppTransitionController.getTransitCompatType(mDisplayContent.mAppTransition,
- mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
- mDisplayContent.mChangingContainers, null /* wallpaperTarget */,
- null /* oldWallpaper */, false /* skipAppTransitionAnimation */));
- }
-
- /**
- * Creates a {@link Task} with two {@link TaskFragment TaskFragments}.
- * The bottom TaskFragment is to prevent
- * {@link AppTransitionController#getAnimationTargets(ArraySet, ArraySet, boolean) the animation
- * target} to promote to Task or above.
- *
- * @return The Activity to be put in either opening or closing Activity
- */
- private ActivityRecord createHierarchyForTaskFragmentTest() {
- final Task parentTask = createTask(mDisplayContent);
- final TaskFragment bottomTaskFragment = createTaskFragmentWithActivity(parentTask);
- final ActivityRecord bottomActivity = bottomTaskFragment.getTopMostActivity();
- bottomActivity.setOccludesParent(true);
- bottomActivity.setVisible(true);
-
- final TaskFragment verifiedTaskFragment = createTaskFragmentWithActivity(parentTask);
- final ActivityRecord activity = verifiedTaskFragment.getTopMostActivity();
- activity.setOccludesParent(true);
-
- return activity;
- }
-
- @Test
- public void testAppTransitionStateForMultiDisplay() {
- // Create 2 displays & presume both display the state is ON for ready to display & animate.
- final DisplayContent dc1 = createNewDisplay(Display.STATE_ON);
- final DisplayContent dc2 = createNewDisplay(Display.STATE_ON);
-
- // Create 2 app window tokens to represent 2 activity window.
- final ActivityRecord activity1 = createActivityRecord(dc1);
- final ActivityRecord activity2 = createActivityRecord(dc2);
-
- activity1.allDrawn = true;
- activity1.startingMoved = true;
-
- // Simulate activity resume / finish flows to prepare app transition & set visibility,
- // make sure transition is set as expected for each display.
- dc1.prepareAppTransition(TRANSIT_OPEN);
- dc2.prepareAppTransition(TRANSIT_CLOSE);
- // One activity window is visible for resuming & the other activity window is invisible
- // for finishing in different display.
- activity1.setVisibility(true);
- activity2.setVisibility(false);
-
- // Make sure each display is in animating stage.
- assertTrue(dc1.mOpeningApps.size() > 0);
- assertTrue(dc2.mClosingApps.size() > 0);
- assertTrue(dc1.isAppTransitioning());
- assertTrue(dc2.isAppTransitioning());
- }
-
- @Test
- public void testCleanAppTransitionWhenRootTaskReparent() {
- // Create 2 displays & presume both display the state is ON for ready to display & animate.
- final DisplayContent dc1 = createNewDisplay(Display.STATE_ON);
- final DisplayContent dc2 = createNewDisplay(Display.STATE_ON);
-
- final Task rootTask1 = createTask(dc1);
- final Task task1 = createTaskInRootTask(rootTask1, 0 /* userId */);
- final ActivityRecord activity1 = createNonAttachedActivityRecord(dc1);
- task1.addChild(activity1, 0);
-
- // Simulate same app is during opening / closing transition set stage.
- dc1.mClosingApps.add(activity1);
- assertTrue(dc1.mClosingApps.size() > 0);
-
- dc1.prepareAppTransition(TRANSIT_OPEN);
- assertTrue(dc1.mAppTransition.containsTransitRequest(TRANSIT_OPEN));
- assertTrue(dc1.mAppTransition.isTransitionSet());
-
- dc1.mOpeningApps.add(activity1);
- assertTrue(dc1.mOpeningApps.size() > 0);
-
- // Move root task to another display.
- rootTask1.reparent(dc2.getDefaultTaskDisplayArea(), true);
-
- // Verify if token are cleared from both pending transition list in former display.
- assertFalse(dc1.mOpeningApps.contains(activity1));
- assertFalse(dc1.mOpeningApps.contains(activity1));
- }
-
- @Test
- public void testLoadAnimationSafely() {
- DisplayContent dc = createNewDisplay(Display.STATE_ON);
- assertNull(dc.mAppTransition.loadAnimationSafely(
- getInstrumentation().getTargetContext(), -1));
- }
-
- @Test
- public void testCancelRemoteAnimationWhenFreeze() {
- final DisplayContent dc = createNewDisplay(Display.STATE_ON);
- doReturn(false).when(dc).onDescendantOrientationChanged(any());
- final WindowState exitingAppWindow = newWindowBuilder("exiting app",
- TYPE_BASE_APPLICATION).setDisplay(dc).build();
- final ActivityRecord exitingActivity = exitingAppWindow.mActivityRecord;
- // Wait until everything in animation handler get executed to prevent the exiting window
- // from being removed during WindowSurfacePlacer Traversal.
- waitUntilHandlersIdle();
-
- // Set a remote animator.
- final TestRemoteAnimationRunner runner = new TestRemoteAnimationRunner();
- final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
- runner, 100, 50, true /* changeNeedsSnapshot */);
- // RemoteAnimationController will tracking RemoteAnimationAdapter's caller with calling pid.
- adapter.setCallingPidUid(123, 456);
-
- // Simulate activity finish flows to prepare app transition & set visibility,
- // make sure transition is set as expected.
- dc.prepareAppTransition(TRANSIT_CLOSE);
- assertTrue(dc.mAppTransition.containsTransitRequest(TRANSIT_CLOSE));
- dc.mAppTransition.overridePendingAppTransitionRemote(adapter);
- exitingActivity.setVisibility(false);
- assertTrue(dc.mClosingApps.size() > 0);
-
- // Make sure window is in animating stage before freeze, and cancel after freeze.
- assertTrue(dc.isAppTransitioning());
- assertFalse(runner.mCancelled);
- dc.mAppTransition.freeze();
- assertFalse(dc.isAppTransitioning());
- assertTrue(runner.mCancelled);
- }
-
- @Test
- public void testGetAnimationStyleResId() {
- // Verify getAnimationStyleResId will return as LayoutParams.windowAnimations when without
- // specifying window type.
- final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams();
- attrs.windowAnimations = 0x12345678;
- assertEquals(attrs.windowAnimations, mDc.mAppTransition.getAnimationStyleResId(attrs));
-
- // Verify getAnimationStyleResId will return system resource Id when the window type is
- // starting window.
- attrs.type = TYPE_APPLICATION_STARTING;
- assertEquals(mDc.mAppTransition.getDefaultWindowAnimationStyleResId(),
- mDc.mAppTransition.getAnimationStyleResId(attrs));
- }
-
- @Test
- public void testActivityRecordReparentedToTaskFragment() {
- final ActivityRecord activity = createActivityRecord(mDc);
- final SurfaceControl activityLeash = mock(SurfaceControl.class);
- doNothing().when(activity).setDropInputMode(anyInt());
- activity.setVisibility(true);
- activity.setSurfaceControl(activityLeash);
- final Task task = activity.getTask();
-
- // Add a TaskFragment of half of the Task size.
- final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
- final ITaskFragmentOrganizer iOrganizer =
- ITaskFragmentOrganizer.Stub.asInterface(organizer.getOrganizerToken().asBinder());
- registerTaskFragmentOrganizer(iOrganizer);
- final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm)
- .setParentTask(task)
- .setOrganizer(organizer)
- .build();
- final Rect taskBounds = new Rect();
- task.getBounds(taskBounds);
- taskFragment.setBounds(0, 0, taskBounds.right / 2, taskBounds.bottom);
- spyOn(taskFragment);
-
- assertTrue(mDc.mChangingContainers.isEmpty());
- assertFalse(mDc.mAppTransition.isTransitionSet());
-
- // Schedule app transition when reparent activity to a TaskFragment of different size.
- final Rect startBounds = new Rect(activity.getBounds());
- activity.reparent(taskFragment, POSITION_TOP);
-
- // It should transit at TaskFragment level with snapshot on the activity surface.
- verify(taskFragment).initializeChangeTransition(activity.getBounds(), activityLeash);
- assertTrue(mDc.mChangingContainers.contains(taskFragment));
- assertTrue(mDc.mAppTransition.containsTransitRequest(TRANSIT_CHANGE));
- }
-
- @Test
- public void testGetNextAppTransitionBackgroundColor() {
- assumeFalse(WindowManagerService.sEnableShellTransitions);
-
- // No override by default.
- assertEquals(0, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
-
- // Override with a custom color.
- mDc.mAppTransition.prepareAppTransition(TRANSIT_OPEN, 0);
- final int testColor = 123;
- mDc.mAppTransition.overridePendingAppTransition("testPackage", 0 /* enterAnim */,
- 0 /* exitAnim */, testColor, null /* startedCallback */, null /* endedCallback */,
- false /* overrideTaskTransaction */);
-
- assertEquals(testColor, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
- assertTrue(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
-
- // Override with ActivityEmbedding remote animation. Background color should be kept.
- mDc.mAppTransition.overridePendingAppTransitionRemote(mock(RemoteAnimationAdapter.class),
- false /* sync */, true /* isActivityEmbedding */);
-
- assertEquals(testColor, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
- assertFalse(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
-
- // Background color should not be cleared anymore after #clear().
- mDc.mAppTransition.clear();
- assertEquals(0, mDc.mAppTransition.getNextAppTransitionBackgroundColor());
- assertFalse(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
- }
-
- @Test
- public void testGetNextAppRequestedAnimation() {
- assumeFalse(WindowManagerService.sEnableShellTransitions);
- final String packageName = "testPackage";
- final int enterAnimResId = 1;
- final int exitAnimResId = 2;
- final int testColor = 123;
- final Animation enterAnim = mock(Animation.class);
- final Animation exitAnim = mock(Animation.class);
- final TransitionAnimation transitionAnimation = mDc.mAppTransition.mTransitionAnimation;
- spyOn(transitionAnimation);
- doReturn(enterAnim).when(transitionAnimation)
- .loadAppTransitionAnimation(packageName, enterAnimResId);
- doReturn(exitAnim).when(transitionAnimation)
- .loadAppTransitionAnimation(packageName, exitAnimResId);
-
- // No override by default.
- assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
- assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
-
- // Override with a custom animation.
- mDc.mAppTransition.prepareAppTransition(TRANSIT_OPEN, 0);
- mDc.mAppTransition.overridePendingAppTransition(packageName, enterAnimResId, exitAnimResId,
- testColor, null /* startedCallback */, null /* endedCallback */,
- false /* overrideTaskTransaction */);
-
- assertEquals(enterAnim, mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
- assertEquals(exitAnim, mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
- assertTrue(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
-
- // Override with ActivityEmbedding remote animation. Custom animation should be kept.
- mDc.mAppTransition.overridePendingAppTransitionRemote(mock(RemoteAnimationAdapter.class),
- false /* sync */, true /* isActivityEmbedding */);
-
- assertEquals(enterAnim, mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
- assertEquals(exitAnim, mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
- assertFalse(mDc.mAppTransition.isNextAppTransitionOverrideRequested());
-
- // Custom animation should not be cleared anymore after #clear().
- mDc.mAppTransition.clear();
- assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(true /* enter */));
- assertNull(mDc.mAppTransition.getNextAppRequestedAnimation(false /* enter */));
- }
-
- private class TestRemoteAnimationRunner implements IRemoteAnimationRunner {
- boolean mCancelled = false;
- @Override
- public void onAnimationStart(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTarget[] apps,
- RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps,
- IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException {
- }
-
- @Override
- public void onAnimationCancelled() {
- mCancelled = true;
- }
-
- @Override
- public IBinder asBinder() {
- return null;
- }
- }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 0964ebed9d25..82435b24dad6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -1172,11 +1172,12 @@ public class DisplayContentTests extends WindowTestsBase {
.setScreenOrientation(getRotatedOrientation(mDisplayContent)).build();
prev.setVisibleRequested(false);
final ActivityRecord top = new ActivityBuilder(mAtm).setCreateTask(true)
+ .setVisible(false)
.setScreenOrientation(SCREEN_ORIENTATION_BEHIND).build();
assertNotEquals(WindowConfiguration.ROTATION_UNDEFINED,
mDisplayContent.rotationForActivityInDifferentOrientation(top));
- mDisplayContent.requestTransitionAndLegacyPrepare(WindowManager.TRANSIT_OPEN, 0);
+ requestTransition(top, WindowManager.TRANSIT_OPEN);
top.setVisibility(true);
mDisplayContent.updateOrientation();
// The top uses "behind", so the orientation is decided by the previous.
@@ -1609,8 +1610,7 @@ public class DisplayContentTests extends WindowTestsBase {
final ActivityRecord app = mAppWindow.mActivityRecord;
app.setVisible(false);
app.setVisibleRequested(false);
- registerTestTransitionPlayer();
- mDisplayContent.requestTransitionAndLegacyPrepare(WindowManager.TRANSIT_OPEN, 0);
+ requestTransition(app, WindowManager.TRANSIT_OPEN);
app.setVisibility(true);
final int newOrientation = getRotatedOrientation(mDisplayContent);
app.setRequestedOrientation(newOrientation);
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index fc4f54a431d6..e4a1bf603cf0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -454,31 +454,6 @@ public class RootWindowContainerTests extends WindowTestsBase {
}
@Test
- public void testMovingBottomMostRootTaskActivityToPinnedRootTask() {
- final Task fullscreenTask = mRootWindowContainer.getDefaultTaskDisplayArea().createRootTask(
- WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
- final ActivityRecord firstActivity = new ActivityBuilder(mAtm)
- .setTask(fullscreenTask).build();
- final Task task = firstActivity.getTask();
-
- final ActivityRecord secondActivity = new ActivityBuilder(mAtm)
- .setTask(fullscreenTask).build();
-
- fullscreenTask.moveTaskToBack(task);
-
- // Ensure full screen task has both tasks.
- ensureTaskPlacement(fullscreenTask, firstActivity, secondActivity);
- assertEquals(task.getTopMostActivity(), secondActivity);
- firstActivity.setState(STOPPED, "testMovingBottomMostRootTaskActivityToPinnedRootTask");
-
-
- // Move first activity to pinned root task.
- mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, "initialMove");
-
- assertTrue(firstActivity.mRequestForceTransition);
- }
-
- @Test
public void testMultipleActivitiesTaskEnterPip() {
// Enable shell transition because the order of setting windowing mode is different.
registerTestTransitionPlayer();
diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
index dba463a436c0..95bca2b17efb 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -1811,9 +1811,9 @@ public class SizeCompatTests extends WindowTestsBase {
}
addStatusBar(mActivity.mDisplayContent);
- mActivity.setVisible(false);
- mActivity.mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_OPEN);
- mActivity.mDisplayContent.mOpeningApps.add(mActivity);
+ mActivity.setVisibleRequested(false);
+ requestTransition(mActivity, WindowManager.TRANSIT_OPEN);
+ mActivity.setVisibility(true);
final float maxAspect = 1.8f;
prepareUnresizable(mActivity, maxAspect, SCREEN_ORIENTATION_LANDSCAPE);
diff --git a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java
index 7dba1422d61d..2544550120d4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceAnimatorTest.java
@@ -22,6 +22,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
+import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMATION;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -69,7 +70,6 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
private MyAnimatable mAnimatable;
private MyAnimatable mAnimatable2;
- private DeferFinishAnimatable mDeferFinishAnimatable;
@Before
public void setUp() throws Exception {
@@ -77,14 +77,12 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
mAnimatable = new MyAnimatable(mWm, mTransaction);
mAnimatable2 = new MyAnimatable(mWm, mTransaction);
- mDeferFinishAnimatable = new DeferFinishAnimatable(mWm, mTransaction);
}
@After
public void tearDown() {
mAnimatable = null;
mAnimatable2 = null;
- mDeferFinishAnimatable = null;
}
@Test
@@ -202,41 +200,33 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
}
@Test
- public void testDeferFinish() {
-
- // Start animation
- final OnAnimationFinishedCallback onFinishedCallback = startDeferFinishAnimatable(mSpec);
-
- // Finish the animation but then make sure we are deferring.
- onFinishedCallback.onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, mSpec);
- assertAnimating(mDeferFinishAnimatable);
-
- // Now end defer finishing.
- mDeferFinishAnimatable.mEndDeferFinishCallback.run();
- assertNotAnimating(mAnimatable2);
- assertTrue(mDeferFinishAnimatable.mFinishedCallbackCalled);
- assertEquals(ANIMATION_TYPE_APP_TRANSITION, mDeferFinishAnimatable.mFinishedAnimationType);
- verify(mTransaction).remove(eq(mDeferFinishAnimatable.mLeash));
- }
-
- @Test
public void testDeferFinishDoNotFinishNextAnimation() {
+ final DeferredFinishAdapter deferredFinishAdapter = new DeferredFinishAdapter();
+ spyOn(deferredFinishAdapter);
// Start the first animation.
- final OnAnimationFinishedCallback onFinishedCallback = startDeferFinishAnimatable(mSpec);
- onFinishedCallback.onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION, mSpec);
+ mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, deferredFinishAdapter,
+ true /* hidden */, ANIMATION_TYPE_WINDOW_ANIMATION);
+ assertAnimating(mAnimatable);
+ final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
+ OnAnimationFinishedCallback.class);
+ verify(deferredFinishAdapter).startAnimation(any(), any(),
+ eq(ANIMATION_TYPE_WINDOW_ANIMATION), callbackCaptor.capture());
+ final OnAnimationFinishedCallback onFinishedCallback = callbackCaptor.getValue();
+ onFinishedCallback.onAnimationFinished(ANIMATION_TYPE_APP_TRANSITION,
+ deferredFinishAdapter);
// The callback is the resetAndInvokeFinish in {@link SurfaceAnimator#getFinishedCallback}.
- final Runnable firstDeferFinishCallback = mDeferFinishAnimatable.mEndDeferFinishCallback;
+ final Runnable firstDeferFinishCallback = deferredFinishAdapter.mEndDeferFinishCallback;
// Start the second animation.
- mDeferFinishAnimatable.mSurfaceAnimator.cancelAnimation();
- startDeferFinishAnimatable(mSpec2);
- mDeferFinishAnimatable.mFinishedCallbackCalled = false;
+ mAnimatable.mSurfaceAnimator.cancelAnimation();
+ mAnimatable.mSurfaceAnimator.startAnimation(mTransaction, mSpec2,
+ true /* hidden */, ANIMATION_TYPE_WINDOW_ANIMATION);
+ mAnimatable.mFinishedCallbackCalled = false;
- // Simulate the first deferred callback is executed from
- // {@link AnimatingActivityRegistry#endDeferringFinished}.
+ // Simulate the first deferred callback is executed.
firstDeferFinishCallback.run();
// The second animation should not be finished.
- assertFalse(mDeferFinishAnimatable.mFinishedCallbackCalled);
+ assertFalse(mAnimatable.mFinishedCallbackCalled);
}
@Test
@@ -260,17 +250,6 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
verify(mTransaction).remove(eq(deferredFinishAdapter.mAnimationLeash));
}
- private OnAnimationFinishedCallback startDeferFinishAnimatable(AnimationAdapter anim) {
- mDeferFinishAnimatable.mSurfaceAnimator.startAnimation(mTransaction, anim,
- true /* hidden */, ANIMATION_TYPE_APP_TRANSITION);
- final ArgumentCaptor<OnAnimationFinishedCallback> callbackCaptor = ArgumentCaptor.forClass(
- OnAnimationFinishedCallback.class);
- assertAnimating(mDeferFinishAnimatable);
- verify(anim).startAnimation(any(), any(), eq(ANIMATION_TYPE_APP_TRANSITION),
- callbackCaptor.capture());
- return callbackCaptor.getValue();
- }
-
private void assertAnimating(MyAnimatable animatable) {
assertTrue(animatable.mSurfaceAnimator.isAnimating());
assertNotNull(animatable.mSurfaceAnimator.getAnimation());
@@ -370,21 +349,6 @@ public class SurfaceAnimatorTest extends WindowTestsBase {
};
}
- private static class DeferFinishAnimatable extends MyAnimatable {
-
- Runnable mEndDeferFinishCallback;
-
- DeferFinishAnimatable(WindowManagerService wm, Transaction transaction) {
- super(wm, transaction);
- }
-
- @Override
- public boolean shouldDeferAnimationFinish(Runnable endDeferFinishCallback) {
- mEndDeferFinishCallback = endDeferFinishCallback;
- return true;
- }
- }
-
private static class DeferredFinishAdapter implements AnimationAdapter {
private Runnable mEndDeferFinishCallback;
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
index 001446550304..edffab801499 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java
@@ -32,8 +32,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.TRANSIT_CLOSE;
import static android.view.WindowManager.TRANSIT_OLD_TASK_CLOSE;
-import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN;
-import static android.view.WindowManager.TRANSIT_OPEN;
import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
@@ -85,12 +83,8 @@ import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.util.ArraySet;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.view.IRemoteAnimationRunner;
import android.view.InsetsFrameProvider;
import android.view.InsetsSource;
-import android.view.RemoteAnimationAdapter;
-import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
import android.view.WindowInsets;
@@ -1055,25 +1049,6 @@ public class WindowContainerTests extends WindowTestsBase {
}
@Test
- public void testTaskCanApplyAnimation() {
- final Task rootTask = createTask(mDisplayContent);
- final Task task = createTaskInRootTask(rootTask, 0 /* userId */);
- final ActivityRecord activity2 = createActivityRecord(mDisplayContent, task);
- final ActivityRecord activity1 = createActivityRecord(mDisplayContent, task);
- verifyWindowContainerApplyAnimation(task, activity1, activity2);
- }
-
- @Test
- public void testRootTaskCanApplyAnimation() {
- final Task rootTask = createTask(mDisplayContent);
- final ActivityRecord activity2 = createActivityRecord(mDisplayContent,
- createTaskInRootTask(rootTask, 0 /* userId */));
- final ActivityRecord activity1 = createActivityRecord(mDisplayContent,
- createTaskInRootTask(rootTask, 0 /* userId */));
- verifyWindowContainerApplyAnimation(rootTask, activity1, activity2);
- }
-
- @Test
public void testGetDisplayArea() {
// WindowContainer
final WindowContainer windowContainer = new WindowContainer(mWm);
@@ -1103,59 +1078,6 @@ public class WindowContainerTests extends WindowTestsBase {
assertEquals(displayArea, displayArea.getDisplayArea());
}
- private void verifyWindowContainerApplyAnimation(WindowContainer wc, ActivityRecord act,
- ActivityRecord act2) {
- // Initial remote animation for app transition.
- final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
- new IRemoteAnimationRunner.Stub() {
- @Override
- public void onAnimationStart(@WindowManager.TransitionOldType int transit,
- RemoteAnimationTarget[] apps,
- RemoteAnimationTarget[] wallpapers,
- RemoteAnimationTarget[] nonApps,
- IRemoteAnimationFinishedCallback finishedCallback) {
- try {
- finishedCallback.onAnimationFinished();
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
-
- @Override
- public void onAnimationCancelled() {
- }
- }, 0, 0, false);
- adapter.setCallingPidUid(123, 456);
- wc.getDisplayContent().prepareAppTransition(TRANSIT_OPEN);
- wc.getDisplayContent().mAppTransition.overridePendingAppTransitionRemote(adapter);
- spyOn(wc);
- doReturn(true).when(wc).okToAnimate();
-
- // Make sure animating state is as expected after applied animation.
-
- // Animation target is promoted from act to wc. act2 is a descendant of wc, but not a source
- // of the animation.
- ArrayList<WindowContainer<WindowState>> sources = new ArrayList<>();
- sources.add(act);
- assertTrue(wc.applyAnimation(null, TRANSIT_OLD_TASK_OPEN, true, false, sources));
-
- assertEquals(act, wc.getTopMostActivity());
- assertTrue(wc.isAnimating());
- assertTrue(wc.isAnimating(0, ANIMATION_TYPE_APP_TRANSITION));
- assertTrue(wc.getAnimationSources().contains(act));
- assertFalse(wc.getAnimationSources().contains(act2));
- assertTrue(act.isAnimating(PARENTS));
- assertTrue(act.isAnimating(PARENTS, ANIMATION_TYPE_APP_TRANSITION));
- assertEquals(wc, act.getAnimatingContainer(PARENTS, ANIMATION_TYPE_APP_TRANSITION));
-
- // Make sure animation finish callback will be received and reset animating state after
- // animation finish.
- wc.getDisplayContent().mAppTransition.goodToGo(TRANSIT_OLD_TASK_OPEN, act);
- verify(wc).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION), any());
- assertFalse(wc.isAnimating());
- assertFalse(act.isAnimating(PARENTS));
- }
-
@Test
public void testRegisterWindowContainerListener() {
final WindowContainer container = new WindowContainer(mWm);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
index 1281be5132d3..7030d986494f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
@@ -26,6 +26,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+import static android.content.pm.ActivityInfo.CONFIG_UI_MODE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -33,6 +34,8 @@ import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED;
import static android.content.res.Configuration.SCREEN_WIDTH_DP_UNDEFINED;
+import static android.content.res.Configuration.UI_MODE_NIGHT_NO;
+import static android.content.res.Configuration.UI_MODE_NIGHT_YES;
import static android.view.InsetsSource.FLAG_FORCE_CONSUMING;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST;
@@ -1983,6 +1986,30 @@ public class WindowOrganizerTests extends WindowTestsBase {
testSetAlwaysOnTop(displayArea);
}
+ @Test
+ public void testConfigurationsAreEqualForOrganizer() {
+ Configuration config1 = new Configuration();
+ config1.smallestScreenWidthDp = 300;
+ config1.uiMode = UI_MODE_NIGHT_YES;
+
+ Configuration config2 = new Configuration(config1);
+ config2.uiMode = UI_MODE_NIGHT_NO;
+
+ Configuration config3 = new Configuration(config1);
+ config3.smallestScreenWidthDp = 500;
+
+ // Should be equal for non-controllable configuration changes.
+ assertTrue(WindowOrganizerController.configurationsAreEqualForOrganizer(config1, config2));
+
+ // Should be unequal for non-controllable configuration changes if the organizer is
+ // interested in that change.
+ assertFalse(WindowOrganizerController.configurationsAreEqualForOrganizer(
+ config1, config2, CONFIG_UI_MODE));
+
+ // Should be unequal for controllable configuration changes.
+ assertFalse(WindowOrganizerController.configurationsAreEqualForOrganizer(config1, config3));
+ }
+
private void testSetAlwaysOnTop(WindowContainer wc) {
final WindowContainerTransaction t = new WindowContainerTransaction();
t.setAlwaysOnTop(wc.mRemoteToken.toWindowContainerToken(), true);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index b16f5283d532..7f9e591ca5e3 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -961,6 +961,15 @@ public class WindowTestsBase extends SystemServiceTestsBase {
return testPlayer;
}
+ void requestTransition(WindowContainer<?> wc, int transit) {
+ final TransitionController controller = mRootWindowContainer.mTransitionController;
+ if (controller.getTransitionPlayer() == null) {
+ registerTestTransitionPlayer();
+ }
+ controller.requestTransitionIfNeeded(transit, 0 /* flags */, null /* trigger */,
+ wc.mDisplayContent);
+ }
+
/** Overrides the behavior of config_reverseDefaultRotation for the given display. */
void setReverseDefaultRotation(DisplayContent dc, boolean reverse) {
final DisplayRotation displayRotation = dc.getDisplayRotation();
@@ -1417,7 +1426,9 @@ public class WindowTestsBase extends SystemServiceTestsBase {
activity.setProcess(wpc);
// Resume top activities to make sure all other signals in the system are connected.
- mService.mRootWindowContainer.resumeFocusedTasksTopActivities();
+ if (mVisible) {
+ mService.mRootWindowContainer.resumeFocusedTasksTopActivities();
+ }
return activity;
}
}
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index 55a89239b864..86468b0cf821 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -200,7 +200,11 @@ public class UsbPortManager implements IBinder.DeathRecipient {
mHandler.sendEmptyMessage(MSG_SYSTEM_READY);
}
- private void updateContaminantNotification() {
+ private void updateContaminantNotificationLocked() {
+ if (mNotificationManager == null) {
+ return;
+ }
+
PortInfo currentPortInfo = null;
Resources r = mContext.getResources();
int contaminantStatus = UsbPortStatus.CONTAMINANT_DETECTION_NOT_DETECTED;
@@ -1171,7 +1175,7 @@ public class UsbPortManager implements IBinder.DeathRecipient {
private void handlePortLocked(PortInfo portInfo, IndentingPrintWriter pw) {
sendPortChangedBroadcastLocked(portInfo);
logToStatsd(portInfo, pw);
- updateContaminantNotification();
+ updateContaminantNotificationLocked();
}
private void handlePortAddedLocked(PortInfo portInfo, IndentingPrintWriter pw) {
@@ -1433,6 +1437,9 @@ public class UsbPortManager implements IBinder.DeathRecipient {
case MSG_SYSTEM_READY: {
mNotificationManager = (NotificationManager)
mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ synchronized (mLock) {
+ updateContaminantNotificationLocked();
+ }
break;
}
}
diff --git a/tests/Input/src/android/hardware/input/KeyboardLayoutPreviewTests.kt b/tests/Input/src/android/hardware/input/KeyboardLayoutPreviewTests.kt
index ae32bdaf80d7..bcff2fcfca93 100644
--- a/tests/Input/src/android/hardware/input/KeyboardLayoutPreviewTests.kt
+++ b/tests/Input/src/android/hardware/input/KeyboardLayoutPreviewTests.kt
@@ -16,17 +16,11 @@
package android.hardware.input
-import android.platform.test.annotations.DisableFlags
-import android.platform.test.annotations.EnableFlags
import android.content.ContextWrapper
import android.graphics.drawable.Drawable
import android.platform.test.annotations.Presubmit
-import android.platform.test.flag.junit.SetFlagsRule
import androidx.test.platform.app.InstrumentationRegistry
-import com.android.hardware.input.Flags
import org.junit.Assert.assertEquals
-import org.junit.Assert.assertNull
-import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.junit.MockitoJUnitRunner
@@ -46,9 +40,6 @@ class KeyboardLayoutPreviewTests {
const val HEIGHT = 100
}
- @get:Rule
- val setFlagsRule = SetFlagsRule()
-
private fun createDrawable(): Drawable? {
val context = ContextWrapper(InstrumentationRegistry.getInstrumentation().getContext())
val inputManager = context.getSystemService(InputManager::class.java)!!
@@ -56,16 +47,9 @@ class KeyboardLayoutPreviewTests {
}
@Test
- @EnableFlags(Flags.FLAG_KEYBOARD_LAYOUT_PREVIEW_FLAG)
fun testKeyboardLayoutDrawable_hasCorrectDimensions() {
val drawable = createDrawable()!!
assertEquals(WIDTH, drawable.intrinsicWidth)
assertEquals(HEIGHT, drawable.intrinsicHeight)
}
-
- @Test
- @DisableFlags(Flags.FLAG_KEYBOARD_LAYOUT_PREVIEW_FLAG)
- fun testKeyboardLayoutDrawable_isNull_ifFlagOff() {
- assertNull(createDrawable())
- }
} \ No newline at end of file
diff --git a/tests/Input/src/android/hardware/input/StickyModifierStateListenerTest.kt b/tests/Input/src/android/hardware/input/StickyModifierStateListenerTest.kt
index c2f9adf84ccd..cc58bbc38e2d 100644
--- a/tests/Input/src/android/hardware/input/StickyModifierStateListenerTest.kt
+++ b/tests/Input/src/android/hardware/input/StickyModifierStateListenerTest.kt
@@ -21,9 +21,7 @@ import android.content.ContextWrapper
import android.os.Handler
import android.os.HandlerExecutor
import android.os.test.TestLooper
-import android.platform.test.annotations.EnableFlags
import android.platform.test.annotations.Presubmit
-import android.platform.test.flag.junit.SetFlagsRule
import android.view.KeyEvent
import androidx.test.core.app.ApplicationProvider
import com.android.server.testutils.any
@@ -50,12 +48,9 @@ import org.mockito.junit.MockitoJUnitRunner
*/
@Presubmit
@RunWith(MockitoJUnitRunner::class)
-@EnableFlags(com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG)
class StickyModifierStateListenerTest {
@get:Rule
- val rule = SetFlagsRule()
- @get:Rule
val inputManagerRule = MockInputManagerRule()
private val testLooper = TestLooper()
diff --git a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt
index 5259455cf33c..b22e42d1ab89 100644
--- a/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt
+++ b/tests/Input/src/com/android/server/input/InputManagerServiceTests.kt
@@ -559,9 +559,6 @@ class InputManagerServiceTests {
@Test
fun handleKeyGestures_a11yBounceKeysShortcut() {
- ExtendedMockito.doReturn(true).`when` {
- InputSettings.isAccessibilityBounceKeysFeatureEnabled()
- }
val toggleBounceKeysEvent =
KeyGestureEvent.Builder()
.setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS)
@@ -594,9 +591,6 @@ class InputManagerServiceTests {
@Test
fun handleKeyGestures_a11yStickyKeysShortcut() {
- ExtendedMockito.doReturn(true).`when` {
- InputSettings.isAccessibilityStickyKeysFeatureEnabled()
- }
val toggleStickyKeysEvent =
KeyGestureEvent.Builder()
.setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_STICKY_KEYS)
@@ -610,9 +604,6 @@ class InputManagerServiceTests {
@Test
fun handleKeyGestures_a11ySlowKeysShortcut() {
- ExtendedMockito.doReturn(true).`when` {
- InputSettings.isAccessibilitySlowKeysFeatureFlagEnabled()
- }
val toggleSlowKeysEvent =
KeyGestureEvent.Builder()
.setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_SLOW_KEYS)
diff --git a/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt b/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt
index de47f013271a..88e84966634b 100644
--- a/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt
+++ b/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt
@@ -754,9 +754,6 @@ class KeyGestureControllerTests {
@EnableFlags(
com.android.server.flags.Flags.FLAG_NEW_BUGREPORT_KEYBOARD_SHORTCUT,
com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL,
- com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG,
- com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG,
- com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG,
com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS,
com.android.hardware.input.Flags.FLAG_ENABLE_TALKBACK_AND_MAGNIFIER_KEY_GESTURES,
com.android.hardware.input.Flags.FLAG_ENABLE_VOICE_ACCESS_KEY_GESTURES,
@@ -773,9 +770,6 @@ class KeyGestureControllerTests {
@EnableFlags(
com.android.server.flags.Flags.FLAG_NEW_BUGREPORT_KEYBOARD_SHORTCUT,
com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL,
- com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_BOUNCE_KEYS_FLAG,
- com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SLOW_KEYS_FLAG,
- com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_STICKY_KEYS_FLAG,
com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_MOUSE_KEYS,
com.android.hardware.input.Flags.FLAG_ENABLE_TALKBACK_AND_MAGNIFIER_KEY_GESTURES,
com.android.hardware.input.Flags.FLAG_ENABLE_VOICE_ACCESS_KEY_GESTURES,
diff --git a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewAnsiScreenshotTest.kt b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewAnsiScreenshotTest.kt
index e85578663764..e1294b1f034e 100644
--- a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewAnsiScreenshotTest.kt
+++ b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewAnsiScreenshotTest.kt
@@ -19,12 +19,9 @@ package com.android.input.screenshot
import android.content.Context
import android.hardware.input.KeyboardLayout
import android.os.LocaleList
-import android.platform.test.flag.junit.SetFlagsRule
-import com.android.hardware.input.Flags
import java.util.Locale
import org.junit.Rule
import org.junit.Test
-import org.junit.rules.RuleChain
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import platform.test.screenshot.DeviceEmulationSpec
@@ -38,18 +35,14 @@ class KeyboardLayoutPreviewAnsiScreenshotTest(emulationSpec: DeviceEmulationSpec
fun getTestSpecs() = DeviceEmulationSpec.PhoneMinimal
}
- val setFlagsRule = SetFlagsRule()
+ @get:Rule
val screenshotRule = InputScreenshotTestRule(
emulationSpec,
"frameworks/base/tests/InputScreenshotTest/assets"
)
- @get:Rule
- val ruleChain = RuleChain.outerRule(screenshotRule).around(setFlagsRule)
-
@Test
fun test() {
- setFlagsRule.enableFlags(Flags.FLAG_KEYBOARD_LAYOUT_PREVIEW_FLAG)
screenshotRule.screenshotTest("layout-preview-ansi") {
context: Context -> LayoutPreview.createLayoutPreview(
context,
@@ -66,5 +59,4 @@ class KeyboardLayoutPreviewAnsiScreenshotTest(emulationSpec: DeviceEmulationSpec
)
}
}
-
} \ No newline at end of file
diff --git a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewIsoScreenshotTest.kt b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewIsoScreenshotTest.kt
index ab7bb4eda899..ddad6dea5e32 100644
--- a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewIsoScreenshotTest.kt
+++ b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewIsoScreenshotTest.kt
@@ -17,14 +17,8 @@
package com.android.input.screenshot
import android.content.Context
-import android.hardware.input.KeyboardLayout
-import android.os.LocaleList
-import android.platform.test.flag.junit.SetFlagsRule
-import com.android.hardware.input.Flags
-import java.util.Locale
import org.junit.Rule
import org.junit.Test
-import org.junit.rules.RuleChain
import org.junit.runner.RunWith
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters
@@ -39,21 +33,16 @@ class KeyboardLayoutPreviewIsoScreenshotTest(emulationSpec: DeviceEmulationSpec)
fun getTestSpecs() = DeviceEmulationSpec.PhoneAndTabletMinimal
}
- val setFlagsRule = SetFlagsRule()
+ @get:Rule
val screenshotRule = InputScreenshotTestRule(
emulationSpec,
"frameworks/base/tests/InputScreenshotTest/assets"
)
- @get:Rule
- val ruleChain = RuleChain.outerRule(screenshotRule).around(setFlagsRule)
-
@Test
fun test() {
- setFlagsRule.enableFlags(Flags.FLAG_KEYBOARD_LAYOUT_PREVIEW_FLAG)
screenshotRule.screenshotTest("layout-preview") {
context: Context -> LayoutPreview.createLayoutPreview(context, null)
}
}
-
}
diff --git a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewJisScreenshotTest.kt b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewJisScreenshotTest.kt
index 5231c14bfc9a..8a8e4f058d8a 100644
--- a/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewJisScreenshotTest.kt
+++ b/tests/InputScreenshotTest/src/android/input/screenshot/KeyboardLayoutPreviewJisScreenshotTest.kt
@@ -19,12 +19,9 @@ package com.android.input.screenshot
import android.content.Context
import android.hardware.input.KeyboardLayout
import android.os.LocaleList
-import android.platform.test.flag.junit.SetFlagsRule
-import com.android.hardware.input.Flags
import java.util.Locale
import org.junit.Rule
import org.junit.Test
-import org.junit.rules.RuleChain
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import platform.test.screenshot.DeviceEmulationSpec
@@ -38,18 +35,14 @@ class KeyboardLayoutPreviewJisScreenshotTest(emulationSpec: DeviceEmulationSpec)
fun getTestSpecs() = DeviceEmulationSpec.PhoneMinimal
}
- val setFlagsRule = SetFlagsRule()
+ @get:Rule
val screenshotRule = InputScreenshotTestRule(
emulationSpec,
"frameworks/base/tests/InputScreenshotTest/assets"
)
- @get:Rule
- val ruleChain = RuleChain.outerRule(screenshotRule).around(setFlagsRule)
-
@Test
fun test() {
- setFlagsRule.enableFlags(Flags.FLAG_KEYBOARD_LAYOUT_PREVIEW_FLAG)
screenshotRule.screenshotTest("layout-preview-jis") {
context: Context -> LayoutPreview.createLayoutPreview(
context,
@@ -66,5 +59,4 @@ class KeyboardLayoutPreviewJisScreenshotTest(emulationSpec: DeviceEmulationSpec)
)
}
}
-
} \ No newline at end of file
diff --git a/tests/testables/src/android/testing/TestableLooper.java b/tests/testables/src/android/testing/TestableLooper.java
index 3ee6dc48bfa3..1273826c8ef8 100644
--- a/tests/testables/src/android/testing/TestableLooper.java
+++ b/tests/testables/src/android/testing/TestableLooper.java
@@ -16,6 +16,7 @@ package android.testing;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
@@ -24,7 +25,7 @@ import android.os.MessageQueue;
import android.os.TestLooperManager;
import android.util.ArrayMap;
-import androidx.test.InstrumentationRegistry;
+import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.runners.model.FrameworkMethod;
@@ -33,8 +34,11 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayDeque;
import java.util.Map;
import java.util.Objects;
+import java.util.Queue;
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -67,16 +71,38 @@ public class TestableLooper {
private Handler mHandler;
private TestLooperManager mQueueWrapper;
+ /**
+ * Baklava introduces new {@link TestLooperManager} APIs that we can use instead of reflection.
+ */
+ private static boolean isAtLeastBaklava() {
+ Method[] methods = TestLooperManager.class.getMethods();
+ for (Method method : methods) {
+ if (method.getName().equals("peekWhen")) {
+ return true;
+ }
+ }
+ return false;
+ // TODO(shayba): delete the above, uncomment the below.
+ // SDK_INT has not yet ramped to Baklava in all 25Q2 builds.
+ // return Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA;
+ }
+
static {
- try {
- MESSAGE_QUEUE_MESSAGES_FIELD = MessageQueue.class.getDeclaredField("mMessages");
- MESSAGE_QUEUE_MESSAGES_FIELD.setAccessible(true);
- MESSAGE_NEXT_FIELD = Message.class.getDeclaredField("next");
- MESSAGE_NEXT_FIELD.setAccessible(true);
- MESSAGE_WHEN_FIELD = Message.class.getDeclaredField("when");
- MESSAGE_WHEN_FIELD.setAccessible(true);
- } catch (NoSuchFieldException e) {
- throw new RuntimeException("Failed to initialize TestableLooper", e);
+ if (isAtLeastBaklava()) {
+ MESSAGE_QUEUE_MESSAGES_FIELD = null;
+ MESSAGE_NEXT_FIELD = null;
+ MESSAGE_WHEN_FIELD = null;
+ } else {
+ try {
+ MESSAGE_QUEUE_MESSAGES_FIELD = MessageQueue.class.getDeclaredField("mMessages");
+ MESSAGE_QUEUE_MESSAGES_FIELD.setAccessible(true);
+ MESSAGE_NEXT_FIELD = Message.class.getDeclaredField("next");
+ MESSAGE_NEXT_FIELD.setAccessible(true);
+ MESSAGE_WHEN_FIELD = Message.class.getDeclaredField("when");
+ MESSAGE_WHEN_FIELD.setAccessible(true);
+ } catch (NoSuchFieldException e) {
+ throw new RuntimeException("Failed to initialize TestableLooper", e);
+ }
}
}
@@ -222,8 +248,61 @@ public class TestableLooper {
}
public void moveTimeForward(long milliSeconds) {
+ if (isAtLeastBaklava()) {
+ moveTimeForwardBaklava(milliSeconds);
+ } else {
+ moveTimeForwardLegacy(milliSeconds);
+ }
+ }
+
+ private void moveTimeForwardBaklava(long milliSeconds) {
+ // Drain all Messages from the queue.
+ Queue<Message> messages = new ArrayDeque<>();
+ while (true) {
+ Message message = mQueueWrapper.poll();
+ if (message == null) {
+ break;
+ }
+
+ // Adjust the Message's delivery time.
+ long newWhen = message.when - milliSeconds;
+ if (newWhen < 0) {
+ newWhen = 0;
+ }
+ message.when = newWhen;
+ messages.add(message);
+ }
+
+ // Repost all Messages back to the queuewith a new time.
+ while (true) {
+ Message message = messages.poll();
+ if (message == null) {
+ break;
+ }
+
+ Runnable callback = message.getCallback();
+ Handler handler = message.getTarget();
+ long when = message.getWhen();
+
+ // The Message cannot be re-enqueued because it is marked in use.
+ // Make a copy of the Message and recycle the original.
+ // This resets {@link Message#isInUse()} but retains all other content.
+ {
+ Message newMessage = Message.obtain();
+ newMessage.copyFrom(message);
+ newMessage.setCallback(callback);
+ mQueueWrapper.recycle(message);
+ message = newMessage;
+ }
+
+ // Send the Message back to its Handler to be re-enqueued.
+ handler.sendMessageAtTime(message, when);
+ }
+ }
+
+ private void moveTimeForwardLegacy(long milliSeconds) {
try {
- Message msg = getMessageLinkedList();
+ Message msg = (Message) MESSAGE_QUEUE_MESSAGES_FIELD.get(mLooper.getQueue());
while (msg != null) {
long updatedWhen = msg.getWhen() - milliSeconds;
if (updatedWhen < 0) {
@@ -237,17 +316,6 @@ public class TestableLooper {
}
}
- private Message getMessageLinkedList() {
- try {
- MessageQueue queue = mLooper.getQueue();
- return (Message) MESSAGE_QUEUE_MESSAGES_FIELD.get(queue);
- } catch (IllegalAccessException e) {
- throw new RuntimeException(
- "Access failed in TestableLooper: get - MessageQueue.mMessages",
- e);
- }
- }
-
private int processQueuedMessages() {
int count = 0;
Runnable barrierRunnable = () -> { };