summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AconfigFlags.bp14
-rw-r--r--Android.bp2
-rw-r--r--Ravenwood.bp6
-rw-r--r--apex/jobscheduler/framework/aconfig/job.aconfig7
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobInfo.java89
-rw-r--r--apex/jobscheduler/service/aconfig/job.aconfig7
-rw-r--r--apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java362
-rw-r--r--apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java4
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java40
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobStore.java2
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java4
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java6
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java3
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java24
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java11
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java2
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java3
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java7
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java4
-rw-r--r--apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java85
-rw-r--r--apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java35
-rw-r--r--apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java101
-rw-r--r--core/api/current.txt91
-rw-r--r--core/api/module-lib-lint-baseline.txt4
-rw-r--r--core/api/removed.txt44
-rw-r--r--core/api/system-current.txt29
-rw-r--r--core/java/android/app/ActivityManagerInternal.java4
-rw-r--r--core/java/android/app/AppOpsManager.java3
-rw-r--r--core/java/android/app/ContextImpl.java17
-rw-r--r--core/java/android/app/Notification.java10
-rw-r--r--core/java/android/app/ResourcesManager.java8
-rw-r--r--core/java/android/app/SystemServiceRegistry.java27
-rw-r--r--core/java/android/app/UiAutomationConnection.java5
-rw-r--r--core/java/android/app/slice/Slice.java42
-rw-r--r--core/java/android/app/slice/SliceItem.java19
-rw-r--r--core/java/android/app/slice/SliceManager.java29
-rw-r--r--core/java/android/app/slice/SliceProvider.java18
-rw-r--r--core/java/android/app/time/TEST_MAPPING5
-rw-r--r--core/java/android/app/timedetector/TEST_MAPPING5
-rw-r--r--core/java/android/app/timezonedetector/TEST_MAPPING5
-rw-r--r--core/java/android/app/usage/IUsageStatsManager.aidl3
-rw-r--r--core/java/android/app/usage/ParcelableUsageEventList.java14
-rw-r--r--core/java/android/app/usage/StorageStatsManager.java16
-rw-r--r--core/java/android/app/usage/UsageEvents.java50
-rw-r--r--core/java/android/app/usage/UsageStatsManager.java64
-rw-r--r--core/java/android/appwidget/AppWidgetManager.java2
-rw-r--r--core/java/android/companion/CompanionDeviceManager.java30
-rw-r--r--core/java/android/companion/ICompanionDeviceManager.aidl2
-rw-r--r--core/java/android/companion/flags.aconfig7
-rw-r--r--core/java/android/companion/virtual/IVirtualDevice.aidl6
-rw-r--r--core/java/android/companion/virtual/VirtualDeviceInternal.java11
-rw-r--r--core/java/android/companion/virtual/camera/VirtualCamera.java26
-rw-r--r--core/java/android/content/AttributionSource.java3
-rw-r--r--core/java/android/content/Context.java23
-rw-r--r--core/java/android/content/ContextWrapper.java3
-rw-r--r--core/java/android/content/Intent.java6
-rw-r--r--core/java/android/content/pm/PackageInfo.java3
-rw-r--r--core/java/android/content/pm/PackageInstaller.java48
-rw-r--r--core/java/android/content/pm/PackageItemInfo.java8
-rw-r--r--core/java/android/content/pm/PackageManager.java11
-rw-r--r--core/java/android/content/pm/flags.aconfig14
-rw-r--r--core/java/android/content/res/flags.aconfig9
-rw-r--r--core/java/android/hardware/SensorPrivacyManager.java7
-rw-r--r--core/java/android/hardware/camera2/params/RecommendedStreamConfigurationMap.java2
-rw-r--r--core/java/android/hardware/input/InputDeviceSensorManager.java95
-rw-r--r--core/java/android/hardware/input/InputManager.java56
-rw-r--r--core/java/android/hardware/input/InputManagerGlobal.java33
-rw-r--r--core/java/android/os/BatteryUsageStats.java22
-rw-r--r--core/java/android/os/FileUtils.java55
-rw-r--r--core/java/android/os/IHintSession.aidl3
-rw-r--r--core/java/android/os/ISecurityStateManager.aidl26
-rw-r--r--core/java/android/os/Message.java2
-rw-r--r--core/java/android/os/PerformanceHintManager.java39
-rw-r--r--core/java/android/os/PowerManager.java8
-rw-r--r--core/java/android/os/Process.java14
-rw-r--r--core/java/android/os/SecurityStateManager.java81
-rw-r--r--core/java/android/os/SystemClock.java3
-rw-r--r--core/java/android/os/UserManager.java33
-rw-r--r--core/java/android/os/WorkDuration.aidl19
-rw-r--r--core/java/android/os/WorkDuration.java213
-rw-r--r--core/java/android/os/flags.aconfig16
-rw-r--r--core/java/android/os/storage/StorageManager.java17
-rw-r--r--core/java/android/os/vibrator/persistence/VibrationXmlParser.java36
-rw-r--r--core/java/android/provider/Settings.java51
-rw-r--r--core/java/android/security/OWNERS2
-rw-r--r--core/java/android/security/flags.aconfig2
-rw-r--r--core/java/android/service/controls/ControlsProviderService.java39
-rw-r--r--core/java/android/service/controls/flags/flags.aconfig8
-rw-r--r--core/java/android/service/notification/NotificationRankingUpdate.java24
-rw-r--r--core/java/android/service/notification/NotificationStats.java35
-rw-r--r--core/java/android/service/timezone/TEST_MAPPING5
-rw-r--r--core/java/android/service/voice/HotwordDetectionServiceFailure.java10
-rw-r--r--core/java/android/speech/SpeechRecognizer.java741
-rw-r--r--core/java/android/speech/SpeechRecognizerImpl.java745
-rw-r--r--core/java/android/speech/SpeechRecognizerProxy.java108
-rw-r--r--core/java/android/text/Layout.java1
-rw-r--r--core/java/android/util/AtomicFile.java3
-rw-r--r--core/java/android/util/LruCache.java14
-rw-r--r--core/java/android/view/AttachedSurfaceControl.java39
-rw-r--r--core/java/android/view/IWindowManager.aidl8
-rw-r--r--core/java/android/view/InsetsController.java17
-rw-r--r--core/java/android/view/Surface.java11
-rw-r--r--core/java/android/view/View.java28
-rw-r--r--core/java/android/view/ViewRootImpl.java54
-rw-r--r--core/java/android/view/ViewRootInsetsControllerHost.java7
-rw-r--r--core/java/android/view/WindowManager.java33
-rw-r--r--core/java/android/view/WindowManagerGlobal.java94
-rw-r--r--core/java/android/view/WindowManagerImpl.java14
-rw-r--r--core/java/android/view/accessibility/IWindowMagnificationConnection.aidl2
-rw-r--r--core/java/android/view/accessibility/flags/accessibility_flags.aconfig16
-rw-r--r--core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java5
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java65
-rw-r--r--core/java/android/view/inputmethod/flags.aconfig7
-rw-r--r--core/java/android/webkit/IWebViewUpdateService.aidl5
-rw-r--r--core/java/android/widget/RemoteViews.java81
-rw-r--r--core/java/android/window/ITaskOrganizerController.aidl16
-rw-r--r--core/java/android/window/ITrustedPresentationListener.aidl24
-rw-r--r--core/java/android/window/TaskFragmentOperation.java14
-rw-r--r--core/java/android/window/TaskFragmentParentInfo.java24
-rw-r--r--core/java/android/window/TaskOrganizer.java25
-rw-r--r--core/java/android/window/TrustedPresentationListener.java26
-rw-r--r--core/java/android/window/TrustedPresentationThresholds.aidl3
-rw-r--r--core/java/android/window/TrustedPresentationThresholds.java127
-rw-r--r--core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java4
-rw-r--r--core/java/com/android/internal/display/RefreshRateSettingsUtils.java15
-rw-r--r--core/java/com/android/internal/protolog/ProtoLogGroup.java1
-rw-r--r--core/java/com/android/internal/vibrator/persistence/SerializedVibrationEffect.java4
-rw-r--r--core/java/com/android/internal/vibrator/persistence/VibrationEffectXmlParser.java16
-rw-r--r--core/java/com/android/internal/vibrator/persistence/XmlConstants.java2
-rw-r--r--core/java/com/android/internal/vibrator/persistence/XmlSerializedVibration.java3
-rw-r--r--core/java/com/android/internal/view/IInputMethodManager.aidl4
-rw-r--r--core/java/com/android/server/LocalServices.java11
-rw-r--r--core/jni/android_os_PerformanceHintManager.cpp77
-rw-r--r--core/proto/android/providers/settings/secure.proto9
-rw-r--r--core/proto/android/server/usagestatsservice_v2.proto10
-rw-r--r--core/res/AndroidManifest.xml1
-rw-r--r--core/res/res/raw/default_ringtone_vibration_effect.ahv4
-rw-r--r--core/res/res/values-af/strings.xml14
-rw-r--r--core/res/res/values-am/strings.xml7
-rw-r--r--core/res/res/values-ar/strings.xml16
-rw-r--r--core/res/res/values-as/strings.xml14
-rw-r--r--core/res/res/values-az/strings.xml14
-rw-r--r--core/res/res/values-b+sr+Latn/strings.xml14
-rw-r--r--core/res/res/values-be/strings.xml14
-rw-r--r--core/res/res/values-bg/strings.xml14
-rw-r--r--core/res/res/values-bn/strings.xml20
-rw-r--r--core/res/res/values-bs/strings.xml14
-rw-r--r--core/res/res/values-ca/strings.xml14
-rw-r--r--core/res/res/values-cs/strings.xml13
-rw-r--r--core/res/res/values-da/strings.xml14
-rw-r--r--core/res/res/values-de/strings.xml9
-rw-r--r--core/res/res/values-el/strings.xml7
-rw-r--r--core/res/res/values-en-rAU/strings.xml14
-rw-r--r--core/res/res/values-en-rCA/strings.xml7
-rw-r--r--core/res/res/values-en-rGB/strings.xml14
-rw-r--r--core/res/res/values-en-rIN/strings.xml14
-rw-r--r--core/res/res/values-en-rXC/strings.xml7
-rw-r--r--core/res/res/values-es-rUS/strings.xml7
-rw-r--r--core/res/res/values-es/strings.xml16
-rw-r--r--core/res/res/values-et/strings.xml14
-rw-r--r--core/res/res/values-eu/strings.xml14
-rw-r--r--core/res/res/values-fa/strings.xml16
-rw-r--r--core/res/res/values-fi/strings.xml14
-rw-r--r--core/res/res/values-fr-rCA/strings.xml14
-rw-r--r--core/res/res/values-fr/strings.xml7
-rw-r--r--core/res/res/values-gl/strings.xml14
-rw-r--r--core/res/res/values-gu/strings.xml14
-rw-r--r--core/res/res/values-hi/strings.xml16
-rw-r--r--core/res/res/values-hr/strings.xml14
-rw-r--r--core/res/res/values-hu/strings.xml14
-rw-r--r--core/res/res/values-hy/strings.xml20
-rw-r--r--core/res/res/values-in/strings.xml18
-rw-r--r--core/res/res/values-is/strings.xml7
-rw-r--r--core/res/res/values-it/strings.xml14
-rw-r--r--core/res/res/values-iw/strings.xml7
-rw-r--r--core/res/res/values-ja/strings.xml14
-rw-r--r--core/res/res/values-ka/strings.xml7
-rw-r--r--core/res/res/values-kk/strings.xml14
-rw-r--r--core/res/res/values-km/strings.xml14
-rw-r--r--core/res/res/values-kn/strings.xml14
-rw-r--r--core/res/res/values-ko/strings.xml14
-rw-r--r--core/res/res/values-ky/strings.xml14
-rw-r--r--core/res/res/values-lo/strings.xml14
-rw-r--r--core/res/res/values-lt/strings.xml14
-rw-r--r--core/res/res/values-lv/strings.xml14
-rw-r--r--core/res/res/values-mk/strings.xml20
-rw-r--r--core/res/res/values-ml/strings.xml14
-rw-r--r--core/res/res/values-mn/strings.xml14
-rw-r--r--core/res/res/values-mr/strings.xml14
-rw-r--r--core/res/res/values-ms/strings.xml14
-rw-r--r--core/res/res/values-my/strings.xml20
-rw-r--r--core/res/res/values-nb/strings.xml14
-rw-r--r--core/res/res/values-ne/strings.xml14
-rw-r--r--core/res/res/values-nl/strings.xml14
-rw-r--r--core/res/res/values-or/strings.xml14
-rw-r--r--core/res/res/values-pa/strings.xml14
-rw-r--r--core/res/res/values-pl/strings.xml14
-rw-r--r--core/res/res/values-pt-rBR/strings.xml14
-rw-r--r--core/res/res/values-pt-rPT/strings.xml7
-rw-r--r--core/res/res/values-pt/strings.xml14
-rw-r--r--core/res/res/values-ro/strings.xml7
-rw-r--r--core/res/res/values-ru/strings.xml14
-rw-r--r--core/res/res/values-si/strings.xml20
-rw-r--r--core/res/res/values-sk/strings.xml14
-rw-r--r--core/res/res/values-sl/strings.xml7
-rw-r--r--core/res/res/values-sq/strings.xml20
-rw-r--r--core/res/res/values-sr/strings.xml14
-rw-r--r--core/res/res/values-sv/strings.xml14
-rw-r--r--core/res/res/values-sw/strings.xml14
-rw-r--r--core/res/res/values-ta/strings.xml14
-rw-r--r--core/res/res/values-te/strings.xml14
-rw-r--r--core/res/res/values-th/strings.xml14
-rw-r--r--core/res/res/values-tl/strings.xml14
-rw-r--r--core/res/res/values-tr/strings.xml14
-rw-r--r--core/res/res/values-uk/strings.xml20
-rw-r--r--core/res/res/values-ur/strings.xml20
-rw-r--r--core/res/res/values-uz/strings.xml20
-rw-r--r--core/res/res/values-vi/strings.xml14
-rw-r--r--core/res/res/values-zh-rCN/strings.xml14
-rw-r--r--core/res/res/values-zh-rHK/strings.xml14
-rw-r--r--core/res/res/values-zh-rTW/strings.xml20
-rw-r--r--core/res/res/values-zu/strings.xml14
-rw-r--r--core/res/res/values/config.xml15
-rw-r--r--core/res/res/values/config_device_idle.xml16
-rw-r--r--core/res/res/values/symbols.xml4
-rw-r--r--core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java39
-rw-r--r--core/tests/coretests/Android.bp13
-rw-r--r--core/tests/coretests/src/android/app/usage/ParcelableUsageEventListTest.java15
-rw-r--r--core/tests/coretests/src/android/app/usage/UsageStatsPersistenceTest.java2
-rw-r--r--core/tests/coretests/src/android/content/res/ResourcesManagerTest.java8
-rw-r--r--core/tests/coretests/src/android/os/FileUtilsTest.java54
-rw-r--r--core/tests/coretests/src/android/os/PerformanceHintManagerTest.java38
-rw-r--r--core/tests/coretests/src/android/service/notification/NotificationRankingUpdateTest.java3
-rw-r--r--core/tests/coretests/src/android/view/ViewRootImplTest.java36
-rw-r--r--core/tests/utiltests/Android.bp2
-rw-r--r--core/tests/utiltests/src/android/util/AtomicFileTest.java30
-rw-r--r--core/tests/vibrator/src/android/os/vibrator/persistence/VibrationEffectXmlSerializationTest.java67
-rw-r--r--core/xsd/Android.bp2
-rw-r--r--core/xsd/vibrator/vibration/schema/current.txt8
-rw-r--r--core/xsd/vibrator/vibration/vibration-plus-hidden-apis.xsd6
-rw-r--r--core/xsd/vibrator/vibration/vibration.xsd6
-rw-r--r--data/etc/services.core.protolog.json111
-rw-r--r--data/keyboards/Generic.kcm2
-rw-r--r--keystore/java/android/security/KeyStore2.java19
-rw-r--r--libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/OverlayPresentationTest.java3
-rw-r--r--libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java3
-rw-r--r--libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/TaskContainerTest.java12
-rw-r--r--libs/WindowManager/Shell/Android.bp1
-rw-r--r--libs/WindowManager/Shell/aconfig/multitasking.aconfig7
-rw-r--r--libs/WindowManager/Shell/res/layout/docked_stack_divider.xml38
-rw-r--r--libs/WindowManager/Shell/res/layout/split_divider.xml9
-rw-r--r--libs/WindowManager/Shell/res/values-land/dimens.xml7
-rw-r--r--libs/WindowManager/Shell/res/values-land/styles.xml36
-rw-r--r--libs/WindowManager/Shell/res/values/dimen.xml3
-rw-r--r--libs/WindowManager/Shell/res/values/styles.xml15
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java24
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java29
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java10
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java10
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt100
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/RelativeTouchListener.kt22
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java30
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerRoundedCorner.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java61
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java108
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java41
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java7
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java30
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java4
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java87
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java14
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java5
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java28
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java22
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java2
-rw-r--r--libs/WindowManager/Shell/tests/flicker/Android.bp9
-rw-r--r--libs/WindowManager/Shell/tests/flicker/AndroidTestTemplate.xml112
-rw-r--r--libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp2
-rw-r--r--libs/WindowManager/Shell/tests/flicker/bubble/Android.bp2
-rw-r--r--libs/WindowManager/Shell/tests/flicker/pip/Android.bp13
-rw-r--r--libs/WindowManager/Shell/tests/flicker/pip/csuiteDefaultTemplate.xml3
-rw-r--r--libs/WindowManager/Shell/tests/flicker/pip/csuitePlan.xml3
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/Android.bp4
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/CopyContentInSplit.kt6
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromNotification.kt6
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromShortcut.kt6
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromTaskbar.kt6
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenFromOverview.kt6
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchAppByDoubleTapDivider.kt6
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromAnotherApp.kt6
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromHome.kt6
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromRecent.kt6
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBetweenSplitPairs.kt6
-rw-r--r--libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/UnlockKeyguardToSplitScreen.kt6
-rw-r--r--libs/WindowManager/Shell/tests/flicker/splitscreen/Android.bp3
-rw-r--r--libs/WindowManager/Shell/tests/flicker/trace_config/trace_config.textproto75
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubblePositionerTest.java92
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java3
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenUtilsTests.java75
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java2
-rw-r--r--libs/androidfw/Android.bp13
-rw-r--r--libs/androidfw/BigBufferStream.cpp (renamed from tools/aapt2/io/BigBufferStream.cpp)38
-rw-r--r--libs/androidfw/FileStream.cpp (renamed from tools/aapt2/io/FileStream.cpp)12
-rw-r--r--libs/androidfw/NinePatch.cpp (renamed from tools/aapt2/compile/NinePatch.cpp)184
-rw-r--r--libs/androidfw/Png.cpp (renamed from tools/aapt2/compile/Png.cpp)328
-rw-r--r--libs/androidfw/PngChunkFilter.cpp (renamed from tools/aapt2/compile/PngChunkFilter.cpp)18
-rw-r--r--libs/androidfw/PngCrunch.cpp (renamed from tools/aapt2/compile/PngCrunch.cpp)108
-rw-r--r--libs/androidfw/include/androidfw/BigBufferStream.h (renamed from tools/aapt2/io/BigBufferStream.h)27
-rw-r--r--libs/androidfw/include/androidfw/FileStream.h (renamed from tools/aapt2/io/FileStream.h)16
-rw-r--r--libs/androidfw/include/androidfw/Image.h (renamed from tools/aapt2/compile/Image.h)24
-rw-r--r--libs/androidfw/include/androidfw/Png.h (renamed from tools/aapt2/compile/Png.h)52
-rw-r--r--libs/androidfw/include/androidfw/Streams.h (renamed from tools/aapt2/io/Io.h)35
-rw-r--r--libs/androidfw/tests/FileStream_test.cpp (renamed from tools/aapt2/io/FileStream_test.cpp)12
-rw-r--r--libs/androidfw/tests/NinePatch_test.cpp (renamed from tools/aapt2/compile/NinePatch_test.cpp)142
-rw-r--r--libs/hwui/Mesh.cpp4
-rw-r--r--libs/hwui/jni/YuvToJpegEncoder.cpp3
-rw-r--r--libs/hwui/jni/YuvToJpegEncoder.h6
-rw-r--r--libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp2
-rw-r--r--location/api/system-current.txt4
-rw-r--r--location/java/android/location/GnssMeasurementRequest.java4
-rw-r--r--location/java/android/location/flags/gnss.aconfig16
-rw-r--r--media/java/android/media/IAudioService.aidl2
-rw-r--r--media/java/android/media/LoudnessCodecConfigurator.java189
-rw-r--r--media/java/android/media/LoudnessCodecDispatcher.java92
-rw-r--r--media/java/android/media/LoudnessCodecInfo.aidl3
-rw-r--r--media/java/android/media/MediaCas.java2
-rw-r--r--media/java/android/media/tv/ad/TvAdManager.java10
-rw-r--r--media/java/android/media/tv/flags/media_tv.aconfig7
-rw-r--r--media/tests/LoudnessCodecApiTest/src/com/android/loudnesscodecapitest/LoudnessCodecConfiguratorTest.java2
-rw-r--r--media/tests/ringtone/res/raw/test_haptic_file.ahv4
-rw-r--r--native/android/libandroid.map.txt7
-rw-r--r--native/android/performance_hint.cpp167
-rw-r--r--native/android/tests/performance_hint/PerformanceHintNativeTest.cpp127
-rw-r--r--packages/CredentialManager/Android.bp2
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/IntentParser.kt11
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/client/impl/CredentialManagerClientImpl.kt7
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt369
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/PasswordKtx.kt32
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/mapper/RequestGetMapper.kt40
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/model/CredentialType.kt (renamed from packages/CredentialManager/src/com/android/credentialmanager/common/CredentialType.kt)2
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/model/EntryInfo.kt (renamed from packages/CredentialManager/src/com/android/credentialmanager/common/BaseEntry.kt)4
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/model/Request.kt7
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/model/creation/CreateOptionInfo.kt46
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/model/creation/RemoteInfo.kt36
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/ActionEntryInfo.kt40
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/AuthenticationEntryInfo.kt44
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/CredentialEntryInfo.kt50
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/ProviderInfo.kt33
-rw-r--r--packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/RemoteEntryInfo.kt36
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt13
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt241
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt27
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt86
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt67
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt29
-rw-r--r--packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt130
-rw-r--r--packages/CredentialManager/wear/src/com/android/credentialmanager/di/AppModule.kt21
-rw-r--r--packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt4
-rw-r--r--packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreen.kt4
-rw-r--r--packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreenViewModel.kt21
-rw-r--r--packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm105
-rw-r--r--packages/PackageInstaller/Android.bp6
-rw-r--r--packages/PackageInstaller/AndroidManifest.xml14
-rw-r--r--packages/PackageInstaller/TEST_MAPPING3
-rw-r--r--packages/PackageInstaller/res/values-af/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-am/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ar/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-as/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-az/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-b+sr+Latn/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-be/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-bg/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-bn/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-bs/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ca/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-cs/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-da/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-de/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-el/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-en-rAU/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-en-rCA/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-en-rGB/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-en-rIN/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-en-rXC/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-es-rUS/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-es/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-et/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-eu/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-fa/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-fi/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-fr-rCA/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-fr/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-gl/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-gu/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-hi/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-hr/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-hu/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-hy/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-in/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-is/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-it/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-iw/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ja/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ka/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-kk/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-km/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-kn/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ko/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ky/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-lo/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-lt/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-lv/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-mk/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ml/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-mn/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-mr/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ms/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-my/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-nb/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ne/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-nl/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-or/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-pa/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-pl/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-pt-rBR/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-pt-rPT/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-pt/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ro/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ru/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-si/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sk/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sl/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sq/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sr/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sv/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-sw/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ta/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-te/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-th/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-tl/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-tr/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-uk/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-ur/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-uz/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-vi/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-zh-rCN/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-zh-rHK/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-zh-rTW/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values-zu/strings.xml3
-rw-r--r--packages/PackageInstaller/res/values/strings.xml84
-rw-r--r--packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java9
-rw-r--r--packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java18
-rw-r--r--packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorActivity.java79
-rw-r--r--packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorFragment.java196
-rw-r--r--packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java18
-rw-r--r--packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java7
-rw-r--r--packages/SettingsLib/MainSwitchPreference/Android.bp1
-rw-r--r--packages/SettingsLib/MainSwitchPreference/AndroidManifest.xml2
-rw-r--r--packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java26
-rw-r--r--packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml1
-rw-r--r--packages/SettingsLib/Spa/build.gradle.kts4
-rw-r--r--packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt35
-rw-r--r--packages/SettingsLib/Spa/spa/build.gradle.kts4
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt2
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsTheme.kt22
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCard.kt37
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCard.kt11
-rw-r--r--packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/chart/BarChart.kt5
-rw-r--r--packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/database/ContentChangeFlow.kt (renamed from packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalFlow.kt)24
-rw-r--r--packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBoolean.kt (renamed from packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepository.kt)4
-rw-r--r--packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlow.kt (renamed from packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt)4
-rw-r--r--packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBoolean.kt51
-rw-r--r--packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanTest.kt (renamed from packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepositoryTest.kt)2
-rw-r--r--packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlowTest.kt (renamed from packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepositoryTest.kt)4
-rw-r--r--packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBooleanTest.kt111
-rw-r--r--packages/SettingsLib/res/layout-v33/restricted_switch_preference.xml2
-rw-r--r--packages/SettingsLib/res/values-af/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-am/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-ar/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-as/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-az/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-b+sr+Latn/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-be/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-bg/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-bn/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ca/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-cs/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-da/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-de/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-el/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-en-rAU/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-en-rCA/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-en-rGB/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-en-rIN/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-en-rXC/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-es-rUS/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-es/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-et/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-eu/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-fi/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-gl/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-gu/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-hr/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-hu/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-hy/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-is/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-it/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-iw/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-ja/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ka/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-kk/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-km/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-kn/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ko/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ky/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-lo/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-lt/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-lv/strings.xml13
-rw-r--r--packages/SettingsLib/res/values-mk/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ml/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-mn/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-mr/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ms/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ne/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-nl/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-or/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-pa/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-pl/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-pt-rBR/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-pt-rPT/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-pt/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ro/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-ru/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-si/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-sl/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-sq/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-sr/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-sv/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml6
-rw-r--r--packages/SettingsLib/res/values-ta/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-te/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-th/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-tr/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-uk/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-ur/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-uz/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-vi/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-zh-rCN/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-zh-rHK/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-zh-rTW/strings.xml9
-rw-r--r--packages/SettingsLib/res/values-zu/strings.xml9
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/PrimarySwitchPreference.java6
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java11
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/Utils.java10
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java4
-rw-r--r--packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java3
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java4
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java9
-rw-r--r--packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java1
-rw-r--r--packages/SoundPicker/res/values-ro/strings.xml2
-rw-r--r--packages/SystemUI/Android.bp178
-rw-r--r--packages/SystemUI/AndroidManifest.xml9
-rw-r--r--packages/SystemUI/TEST_MAPPING30
-rw-r--r--packages/SystemUI/aconfig/OWNERS1
-rw-r--r--packages/SystemUI/aconfig/biometrics_framework.aconfig10
-rw-r--r--packages/SystemUI/aconfig/systemui.aconfig30
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt123
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PasswordBouncer.kt66
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PatternBouncer.kt78
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt39
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt50
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt76
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt2
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt52
-rw-r--r--packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt5
-rw-r--r--packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt4
-rw-r--r--packages/SystemUI/docs/qs-tiles.md435
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt (renamed from packages/SystemUI/tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt (renamed from packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java (renamed from packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt (renamed from packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt)22
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt (renamed from packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerTest.java (renamed from packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java (renamed from packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSimPinViewControllerTest.kt (renamed from packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPinViewControllerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSimPukViewControllerTest.kt (renamed from packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPukViewControllerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/authentication/data/repository/AuthenticationRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/authentication/data/repository/AuthenticationRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java)5
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/BiometricDisplayListenerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricDisplayListenerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/FaceHelpMessageDeferralTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/FaceHelpMessageDeferralTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt)265
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java)13
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsDisplayModeTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDisplayModeTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java)2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt)125
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsShellTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsShellTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsViewTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsViewTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/data/repository/SimBouncerRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/data/repository/SimBouncerRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt)2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorTest.kt)4
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerCallbackInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerCallbackInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorWithCoroutinesTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorWithCoroutinesTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModelTest.kt)16
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt)132
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinInputViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PinInputViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/view/layout/blueprints/DefaultCommunalBlueprintTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/communal/ui/view/layout/blueprints/DefaultCommunalBlueprintTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dock/DockManagerFake.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dock/DockManagerFake.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayAnimationsControllerTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayAnimationsControllerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayCallbackControllerTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayCallbackControllerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayNotificationCountProviderTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayNotificationCountProviderTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayStatusBarItemsProviderTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarItemsProviderTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/complication/HideComplicationTouchHandlerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/complication/HideComplicationTouchHandlerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/conditions/AssistantAttentionConditionTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/conditions/AssistantAttentionConditionTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/conditions/DreamConditionTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/conditions/DreamConditionTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/ShadeTouchHandlerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/touch/ShadeTouchHandlerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/scrim/BouncerlessScrimControllerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/touch/scrim/BouncerlessScrimControllerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/scrim/ScrimManagerTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/dreams/touch/scrim/ScrimManagerTest.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/dump/LogBufferHelper.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferHelper.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfigTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfigTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfigTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfigTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLegacySettingSyncerTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLegacySettingSyncerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLocalUserSelectionManagerTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLocalUserSelectionManagerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceRemoteUserSelectionManagerTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceRemoteUserSelectionManagerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfigTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfigTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/QrCodeScannerKeyguardQuickAffordanceConfigTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/QrCodeScannerKeyguardQuickAffordanceConfigTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfigTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfigTest.kt)94
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/VideoCameraQuickAffordanceConfigTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/VideoCameraQuickAffordanceConfigTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/TrustRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/TrustRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLongPressInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLongPressInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/AutoAddSettingsRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/AutoAddSettingsRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedSharedPreferencesRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedSharedPreferencesRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/InstalledTilesComponentRepositoryImplTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/InstalledTilesComponentRepositoryImplTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/QSSettingsRestoredBroadcastRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/QSSettingsRestoredBroadcastRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TilesSettingConverterTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/TilesSettingConverterTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingListTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingListTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddableTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddableTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddableTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddableTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddableTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddableTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddableTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddableTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddableTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddableTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddableTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddableTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddableTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddableTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddableTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddableTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddableTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddableTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddableTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddableTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/FakeQSTile.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/FakeQSTile.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/PanelInteractorImplTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/PanelInteractorImplTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/RestoreReconciliationInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/RestoreReconciliationInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/analytics/QSTileAnalyticsTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/analytics/QSTileAnalyticsTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/interactor/DisabledByPolicyInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/interactor/DisabledByPolicyInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/logging/QSTileLoggerTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/logging/QSTileLoggerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileDataInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileDataInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileUserActionInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileUserActionInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/CustomTileDefaultsRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/CustomTileDefaultsRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/CustomTilePackageUpdatesRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/CustomTilePackageUpdatesRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTileRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTileRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/flashlight/domain/FlashlightMapperTest.kt18
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/location/domain/LocationTileMapperTest.kt13
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfigProviderTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfigProviderTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelUserInputTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelUserInputTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt)31
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterTest.kt42
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt)2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt)17
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/scene/data/repository/WindowRootViewVisibilityRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/WindowRootViewVisibilityRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt)2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt)29
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/BcSmartspaceConfigProviderTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/smartspace/BcSmartspaceConfigProviderTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/DreamSmartspaceControllerTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/smartspace/DreamSmartspaceControllerTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/LockscreenAndDreamTargetFilterTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/smartspace/LockscreenAndDreamTargetFilterTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/LockscreenPreconditionTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/smartspace/LockscreenPreconditionTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/FakeKeyguardStateController.java (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/FakeKeyguardStateController.java)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/util/FakeSubscriptionManagerProxy.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/util/FakeSubscriptionManagerProxy.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/data/repository/FakeConnectivityRepository.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/data/repository/FakeConnectivityRepository.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/FakeWifiRepository.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/FakeWifiRepository.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepositorySwitcherTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepositorySwitcherTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepositoryTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepositoryTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt)0
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt (renamed from packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt)0
-rw-r--r--packages/SystemUI/res/color/notification_overlay_color.xml4
-rw-r--r--packages/SystemUI/res/values-af/strings.xml71
-rw-r--r--packages/SystemUI/res/values-am/strings.xml60
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml71
-rw-r--r--packages/SystemUI/res/values-as/strings.xml71
-rw-r--r--packages/SystemUI/res/values-az/strings.xml71
-rw-r--r--packages/SystemUI/res/values-b+sr+Latn/strings.xml71
-rw-r--r--packages/SystemUI/res/values-be/strings.xml71
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml71
-rw-r--r--packages/SystemUI/res/values-bn/strings.xml71
-rw-r--r--packages/SystemUI/res/values-bs/strings.xml71
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml71
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml60
-rw-r--r--packages/SystemUI/res/values-da/strings.xml71
-rw-r--r--packages/SystemUI/res/values-de/strings.xml60
-rw-r--r--packages/SystemUI/res/values-el/strings.xml60
-rw-r--r--packages/SystemUI/res/values-en-rAU/strings.xml71
-rw-r--r--packages/SystemUI/res/values-en-rCA/strings.xml62
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml71
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml71
-rw-r--r--packages/SystemUI/res/values-en-rXC/strings.xml60
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml60
-rw-r--r--packages/SystemUI/res/values-es/strings.xml71
-rw-r--r--packages/SystemUI/res/values-et/strings.xml71
-rw-r--r--packages/SystemUI/res/values-eu/strings.xml71
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml71
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml71
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml71
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml60
-rw-r--r--packages/SystemUI/res/values-gl/strings.xml71
-rw-r--r--packages/SystemUI/res/values-gu/strings.xml71
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml71
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml71
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml71
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml71
-rw-r--r--packages/SystemUI/res/values-in/strings.xml71
-rw-r--r--packages/SystemUI/res/values-is/strings.xml60
-rw-r--r--packages/SystemUI/res/values-it/strings.xml71
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml60
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml71
-rw-r--r--packages/SystemUI/res/values-ka/strings.xml60
-rw-r--r--packages/SystemUI/res/values-kk/strings.xml71
-rw-r--r--packages/SystemUI/res/values-km/strings.xml71
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml71
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml71
-rw-r--r--packages/SystemUI/res/values-ky/strings.xml71
-rw-r--r--packages/SystemUI/res/values-lo/strings.xml71
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml71
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml71
-rw-r--r--packages/SystemUI/res/values-mk/strings.xml77
-rw-r--r--packages/SystemUI/res/values-ml/strings.xml71
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml71
-rw-r--r--packages/SystemUI/res/values-mr/strings.xml71
-rw-r--r--packages/SystemUI/res/values-ms/strings.xml71
-rw-r--r--packages/SystemUI/res/values-my/strings.xml77
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml75
-rw-r--r--packages/SystemUI/res/values-ne/strings.xml71
-rw-r--r--packages/SystemUI/res/values-night/colors.xml3
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml71
-rw-r--r--packages/SystemUI/res/values-or/strings.xml71
-rw-r--r--packages/SystemUI/res/values-pa/strings.xml71
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml71
-rw-r--r--packages/SystemUI/res/values-pt-rBR/strings.xml71
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml62
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml71
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml62
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml71
-rw-r--r--packages/SystemUI/res/values-si/strings.xml71
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml71
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml60
-rw-r--r--packages/SystemUI/res/values-sq/strings.xml77
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml71
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml71
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml60
-rw-r--r--packages/SystemUI/res/values-ta/strings.xml71
-rw-r--r--packages/SystemUI/res/values-te/strings.xml71
-rw-r--r--packages/SystemUI/res/values-th/strings.xml71
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml71
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml71
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml77
-rw-r--r--packages/SystemUI/res/values-ur/strings.xml71
-rw-r--r--packages/SystemUI/res/values-uz/strings.xml71
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml73
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml71
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml71
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml77
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml71
-rw-r--r--packages/SystemUI/res/values/colors.xml2
-rw-r--r--packages/SystemUI/res/values/dimens.xml1
-rw-r--r--packages/SystemUI/res/values/flags.xml2
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl3
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java9
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java1
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java25
-rw-r--r--packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt119
-rw-r--r--packages/SystemUI/src/com/android/systemui/GuestResetOrExitSessionReceiver.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java38
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/MagnificationConnectionImpl.java (renamed from packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java)8
-rw-r--r--packages/SystemUI/src/com/android/systemui/assist/AssistManager.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt26
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationDialogFactory.java104
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt23
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt63
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt52
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModel.kt49
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModel.kt51
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/UdfpsTouchOverlayViewModel.kt25
-rw-r--r--packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java (renamed from packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialog.java)116
-rw-r--r--packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt28
-rw-r--r--packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt12
-rw-r--r--packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt17
-rw-r--r--packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt46
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt18
-rw-r--r--packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogDelegate.kt (renamed from packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt)54
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java56
-rw-r--r--packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt9
-rw-r--r--packages/SystemUI/src/com/android/systemui/flags/Flags.kt33
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt80
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/Lifecycle.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt75
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt46
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt57
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt14
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt19
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt11
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt87
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt60
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt16
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt16
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt75
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AlignShortcutsToUdfpsSection.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodBurnInSection.kt41
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt15
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultIndicationAreaSection.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultShortcutsSection.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt5
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt13
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModel.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingHostedToLockscreenTransitionViewModel.kt46
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModel.kt46
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt31
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt55
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt118
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt23
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt9
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt47
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingHostedTransitionViewModel.kt47
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt9
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt45
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt20
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt18
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt26
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewController.kt46
-rw-r--r--packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java50
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt11
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/impl/airplane/domain/AirplaneModeMapper.kt25
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/impl/flashlight/domain/FlashlightMapper.kt25
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/LocationTileMapper.kt27
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileState.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt28
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt18
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt9
-rw-r--r--packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt3
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/ActiveNotificationsInteractor.kt32
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/NotificationsKeyguardInteractor.kt9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java63
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureController.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java41
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt17
-rw-r--r--packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt12
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationDialogFactoryTest.java52
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationServiceTest.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModelTest.kt157
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelTest.kt150
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogDelegateTest.java (renamed from packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogTest.java)99
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogDelegateTest.kt101
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogTest.kt84
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinderTest.kt103
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt36
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt115
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt32
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt58
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImplTest.kt130
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagsTest.kt24
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt17
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java22
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt24
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/RenderNotificationsListInteractorTest.kt42
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DevicePostureControllerImplTest.kt143
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProviderTest.kt96
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt7
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/data/FakeSystemUiDataLayerModule.kt2
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt2
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryHapticsRepository.kt55
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventDataLayerModule.kt (renamed from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt)5
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventRepository.kt10
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/FakeKeyguardDataLayerModule.kt2
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt56
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt7
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryKosmos.kt23
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt23
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt31
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt3
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt8
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt1
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/ActiveNotificationsInteractorKosmos.kt5
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationsKeyguardInteractorKosmos.kt2
-rw-r--r--packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedModule.kt52
-rw-r--r--packages/SystemUI/unfold/src/com/android/systemui/unfold/dagger/UnfoldBgProgressFlag.kt26
-rw-r--r--packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProvider.kt92
-rw-r--r--packages/overlays/NavigationBarModeGesturalOverlay/res/values-sw600dp/config.xml22
-rw-r--r--packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values-sw600dp/config.xml22
-rw-r--r--packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values-sw600dp/config.xml22
-rw-r--r--packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values-sw600dp/config.xml22
-rw-r--r--ravenwood/OWNERS2
-rw-r--r--ravenwood/README.md28
-rw-r--r--ravenwood/TEST_MAPPING24
-rw-r--r--ravenwood/api-maintainers.md73
-rw-r--r--ravenwood/framework-minus-apex-ravenwood-policies.txt7
-rw-r--r--ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java4
-rw-r--r--ravenwood/minimum-test/Android.bp24
-rw-r--r--ravenwood/minimum-test/test/com/android/ravenwood/RavenwoodMinimumTest.java45
-rw-r--r--ravenwood/ravenwood-annotation-allowed-classes.txt7
-rw-r--r--ravenwood/ravenwood-standard-options.txt2
-rw-r--r--ravenwood/test-authors.md148
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java2
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java20
-rw-r--r--services/accessibility/java/com/android/server/accessibility/ProxyManager.java4
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java41
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionManager.java (renamed from services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java)53
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionWrapper.java6
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java115
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/MagnificationProcessor.java38
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java1
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java52
-rw-r--r--services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java507
-rw-r--r--services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java7
-rw-r--r--services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java17
-rw-r--r--services/companion/java/com/android/server/companion/virtual/TEST_MAPPING10
-rw-r--r--services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java16
-rw-r--r--services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java16
-rw-r--r--services/companion/java/com/android/server/companion/virtual/camera/VirtualCameraController.java125
-rw-r--r--services/core/Android.bp1
-rw-r--r--services/core/java/android/app/usage/UsageStatsManagerInternal.java13
-rw-r--r--services/core/java/android/content/pm/PackageManagerInternal.java5
-rw-r--r--services/core/java/com/android/server/OWNERS4
-rw-r--r--services/core/java/com/android/server/PinnerService.java2
-rw-r--r--services/core/java/com/android/server/SecurityStateManagerService.java109
-rw-r--r--services/core/java/com/android/server/Watchdog.java146
-rw-r--r--services/core/java/com/android/server/adb/AdbDebuggingManager.java9
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java6
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java31
-rw-r--r--services/core/java/com/android/server/am/BroadcastProcessQueue.java3
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueueModernImpl.java17
-rw-r--r--services/core/java/com/android/server/am/BroadcastRecord.java33
-rw-r--r--services/core/java/com/android/server/am/SettingsToPropertiesMapper.java6
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java9
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java61
-rw-r--r--services/core/java/com/android/server/audio/AudioServiceEvents.java49
-rw-r--r--services/core/java/com/android/server/audio/LoudnessCodecHelper.java196
-rw-r--r--services/core/java/com/android/server/audio/SpatializerHelper.java5
-rw-r--r--services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java9
-rw-r--r--services/core/java/com/android/server/biometrics/log/OperationContextExt.java15
-rw-r--r--services/core/java/com/android/server/camera/CameraServiceProxy.java45
-rw-r--r--services/core/java/com/android/server/clipboard/ClipboardService.java6
-rw-r--r--services/core/java/com/android/server/companion/virtual/VirtualDeviceManagerInternal.java8
-rw-r--r--services/core/java/com/android/server/display/BrightnessMappingStrategy.java23
-rw-r--r--services/core/java/com/android/server/display/DisplayAdapter.java12
-rw-r--r--services/core/java/com/android/server/display/DisplayDevice.java3
-rw-r--r--services/core/java/com/android/server/display/DisplayDeviceConfig.java175
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java12
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java14
-rw-r--r--services/core/java/com/android/server/display/OverlayDisplayAdapter.java6
-rw-r--r--services/core/java/com/android/server/display/VirtualDisplayAdapter.java10
-rw-r--r--services/core/java/com/android/server/display/WifiDisplayAdapter.java5
-rw-r--r--services/core/java/com/android/server/display/brightness/clamper/BrightnessClamper.java19
-rw-r--r--services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java29
-rw-r--r--services/core/java/com/android/server/display/brightness/clamper/BrightnessMinClamper.java137
-rw-r--r--services/core/java/com/android/server/display/brightness/clamper/BrightnessPowerClamper.java7
-rw-r--r--services/core/java/com/android/server/display/brightness/clamper/BrightnessThermalClamper.java9
-rw-r--r--services/core/java/com/android/server/display/brightness/clamper/BrightnessWearBedtimeModeClamper.java99
-rw-r--r--services/core/java/com/android/server/display/feature/DisplayManagerFlags.java31
-rw-r--r--services/core/java/com/android/server/display/feature/display_flags.aconfig24
-rw-r--r--services/core/java/com/android/server/display/mode/BaseModeRefreshRateVote.java2
-rw-r--r--services/core/java/com/android/server/display/mode/CombinedVote.java2
-rw-r--r--services/core/java/com/android/server/display/mode/DisableRefreshRateSwitchingVote.java2
-rw-r--r--services/core/java/com/android/server/display/mode/DisplayModeDirector.java414
-rw-r--r--services/core/java/com/android/server/display/mode/RefreshRateVote.java4
-rw-r--r--services/core/java/com/android/server/display/mode/SizeVote.java2
-rw-r--r--services/core/java/com/android/server/display/mode/SupportedModesVote.java2
-rw-r--r--services/core/java/com/android/server/display/mode/Vote.java2
-rw-r--r--services/core/java/com/android/server/display/mode/VoteSummary.java376
-rw-r--r--services/core/java/com/android/server/input/KeyboardMetricsCollector.java13
-rw-r--r--services/core/java/com/android/server/inputmethod/HandwritingModeController.java23
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerService.java91
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodUtils.java56
-rw-r--r--services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java3
-rw-r--r--services/core/java/com/android/server/location/gnss/GnssLocationProvider.java52
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsService.java2
-rw-r--r--services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java32
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java86
-rw-r--r--services/core/java/com/android/server/notification/NotificationRecord.java19
-rw-r--r--services/core/java/com/android/server/pdb/TEST_MAPPING7
-rw-r--r--services/core/java/com/android/server/pm/ApkChecksums.java3
-rw-r--r--services/core/java/com/android/server/pm/DeletePackageHelper.java6
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java18
-rw-r--r--services/core/java/com/android/server/pm/InstallRequest.java6
-rw-r--r--services/core/java/com/android/server/pm/PackageArchiver.java125
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java30
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java27
-rw-r--r--services/core/java/com/android/server/pm/PackageSetting.java5
-rw-r--r--services/core/java/com/android/server/pm/SharedLibrariesImpl.java4
-rw-r--r--services/core/java/com/android/server/pm/UserDataPreparer.java54
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java10
-rw-r--r--services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java3
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionMigrationHelperImpl.java2
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java55
-rw-r--r--services/core/java/com/android/server/power/LowPowerStandbyController.java37
-rw-r--r--services/core/java/com/android/server/power/TEST_MAPPING11
-rw-r--r--services/core/java/com/android/server/power/ThermalManagerService.java128
-rw-r--r--services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java109
-rw-r--r--services/core/java/com/android/server/power/hint/HintManagerService.java66
-rw-r--r--services/core/java/com/android/server/power/stats/BatteryStatsImpl.java45
-rw-r--r--services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java24
-rw-r--r--services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java8
-rw-r--r--services/core/java/com/android/server/power/stats/PowerStatsExporter.java4
-rw-r--r--services/core/java/com/android/server/power/stats/PowerStatsStore.java2
-rw-r--r--services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java25
-rw-r--r--services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java2
-rw-r--r--services/core/java/com/android/server/stats/pull/StatsPullAtomService.java2
-rw-r--r--services/core/java/com/android/server/timezonedetector/TEST_MAPPING5
-rw-r--r--services/core/java/com/android/server/trust/TrustManagerService.java20
-rw-r--r--services/core/java/com/android/server/tv/interactive/TvInteractiveAppManagerService.java8
-rw-r--r--services/core/java/com/android/server/utils/UserSettingDeviceConfigMediator.java194
-rw-r--r--services/core/java/com/android/server/webkit/WebViewUpdateService.java5
-rw-r--r--services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java7
-rw-r--r--services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java18
-rw-r--r--services/core/java/com/android/server/webkit/WebViewUpdateServiceInterface.java2
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java5
-rw-r--r--services/core/java/com/android/server/wm/ActivityStarter.java6
-rw-r--r--services/core/java/com/android/server/wm/BackgroundActivityStartController.java73
-rw-r--r--services/core/java/com/android/server/wm/Dimmer.java4
-rw-r--r--services/core/java/com/android/server/wm/DimmerAnimationHelper.java334
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java2
-rw-r--r--services/core/java/com/android/server/wm/InsetsPolicy.java7
-rw-r--r--services/core/java/com/android/server/wm/SmoothDimmer.java423
-rw-r--r--services/core/java/com/android/server/wm/Task.java145
-rw-r--r--services/core/java/com/android/server/wm/TaskFragment.java3
-rw-r--r--services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java2
-rw-r--r--services/core/java/com/android/server/wm/TaskOrganizerController.java16
-rw-r--r--services/core/java/com/android/server/wm/Transition.java24
-rw-r--r--services/core/java/com/android/server/wm/TransitionController.java6
-rw-r--r--services/core/java/com/android/server/wm/TrustedPresentationListenerController.java448
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerInternal.java14
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java28
-rw-r--r--services/core/java/com/android/server/wm/WindowOrganizerController.java25
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java8
-rw-r--r--services/core/jni/com_android_server_hint_HintManagerService.cpp44
-rw-r--r--services/core/xsd/display-device-config/display-device-config.xsd63
-rw-r--r--services/core/xsd/display-device-config/schema/current.txt17
-rw-r--r--services/java/com/android/server/SystemServer.java21
-rw-r--r--services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java33
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/BrightnessMappingStrategyTest.java82
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java95
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceTest.java23
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java14
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java4
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayMapperTest.java7
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/PersistentDataStoreTest.java29
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java19
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java7
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java2
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessWearBedtimeModeClamperTest.java126
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/BaseModeRefreshRateVoteTest.kt7
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/CombinedVoteTest.kt3
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/DisableRefreshRateSwitchingVoteTest.kt7
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java118
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/PhysicalVoteTest.kt13
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/RenderVoteTest.kt13
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/SizeVoteTest.kt23
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/SupportedModesVoteTest.kt7
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/TestUtils.kt27
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt107
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java15
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java2
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java53
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java73
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/backup/restore/PerformUnifiedRestoreTaskTest.java81
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java3
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java1
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java102
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java8
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java1
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/job/controllers/TimeControllerTest.java10
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/location/gnss/GnssLocationProviderTest.java179
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/DeletePackageHelperTest.kt11
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java8
-rw-r--r--services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java66
-rw-r--r--services/tests/powerservicetests/src/com/android/server/power/ShutdownThreadTest.java12
-rw-r--r--services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java9
-rw-r--r--services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java37
-rw-r--r--services/tests/servicestests/src/com/android/server/SecurityStateTest.java118
-rw-r--r--services/tests/servicestests/src/com/android/server/WatchdogTest.java152
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java30
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java58
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java46
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java (renamed from services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java)433
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionWrapperTest.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java153
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java23
-rw-r--r--services/tests/servicestests/src/com/android/server/audio/LoudnessCodecHelperTest.java166
-rw-r--r--services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java23
-rw-r--r--services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/companion/virtual/camera/VirtualCameraControllerTest.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/job/BiasSchedulingTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/job/JobStoreTest.java20
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java15
-rw-r--r--services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java29
-rw-r--r--services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java58
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/IntervalStatsTests.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/UsageStatsDatabaseTest.java25
-rw-r--r--services/tests/servicestests/src/com/android/server/utils/UserSettingDeviceConfigMediatorTest.java235
-rw-r--r--services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java18
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java193
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java40
-rw-r--r--services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackCustomizationTest.java22
-rw-r--r--services/tests/wmtests/AndroidManifest.xml11
-rw-r--r--services/tests/wmtests/AndroidTest.xml4
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java18
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/ShortcutLoggingTests.java32
-rw-r--r--services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java17
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java18
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DimmerTests.java138
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SurfaceControlViewHostTests.java95
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SystemServiceTestsBase.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java39
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskTests.java181
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TransitionTests.java3
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TrustedPresentationCallbackTest.java154
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TrustedPresentationListenerTest.java267
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/utils/TestActivity.java68
-rw-r--r--services/usage/java/com/android/server/usage/IntervalStats.java39
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsProtoV2.java80
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsService.java99
-rw-r--r--services/usage/java/com/android/server/usage/UserUsageStatsService.java4
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java78
-rw-r--r--telephony/java/android/telephony/CarrierConfigManager.java37
-rw-r--r--telephony/java/android/telephony/CellularIdentifierDisclosure.java161
-rw-r--r--telephony/java/android/telephony/ims/RegistrationManager.java32
-rw-r--r--test-mock/Android.bp23
-rw-r--r--test-mock/tests/src/android/test/mock/MockContextTest.java (renamed from packages/CredentialManager/shared/src/com/android/credentialmanager/model/Password.kt)22
-rw-r--r--test-mock/tests/src/android/test/mock/MockPackageManagerTest.java30
-rw-r--r--tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/GraphicsActivity.java58
-rw-r--r--tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/SurfaceControlTest.java6
-rw-r--r--tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt38
-rw-r--r--tests/Input/src/com/android/server/input/KeyboardMetricsCollectorTests.kt12
-rw-r--r--tests/NetworkSecurityConfigTest/OWNERS1
-rw-r--r--tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt4
-rw-r--r--tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt7
-rw-r--r--tools/aapt2/Android.bp6
-rw-r--r--tools/aapt2/LoadedApk.cpp14
-rw-r--r--tools/aapt2/Main.cpp8
-rw-r--r--tools/aapt2/cmd/Compile.cpp35
-rw-r--r--tools/aapt2/cmd/Compile_test.cpp2
-rw-r--r--tools/aapt2/cmd/Convert.cpp8
-rw-r--r--tools/aapt2/cmd/Dump.cpp11
-rw-r--r--tools/aapt2/cmd/Dump.h2
-rw-r--r--tools/aapt2/cmd/Link.cpp28
-rw-r--r--tools/aapt2/cmd/Optimize.cpp6
-rw-r--r--tools/aapt2/dump/DumpManifest.cpp2
-rw-r--r--tools/aapt2/format/Archive.cpp4
-rw-r--r--tools/aapt2/format/Archive.h4
-rw-r--r--tools/aapt2/format/Archive_test.cpp2
-rw-r--r--tools/aapt2/format/Container.cpp4
-rw-r--r--tools/aapt2/format/Container.h8
-rw-r--r--tools/aapt2/io/Data.h5
-rw-r--r--tools/aapt2/io/File.cpp2
-rw-r--r--tools/aapt2/io/File.h4
-rw-r--r--tools/aapt2/io/FileSystem.cpp6
-rw-r--r--tools/aapt2/io/FileSystem.h2
-rw-r--r--tools/aapt2/io/StringStream.cpp17
-rw-r--r--tools/aapt2/io/StringStream.h9
-rw-r--r--tools/aapt2/io/Util.cpp11
-rw-r--r--tools/aapt2/io/Util.h24
-rw-r--r--tools/aapt2/io/ZipArchive.cpp2
-rw-r--r--tools/aapt2/io/ZipArchive.h2
-rw-r--r--tools/aapt2/java/ClassDefinition.cpp2
-rw-r--r--tools/aapt2/java/ClassDefinition.h2
-rw-r--r--tools/aapt2/java/JavaClassGenerator.cpp2
-rw-r--r--tools/aapt2/java/JavaClassGenerator.h13
-rw-r--r--tools/aapt2/java/ProguardRules.cpp2
-rw-r--r--tools/aapt2/java/ProguardRules.h6
-rw-r--r--tools/aapt2/test/Common.h2
-rw-r--r--tools/aapt2/test/Fixture.cpp2
-rw-r--r--tools/aapt2/text/Printer.cpp2
-rw-r--r--tools/aapt2/text/Printer.h7
-rw-r--r--tools/aapt2/xml/XmlDom.cpp2
-rw-r--r--tools/aapt2/xml/XmlDom.h4
-rw-r--r--tools/aapt2/xml/XmlPullParser.cpp2
-rw-r--r--tools/aapt2/xml/XmlPullParser.h9
-rw-r--r--tools/hoststubgen/README.md38
-rw-r--r--tools/hoststubgen/TEST_MAPPING20
-rw-r--r--tools/hoststubgen/hoststubgen/Android.bp17
-rw-r--r--tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/android/system/ErrnoException.java84
-rw-r--r--tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/libcore/io/IoUtils.java61
-rw-r--r--tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInImpl.java35
-rw-r--r--tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInStub.java38
-rw-r--r--tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsIgnore.java (renamed from tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedStubClass.java)12
-rw-r--r--tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsSubstitute.java38
-rw-r--r--tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsThrow.java (renamed from tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java)12
-rw-r--r--tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java4
-rwxr-xr-xtools/hoststubgen/hoststubgen/invoketest/hoststubgen-invoke-test.sh4
-rw-r--r--tools/hoststubgen/hoststubgen/jarjar-rules.txt2
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt6
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenLogger.kt219
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt22
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt16
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt37
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/AndroidHeuristicsFilter.kt2
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ClassWidePolicyPropagatingFilter.kt35
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/DelegatingFilter.kt14
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt2
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt45
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt15
-rw-r--r--tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/StubGeneratingAdapter.kt1
-rw-r--r--tools/hoststubgen/hoststubgen/test-framework/README.md11
-rw-r--r--tools/hoststubgen/hoststubgen/test-tiny-framework/README.md2
-rw-r--r--tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt20
-rw-r--r--tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt649
-rw-r--r--tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt822
-rw-r--r--tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt649
-rw-r--r--tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt826
-rw-r--r--tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/IPretendingAidl.java9
-rw-r--r--tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java2
-rw-r--r--tools/hoststubgen/hoststubgen/test/com/android/hoststubgen/utils/AsmUtilsTest.kt34
-rwxr-xr-xtools/hoststubgen/scripts/run-all-tests.sh10
1359 files changed, 30320 insertions, 11737 deletions
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index b3e8ea8fabf7..1fb5f34650cb 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -56,6 +56,7 @@ aconfig_srcjars = [
":android.credentials.flags-aconfig-java{.generated_srcjars}",
":android.view.contentprotection.flags-aconfig-java{.generated_srcjars}",
":com.android.server.flags.pinner-aconfig-java{.generated_srcjars}",
+ ":android.service.controls.flags-aconfig-java{.generated_srcjars}",
":android.service.voice.flags-aconfig-java{.generated_srcjars}",
":android.media.tv.flags-aconfig-java{.generated_srcjars}",
":android.service.autofill.flags-aconfig-java{.generated_srcjars}",
@@ -598,6 +599,19 @@ java_aconfig_library {
defaults: ["framework-minus-apex-aconfig-java-defaults"],
}
+// Controls
+aconfig_declarations {
+ name: "android.service.controls.flags-aconfig",
+ package: "android.service.controls.flags",
+ srcs: ["core/java/android/service/controls/flags/*.aconfig"],
+}
+
+java_aconfig_library {
+ name: "android.service.controls.flags-aconfig-java",
+ aconfig_declarations: "android.service.controls.flags-aconfig",
+ defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
+
// Voice
aconfig_declarations {
name: "android.service.voice.flags-aconfig",
diff --git a/Android.bp b/Android.bp
index c1fb41f845e3..23234fdc5ae2 100644
--- a/Android.bp
+++ b/Android.bp
@@ -95,7 +95,7 @@ filegroup {
":platform-compat-native-aidl",
// AIDL sources from external directories
- ":android.hardware.biometrics.common-V3-java-source",
+ ":android.hardware.biometrics.common-V4-java-source",
":android.hardware.biometrics.fingerprint-V3-java-source",
":android.hardware.gnss-V2-java-source",
":android.hardware.graphics.common-V3-java-source",
diff --git a/Ravenwood.bp b/Ravenwood.bp
index ca73378c8e81..03f3f0f3d61d 100644
--- a/Ravenwood.bp
+++ b/Ravenwood.bp
@@ -32,6 +32,8 @@ java_genrule {
cmd: "$(location hoststubgen) " +
"@$(location ravenwood/ravenwood-standard-options.txt) " +
+ "--debug-log $(location hoststubgen_framework-minus-apex.log) " +
+
"--out-impl-jar $(location ravenwood.jar) " +
"--gen-keep-all-file $(location hoststubgen_keep_all.txt) " +
@@ -52,6 +54,8 @@ java_genrule {
// Following files are created just as FYI.
"hoststubgen_keep_all.txt",
"hoststubgen_dump.txt",
+
+ "hoststubgen_framework-minus-apex.log",
],
visibility: ["//visibility:private"],
}
@@ -80,7 +84,7 @@ android_ravenwood_libgroup {
"junit",
"truth",
"ravenwood-junit-impl",
- "android.test.mock",
+ "android.test.mock.ravenwood",
],
}
diff --git a/apex/jobscheduler/framework/aconfig/job.aconfig b/apex/jobscheduler/framework/aconfig/job.aconfig
index f5e33a80211b..e73b434042af 100644
--- a/apex/jobscheduler/framework/aconfig/job.aconfig
+++ b/apex/jobscheduler/framework/aconfig/job.aconfig
@@ -1,6 +1,13 @@
package: "android.app.job"
flag {
+ name: "enforce_minimum_time_windows"
+ namespace: "backstage_power"
+ description: "Enforce a minimum time window for job latencies & deadlines"
+ bug: "311402873"
+}
+
+flag {
name: "job_debug_info_apis"
namespace: "backstage_power"
description: "Add APIs to let apps attach debug information to jobs"
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
index 742ed5f2eeb7..4bc73130db29 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
@@ -23,6 +23,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.text.format.DateUtils.HOUR_IN_MILLIS;
import static android.util.TimeUtils.formatDuration;
import android.annotation.BytesLong;
@@ -36,6 +37,7 @@ import android.compat.Compatibility;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter;
import android.compat.annotation.EnabledSince;
+import android.compat.annotation.Overridable;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ClipData;
import android.content.ComponentName;
@@ -48,7 +50,9 @@ import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.PersistableBundle;
+import android.os.Process;
import android.os.Trace;
+import android.os.UserHandle;
import android.util.ArraySet;
import android.util.Log;
@@ -113,6 +117,16 @@ public class JobInfo implements Parcelable {
@EnabledAfter(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
public static final long REJECT_NEGATIVE_NETWORK_ESTIMATES = 253665015L;
+ /**
+ * Enforce a minimum time window between job latencies and deadlines.
+ *
+ * @hide
+ */
+ @ChangeId
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+ @Overridable // Aid in testing
+ public static final long ENFORCE_MINIMUM_TIME_WINDOWS = 311402873L;
+
/** @hide */
@IntDef(prefix = { "NETWORK_TYPE_" }, value = {
NETWORK_TYPE_NONE,
@@ -1866,10 +1880,40 @@ public class JobInfo implements Parcelable {
* Set deadline which is the maximum scheduling latency. The job will be run by this
* deadline even if other requirements (including a delay set through
* {@link #setMinimumLatency(long)}) are not met.
+ * {@link JobParameters#isOverrideDeadlineExpired()} will return {@code true} if the job's
+ * deadline has passed.
+ *
* <p>
* Because it doesn't make sense setting this property on a periodic job, doing so will
* throw an {@link java.lang.IllegalArgumentException} when
* {@link android.app.job.JobInfo.Builder#build()} is called.
+ *
+ * <p class="note">
+ * Since a job will run once the deadline has passed regardless of the status of other
+ * constraints, setting a deadline of 0 with other constraints makes those constraints
+ * meaningless when it comes to execution decisions. Avoid doing this.
+ * </p>
+ *
+ * <p>
+ * Short deadlines hinder the system's ability to optimize scheduling behavior and may
+ * result in running jobs at inopportune times. Therefore, starting in Android version
+ * {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM}, minimum time windows will be
+ * enforced to help make it easier to better optimize job execution. Time windows are
+ * defined as the time between a job's {@link #setMinimumLatency(long) minimum latency}
+ * and its deadline. If the minimum latency is not set, it is assumed to be 0.
+ * The following minimums will be enforced:
+ * <ul>
+ * <li>
+ * Jobs with {@link #PRIORITY_DEFAULT} or higher priorities have a minimum time
+ * window of one hour.
+ * </li>
+ * <li>Jobs with {@link #PRIORITY_LOW} have a minimum time window of 6 hours.</li>
+ * <li>Jobs with {@link #PRIORITY_MIN} have a minimum time window of 12 hours.</li>
+ * </ul>
+ *
+ * Work that must happen immediately should use {@link #setExpedited(boolean)} or
+ * {@link #setUserInitiated(boolean)} in the appropriate manner.
+ *
* @see JobInfo#getMaxExecutionDelayMillis()
*/
public Builder setOverrideDeadline(long maxExecutionDelayMillis) {
@@ -2143,12 +2187,14 @@ public class JobInfo implements Parcelable {
*/
public JobInfo build() {
return build(Compatibility.isChangeEnabled(DISALLOW_DEADLINES_FOR_PREFETCH_JOBS),
- Compatibility.isChangeEnabled(REJECT_NEGATIVE_NETWORK_ESTIMATES));
+ Compatibility.isChangeEnabled(REJECT_NEGATIVE_NETWORK_ESTIMATES),
+ Compatibility.isChangeEnabled(ENFORCE_MINIMUM_TIME_WINDOWS));
}
/** @hide */
public JobInfo build(boolean disallowPrefetchDeadlines,
- boolean rejectNegativeNetworkEstimates) {
+ boolean rejectNegativeNetworkEstimates,
+ boolean enforceMinimumTimeWindows) {
// This check doesn't need to be inside enforceValidity. It's an unnecessary legacy
// check that would ideally be phased out instead.
if (mBackoffPolicySet && (mConstraintFlags & CONSTRAINT_FLAG_DEVICE_IDLE) != 0) {
@@ -2157,7 +2203,8 @@ public class JobInfo implements Parcelable {
" setRequiresDeviceIdle is an error.");
}
JobInfo jobInfo = new JobInfo(this);
- jobInfo.enforceValidity(disallowPrefetchDeadlines, rejectNegativeNetworkEstimates);
+ jobInfo.enforceValidity(disallowPrefetchDeadlines, rejectNegativeNetworkEstimates,
+ enforceMinimumTimeWindows);
return jobInfo;
}
@@ -2176,7 +2223,8 @@ public class JobInfo implements Parcelable {
* @hide
*/
public final void enforceValidity(boolean disallowPrefetchDeadlines,
- boolean rejectNegativeNetworkEstimates) {
+ boolean rejectNegativeNetworkEstimates,
+ boolean enforceMinimumTimeWindows) {
// Check that network estimates require network type and are reasonable values.
if ((networkDownloadBytes > 0 || networkUploadBytes > 0 || minimumNetworkChunkBytes > 0)
&& networkRequest == null) {
@@ -2291,6 +2339,39 @@ public class JobInfo implements Parcelable {
throw new IllegalArgumentException("Invalid priority level provided: " + mPriority);
}
+ if (enforceMinimumTimeWindows
+ && Flags.enforceMinimumTimeWindows()
+ // TODO(312197030): remove exemption for the system
+ && !UserHandle.isCore(Process.myUid())
+ && hasLateConstraint && !isPeriodic) {
+ final long windowStart = hasEarlyConstraint ? minLatencyMillis : 0;
+ if (mPriority >= PRIORITY_DEFAULT) {
+ if (maxExecutionDelayMillis - windowStart < HOUR_IN_MILLIS) {
+ throw new IllegalArgumentException(
+ getPriorityString(mPriority)
+ + " cannot have a time window less than 1 hour."
+ + " Delay=" + windowStart
+ + ", deadline=" + maxExecutionDelayMillis);
+ }
+ } else if (mPriority >= PRIORITY_LOW) {
+ if (maxExecutionDelayMillis - windowStart < 6 * HOUR_IN_MILLIS) {
+ throw new IllegalArgumentException(
+ getPriorityString(mPriority)
+ + " cannot have a time window less than 6 hours."
+ + " Delay=" + windowStart
+ + ", deadline=" + maxExecutionDelayMillis);
+ }
+ } else {
+ if (maxExecutionDelayMillis - windowStart < 12 * HOUR_IN_MILLIS) {
+ throw new IllegalArgumentException(
+ getPriorityString(mPriority)
+ + " cannot have a time window less than 12 hours."
+ + " Delay=" + windowStart
+ + ", deadline=" + maxExecutionDelayMillis);
+ }
+ }
+ }
+
if (isExpedited) {
if (hasEarlyConstraint) {
throw new IllegalArgumentException("An expedited job cannot have a time delay");
diff --git a/apex/jobscheduler/service/aconfig/job.aconfig b/apex/jobscheduler/service/aconfig/job.aconfig
index eb5502ba95d2..c65e50640ee9 100644
--- a/apex/jobscheduler/service/aconfig/job.aconfig
+++ b/apex/jobscheduler/service/aconfig/job.aconfig
@@ -5,4 +5,11 @@ flag {
namespace: "backstage_power"
description: "Only relax a prefetch job's connectivity constraint when the device is charging and battery is not low"
bug: "299329948"
+}
+
+flag {
+ name: "throw_on_unsupported_bias_usage"
+ namespace: "backstage_power"
+ description: "Throw an exception if an unsupported app uses JobInfo.setBias"
+ bug: "300477393"
} \ No newline at end of file
diff --git a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
index 158d914575c6..6383ed873e59 100644
--- a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
+++ b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java
@@ -32,6 +32,7 @@ import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
import android.app.BroadcastOptions;
import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.IIntentReceiver;
import android.content.Intent;
@@ -41,6 +42,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManagerInternal;
import android.content.res.Resources;
+import android.database.ContentObserver;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@@ -81,6 +83,7 @@ import android.os.Trace;
import android.os.UserHandle;
import android.os.WearModeManagerInternal;
import android.provider.DeviceConfig;
+import android.provider.Settings;
import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
import android.telephony.emergency.EmergencyNumber;
@@ -109,6 +112,7 @@ import com.android.server.deviceidle.DeviceIdleConstraintTracker;
import com.android.server.deviceidle.IDeviceIdleConstraint;
import com.android.server.deviceidle.TvConstraintController;
import com.android.server.net.NetworkPolicyManagerInternal;
+import com.android.server.utils.UserSettingDeviceConfigMediator;
import com.android.server.wm.ActivityTaskManagerInternal;
import org.xmlpull.v1.XmlPullParser;
@@ -1020,7 +1024,8 @@ public class DeviceIdleController extends SystemService
* global Settings. Any access to this class or its fields should be done while
* holding the DeviceIdleController lock.
*/
- public final class Constants implements DeviceConfig.OnPropertiesChangedListener {
+ public final class Constants extends ContentObserver
+ implements DeviceConfig.OnPropertiesChangedListener {
// Key names stored in the settings value.
private static final String KEY_FLEX_TIME_SHORT = "flex_time_short";
private static final String KEY_LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT =
@@ -1102,7 +1107,7 @@ public class DeviceIdleController extends SystemService
private long mDefaultInactiveTimeout =
(30 * 60 * 1000L) / (!COMPRESS_TIME ? 1 : 10);
private static final long DEFAULT_INACTIVE_TIMEOUT_SMALL_BATTERY =
- (15 * 60 * 1000L) / (!COMPRESS_TIME ? 1 : 10);
+ (60 * 1000L) / (!COMPRESS_TIME ? 1 : 10);
private long mDefaultSensingTimeout =
!COMPRESS_TIME ? 4 * 60 * 1000L : 60 * 1000L;
private long mDefaultLocatingTimeout =
@@ -1115,7 +1120,7 @@ public class DeviceIdleController extends SystemService
private long mDefaultIdleAfterInactiveTimeout =
(30 * 60 * 1000L) / (!COMPRESS_TIME ? 1 : 10);
private static final long DEFAULT_IDLE_AFTER_INACTIVE_TIMEOUT_SMALL_BATTERY =
- (15 * 60 * 1000L) / (!COMPRESS_TIME ? 1 : 10);
+ (60 * 1000L) / (!COMPRESS_TIME ? 1 : 10);
private long mDefaultIdlePendingTimeout =
!COMPRESS_TIME ? 5 * 60 * 1000L : 30 * 1000L;
private long mDefaultMaxIdlePendingTimeout =
@@ -1396,6 +1401,7 @@ public class DeviceIdleController extends SystemService
/**
* Amount of time we would like to whitelist an app that is handling a
* {@link android.app.PendingIntent} triggered by a {@link android.app.Notification}.
+ *
* @see #KEY_NOTIFICATION_ALLOWLIST_DURATION_MS
*/
public long NOTIFICATION_ALLOWLIST_DURATION_MS = mDefaultNotificationAllowlistDurationMs;
@@ -1413,9 +1419,14 @@ public class DeviceIdleController extends SystemService
*/
public boolean USE_MODE_MANAGER = mDefaultUseModeManager;
+ private final ContentResolver mResolver;
private final boolean mSmallBatteryDevice;
+ private final UserSettingDeviceConfigMediator mUserSettingDeviceConfigMediator =
+ new UserSettingDeviceConfigMediator.SettingsOverridesIndividualMediator(',');
- public Constants() {
+ public Constants(Handler handler, ContentResolver resolver) {
+ super(handler);
+ mResolver = resolver;
initDefault();
mSmallBatteryDevice = ActivityManager.isSmallBatteryDevice();
if (mSmallBatteryDevice) {
@@ -1424,8 +1435,14 @@ public class DeviceIdleController extends SystemService
}
DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DEVICE_IDLE,
AppSchedulingModuleThread.getExecutor(), this);
+ mResolver.registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.DEVICE_IDLE_CONSTANTS),
+ false, this);
// Load all the constants.
- onPropertiesChanged(DeviceConfig.getProperties(DeviceConfig.NAMESPACE_DEVICE_IDLE));
+ updateSettingsConstantLocked();
+ mUserSettingDeviceConfigMediator.setDeviceConfigProperties(
+ DeviceConfig.getProperties(DeviceConfig.NAMESPACE_DEVICE_IDLE));
+ updateConstantsLocked();
}
private void initDefault() {
@@ -1574,188 +1591,166 @@ public class DeviceIdleController extends SystemService
return (!COMPRESS_TIME || defTimeout < compTimeout) ? defTimeout : compTimeout;
}
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ synchronized (DeviceIdleController.this) {
+ updateSettingsConstantLocked();
+ updateConstantsLocked();
+ }
+ }
+
+ private void updateSettingsConstantLocked() {
+ try {
+ mUserSettingDeviceConfigMediator.setSettingsString(
+ Settings.Global.getString(mResolver,
+ Settings.Global.DEVICE_IDLE_CONSTANTS));
+ } catch (IllegalArgumentException e) {
+ // Failed to parse the settings string, log this and move on with previous values.
+ Slog.e(TAG, "Bad device idle settings", e);
+ }
+ }
@Override
public void onPropertiesChanged(DeviceConfig.Properties properties) {
synchronized (DeviceIdleController.this) {
- for (String name : properties.getKeyset()) {
- if (name == null) {
- continue;
- }
- switch (name) {
- case KEY_FLEX_TIME_SHORT:
- FLEX_TIME_SHORT = properties.getLong(
- KEY_FLEX_TIME_SHORT, mDefaultFlexTimeShort);
- break;
- case KEY_LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT:
- LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT = properties.getLong(
- KEY_LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT,
- mDefaultLightIdleAfterInactiveTimeout);
- break;
- case KEY_LIGHT_IDLE_TIMEOUT:
- LIGHT_IDLE_TIMEOUT = properties.getLong(
- KEY_LIGHT_IDLE_TIMEOUT, mDefaultLightIdleTimeout);
- break;
- case KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX:
- LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = properties.getLong(
- KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX,
- mDefaultLightIdleTimeoutInitialFlex);
- break;
- case KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX:
- LIGHT_IDLE_TIMEOUT_MAX_FLEX = properties.getLong(
- KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX,
- mDefaultLightIdleTimeoutMaxFlex);
- break;
- case KEY_LIGHT_IDLE_FACTOR:
- LIGHT_IDLE_FACTOR = Math.max(1, properties.getFloat(
- KEY_LIGHT_IDLE_FACTOR, mDefaultLightIdleFactor));
- break;
- case KEY_LIGHT_IDLE_INCREASE_LINEARLY:
- LIGHT_IDLE_INCREASE_LINEARLY = properties.getBoolean(
- KEY_LIGHT_IDLE_INCREASE_LINEARLY,
- mDefaultLightIdleIncreaseLinearly);
- break;
- case KEY_LIGHT_IDLE_LINEAR_INCREASE_FACTOR_MS:
- LIGHT_IDLE_LINEAR_INCREASE_FACTOR_MS = properties.getLong(
- KEY_LIGHT_IDLE_LINEAR_INCREASE_FACTOR_MS,
- mDefaultLightIdleLinearIncreaseFactorMs);
- break;
- case KEY_LIGHT_IDLE_FLEX_LINEAR_INCREASE_FACTOR_MS:
- LIGHT_IDLE_FLEX_LINEAR_INCREASE_FACTOR_MS = properties.getLong(
- KEY_LIGHT_IDLE_FLEX_LINEAR_INCREASE_FACTOR_MS,
- mDefaultLightIdleFlexLinearIncreaseFactorMs);
- break;
- case KEY_LIGHT_MAX_IDLE_TIMEOUT:
- LIGHT_MAX_IDLE_TIMEOUT = properties.getLong(
- KEY_LIGHT_MAX_IDLE_TIMEOUT, mDefaultLightMaxIdleTimeout);
- break;
- case KEY_LIGHT_IDLE_MAINTENANCE_MIN_BUDGET:
- LIGHT_IDLE_MAINTENANCE_MIN_BUDGET = properties.getLong(
- KEY_LIGHT_IDLE_MAINTENANCE_MIN_BUDGET,
- mDefaultLightIdleMaintenanceMinBudget);
- break;
- case KEY_LIGHT_IDLE_MAINTENANCE_MAX_BUDGET:
- LIGHT_IDLE_MAINTENANCE_MAX_BUDGET = properties.getLong(
- KEY_LIGHT_IDLE_MAINTENANCE_MAX_BUDGET,
- mDefaultLightIdleMaintenanceMaxBudget);
- break;
- case KEY_MIN_LIGHT_MAINTENANCE_TIME:
- MIN_LIGHT_MAINTENANCE_TIME = properties.getLong(
- KEY_MIN_LIGHT_MAINTENANCE_TIME,
- mDefaultMinLightMaintenanceTime);
- break;
- case KEY_MIN_DEEP_MAINTENANCE_TIME:
- MIN_DEEP_MAINTENANCE_TIME = properties.getLong(
- KEY_MIN_DEEP_MAINTENANCE_TIME,
- mDefaultMinDeepMaintenanceTime);
- break;
- case KEY_INACTIVE_TIMEOUT:
- final long defaultInactiveTimeout = mSmallBatteryDevice
- ? DEFAULT_INACTIVE_TIMEOUT_SMALL_BATTERY
- : mDefaultInactiveTimeout;
- INACTIVE_TIMEOUT = properties.getLong(
- KEY_INACTIVE_TIMEOUT, defaultInactiveTimeout);
- break;
- case KEY_SENSING_TIMEOUT:
- SENSING_TIMEOUT = properties.getLong(
- KEY_SENSING_TIMEOUT, mDefaultSensingTimeout);
- break;
- case KEY_LOCATING_TIMEOUT:
- LOCATING_TIMEOUT = properties.getLong(
- KEY_LOCATING_TIMEOUT, mDefaultLocatingTimeout);
- break;
- case KEY_LOCATION_ACCURACY:
- LOCATION_ACCURACY = properties.getFloat(
- KEY_LOCATION_ACCURACY, mDefaultLocationAccuracy);
- break;
- case KEY_MOTION_INACTIVE_TIMEOUT:
- MOTION_INACTIVE_TIMEOUT = properties.getLong(
- KEY_MOTION_INACTIVE_TIMEOUT, mDefaultMotionInactiveTimeout);
- break;
- case KEY_MOTION_INACTIVE_TIMEOUT_FLEX:
- MOTION_INACTIVE_TIMEOUT_FLEX = properties.getLong(
- KEY_MOTION_INACTIVE_TIMEOUT_FLEX,
- mDefaultMotionInactiveTimeoutFlex);
- break;
- case KEY_IDLE_AFTER_INACTIVE_TIMEOUT:
- final long defaultIdleAfterInactiveTimeout = mSmallBatteryDevice
- ? DEFAULT_IDLE_AFTER_INACTIVE_TIMEOUT_SMALL_BATTERY
- : mDefaultIdleAfterInactiveTimeout;
- IDLE_AFTER_INACTIVE_TIMEOUT = properties.getLong(
- KEY_IDLE_AFTER_INACTIVE_TIMEOUT,
- defaultIdleAfterInactiveTimeout);
- break;
- case KEY_IDLE_PENDING_TIMEOUT:
- IDLE_PENDING_TIMEOUT = properties.getLong(
- KEY_IDLE_PENDING_TIMEOUT, mDefaultIdlePendingTimeout);
- break;
- case KEY_MAX_IDLE_PENDING_TIMEOUT:
- MAX_IDLE_PENDING_TIMEOUT = properties.getLong(
- KEY_MAX_IDLE_PENDING_TIMEOUT, mDefaultMaxIdlePendingTimeout);
- break;
- case KEY_IDLE_PENDING_FACTOR:
- IDLE_PENDING_FACTOR = properties.getFloat(
- KEY_IDLE_PENDING_FACTOR, mDefaultIdlePendingFactor);
- break;
- case KEY_QUICK_DOZE_DELAY_TIMEOUT:
- QUICK_DOZE_DELAY_TIMEOUT = properties.getLong(
- KEY_QUICK_DOZE_DELAY_TIMEOUT, mDefaultQuickDozeDelayTimeout);
- break;
- case KEY_IDLE_TIMEOUT:
- IDLE_TIMEOUT = properties.getLong(
- KEY_IDLE_TIMEOUT, mDefaultIdleTimeout);
- break;
- case KEY_MAX_IDLE_TIMEOUT:
- MAX_IDLE_TIMEOUT = properties.getLong(
- KEY_MAX_IDLE_TIMEOUT, mDefaultMaxIdleTimeout);
- break;
- case KEY_IDLE_FACTOR:
- IDLE_FACTOR = properties.getFloat(KEY_IDLE_FACTOR, mDefaultIdleFactor);
- break;
- case KEY_MIN_TIME_TO_ALARM:
- MIN_TIME_TO_ALARM = properties.getLong(
- KEY_MIN_TIME_TO_ALARM, mDefaultMinTimeToAlarm);
- break;
- case KEY_MAX_TEMP_APP_ALLOWLIST_DURATION_MS:
- MAX_TEMP_APP_ALLOWLIST_DURATION_MS = properties.getLong(
- KEY_MAX_TEMP_APP_ALLOWLIST_DURATION_MS,
- mDefaultMaxTempAppAllowlistDurationMs);
- break;
- case KEY_MMS_TEMP_APP_ALLOWLIST_DURATION_MS:
- MMS_TEMP_APP_ALLOWLIST_DURATION_MS = properties.getLong(
- KEY_MMS_TEMP_APP_ALLOWLIST_DURATION_MS,
- mDefaultMmsTempAppAllowlistDurationMs);
- break;
- case KEY_SMS_TEMP_APP_ALLOWLIST_DURATION_MS:
- SMS_TEMP_APP_ALLOWLIST_DURATION_MS = properties.getLong(
- KEY_SMS_TEMP_APP_ALLOWLIST_DURATION_MS,
- mDefaultSmsTempAppAllowlistDurationMs);
- break;
- case KEY_NOTIFICATION_ALLOWLIST_DURATION_MS:
- NOTIFICATION_ALLOWLIST_DURATION_MS = properties.getLong(
- KEY_NOTIFICATION_ALLOWLIST_DURATION_MS,
- mDefaultNotificationAllowlistDurationMs);
- break;
- case KEY_WAIT_FOR_UNLOCK:
- WAIT_FOR_UNLOCK = properties.getBoolean(
- KEY_WAIT_FOR_UNLOCK, mDefaultWaitForUnlock);
- break;
- case KEY_USE_WINDOW_ALARMS:
- USE_WINDOW_ALARMS = properties.getBoolean(
- KEY_USE_WINDOW_ALARMS, mDefaultUseWindowAlarms);
- break;
- case KEY_USE_MODE_MANAGER:
- USE_MODE_MANAGER = properties.getBoolean(
- KEY_USE_MODE_MANAGER, mDefaultUseModeManager);
- break;
- default:
- Slog.e(TAG, "Unknown configuration key: " + name);
- break;
- }
- }
+ mUserSettingDeviceConfigMediator.setDeviceConfigProperties(properties);
+ updateConstantsLocked();
}
}
+ private void updateConstantsLocked() {
+ if (mSmallBatteryDevice) return;
+ FLEX_TIME_SHORT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_FLEX_TIME_SHORT, mDefaultFlexTimeShort);
+
+ LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT,
+ mDefaultLightIdleAfterInactiveTimeout);
+
+ LIGHT_IDLE_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_LIGHT_IDLE_TIMEOUT, mDefaultLightIdleTimeout);
+
+ LIGHT_IDLE_TIMEOUT_INITIAL_FLEX = mUserSettingDeviceConfigMediator.getLong(
+ KEY_LIGHT_IDLE_TIMEOUT_INITIAL_FLEX,
+ mDefaultLightIdleTimeoutInitialFlex);
+
+ LIGHT_IDLE_TIMEOUT_MAX_FLEX = mUserSettingDeviceConfigMediator.getLong(
+ KEY_LIGHT_IDLE_TIMEOUT_MAX_FLEX,
+ mDefaultLightIdleTimeoutMaxFlex);
+
+ LIGHT_IDLE_FACTOR = Math.max(1, mUserSettingDeviceConfigMediator.getFloat(
+ KEY_LIGHT_IDLE_FACTOR, mDefaultLightIdleFactor));
+
+ LIGHT_IDLE_INCREASE_LINEARLY = mUserSettingDeviceConfigMediator.getBoolean(
+ KEY_LIGHT_IDLE_INCREASE_LINEARLY,
+ mDefaultLightIdleIncreaseLinearly);
+
+ LIGHT_IDLE_LINEAR_INCREASE_FACTOR_MS = mUserSettingDeviceConfigMediator.getLong(
+ KEY_LIGHT_IDLE_LINEAR_INCREASE_FACTOR_MS,
+ mDefaultLightIdleLinearIncreaseFactorMs);
+
+ LIGHT_IDLE_FLEX_LINEAR_INCREASE_FACTOR_MS = mUserSettingDeviceConfigMediator.getLong(
+ KEY_LIGHT_IDLE_FLEX_LINEAR_INCREASE_FACTOR_MS,
+ mDefaultLightIdleFlexLinearIncreaseFactorMs);
+
+ LIGHT_MAX_IDLE_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_LIGHT_MAX_IDLE_TIMEOUT, mDefaultLightMaxIdleTimeout);
+
+ LIGHT_IDLE_MAINTENANCE_MIN_BUDGET = mUserSettingDeviceConfigMediator.getLong(
+ KEY_LIGHT_IDLE_MAINTENANCE_MIN_BUDGET,
+ mDefaultLightIdleMaintenanceMinBudget);
+
+ LIGHT_IDLE_MAINTENANCE_MAX_BUDGET = mUserSettingDeviceConfigMediator.getLong(
+ KEY_LIGHT_IDLE_MAINTENANCE_MAX_BUDGET,
+ mDefaultLightIdleMaintenanceMaxBudget);
+
+ MIN_LIGHT_MAINTENANCE_TIME = mUserSettingDeviceConfigMediator.getLong(
+ KEY_MIN_LIGHT_MAINTENANCE_TIME,
+ mDefaultMinLightMaintenanceTime);
+
+ MIN_DEEP_MAINTENANCE_TIME = mUserSettingDeviceConfigMediator.getLong(
+ KEY_MIN_DEEP_MAINTENANCE_TIME,
+ mDefaultMinDeepMaintenanceTime);
+
+ final long defaultInactiveTimeout = mSmallBatteryDevice
+ ? DEFAULT_INACTIVE_TIMEOUT_SMALL_BATTERY
+ : mDefaultInactiveTimeout;
+ INACTIVE_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_INACTIVE_TIMEOUT, defaultInactiveTimeout);
+
+ SENSING_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_SENSING_TIMEOUT, mDefaultSensingTimeout);
+
+ LOCATING_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_LOCATING_TIMEOUT, mDefaultLocatingTimeout);
+
+ LOCATION_ACCURACY = mUserSettingDeviceConfigMediator.getFloat(
+ KEY_LOCATION_ACCURACY, mDefaultLocationAccuracy);
+
+ MOTION_INACTIVE_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_MOTION_INACTIVE_TIMEOUT, mDefaultMotionInactiveTimeout);
+
+ MOTION_INACTIVE_TIMEOUT_FLEX = mUserSettingDeviceConfigMediator.getLong(
+ KEY_MOTION_INACTIVE_TIMEOUT_FLEX,
+ mDefaultMotionInactiveTimeoutFlex);
+
+ final long defaultIdleAfterInactiveTimeout = mSmallBatteryDevice
+ ? DEFAULT_IDLE_AFTER_INACTIVE_TIMEOUT_SMALL_BATTERY
+ : mDefaultIdleAfterInactiveTimeout;
+ IDLE_AFTER_INACTIVE_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_IDLE_AFTER_INACTIVE_TIMEOUT,
+ defaultIdleAfterInactiveTimeout);
+
+ IDLE_PENDING_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_IDLE_PENDING_TIMEOUT, mDefaultIdlePendingTimeout);
+
+ MAX_IDLE_PENDING_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_MAX_IDLE_PENDING_TIMEOUT, mDefaultMaxIdlePendingTimeout);
+
+ IDLE_PENDING_FACTOR = mUserSettingDeviceConfigMediator.getFloat(
+ KEY_IDLE_PENDING_FACTOR, mDefaultIdlePendingFactor);
+
+ QUICK_DOZE_DELAY_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_QUICK_DOZE_DELAY_TIMEOUT, mDefaultQuickDozeDelayTimeout);
+
+ IDLE_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_IDLE_TIMEOUT, mDefaultIdleTimeout);
+
+ MAX_IDLE_TIMEOUT = mUserSettingDeviceConfigMediator.getLong(
+ KEY_MAX_IDLE_TIMEOUT, mDefaultMaxIdleTimeout);
+
+ IDLE_FACTOR = mUserSettingDeviceConfigMediator.getFloat(KEY_IDLE_FACTOR,
+ mDefaultIdleFactor);
+
+ MIN_TIME_TO_ALARM = mUserSettingDeviceConfigMediator.getLong(
+ KEY_MIN_TIME_TO_ALARM, mDefaultMinTimeToAlarm);
+
+ MAX_TEMP_APP_ALLOWLIST_DURATION_MS = mUserSettingDeviceConfigMediator.getLong(
+ KEY_MAX_TEMP_APP_ALLOWLIST_DURATION_MS,
+ mDefaultMaxTempAppAllowlistDurationMs);
+
+ MMS_TEMP_APP_ALLOWLIST_DURATION_MS = mUserSettingDeviceConfigMediator.getLong(
+ KEY_MMS_TEMP_APP_ALLOWLIST_DURATION_MS,
+ mDefaultMmsTempAppAllowlistDurationMs);
+
+ SMS_TEMP_APP_ALLOWLIST_DURATION_MS = mUserSettingDeviceConfigMediator.getLong(
+ KEY_SMS_TEMP_APP_ALLOWLIST_DURATION_MS,
+ mDefaultSmsTempAppAllowlistDurationMs);
+
+ NOTIFICATION_ALLOWLIST_DURATION_MS = mUserSettingDeviceConfigMediator.getLong(
+ KEY_NOTIFICATION_ALLOWLIST_DURATION_MS,
+ mDefaultNotificationAllowlistDurationMs);
+
+ WAIT_FOR_UNLOCK = mUserSettingDeviceConfigMediator.getBoolean(
+ KEY_WAIT_FOR_UNLOCK, mDefaultWaitForUnlock);
+
+ USE_WINDOW_ALARMS = mUserSettingDeviceConfigMediator.getBoolean(
+ KEY_USE_WINDOW_ALARMS, mDefaultUseWindowAlarms);
+
+ USE_MODE_MANAGER = mUserSettingDeviceConfigMediator.getBoolean(
+ KEY_USE_MODE_MANAGER, mDefaultUseModeManager);
+ }
+
void dump(PrintWriter pw) {
pw.println(" Settings:");
@@ -2490,9 +2485,10 @@ public class DeviceIdleController extends SystemService
return mConnectivityManager;
}
- Constants getConstants(DeviceIdleController controller) {
+ Constants getConstants(DeviceIdleController controller, Handler handler,
+ ContentResolver resolver) {
if (mConstants == null) {
- mConstants = controller.new Constants();
+ mConstants = controller.new Constants(handler, resolver);
}
return mConstants;
}
@@ -2650,7 +2646,7 @@ public class DeviceIdleController extends SystemService
}
}
- mConstants = mInjector.getConstants(this);
+ mConstants = mInjector.getConstants(this, mHandler, getContext().getContentResolver());
readConfigFileLocked();
updateWhitelistAppIdsLocked();
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
index 1bd8da8256c3..5a32a02ca8ce 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -2163,6 +2163,8 @@ public class AlarmManagerService extends SystemService {
mActivityManagerInternal.getBootTimeTempAllowListDuration(),
TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED,
PowerExemptionManager.REASON_TIMEZONE_CHANGED, "");
+ mOptsTimeBroadcast.setDeliveryGroupPolicy(
+ BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT);
getContext().sendBroadcastAsUser(intent, UserHandle.ALL,
null /* receiverPermission */, mOptsTimeBroadcast.toBundle());
}
@@ -4608,6 +4610,8 @@ public class AlarmManagerService extends SystemService {
mActivityManagerInternal.getBootTimeTempAllowListDuration(),
TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED,
PowerExemptionManager.REASON_TIME_CHANGED, "");
+ mOptsTimeBroadcast.setDeliveryGroupPolicy(
+ BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT);
getContext().sendBroadcastAsUser(intent, UserHandle.ALL,
null /* receiverPermission */, mOptsTimeBroadcast.toBundle());
// The world has changed on us, so we need to re-evaluate alarms
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
index 07475b4f2136..f97100bf2e9b 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -268,6 +268,7 @@ public class JobSchedulerService extends com.android.server.SystemService
/** Master list of jobs. */
final JobStore mJobs;
private final CountDownLatch mJobStoreLoadedLatch;
+ private final CountDownLatch mStartControllerTrackingLatch;
/** Tracking the standby bucket state of each app */
final StandbyTracker mStandbyTracker;
/** Tracking amount of time each package runs for. */
@@ -2521,6 +2522,7 @@ public class JobSchedulerService extends com.android.server.SystemService
mBatteryStateTracker.startTracking();
// Create the controllers.
+ mStartControllerTrackingLatch = new CountDownLatch(1);
mControllers = new ArrayList<StateController>();
mPrefetchController = new PrefetchController(this);
mControllers.add(mPrefetchController);
@@ -2552,6 +2554,8 @@ public class JobSchedulerService extends com.android.server.SystemService
new TareController(this, backgroundJobsController, mConnectivityController);
mControllers.add(mTareController);
+ startControllerTrackingAsync();
+
mRestrictiveControllers = new ArrayList<>();
mRestrictiveControllers.add(batteryController);
mRestrictiveControllers.add(mConnectivityController);
@@ -2623,16 +2627,22 @@ public class JobSchedulerService extends com.android.server.SystemService
public void onBootPhase(int phase) {
if (PHASE_LOCK_SETTINGS_READY == phase) {
// This is the last phase before PHASE_SYSTEM_SERVICES_READY. We need to ensure that
+ // controllers have started tracking and that
// persisted jobs are loaded before we can proceed to PHASE_SYSTEM_SERVICES_READY.
try {
+ mStartControllerTrackingLatch.await();
+ } catch (InterruptedException e) {
+ Slog.e(TAG, "Couldn't wait on controller tracking start latch");
+ }
+ try {
mJobStoreLoadedLatch.await();
} catch (InterruptedException e) {
Slog.e(TAG, "Couldn't wait on job store loading latch");
}
} else if (PHASE_SYSTEM_SERVICES_READY == phase) {
mConstantsObserver.start();
- for (StateController controller : mControllers) {
- controller.onSystemServicesReady();
+ for (int i = mControllers.size() - 1; i >= 0; --i) {
+ mControllers.get(i).onSystemServicesReady();
}
mAppStateTracker = (AppStateTrackerImpl) Objects.requireNonNull(
@@ -2695,6 +2705,17 @@ public class JobSchedulerService extends com.android.server.SystemService
}
}
+ private void startControllerTrackingAsync() {
+ mHandler.post(() -> {
+ synchronized (mLock) {
+ for (int i = mControllers.size() - 1; i >= 0; --i) {
+ mControllers.get(i).startTrackingLocked();
+ }
+ }
+ mStartControllerTrackingLatch.countDown();
+ });
+ }
+
/**
* Called when we have a job status object that we need to insert in our
* {@link com.android.server.job.JobStore}, and make sure all the relevant controllers know
@@ -4358,7 +4379,8 @@ public class JobSchedulerService extends com.android.server.SystemService
private JobInfo enforceBuilderApiPermissions(int uid, int pid, JobInfo job) {
if (job.getBias() != JobInfo.BIAS_DEFAULT
&& !hasPermission(uid, pid, Manifest.permission.UPDATE_DEVICE_STATS)) {
- if (CompatChanges.isChangeEnabled(THROW_ON_UNSUPPORTED_BIAS_USAGE, uid)) {
+ if (CompatChanges.isChangeEnabled(THROW_ON_UNSUPPORTED_BIAS_USAGE, uid)
+ && Flags.throwOnUnsupportedBiasUsage()) {
throw new SecurityException("Apps may not call setBias()");
} else {
// We can't throw the exception. Log the issue and modify the job to remove
@@ -4366,7 +4388,7 @@ public class JobSchedulerService extends com.android.server.SystemService
Slog.w(TAG, "Uid " + uid + " set bias on its job");
return new JobInfo.Builder(job)
.setBias(JobInfo.BIAS_DEFAULT)
- .build(false, false);
+ .build(false, false, false);
}
}
@@ -4388,7 +4410,9 @@ public class JobSchedulerService extends com.android.server.SystemService
job.enforceValidity(
CompatChanges.isChangeEnabled(
JobInfo.DISALLOW_DEADLINES_FOR_PREFETCH_JOBS, callingUid),
- rejectNegativeNetworkEstimates);
+ rejectNegativeNetworkEstimates,
+ CompatChanges.isChangeEnabled(
+ JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS, callingUid));
if ((job.getFlags() & JobInfo.FLAG_WILL_BE_FOREGROUND) != 0) {
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.CONNECTIVITY_INTERNAL, TAG);
@@ -5175,6 +5199,12 @@ public class JobSchedulerService extends com.android.server.SystemService
return mTareController;
}
+ @VisibleForTesting
+ protected void waitOnAsyncLoadingForTesting() throws Exception {
+ mStartControllerTrackingLatch.await();
+ // Ignore the job store loading for testing.
+ }
+
// Shell command infrastructure
int getJobState(PrintWriter pw, String pkgName, int userId, @Nullable String namespace,
int jobId) {
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java
index afcbddad611e..53b14d616ecc 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java
@@ -1495,7 +1495,7 @@ public final class JobStore {
// return value), the deadline is dropped. Periodic jobs require all constraints
// to be met, so there's no issue with their deadlines.
// The same logic applies for other target SDK-based validation checks.
- builtJob = jobBuilder.build(false, false);
+ builtJob = jobBuilder.build(false, false, false);
} catch (Exception e) {
Slog.w(TAG, "Unable to build job from XML, ignoring: " + jobBuilder.summarize(), e);
return null;
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java
index 25b3421a55f0..cd3ba6b9e13e 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java
@@ -73,6 +73,10 @@ public final class BackgroundJobsController extends StateController {
LocalServices.getService(ActivityManagerInternal.class));
mAppStateTracker = (AppStateTrackerImpl) Objects.requireNonNull(
LocalServices.getService(AppStateTracker.class));
+ }
+
+ @Override
+ public void startTrackingLocked() {
mAppStateTracker.addListener(mForceAppStandbyListener);
}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java
index 5246f2bf838b..ddbc2ecf5e3e 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java
@@ -78,11 +78,15 @@ public final class BatteryController extends RestrictingController {
FlexibilityController flexibilityController) {
super(service);
mPowerTracker = new PowerTracker();
- mPowerTracker.startTracking();
mFlexibilityController = flexibilityController;
}
@Override
+ public void startTrackingLocked() {
+ mPowerTracker.startTracking();
+ }
+
+ @Override
public void maybeStartTrackingJobLocked(JobStatus taskStatus, JobStatus lastJob) {
if (taskStatus.hasPowerConstraint()) {
final long nowElapsed = sElapsedRealtimeClock.millis();
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java
index b029e0075dc2..9d4cba18b4b1 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java
@@ -106,7 +106,10 @@ public class ComponentController extends StateController {
public ComponentController(JobSchedulerService service) {
super(service);
+ }
+ @Override
+ public void startTrackingLocked() {
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
index fed3c42ab87f..13a474ccf451 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
@@ -201,6 +201,10 @@ public final class FlexibilityController extends StateController {
mPercentToDropConstraints =
mFcConfig.DEFAULT_PERCENT_TO_DROP_FLEXIBLE_CONSTRAINTS;
mPrefetchController = prefetchController;
+ }
+
+ @Override
+ public void startTrackingLocked() {
if (mFlexibilityEnabled) {
mPrefetchController.registerPrefetchChangedListener(mPrefetchChangedListener);
}
@@ -369,8 +373,23 @@ public final class FlexibilityController extends StateController {
@VisibleForTesting
@GuardedBy("mLock")
long getLifeCycleBeginningElapsedLocked(JobStatus js) {
+ long earliestRuntime = js.getEarliestRunTime() == JobStatus.NO_EARLIEST_RUNTIME
+ ? js.enqueueTime : js.getEarliestRunTime();
+ if (js.getJob().isPeriodic() && js.getNumPreviousAttempts() == 0) {
+ // Rescheduling periodic jobs (after a successful execution) may result in the job's
+ // start time being a little after the "true" periodic start time (to avoid jobs
+ // running back to back). See JobSchedulerService#getRescheduleJobForPeriodic for more
+ // details. Since rescheduled periodic jobs may already be delayed slightly by this
+ // policy, don't penalize them further by then enforcing the full set of applied
+ // flex constraints at the beginning of the newly determined start time. Let the flex
+ // constraint requirement start closer to the true periodic start time.
+ final long truePeriodicStartTimeElapsed =
+ js.getLatestRunTimeElapsed() - js.getJob().getFlexMillis();
+ // For now, treat the lifecycle beginning as the midpoint between the true periodic
+ // start time and the adjusted start time.
+ earliestRuntime = (earliestRuntime + truePeriodicStartTimeElapsed) / 2;
+ }
if (js.getJob().isPrefetch()) {
- final long earliestRuntime = Math.max(js.enqueueTime, js.getEarliestRunTime());
final long estimatedLaunchTime =
mPrefetchController.getNextEstimatedLaunchTimeLocked(js);
long prefetchWindowStart = mPrefetchLifeCycleStart.getOrDefault(
@@ -381,8 +400,7 @@ public final class FlexibilityController extends StateController {
}
return Math.max(prefetchWindowStart, earliestRuntime);
}
- return js.getEarliestRunTime() == JobStatus.NO_EARLIEST_RUNTIME
- ? js.enqueueTime : js.getEarliestRunTime();
+ return earliestRuntime;
}
@VisibleForTesting
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java
index 47d3fd5bc8c4..adee322f60cf 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java
@@ -19,7 +19,6 @@ package com.android.server.job.controllers;
import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
import android.annotation.NonNull;
-import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserHandle;
import android.provider.DeviceConfig;
@@ -56,7 +55,7 @@ public final class IdleController extends RestrictingController implements Idlen
public IdleController(JobSchedulerService service,
FlexibilityController flexibilityController) {
super(service);
- initIdleStateTracking(mContext);
+ initIdleStateTracker();
mFlexibilityController = flexibilityController;
}
@@ -127,7 +126,7 @@ public final class IdleController extends RestrictingController implements Idlen
* Idle state tracking, and messaging with the task manager when
* significant state changes occur
*/
- private void initIdleStateTracking(Context ctx) {
+ private void initIdleStateTracker() {
final boolean isCar = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_AUTOMOTIVE);
if (isCar) {
@@ -135,7 +134,11 @@ public final class IdleController extends RestrictingController implements Idlen
} else {
mIdleTracker = new DeviceIdlenessTracker();
}
- mIdleTracker.startTracking(ctx, mService, this);
+ }
+
+ @Override
+ public void startTrackingLocked() {
+ mIdleTracker.startTracking(mContext, mService, this);
}
@Override
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
index 13bea6bd1dd1..b74806494a60 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
@@ -636,7 +636,7 @@ public final class JobStatus {
.build());
// Don't perform validation checks at this point since we've already passed the
// initial validation check.
- job = builder.build(false, false);
+ job = builder.build(false, false, false);
}
this.job = job;
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java
index fdeb072cacb3..865e5417faf2 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java
@@ -134,7 +134,10 @@ public class PrefetchController extends StateController {
mThresholdAlarmListener = new ThresholdAlarmListener(
mContext, AppSchedulingModuleThread.get().getLooper());
mUsageStatsManagerInternal = LocalServices.getService(UsageStatsManagerInternal.class);
+ }
+ @Override
+ public void startTrackingLocked() {
mUsageStatsManagerInternal
.registerLaunchTimeChangedListener(mEstimatedLaunchTimeChangedListener);
}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java
index 44ac798c2912..2b9205117316 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java
@@ -56,6 +56,12 @@ public abstract class StateController {
}
/**
+ * Called to get the controller to start tracking relevant information. This is called before
+ * {@link #onSystemServicesReady()}.
+ */
+ public void startTrackingLocked() {}
+
+ /**
* Called when the system boot phase has reached
* {@link com.android.server.SystemService#PHASE_SYSTEM_SERVICES_READY}.
*/
@@ -67,6 +73,7 @@ public abstract class StateController {
* This logic is put here so the JobManager can be completely agnostic of Controller logic.
* Also called when updating a task, so implementing controllers have to be aware of
* preexisting tasks.
+ * This will never be called before {@link #onSystemServicesReady()}.
*/
public abstract void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob);
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java
index 11e2ff7bd77f..0c48c4e5a766 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java
@@ -55,6 +55,10 @@ public final class StorageController extends StateController {
public StorageController(JobSchedulerService service) {
super(service);
mStorageTracker = new StorageTracker();
+ }
+
+ @Override
+ public void startTrackingLocked() {
mStorageTracker.startTracking();
}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java
index d2150b80761f..8381d1a322e0 100644
--- a/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java
+++ b/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java
@@ -109,7 +109,6 @@ import android.annotation.Nullable;
import android.content.ContentResolver;
import android.provider.DeviceConfig;
import android.util.IndentingPrintWriter;
-import android.util.KeyValueListParser;
import android.util.Slog;
import android.util.SparseArray;
@@ -154,7 +153,6 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
private long mMinSatiatedConsumptionLimit;
private long mMaxSatiatedConsumptionLimit;
- private final KeyValueListParser mParser = new KeyValueListParser(',');
private final Injector mInjector;
private final SparseArray<Action> mActions = new SparseArray<>();
@@ -241,35 +239,36 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
mRewards.clear();
try {
- mParser.setString(policyValuesString);
+ mUserSettingDeviceConfigMediator.setSettingsString(policyValuesString);
+ mUserSettingDeviceConfigMediator.setDeviceConfigProperties(properties);
} catch (IllegalArgumentException e) {
Slog.e(TAG, "Global setting key incorrect: ", e);
}
- mMinSatiatedBalanceOther = getConstantAsCake(mParser, properties,
+ mMinSatiatedBalanceOther = getConstantAsCake(
KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES);
- mMinSatiatedBalanceHeadlessSystemApp = getConstantAsCake(mParser, properties,
+ mMinSatiatedBalanceHeadlessSystemApp = getConstantAsCake(
KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
mMinSatiatedBalanceOther);
- mMinSatiatedBalanceExempted = getConstantAsCake(mParser, properties,
+ mMinSatiatedBalanceExempted = getConstantAsCake(
KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED,
DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
mMinSatiatedBalanceHeadlessSystemApp);
- mMaxSatiatedBalance = getConstantAsCake(mParser, properties,
+ mMaxSatiatedBalance = getConstantAsCake(
KEY_AM_MAX_SATIATED_BALANCE, DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
Math.max(arcToCake(1), mMinSatiatedBalanceExempted));
- mMinSatiatedConsumptionLimit = getConstantAsCake(mParser, properties,
+ mMinSatiatedConsumptionLimit = getConstantAsCake(
KEY_AM_MIN_CONSUMPTION_LIMIT, DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES,
arcToCake(1));
- mInitialSatiatedConsumptionLimit = getConstantAsCake(mParser, properties,
+ mInitialSatiatedConsumptionLimit = getConstantAsCake(
KEY_AM_INITIAL_CONSUMPTION_LIMIT, DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES,
mMinSatiatedConsumptionLimit);
- mMaxSatiatedConsumptionLimit = getConstantAsCake(mParser, properties,
+ mMaxSatiatedConsumptionLimit = getConstantAsCake(
KEY_AM_MAX_CONSUMPTION_LIMIT, DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES,
mInitialSatiatedConsumptionLimit);
- final long exactAllowWhileIdleWakeupBasePrice = getConstantAsCake(mParser, properties,
+ final long exactAllowWhileIdleWakeupBasePrice = getConstantAsCake(
KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE,
DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE_CAKES);
@@ -279,49 +278,49 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
// run out of credits, and not when the system has run out of stock.
mActions.put(ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE,
new Action(ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP,
DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP_CAKES),
exactAllowWhileIdleWakeupBasePrice,
/* respectsStockLimit */ false));
mActions.put(ACTION_ALARM_WAKEUP_EXACT,
new Action(ACTION_ALARM_WAKEUP_EXACT,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP,
DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE,
DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE_CAKES),
/* respectsStockLimit */ false));
final long inexactAllowWhileIdleWakeupBasePrice =
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE,
DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE_CAKES);
mActions.put(ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE,
new Action(ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP,
DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP_CAKES),
inexactAllowWhileIdleWakeupBasePrice,
/* respectsStockLimit */ false));
mActions.put(ACTION_ALARM_WAKEUP_INEXACT,
new Action(ACTION_ALARM_WAKEUP_INEXACT,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP,
DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE,
DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE_CAKES),
/* respectsStockLimit */ false));
- final long exactAllowWhileIdleNonWakeupBasePrice = getConstantAsCake(mParser, properties,
+ final long exactAllowWhileIdleNonWakeupBasePrice = getConstantAsCake(
KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE,
DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES);
mActions.put(ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE,
new Action(ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP,
DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP_CAKES),
exactAllowWhileIdleNonWakeupBasePrice,
@@ -329,18 +328,18 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
mActions.put(ACTION_ALARM_NONWAKEUP_EXACT,
new Action(ACTION_ALARM_NONWAKEUP_EXACT,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP,
DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE,
DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE_CAKES),
/* respectsStockLimit */ false));
- final long inexactAllowWhileIdleNonWakeupBasePrice = getConstantAsCake(mParser, properties,
+ final long inexactAllowWhileIdleNonWakeupBasePrice = getConstantAsCake(
KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE,
DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES);
- final long inexactAllowWhileIdleNonWakeupCtp = getConstantAsCake(mParser, properties,
+ final long inexactAllowWhileIdleNonWakeupCtp = getConstantAsCake(
KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP,
DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP_CAKES);
mActions.put(ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE,
@@ -350,72 +349,72 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
mActions.put(ACTION_ALARM_NONWAKEUP_INEXACT,
new Action(ACTION_ALARM_NONWAKEUP_INEXACT,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP,
DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE,
DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE_CAKES)));
mActions.put(ACTION_ALARM_CLOCK,
new Action(ACTION_ALARM_CLOCK,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP,
DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE,
DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE_CAKES),
/* respectsStockLimit */ false));
mRewards.put(REWARD_TOP_ACTIVITY, new Reward(REWARD_TOP_ACTIVITY,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_TOP_ACTIVITY_INSTANT,
DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_TOP_ACTIVITY_ONGOING,
DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_TOP_ACTIVITY_MAX,
DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX_CAKES)));
mRewards.put(REWARD_NOTIFICATION_SEEN, new Reward(REWARD_NOTIFICATION_SEEN,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT,
DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING,
DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_NOTIFICATION_SEEN_MAX,
DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX_CAKES)));
mRewards.put(REWARD_NOTIFICATION_INTERACTION,
new Reward(REWARD_NOTIFICATION_INTERACTION,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT,
DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING,
DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX,
DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES)));
mRewards.put(REWARD_WIDGET_INTERACTION, new Reward(REWARD_WIDGET_INTERACTION,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT,
DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING,
DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_WIDGET_INTERACTION_MAX,
DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX_CAKES)));
mRewards.put(REWARD_OTHER_USER_INTERACTION,
new Reward(REWARD_OTHER_USER_INTERACTION,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT,
DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING,
DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX,
DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX_CAKES)));
}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java
index a4043dd8ba78..61096b9fa179 100644
--- a/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java
+++ b/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java
@@ -33,9 +33,9 @@ import android.content.ContentResolver;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.util.IndentingPrintWriter;
-import android.util.KeyValueListParser;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.utils.UserSettingDeviceConfigMediator;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -197,10 +197,17 @@ public abstract class EconomicPolicy {
}
protected final InternalResourceService mIrs;
+ protected final UserSettingDeviceConfigMediator mUserSettingDeviceConfigMediator;
private static final Modifier[] COST_MODIFIER_BY_INDEX = new Modifier[NUM_COST_MODIFIERS];
EconomicPolicy(@NonNull InternalResourceService irs) {
mIrs = irs;
+ // Don't cross the streams! Mixing Settings/local user config changes with DeviceConfig
+ // config can cause issues since the scales may be different, so use one or the other.
+ // If user settings exist, then just stick with the Settings constants, even if there
+ // are invalid values.
+ mUserSettingDeviceConfigMediator =
+ new UserSettingDeviceConfigMediator.SettingsOverridesAllMediator(',');
for (int mId : getCostModifiers()) {
initModifier(mId, irs);
}
@@ -464,28 +471,14 @@ public abstract class EconomicPolicy {
return "UNKNOWN_REWARD:" + Integer.toHexString(eventId);
}
- protected long getConstantAsCake(@NonNull KeyValueListParser parser,
- @Nullable DeviceConfig.Properties properties, String key, long defaultValCake) {
- return getConstantAsCake(parser, properties, key, defaultValCake, 0);
+ protected long getConstantAsCake(String key, long defaultValCake) {
+ return getConstantAsCake(key, defaultValCake, 0);
}
- protected long getConstantAsCake(@NonNull KeyValueListParser parser,
- @Nullable DeviceConfig.Properties properties, String key, long defaultValCake,
- long minValCake) {
- // Don't cross the streams! Mixing Settings/local user config changes with DeviceConfig
- // config can cause issues since the scales may be different, so use one or the other.
- if (parser.size() > 0) {
- // User settings take precedence. Just stick with the Settings constants, even if there
- // are invalid values. It's not worth the time to evaluate all the key/value pairs to
- // make sure there are valid ones before deciding.
- return Math.max(minValCake,
- parseCreditValue(parser.getString(key, null), defaultValCake));
- }
- if (properties != null) {
- return Math.max(minValCake,
- parseCreditValue(properties.getString(key, null), defaultValCake));
- }
- return Math.max(minValCake, defaultValCake);
+ protected long getConstantAsCake(String key, long defaultValCake, long minValCake) {
+ return Math.max(minValCake,
+ parseCreditValue(
+ mUserSettingDeviceConfigMediator.getString(key, null), defaultValCake));
}
@VisibleForTesting
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java
index 91a291fe20db..69e57365b6e0 100644
--- a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java
+++ b/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java
@@ -127,7 +127,6 @@ import android.annotation.Nullable;
import android.content.ContentResolver;
import android.provider.DeviceConfig;
import android.util.IndentingPrintWriter;
-import android.util.KeyValueListParser;
import android.util.Slog;
import android.util.SparseArray;
@@ -168,7 +167,6 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy {
private long mMinSatiatedConsumptionLimit;
private long mMaxSatiatedConsumptionLimit;
- private final KeyValueListParser mParser = new KeyValueListParser(',');
private final Injector mInjector;
private final SparseArray<Action> mActions = new SparseArray<>();
@@ -274,176 +272,177 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy {
mRewards.clear();
try {
- mParser.setString(policyValuesString);
+ mUserSettingDeviceConfigMediator.setSettingsString(policyValuesString);
+ mUserSettingDeviceConfigMediator.setDeviceConfigProperties(properties);
} catch (IllegalArgumentException e) {
Slog.e(TAG, "Global setting key incorrect: ", e);
}
- mMinSatiatedBalanceOther = getConstantAsCake(mParser, properties,
+ mMinSatiatedBalanceOther = getConstantAsCake(
KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES);
- mMinSatiatedBalanceHeadlessSystemApp = getConstantAsCake(mParser, properties,
+ mMinSatiatedBalanceHeadlessSystemApp = getConstantAsCake(
KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
mMinSatiatedBalanceOther);
- mMinSatiatedBalanceExempted = getConstantAsCake(mParser, properties,
+ mMinSatiatedBalanceExempted = getConstantAsCake(
KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED,
DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
mMinSatiatedBalanceHeadlessSystemApp);
- mMinSatiatedBalanceIncrementalAppUpdater = getConstantAsCake(mParser, properties,
+ mMinSatiatedBalanceIncrementalAppUpdater = getConstantAsCake(
KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER,
DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES);
- mMaxSatiatedBalance = getConstantAsCake(mParser, properties,
+ mMaxSatiatedBalance = getConstantAsCake(
KEY_JS_MAX_SATIATED_BALANCE, DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
Math.max(arcToCake(1), mMinSatiatedBalanceExempted));
- mMinSatiatedConsumptionLimit = getConstantAsCake(mParser, properties,
+ mMinSatiatedConsumptionLimit = getConstantAsCake(
KEY_JS_MIN_CONSUMPTION_LIMIT, DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES,
arcToCake(1));
- mInitialSatiatedConsumptionLimit = getConstantAsCake(mParser, properties,
+ mInitialSatiatedConsumptionLimit = getConstantAsCake(
KEY_JS_INITIAL_CONSUMPTION_LIMIT, DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES,
mMinSatiatedConsumptionLimit);
- mMaxSatiatedConsumptionLimit = getConstantAsCake(mParser, properties,
+ mMaxSatiatedConsumptionLimit = getConstantAsCake(
KEY_JS_MAX_CONSUMPTION_LIMIT, DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES,
mInitialSatiatedConsumptionLimit);
mActions.put(ACTION_JOB_MAX_START, new Action(ACTION_JOB_MAX_START,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_MAX_START_CTP,
DEFAULT_JS_ACTION_JOB_MAX_START_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_MAX_START_BASE_PRICE,
DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE_CAKES)));
mActions.put(ACTION_JOB_MAX_RUNNING, new Action(ACTION_JOB_MAX_RUNNING,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_MAX_RUNNING_CTP,
DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE,
DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE_CAKES)));
mActions.put(ACTION_JOB_HIGH_START, new Action(ACTION_JOB_HIGH_START,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_HIGH_START_CTP,
DEFAULT_JS_ACTION_JOB_HIGH_START_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_HIGH_START_BASE_PRICE,
DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE_CAKES)));
mActions.put(ACTION_JOB_HIGH_RUNNING, new Action(ACTION_JOB_HIGH_RUNNING,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_HIGH_RUNNING_CTP,
DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE,
DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE_CAKES)));
mActions.put(ACTION_JOB_DEFAULT_START, new Action(ACTION_JOB_DEFAULT_START,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_DEFAULT_START_CTP,
DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE,
DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE_CAKES)));
mActions.put(ACTION_JOB_DEFAULT_RUNNING, new Action(ACTION_JOB_DEFAULT_RUNNING,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_DEFAULT_RUNNING_CTP,
DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE,
DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE_CAKES)));
mActions.put(ACTION_JOB_LOW_START, new Action(ACTION_JOB_LOW_START,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_LOW_START_CTP,
DEFAULT_JS_ACTION_JOB_LOW_START_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_LOW_START_BASE_PRICE,
DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE_CAKES)));
mActions.put(ACTION_JOB_LOW_RUNNING, new Action(ACTION_JOB_LOW_RUNNING,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_LOW_RUNNING_CTP,
DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE,
DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE_CAKES)));
mActions.put(ACTION_JOB_MIN_START, new Action(ACTION_JOB_MIN_START,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_MIN_START_CTP,
DEFAULT_JS_ACTION_JOB_MIN_START_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_MIN_START_BASE_PRICE,
DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE_CAKES)));
mActions.put(ACTION_JOB_MIN_RUNNING, new Action(ACTION_JOB_MIN_RUNNING,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_MIN_RUNNING_CTP,
DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE,
DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE_CAKES)));
mActions.put(ACTION_JOB_TIMEOUT, new Action(ACTION_JOB_TIMEOUT,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP,
DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE,
DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE_CAKES)));
mRewards.put(REWARD_TOP_ACTIVITY, new Reward(REWARD_TOP_ACTIVITY,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_TOP_ACTIVITY_INSTANT,
DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_TOP_ACTIVITY_ONGOING,
DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_TOP_ACTIVITY_MAX,
DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX_CAKES)));
mRewards.put(REWARD_NOTIFICATION_SEEN, new Reward(REWARD_NOTIFICATION_SEEN,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_NOTIFICATION_SEEN_INSTANT,
DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_NOTIFICATION_SEEN_ONGOING,
DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_NOTIFICATION_SEEN_MAX,
DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX_CAKES)));
mRewards.put(REWARD_NOTIFICATION_INTERACTION,
new Reward(REWARD_NOTIFICATION_INTERACTION,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT,
DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING,
DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_NOTIFICATION_INTERACTION_MAX,
DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES)));
mRewards.put(REWARD_WIDGET_INTERACTION, new Reward(REWARD_WIDGET_INTERACTION,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_WIDGET_INTERACTION_INSTANT,
DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_WIDGET_INTERACTION_ONGOING,
DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_WIDGET_INTERACTION_MAX,
DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX_CAKES)));
mRewards.put(REWARD_OTHER_USER_INTERACTION,
new Reward(REWARD_OTHER_USER_INTERACTION,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_OTHER_USER_INTERACTION_INSTANT,
DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_OTHER_USER_INTERACTION_ONGOING,
DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_OTHER_USER_INTERACTION_MAX,
DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX_CAKES)));
mRewards.put(REWARD_APP_INSTALL,
new Reward(REWARD_APP_INSTALL,
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_APP_INSTALL_INSTANT,
DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_APP_INSTALL_ONGOING,
DEFAULT_JS_REWARD_APP_INSTALL_ONGOING_CAKES),
- getConstantAsCake(mParser, properties,
+ getConstantAsCake(
KEY_JS_REWARD_APP_INSTALL_MAX,
DEFAULT_JS_REWARD_APP_INSTALL_MAX_CAKES)));
}
diff --git a/core/api/current.txt b/core/api/current.txt
index 9d13d8ad7905..095da8871dc8 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -9342,6 +9342,7 @@ package android.app.usage {
method public String getClassName();
method public android.content.res.Configuration getConfiguration();
method public int getEventType();
+ method @FlaggedApi("android.app.usage.user_interaction_type_api") @NonNull public android.os.PersistableBundle getExtras();
method public String getPackageName();
method public String getShortcutId();
method public long getTimeStamp();
@@ -9407,6 +9408,8 @@ package android.app.usage {
method @FlaggedApi("android.app.usage.filter_based_event_query_api") @NonNull @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public android.app.usage.UsageEvents queryEvents(@NonNull android.app.usage.UsageEventsQuery);
method public android.app.usage.UsageEvents queryEventsForSelf(long, long);
method public java.util.List<android.app.usage.UsageStats> queryUsageStats(int, long, long);
+ field @FlaggedApi("android.app.usage.user_interaction_type_api") public static final String EXTRA_EVENT_ACTION = "android.app.usage.extra.EVENT_ACTION";
+ field @FlaggedApi("android.app.usage.user_interaction_type_api") public static final String EXTRA_EVENT_CATEGORY = "android.app.usage.extra.EVENT_CATEGORY";
field public static final int INTERVAL_BEST = 4; // 0x4
field public static final int INTERVAL_DAILY = 0; // 0x0
field public static final int INTERVAL_MONTHLY = 2; // 0x2
@@ -9673,6 +9676,7 @@ package android.companion {
method @Deprecated @NonNull public java.util.List<java.lang.String> getAssociations();
method @NonNull public java.util.List<android.companion.AssociationInfo> getMyAssociations();
method @Deprecated public boolean hasNotificationAccess(android.content.ComponentName);
+ method @FlaggedApi("android.companion.perm_sync_user_consent") public boolean isPermissionTransferUserConsented(int);
method public void requestNotificationAccess(android.content.ComponentName);
method @FlaggedApi("android.companion.association_tag") public void setAssociationTag(int, @NonNull String);
method @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE) public void startObservingDevicePresence(@NonNull String) throws android.companion.DeviceNotAssociatedException;
@@ -9851,7 +9855,7 @@ package android.content {
method @NonNull public android.content.AttributionSource build();
method @NonNull public android.content.AttributionSource.Builder setAttributionTag(@Nullable String);
method @FlaggedApi("android.permission.flags.device_aware_permission_apis") @NonNull public android.content.AttributionSource.Builder setDeviceId(int);
- method @Deprecated @NonNull public android.content.AttributionSource.Builder setNext(@Nullable android.content.AttributionSource);
+ method @NonNull public android.content.AttributionSource.Builder setNext(@Nullable android.content.AttributionSource);
method @FlaggedApi("android.permission.flags.set_next_attribution_source") @NonNull public android.content.AttributionSource.Builder setNextAttributionSource(@NonNull android.content.AttributionSource);
method @NonNull public android.content.AttributionSource.Builder setPackageName(@Nullable String);
method @NonNull public android.content.AttributionSource.Builder setPid(int);
@@ -10598,6 +10602,7 @@ package android.content {
field public static final String RESTRICTIONS_SERVICE = "restrictions";
field public static final String ROLE_SERVICE = "role";
field public static final String SEARCH_SERVICE = "search";
+ field @FlaggedApi("android.os.security_state_service") public static final String SECURITY_STATE_SERVICE = "security_state";
field public static final String SENSOR_SERVICE = "sensor";
field public static final String SHORTCUT_SERVICE = "shortcut";
field public static final String STATUS_BAR_SERVICE = "statusbar";
@@ -10610,6 +10615,7 @@ package android.content {
field public static final String TELEPHONY_SUBSCRIPTION_SERVICE = "telephony_subscription_service";
field public static final String TEXT_CLASSIFICATION_SERVICE = "textclassification";
field public static final String TEXT_SERVICES_MANAGER_SERVICE = "textservices";
+ field @FlaggedApi("android.media.tv.flags.enable_ad_service_fw") public static final String TV_AD_SERVICE = "tv_ad";
field public static final String TV_INPUT_SERVICE = "tv_input";
field public static final String TV_INTERACTIVE_APP_SERVICE = "tv_interactive_app";
field public static final String UI_MODE_SERVICE = "uimode";
@@ -11098,6 +11104,7 @@ package android.content {
field public static final String ACTION_UID_REMOVED = "android.intent.action.UID_REMOVED";
field @Deprecated public static final String ACTION_UMS_CONNECTED = "android.intent.action.UMS_CONNECTED";
field @Deprecated public static final String ACTION_UMS_DISCONNECTED = "android.intent.action.UMS_DISCONNECTED";
+ field @FlaggedApi("android.content.pm.archiving") public static final String ACTION_UNARCHIVE_PACKAGE = "android.intent.action.UNARCHIVE_PACKAGE";
field @Deprecated public static final String ACTION_UNINSTALL_PACKAGE = "android.intent.action.UNINSTALL_PACKAGE";
field public static final String ACTION_USER_BACKGROUND = "android.intent.action.USER_BACKGROUND";
field public static final String ACTION_USER_FOREGROUND = "android.intent.action.USER_FOREGROUND";
@@ -12363,6 +12370,7 @@ package android.content.pm {
public class PackageInfo implements android.os.Parcelable {
ctor public PackageInfo();
method public int describeContents();
+ method @FlaggedApi("android.content.pm.archiving") public long getArchiveTimeMillis();
method public long getLongVersionCode();
method public void setLongVersionCode(long);
method public void writeToParcel(android.os.Parcel, int);
@@ -12419,6 +12427,9 @@ package android.content.pm {
method @NonNull public android.content.pm.PackageInstaller.Session openSession(int) throws java.io.IOException;
method public void registerSessionCallback(@NonNull android.content.pm.PackageInstaller.SessionCallback);
method public void registerSessionCallback(@NonNull android.content.pm.PackageInstaller.SessionCallback, @NonNull android.os.Handler);
+ method @FlaggedApi("android.content.pm.archiving") @RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES, android.Manifest.permission.REQUEST_INSTALL_PACKAGES}) public void reportUnarchivalStatus(int, int, long, @Nullable android.app.PendingIntent) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @FlaggedApi("android.content.pm.archiving") @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void requestArchive(@NonNull String, @NonNull android.content.IntentSender) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @FlaggedApi("android.content.pm.archiving") @RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES, android.Manifest.permission.REQUEST_INSTALL_PACKAGES}) public void requestUnarchive(@NonNull String, @NonNull android.content.IntentSender) throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException;
method @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void uninstall(@NonNull String, @NonNull android.content.IntentSender);
method @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void uninstall(@NonNull android.content.pm.VersionedPackage, @NonNull android.content.IntentSender);
method @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void uninstall(@NonNull android.content.pm.VersionedPackage, int, @NonNull android.content.IntentSender);
@@ -12440,6 +12451,10 @@ package android.content.pm {
field public static final String EXTRA_STATUS = "android.content.pm.extra.STATUS";
field public static final String EXTRA_STATUS_MESSAGE = "android.content.pm.extra.STATUS_MESSAGE";
field public static final String EXTRA_STORAGE_PATH = "android.content.pm.extra.STORAGE_PATH";
+ field @FlaggedApi("android.content.pm.archiving") public static final String EXTRA_UNARCHIVE_ALL_USERS = "android.content.pm.extra.UNARCHIVE_ALL_USERS";
+ field @FlaggedApi("android.content.pm.archiving") public static final String EXTRA_UNARCHIVE_ID = "android.content.pm.extra.UNARCHIVE_ID";
+ field @FlaggedApi("android.content.pm.archiving") public static final String EXTRA_UNARCHIVE_PACKAGE_NAME = "android.content.pm.extra.UNARCHIVE_PACKAGE_NAME";
+ field @FlaggedApi("android.content.pm.archiving") public static final String EXTRA_UNARCHIVE_STATUS = "android.content.pm.extra.UNARCHIVE_STATUS";
field public static final int PACKAGE_SOURCE_DOWNLOADED_FILE = 4; // 0x4
field public static final int PACKAGE_SOURCE_LOCAL_FILE = 3; // 0x3
field public static final int PACKAGE_SOURCE_OTHER = 1; // 0x1
@@ -12455,6 +12470,13 @@ package android.content.pm {
field public static final int STATUS_FAILURE_TIMEOUT = 8; // 0x8
field public static final int STATUS_PENDING_USER_ACTION = -1; // 0xffffffff
field public static final int STATUS_SUCCESS = 0; // 0x0
+ field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_ERROR_INSTALLER_DISABLED = 4; // 0x4
+ field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED = 5; // 0x5
+ field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE = 2; // 0x2
+ field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_ERROR_NO_CONNECTIVITY = 3; // 0x3
+ field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_ERROR_USER_ACTION_NEEDED = 1; // 0x1
+ field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_GENERIC_ERROR = 100; // 0x64
+ field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_OK = 0; // 0x0
}
public static final class PackageInstaller.InstallConstraints implements android.os.Parcelable {
@@ -12618,6 +12640,7 @@ package android.content.pm {
method @RequiresPermission(android.Manifest.permission.ENFORCE_UPDATE_OWNERSHIP) public void setRequestUpdateOwnership(boolean);
method public void setRequireUserAction(int);
method public void setSize(long);
+ method @FlaggedApi("android.content.pm.archiving") public void setUnarchiveId(int);
method public void setWhitelistedRestrictedPermissions(@Nullable java.util.Set<java.lang.String>);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.content.pm.PackageInstaller.SessionParams> CREATOR;
@@ -12647,6 +12670,7 @@ package android.content.pm {
method public void writeToParcel(android.os.Parcel, int);
field public int banner;
field public int icon;
+ field @FlaggedApi("android.content.pm.archiving") public boolean isArchived;
field public int labelRes;
field public int logo;
field public android.os.Bundle metaData;
@@ -12769,6 +12793,7 @@ package android.content.pm {
method public boolean hasSigningCertificate(int, @NonNull byte[], int);
method public abstract boolean hasSystemFeature(@NonNull String);
method public abstract boolean hasSystemFeature(@NonNull String, int);
+ method @FlaggedApi("android.content.pm.archiving") public boolean isAppArchivable(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
method @RequiresPermission(value="android.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS", conditional=true) public boolean isAutoRevokeWhitelisted(@NonNull String);
method public boolean isAutoRevokeWhitelisted();
method public boolean isDefaultApplicationIcon(@NonNull android.graphics.drawable.Drawable);
@@ -13010,6 +13035,7 @@ package android.content.pm {
field public static final int INSTALL_SCENARIO_FAST = 1; // 0x1
field public static final int MATCH_ALL = 131072; // 0x20000
field public static final int MATCH_APEX = 1073741824; // 0x40000000
+ field @FlaggedApi("android.content.pm.archiving") public static final long MATCH_ARCHIVED_PACKAGES = 4294967296L; // 0x100000000L
field public static final int MATCH_DEFAULT_ONLY = 65536; // 0x10000
field public static final int MATCH_DIRECT_BOOT_AUTO = 268435456; // 0x10000000
field public static final int MATCH_DIRECT_BOOT_AWARE = 524288; // 0x80000
@@ -22031,6 +22057,19 @@ package android.media {
method public void onJetUserIdUpdate(android.media.JetPlayer, int, int);
}
+ @FlaggedApi("android.media.audio.loudness_configurator_api") public class LoudnessCodecConfigurator {
+ method @FlaggedApi("android.media.audio.loudness_configurator_api") public void addMediaCodec(@NonNull android.media.MediaCodec);
+ method @FlaggedApi("android.media.audio.loudness_configurator_api") @NonNull public static android.media.LoudnessCodecConfigurator create();
+ method @FlaggedApi("android.media.audio.loudness_configurator_api") @NonNull public static android.media.LoudnessCodecConfigurator create(@NonNull java.util.concurrent.Executor, @NonNull android.media.LoudnessCodecConfigurator.OnLoudnessCodecUpdateListener);
+ method @FlaggedApi("android.media.audio.loudness_configurator_api") @NonNull public android.os.Bundle getLoudnessCodecParams(@NonNull android.media.AudioTrack, @NonNull android.media.MediaCodec);
+ method @FlaggedApi("android.media.audio.loudness_configurator_api") public void removeMediaCodec(@NonNull android.media.MediaCodec);
+ method @FlaggedApi("android.media.audio.loudness_configurator_api") public void setAudioTrack(@Nullable android.media.AudioTrack);
+ }
+
+ @FlaggedApi("android.media.audio.loudness_configurator_api") public static interface LoudnessCodecConfigurator.OnLoudnessCodecUpdateListener {
+ method @FlaggedApi("android.media.audio.loudness_configurator_api") @NonNull public default android.os.Bundle onLoudnessCodecUpdate(@NonNull android.media.MediaCodec, @NonNull android.os.Bundle);
+ }
+
public class MediaActionSound {
ctor public MediaActionSound();
method public void load(int);
@@ -27299,6 +27338,13 @@ package android.media.tv {
}
+package android.media.tv.ad {
+
+ @FlaggedApi("android.media.tv.flags.enable_ad_service_fw") public class TvAdManager {
+ }
+
+}
+
package android.media.tv.interactive {
public final class AppLinkInfo implements android.os.Parcelable {
@@ -32837,7 +32883,7 @@ package android.os {
method public static android.os.Message obtain(android.os.Handler, int, Object);
method public static android.os.Message obtain(android.os.Handler, int, int, int);
method public static android.os.Message obtain(android.os.Handler, int, int, int, Object);
- method public android.os.Bundle peekData();
+ method @Nullable public android.os.Bundle peekData();
method public void recycle();
method public void sendToTarget();
method public void setAsynchronous(boolean);
@@ -33159,6 +33205,7 @@ package android.os {
public static class PerformanceHintManager.Session implements java.io.Closeable {
method public void close();
method public void reportActualWorkDuration(long);
+ method @FlaggedApi("android.os.adpf_gpu_report_actual_work_duration") public void reportActualWorkDuration(@NonNull android.os.WorkDuration);
method @FlaggedApi("android.os.adpf_prefer_power_efficiency") public void setPreferPowerEfficiency(boolean);
method public void setThreads(@NonNull int[]);
method public void updateTargetWorkDuration(long);
@@ -33376,6 +33423,13 @@ package android.os {
field @NonNull public static final android.os.Parcelable.Creator<android.os.ResultReceiver> CREATOR;
}
+ @FlaggedApi("android.os.security_state_service") public class SecurityStateManager {
+ method @FlaggedApi("android.os.security_state_service") @NonNull public android.os.Bundle getGlobalSecurityState();
+ field public static final String KEY_KERNEL_VERSION = "kernel_version";
+ field public static final String KEY_SYSTEM_SPL = "system_spl";
+ field public static final String KEY_VENDOR_SPL = "vendor_spl";
+ }
+
public final class SharedMemory implements java.io.Closeable android.os.Parcelable {
method public void close();
method @NonNull public static android.os.SharedMemory create(@Nullable String, int) throws android.system.ErrnoException;
@@ -33501,6 +33555,7 @@ package android.os {
method public static boolean setCurrentTimeMillis(long);
method public static void sleep(long);
method public static long uptimeMillis();
+ method @FlaggedApi("android.os.adpf_gpu_report_actual_work_duration") public static long uptimeNanos();
}
public class TestLooperManager {
@@ -33766,6 +33821,22 @@ package android.os {
method @RequiresPermission(android.Manifest.permission.VIBRATE) public final void vibrate(@NonNull android.os.CombinedVibration, @Nullable android.os.VibrationAttributes);
}
+ @FlaggedApi("android.os.adpf_gpu_report_actual_work_duration") public final class WorkDuration implements android.os.Parcelable {
+ ctor public WorkDuration();
+ ctor public WorkDuration(long, long, long, long);
+ method public int describeContents();
+ method public long getActualCpuDurationNanos();
+ method public long getActualGpuDurationNanos();
+ method public long getActualTotalDurationNanos();
+ method public long getWorkPeriodStartTimestampNanos();
+ method public void setActualCpuDurationNanos(long);
+ method public void setActualGpuDurationNanos(long);
+ method public void setActualTotalDurationNanos(long);
+ method public void setWorkPeriodStartTimestampNanos(long);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.os.WorkDuration> CREATOR;
+ }
+
public class WorkSource implements android.os.Parcelable {
ctor public WorkSource();
ctor public WorkSource(android.os.WorkSource);
@@ -36770,7 +36841,7 @@ package android.provider {
field public static final String ACTION_CAST_SETTINGS = "android.settings.CAST_SETTINGS";
field public static final String ACTION_CHANNEL_NOTIFICATION_SETTINGS = "android.settings.CHANNEL_NOTIFICATION_SETTINGS";
field public static final String ACTION_CONDITION_PROVIDER_SETTINGS = "android.settings.ACTION_CONDITION_PROVIDER_SETTINGS";
- field public static final String ACTION_CREDENTIAL_PROVIDER = "android.settings.CREDENTIAL_PROVIDER";
+ field @FlaggedApi("android.credentials.flags.new_settings_intents") public static final String ACTION_CREDENTIAL_PROVIDER = "android.settings.CREDENTIAL_PROVIDER";
field public static final String ACTION_DATA_ROAMING_SETTINGS = "android.settings.DATA_ROAMING_SETTINGS";
field public static final String ACTION_DATA_USAGE_SETTINGS = "android.settings.DATA_USAGE_SETTINGS";
field public static final String ACTION_DATE_SETTINGS = "android.settings.DATE_SETTINGS";
@@ -40056,6 +40127,9 @@ package android.service.controls {
method public final boolean onUnbind(@NonNull android.content.Intent);
method public abstract void performControlAction(@NonNull String, @NonNull android.service.controls.actions.ControlAction, @NonNull java.util.function.Consumer<java.lang.Integer>);
method public static void requestAddControl(@NonNull android.content.Context, @NonNull android.content.ComponentName, @NonNull android.service.controls.Control);
+ field @FlaggedApi("android.service.controls.flags.home_panel_dream") public static final int CONTROLS_SURFACE_ACTIVITY_PANEL = 0; // 0x0
+ field @FlaggedApi("android.service.controls.flags.home_panel_dream") public static final int CONTROLS_SURFACE_DREAM = 1; // 0x1
+ field @FlaggedApi("android.service.controls.flags.home_panel_dream") public static final String EXTRA_CONTROLS_SURFACE = "android.service.controls.extra.CONTROLS_SURFACE";
field public static final String EXTRA_LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS = "android.service.controls.extra.LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS";
field public static final String META_DATA_PANEL_ACTIVITY = "android.service.controls.META_DATA_PANEL_ACTIVITY";
field public static final String SERVICE_CONTROLS = "android.service.controls.ControlsProviderService";
@@ -43080,8 +43154,8 @@ package android.telephony {
field public static final String KEY_5G_NR_SSRSRQ_THRESHOLDS_INT_ARRAY = "5g_nr_ssrsrq_thresholds_int_array";
field public static final String KEY_5G_NR_SSSINR_THRESHOLDS_INT_ARRAY = "5g_nr_sssinr_thresholds_int_array";
field public static final String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
- field public static final String KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL = "additional_settings_caller_id_visibility_bool";
- field public static final String KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL = "additional_settings_call_waiting_visibility_bool";
+ field @FlaggedApi("com.android.internal.telephony.flags.show_call_id_and_call_waiting_in_additional_settings_menu") public static final String KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL = "additional_settings_caller_id_visibility_bool";
+ field @FlaggedApi("com.android.internal.telephony.flags.show_call_id_and_call_waiting_in_additional_settings_menu") public static final String KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL = "additional_settings_call_waiting_visibility_bool";
field public static final String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
field public static final String KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL = "allow_add_call_during_video_call";
field public static final String KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL = "allow_emergency_numbers_in_call_log_bool";
@@ -47139,7 +47213,7 @@ package android.text {
method public void getSelectionPath(int, int, android.graphics.Path);
method public final float getSpacingAdd();
method public final float getSpacingMultiplier();
- method @FlaggedApi("com.android.text.flags.use_bounds_for_width") @NonNull public final CharSequence getText();
+ method @NonNull public final CharSequence getText();
method @FlaggedApi("com.android.text.flags.use_bounds_for_width") @NonNull public final android.text.TextDirectionHeuristic getTextDirectionHeuristic();
method public abstract int getTopPadding();
method @FlaggedApi("com.android.text.flags.use_bounds_for_width") public boolean getUseBoundsForWidth();
@@ -51998,6 +52072,7 @@ package android.view {
method public float getHandwritingBoundsOffsetLeft();
method public float getHandwritingBoundsOffsetRight();
method public float getHandwritingBoundsOffsetTop();
+ method @FlaggedApi("android.view.inputmethod.home_screen_handwriting_delegator") public int getHandwritingDelegateFlags();
method @Nullable public Runnable getHandwritingDelegatorCallback();
method public final boolean getHasOverlappingRendering();
method public final int getHeight();
@@ -52371,6 +52446,7 @@ package android.view {
method public void setForegroundTintMode(@Nullable android.graphics.PorterDuff.Mode);
method @FlaggedApi("android.view.flags.view_velocity_api") public void setFrameContentVelocity(float);
method public void setHandwritingBoundsOffsets(float, float, float, float);
+ method @FlaggedApi("android.view.inputmethod.home_screen_handwriting_delegator") public void setHandwritingDelegateFlags(int);
method public void setHandwritingDelegatorCallback(@Nullable Runnable);
method public void setHapticFeedbackEnabled(boolean);
method public void setHasTransientState(boolean);
@@ -55626,6 +55702,7 @@ package android.view.inputmethod {
public final class InputMethodManager {
method public boolean acceptStylusHandwritingDelegation(@NonNull android.view.View);
method public boolean acceptStylusHandwritingDelegation(@NonNull android.view.View, @NonNull String);
+ method @FlaggedApi("android.view.inputmethod.home_screen_handwriting_delegator") public boolean acceptStylusHandwritingDelegation(@NonNull android.view.View, @NonNull String, int);
method public void dispatchKeyEventFromInputMethod(@Nullable android.view.View, @NonNull android.view.KeyEvent);
method public void displayCompletions(android.view.View, android.view.inputmethod.CompletionInfo[]);
method @Nullable public android.view.inputmethod.InputMethodInfo getCurrentInputMethodInfo();
@@ -55673,6 +55750,7 @@ package android.view.inputmethod {
method public void updateExtractedText(android.view.View, int, android.view.inputmethod.ExtractedText);
method public void updateSelection(android.view.View, int, int, int, int);
method @Deprecated public void viewClicked(android.view.View);
+ field @FlaggedApi("android.view.inputmethod.home_screen_handwriting_delegator") public static final int HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED = 1; // 0x1
field public static final int HIDE_IMPLICIT_ONLY = 1; // 0x1
field public static final int HIDE_NOT_ALWAYS = 2; // 0x2
field public static final int RESULT_HIDDEN = 3; // 0x3
@@ -59490,6 +59568,7 @@ package android.widget {
method public void setOnClickFillInIntent(@IdRes int, android.content.Intent);
method public void setOnClickPendingIntent(@IdRes int, android.app.PendingIntent);
method public void setOnClickResponse(@IdRes int, @NonNull android.widget.RemoteViews.RemoteResponse);
+ method @FlaggedApi("android.view.inputmethod.home_screen_handwriting_delegator") public void setOnStylusHandwritingPendingIntent(@IdRes int, @Nullable android.app.PendingIntent);
method public void setPendingIntentTemplate(@IdRes int, android.app.PendingIntent);
method public void setProgressBar(@IdRes int, int, int, boolean);
method public void setRadioGroupChecked(@IdRes int, @IdRes int);
diff --git a/core/api/module-lib-lint-baseline.txt b/core/api/module-lib-lint-baseline.txt
index e49d6e3ac9c7..a6a948c7f64c 100644
--- a/core/api/module-lib-lint-baseline.txt
+++ b/core/api/module-lib-lint-baseline.txt
@@ -1745,6 +1745,10 @@ SamShouldBeLast: android.media.session.MediaSessionManager#setOnMediaKeyListener
SAM-compatible parameters (such as parameter 1, "listener", in android.media.session.MediaSessionManager.setOnMediaKeyListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
SamShouldBeLast: android.media.session.MediaSessionManager#setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, android.os.Handler):
SAM-compatible parameters (such as parameter 1, "listener", in android.media.session.MediaSessionManager.setOnVolumeKeyLongPressListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
+SamShouldBeLast: android.view.accessibility.AccessibilityManager#addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, android.os.Handler):
+ SAM-compatible parameters (such as parameter 1, "listener", in android.view.accessibility.AccessibilityManager.addAccessibilityStateChangeListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
+SamShouldBeLast: android.view.accessibility.AccessibilityManager#addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener, android.os.Handler):
+ SAM-compatible parameters (such as parameter 1, "listener", in android.view.accessibility.AccessibilityManager.addTouchExplorationStateChangeListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
SdkConstant: android.content.Intent#ACTION_BATTERY_LEVEL_CHANGED:
diff --git a/core/api/removed.txt b/core/api/removed.txt
index 285dcc6a3ed9..12b1f6a1fba3 100644
--- a/core/api/removed.txt
+++ b/core/api/removed.txt
@@ -30,50 +30,6 @@ package android.app {
}
-package android.app.slice {
-
- public final class Slice implements android.os.Parcelable {
- field @Deprecated public static final String EXTRA_SLIDER_VALUE = "android.app.slice.extra.SLIDER_VALUE";
- field @Deprecated public static final String SUBTYPE_SLIDER = "slider";
- }
-
- public static class Slice.Builder {
- ctor @Deprecated public Slice.Builder(@NonNull android.net.Uri);
- method @Deprecated public android.app.slice.Slice.Builder addTimestamp(long, @Nullable String, java.util.List<java.lang.String>);
- method @Deprecated public android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
- }
-
- public final class SliceItem implements android.os.Parcelable {
- method @Deprecated public long getTimestamp();
- field @Deprecated public static final String FORMAT_TIMESTAMP = "long";
- }
-
- public class SliceManager {
- method @Deprecated @Nullable public android.app.slice.Slice bindSlice(@NonNull android.net.Uri, @NonNull java.util.List<android.app.slice.SliceSpec>);
- method @Deprecated @Nullable public android.app.slice.Slice bindSlice(@NonNull android.content.Intent, @NonNull java.util.List<android.app.slice.SliceSpec>);
- method @Deprecated public void pinSlice(@NonNull android.net.Uri, @NonNull java.util.List<android.app.slice.SliceSpec>);
- }
-
- public abstract class SliceProvider extends android.content.ContentProvider {
- method @Deprecated public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
- }
-
-}
-
-package android.app.usage {
-
- public class StorageStatsManager {
- method @Deprecated public long getFreeBytes(String) throws java.io.IOException;
- method @Deprecated public long getTotalBytes(String) throws java.io.IOException;
- method @Deprecated public boolean isQuotaSupported(String);
- method @Deprecated public android.app.usage.ExternalStorageStats queryExternalStatsForUser(String, android.os.UserHandle) throws java.io.IOException;
- method @Deprecated public android.app.usage.StorageStats queryStatsForPackage(String, String, android.os.UserHandle) throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException;
- method @Deprecated public android.app.usage.StorageStats queryStatsForUid(String, int) throws java.io.IOException;
- method @Deprecated public android.app.usage.StorageStats queryStatsForUser(String, android.os.UserHandle) throws java.io.IOException;
- }
-
-}
-
package android.content {
public abstract class ContentProvider implements android.content.ComponentCallbacks2 {
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index fc23f9bc43ff..847edd13bb05 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -3614,7 +3614,6 @@ package android.content {
field public static final String ACTION_SHOW_SUSPENDED_APP_DETAILS = "android.intent.action.SHOW_SUSPENDED_APP_DETAILS";
field @Deprecated public static final String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
field public static final String ACTION_SPLIT_CONFIGURATION_CHANGED = "android.intent.action.SPLIT_CONFIGURATION_CHANGED";
- field @FlaggedApi("android.content.pm.archiving") public static final String ACTION_UNARCHIVE_PACKAGE = "android.intent.action.UNARCHIVE_PACKAGE";
field public static final String ACTION_UPGRADE_SETUP = "android.intent.action.UPGRADE_SETUP";
field public static final String ACTION_USER_ADDED = "android.intent.action.USER_ADDED";
field public static final String ACTION_USER_REMOVED = "android.intent.action.USER_REMOVED";
@@ -3862,16 +3861,9 @@ package android.content.pm {
field @RequiresPermission(android.Manifest.permission.ACCESS_SHORTCUTS) public static final int FLAG_GET_PERSONS_DATA = 2048; // 0x800
}
- public class PackageInfo implements android.os.Parcelable {
- method @FlaggedApi("android.content.pm.archiving") public long getArchiveTimeMillis();
- }
-
public class PackageInstaller {
method @NonNull public android.content.pm.PackageInstaller.InstallInfo readInstallInfo(@NonNull java.io.File, int) throws android.content.pm.PackageInstaller.PackageParsingException;
method @FlaggedApi("android.content.pm.read_install_info") @NonNull public android.content.pm.PackageInstaller.InstallInfo readInstallInfo(@NonNull android.os.ParcelFileDescriptor, @Nullable String, int) throws android.content.pm.PackageInstaller.PackageParsingException;
- method @FlaggedApi("android.content.pm.archiving") @RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES, android.Manifest.permission.REQUEST_INSTALL_PACKAGES}) public void reportUnarchivalStatus(int, int, long, @Nullable android.app.PendingIntent) throws android.content.pm.PackageManager.NameNotFoundException;
- method @FlaggedApi("android.content.pm.archiving") @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void requestArchive(@NonNull String, @NonNull android.content.IntentSender) throws android.content.pm.PackageManager.NameNotFoundException;
- method @FlaggedApi("android.content.pm.archiving") @RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES, android.Manifest.permission.REQUEST_INSTALL_PACKAGES}) public void requestUnarchive(@NonNull String, @NonNull android.content.IntentSender) throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException;
method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setPermissionsResult(int, boolean);
field public static final String ACTION_CONFIRM_INSTALL = "android.content.pm.action.CONFIRM_INSTALL";
field public static final String ACTION_CONFIRM_PRE_APPROVAL = "android.content.pm.action.CONFIRM_PRE_APPROVAL";
@@ -3882,23 +3874,12 @@ package android.content.pm {
field public static final String EXTRA_DATA_LOADER_TYPE = "android.content.pm.extra.DATA_LOADER_TYPE";
field public static final String EXTRA_LEGACY_STATUS = "android.content.pm.extra.LEGACY_STATUS";
field @Deprecated public static final String EXTRA_RESOLVED_BASE_PATH = "android.content.pm.extra.RESOLVED_BASE_PATH";
- field @FlaggedApi("android.content.pm.archiving") public static final String EXTRA_UNARCHIVE_ALL_USERS = "android.content.pm.extra.UNARCHIVE_ALL_USERS";
- field @FlaggedApi("android.content.pm.archiving") public static final String EXTRA_UNARCHIVE_ID = "android.content.pm.extra.UNARCHIVE_ID";
- field @FlaggedApi("android.content.pm.archiving") public static final String EXTRA_UNARCHIVE_PACKAGE_NAME = "android.content.pm.extra.UNARCHIVE_PACKAGE_NAME";
- field @FlaggedApi("android.content.pm.archiving") public static final String EXTRA_UNARCHIVE_STATUS = "android.content.pm.extra.UNARCHIVE_STATUS";
field public static final int LOCATION_DATA_APP = 0; // 0x0
field public static final int LOCATION_MEDIA_DATA = 2; // 0x2
field public static final int LOCATION_MEDIA_OBB = 1; // 0x1
field public static final int REASON_CONFIRM_PACKAGE_CHANGE = 0; // 0x0
field public static final int REASON_OWNERSHIP_CHANGED = 1; // 0x1
field public static final int REASON_REMIND_OWNERSHIP = 2; // 0x2
- field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_ERROR_INSTALLER_DISABLED = 4; // 0x4
- field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED = 5; // 0x5
- field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE = 2; // 0x2
- field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_ERROR_NO_CONNECTIVITY = 3; // 0x3
- field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_ERROR_USER_ACTION_NEEDED = 1; // 0x1
- field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_GENERIC_ERROR = 100; // 0x64
- field @FlaggedApi("android.content.pm.archiving") public static final int UNARCHIVAL_OK = 0; // 0x0
}
public static class PackageInstaller.InstallInfo {
@@ -3948,14 +3929,12 @@ package android.content.pm {
method public void setRequestDowngrade(boolean);
method @FlaggedApi("android.content.pm.rollback_lifetime") @RequiresPermission(android.Manifest.permission.MANAGE_ROLLBACKS) public void setRollbackLifetimeMillis(long);
method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setStaged();
- method @FlaggedApi("android.content.pm.archiving") public void setUnarchiveId(int);
}
public class PackageItemInfo {
method public static void forceSafeLabels();
method @Deprecated @NonNull public CharSequence loadSafeLabel(@NonNull android.content.pm.PackageManager);
method @NonNull public CharSequence loadSafeLabel(@NonNull android.content.pm.PackageManager, @FloatRange(from=0) float, int);
- field @FlaggedApi("android.content.pm.archiving") public boolean isArchived;
}
public abstract class PackageManager {
@@ -3987,7 +3966,6 @@ package android.content.pm {
method @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public abstract void grantRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle);
method @Deprecated public abstract int installExistingPackage(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
method @Deprecated public abstract int installExistingPackage(@NonNull String, int) throws android.content.pm.PackageManager.NameNotFoundException;
- method @FlaggedApi("android.content.pm.archiving") public boolean isAppArchivable(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceiversAsUser(@NonNull android.content.Intent, int, android.os.UserHandle);
method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceiversAsUser(@NonNull android.content.Intent, @NonNull android.content.pm.PackageManager.ResolveInfoFlags, @NonNull android.os.UserHandle);
method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public java.util.List<android.content.pm.ResolveInfo> queryIntentActivitiesAsUser(@NonNull android.content.Intent, int, @NonNull android.os.UserHandle);
@@ -4105,7 +4083,6 @@ package android.content.pm {
field @Deprecated public static final int INTENT_FILTER_VERIFICATION_SUCCESS = 1; // 0x1
field @Deprecated public static final int MASK_PERMISSION_FLAGS = 255; // 0xff
field public static final int MATCH_ANY_USER = 4194304; // 0x400000
- field @FlaggedApi("android.content.pm.archiving") public static final long MATCH_ARCHIVED_PACKAGES = 4294967296L; // 0x100000000L
field public static final int MATCH_CLONE_PROFILE = 536870912; // 0x20000000
field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000
field public static final int MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS = 536870912; // 0x20000000
@@ -10578,6 +10555,7 @@ package android.os {
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public android.os.PersistableBundle getSeedAccountOptions();
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getSeedAccountType();
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public long[] getSerialNumbersOfUsers(boolean);
+ method @NonNull public android.graphics.drawable.Drawable getUserBadge();
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public java.util.List<android.os.UserHandle> getUserHandles(boolean);
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.GET_ACCOUNTS_PRIVILEGED}) public android.graphics.Bitmap getUserIcon();
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.QUERY_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public android.content.pm.UserProperties getUserProperties(@NonNull android.os.UserHandle);
@@ -12214,6 +12192,7 @@ package android.service.notification {
method public boolean hasExpanded();
method public boolean hasInteracted();
method public boolean hasSeen();
+ method @FlaggedApi("android.app.lifetime_extension_refactor") public boolean hasSmartReplied();
method public boolean hasSnoozed();
method public boolean hasViewedSettings();
method public void setDirectReplied();
@@ -12221,6 +12200,7 @@ package android.service.notification {
method public void setDismissalSurface(int);
method public void setExpanded();
method public void setSeen();
+ method @FlaggedApi("android.app.lifetime_extension_refactor") public void setSmartReplied();
method public void setSnoozed();
method public void setViewedSettings();
method public void writeToParcel(android.os.Parcel, int);
@@ -12808,6 +12788,7 @@ package android.service.voice {
field @FlaggedApi("android.service.voice.flags.allow_training_data_egress_from_hds") public static final int ERROR_CODE_ON_TRAINING_DATA_EGRESS_LIMIT_EXCEEDED = 8; // 0x8
field @FlaggedApi("android.service.voice.flags.allow_training_data_egress_from_hds") public static final int ERROR_CODE_ON_TRAINING_DATA_SECURITY_EXCEPTION = 9; // 0x9
field public static final int ERROR_CODE_REMOTE_EXCEPTION = 7; // 0x7
+ field @FlaggedApi("android.service.voice.flags.allow_training_data_egress_from_hds") public static final int ERROR_CODE_SHUTDOWN_HDS_ON_VOICE_ACTIVATION_OP_DISABLED = 10; // 0xa
field public static final int ERROR_CODE_UNKNOWN = 0; // 0x0
}
@@ -16161,8 +16142,10 @@ package android.telephony.ims {
public interface RegistrationManager {
field public static final int SUGGESTED_ACTION_NONE = 0; // 0x0
+ field @FlaggedApi("com.android.internal.telephony.flags.add_rat_related_suggested_action_to_ims_registration") public static final int SUGGESTED_ACTION_TRIGGER_CLEAR_RAT_BLOCK = 4; // 0x4
field public static final int SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK = 1; // 0x1
field public static final int SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT = 2; // 0x2
+ field @FlaggedApi("com.android.internal.telephony.flags.add_rat_related_suggested_action_to_ims_registration") public static final int SUGGESTED_ACTION_TRIGGER_RAT_BLOCK = 3; // 0x3
}
public static class RegistrationManager.RegistrationCallback {
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 32c40df32585..ea9bb396f83c 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -46,7 +46,6 @@ import android.os.TransactionTooLargeException;
import android.os.WorkSource;
import android.util.ArraySet;
import android.util.Pair;
-import android.util.StatsEvent;
import com.android.internal.os.TimeoutRecord;
@@ -1224,7 +1223,8 @@ public abstract class ActivityManagerInternal {
* @return The stats event for the cached apps high watermark since last pull.
*/
@NonNull
- public abstract StatsEvent getCachedAppsHighWatermarkStats(int atomTag, boolean resetAfterPull);
+ // TODO: restore to android.util.StatsEvent once Ravenwood includes Mainline stubs
+ public abstract Object getCachedAppsHighWatermarkStats(int atomTag, boolean resetAfterPull);
/**
* Internal method for clearing app data, with the extra param that is used to indicate restore.
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index c5e132fc0c4b..aec042739c0d 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -2391,12 +2391,9 @@ public class AppOpsManager {
OP_ACTIVITY_RECOGNITION,
// Aural
OP_READ_MEDIA_AUDIO,
- OP_WRITE_MEDIA_AUDIO,
// Visual
OP_READ_MEDIA_VIDEO,
- OP_WRITE_MEDIA_VIDEO,
OP_READ_MEDIA_IMAGES,
- OP_WRITE_MEDIA_IMAGES,
OP_READ_MEDIA_VISUAL_USER_SELECTED,
// Nearby devices
OP_BLUETOOTH_SCAN,
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 4f8e8dd813a1..014ddd41f8d4 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -3484,9 +3484,20 @@ class ContextImpl extends Context {
// only do this if the user already has more than one preferred locale
if (android.content.res.Flags.defaultLocale()
&& r.getConfiguration().getLocales().size() > 1) {
- LocaleConfig lc = getUserId() < 0
- ? LocaleConfig.fromContextIgnoringOverride(this)
- : new LocaleConfig(this);
+ LocaleConfig lc;
+ if (getUserId() < 0) {
+ lc = LocaleConfig.fromContextIgnoringOverride(this);
+ } else {
+ // This is needed because the app might have locale config overrides that need to
+ // be read from disk in order for resources to correctly choose which values to
+ // load.
+ StrictMode.ThreadPolicy policy = StrictMode.allowThreadDiskReads();
+ try {
+ lc = new LocaleConfig(this);
+ } finally {
+ StrictMode.setThreadPolicy(policy);
+ }
+ }
mResourcesManager.setLocaleConfig(lc);
}
}
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 337e3f1195be..8c5773a05764 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -745,6 +745,16 @@ public class Notification implements Parcelable
@TestApi
public static final int FLAG_USER_INITIATED_JOB = 0x00008000;
+ /**
+ * Bit to be bitwise-ored into the {@link #flags} field that should be
+ * set if this notification has been lifetime extended due to a direct reply.
+ *
+ * This flag is for internal use only; applications cannot set this flag directly.
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_LIFETIME_EXTENSION_REFACTOR)
+ public static final int FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY = 0x00010000;
+
private static final List<Class<? extends Style>> PLATFORM_STYLE_CLASSES = Arrays.asList(
BigTextStyle.class, BigPictureStyle.class, InboxStyle.class, MediaStyle.class,
DecoratedCustomViewStyle.class, DecoratedMediaCustomViewStyle.class,
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index 6009c29ae53c..24a51573b48a 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -159,7 +159,8 @@ public class ResourcesManager {
* Loads {@link ApkAssets} and caches them to prevent their garbage collection while the
* instance is alive and reachable.
*/
- private class ApkAssetsSupplier {
+ @VisibleForTesting
+ protected class ApkAssetsSupplier {
final ArrayMap<ApkKey, ApkAssets> mLocalCache = new ArrayMap<>();
/**
@@ -544,7 +545,10 @@ public class ResourcesManager {
* from an {@link ApkAssetsSupplier} if non-null; otherwise ApkAssets are loaded using
* {@link #loadApkAssets(ApkKey)}.
*/
- private @Nullable AssetManager createAssetManager(@NonNull final ResourcesKey key,
+
+ @VisibleForTesting
+ @UnsupportedAppUsage
+ protected @Nullable AssetManager createAssetManager(@NonNull final ResourcesKey key,
@Nullable ApkAssetsSupplier apkSupplier) {
final AssetManager.Builder builder = new AssetManager.Builder();
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 79a5879b5cc0..9cf732abb86a 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -137,6 +137,8 @@ import android.media.projection.MediaProjectionManager;
import android.media.soundtrigger.SoundTriggerManager;
import android.media.tv.ITvInputManager;
import android.media.tv.TvInputManager;
+import android.media.tv.ad.ITvAdManager;
+import android.media.tv.ad.TvAdManager;
import android.media.tv.interactive.ITvInteractiveAppManager;
import android.media.tv.interactive.TvInteractiveAppManager;
import android.media.tv.tunerresourcemanager.ITunerResourceManager;
@@ -174,6 +176,7 @@ import android.os.IHardwarePropertiesManager;
import android.os.IPowerManager;
import android.os.IPowerStatsService;
import android.os.IRecoverySystem;
+import android.os.ISecurityStateManager;
import android.os.ISystemUpdateManager;
import android.os.IThermalService;
import android.os.IUserManager;
@@ -182,6 +185,7 @@ import android.os.PerformanceHintManager;
import android.os.PermissionEnforcer;
import android.os.PowerManager;
import android.os.RecoverySystem;
+import android.os.SecurityStateManager;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
import android.os.StatsFrameworkInitializer;
@@ -628,6 +632,17 @@ public final class SystemServiceRegistry {
ctx.mMainThread.getHandler());
}});
+ registerService(Context.SECURITY_STATE_SERVICE, SecurityStateManager.class,
+ new CachedServiceFetcher<SecurityStateManager>() {
+ @Override
+ public SecurityStateManager createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ IBinder b = ServiceManager.getServiceOrThrow(
+ Context.SECURITY_STATE_SERVICE);
+ ISecurityStateManager service = ISecurityStateManager.Stub.asInterface(b);
+ return new SecurityStateManager(service);
+ }});
+
registerService(Context.SENSOR_SERVICE, SensorManager.class,
new CachedServiceFetcher<SensorManager>() {
@Override
@@ -960,6 +975,18 @@ public final class SystemServiceRegistry {
return new TvInteractiveAppManager(service, ctx.getUserId());
}});
+ registerService(Context.TV_AD_SERVICE, TvAdManager.class,
+ new CachedServiceFetcher<TvAdManager>() {
+ @Override
+ public TvAdManager createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ IBinder iBinder =
+ ServiceManager.getServiceOrThrow(Context.TV_AD_SERVICE);
+ ITvAdManager service =
+ ITvAdManager.Stub.asInterface(iBinder);
+ return new TvAdManager(service, ctx.getUserId());
+ }});
+
registerService(Context.TV_INPUT_SERVICE, TvInputManager.class,
new CachedServiceFetcher<TvInputManager>() {
@Override
diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java
index 6a03c17159d3..ce1d43d10c34 100644
--- a/core/java/android/app/UiAutomationConnection.java
+++ b/core/java/android/app/UiAutomationConnection.java
@@ -180,6 +180,11 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
@Override
public void injectInputEventToInputFilter(InputEvent event) throws RemoteException {
+ synchronized (mLock) {
+ throwIfCalledByNotTrustedUidLocked();
+ throwIfShutdownLocked();
+ throwIfNotConnectedLocked();
+ }
mAccessibilityManager.injectInputEventToInputFilter(event);
}
diff --git a/core/java/android/app/slice/Slice.java b/core/java/android/app/slice/Slice.java
index 823fdd26db1e..475ee7a1ce3d 100644
--- a/core/java/android/app/slice/Slice.java
+++ b/core/java/android/app/slice/Slice.java
@@ -195,13 +195,6 @@ public final class Slice implements Parcelable {
*/
public static final String EXTRA_TOGGLE_STATE = "android.app.slice.extra.TOGGLE_STATE";
/**
- * Key to retrieve an extra added to an intent when the value of a slider is changed.
- * @deprecated remove once support lib is update to use EXTRA_RANGE_VALUE instead
- * @removed
- */
- @Deprecated
- public static final String EXTRA_SLIDER_VALUE = "android.app.slice.extra.SLIDER_VALUE";
- /**
* Key to retrieve an extra added to an intent when the value of an input range is changed.
*/
public static final String EXTRA_RANGE_VALUE = "android.app.slice.extra.RANGE_VALUE";
@@ -223,13 +216,6 @@ public final class Slice implements Parcelable {
*/
public static final String SUBTYPE_COLOR = "color";
/**
- * Subtype to tag an item as representing a slider.
- * @deprecated remove once support lib is update to use SUBTYPE_RANGE instead
- * @removed
- */
- @Deprecated
- public static final String SUBTYPE_SLIDER = "slider";
- /**
* Subtype to tag an item as representing a range.
* Expected to be on an item of format {@link SliceItem#FORMAT_SLICE} containing
* a {@link #SUBTYPE_VALUE} and possibly a {@link #SUBTYPE_MAX}.
@@ -361,15 +347,6 @@ public final class Slice implements Parcelable {
private SliceSpec mSpec;
/**
- * @deprecated TO BE REMOVED
- * @removed
- */
- @Deprecated
- public Builder(@NonNull Uri uri) {
- mUri = uri;
- }
-
- /**
* Create a builder which will construct a {@link Slice} for the given Uri.
* @param uri Uri to tag for this slice.
* @param spec the spec for this slice.
@@ -413,15 +390,6 @@ public final class Slice implements Parcelable {
}
/**
- * @deprecated TO BE REMOVED
- * @removed
- */
- public Builder setSpec(SliceSpec spec) {
- mSpec = spec;
- return this;
- }
-
- /**
* Add a sub-slice to the slice being constructed
* @param subType Optional template-specific type information
* @see SliceItem#getSubType()
@@ -498,16 +466,6 @@ public final class Slice implements Parcelable {
}
/**
- * @deprecated TO BE REMOVED.
- * @removed
- */
- @Deprecated
- public Slice.Builder addTimestamp(long time, @Nullable @SliceSubtype String subType,
- @SliceHint List<String> hints) {
- return addLong(time, subType, hints);
- }
-
- /**
* Add a long to the slice being constructed
* @param subType Optional template-specific type information
* @see SliceItem#getSubType()
diff --git a/core/java/android/app/slice/SliceItem.java b/core/java/android/app/slice/SliceItem.java
index ed32a1b7be2c..2d6f4a6fd227 100644
--- a/core/java/android/app/slice/SliceItem.java
+++ b/core/java/android/app/slice/SliceItem.java
@@ -102,12 +102,6 @@ public final class SliceItem implements Parcelable {
*/
public static final String FORMAT_LONG = "long";
/**
- * @deprecated TO BE REMOVED
- * @removed
- */
- @Deprecated
- public static final String FORMAT_TIMESTAMP = FORMAT_LONG;
- /**
* A {@link SliceItem} that contains a {@link RemoteInput}.
*/
public static final String FORMAT_REMOTE_INPUT = "input";
@@ -257,15 +251,6 @@ public final class SliceItem implements Parcelable {
}
/**
- * @deprecated replaced by {@link #getLong()}
- * @removed
- */
- @Deprecated
- public long getTimestamp() {
- return (Long) mObj;
- }
-
- /**
* @param hint The hint to check for
* @return true if this item contains the given hint
*/
@@ -348,7 +333,7 @@ public final class SliceItem implements Parcelable {
case FORMAT_INT:
dest.writeInt((Integer) obj);
break;
- case FORMAT_TIMESTAMP:
+ case FORMAT_LONG:
dest.writeLong((Long) obj);
break;
}
@@ -368,7 +353,7 @@ public final class SliceItem implements Parcelable {
Slice.CREATOR.createFromParcel(in));
case FORMAT_INT:
return in.readInt();
- case FORMAT_TIMESTAMP:
+ case FORMAT_LONG:
return in.readLong();
case FORMAT_REMOTE_INPUT:
return RemoteInput.CREATOR.createFromParcel(in);
diff --git a/core/java/android/app/slice/SliceManager.java b/core/java/android/app/slice/SliceManager.java
index 1e4934ebb6f5..2e179d063b76 100644
--- a/core/java/android/app/slice/SliceManager.java
+++ b/core/java/android/app/slice/SliceManager.java
@@ -141,15 +141,6 @@ public class SliceManager {
}
/**
- * @deprecated TO BE REMOVED
- * @removed
- */
- @Deprecated
- public void pinSlice(@NonNull Uri uri, @NonNull List<SliceSpec> specs) {
- pinSlice(uri, new ArraySet<>(specs));
- }
-
- /**
* Remove a pin for a slice.
* <p>
* If the slice has no other pins/callbacks then the slice will be unpinned.
@@ -273,15 +264,6 @@ public class SliceManager {
}
/**
- * @deprecated TO BE REMOVED
- * @removed
- */
- @Deprecated
- public @Nullable Slice bindSlice(@NonNull Uri uri, @NonNull List<SliceSpec> supportedSpecs) {
- return bindSlice(uri, new ArraySet<>(supportedSpecs));
- }
-
- /**
* Turns a slice intent into a slice uri. Expects an explicit intent.
* <p>
* This goes through a several stage resolution process to determine if any slice
@@ -412,17 +394,6 @@ public class SliceManager {
}
/**
- * @deprecated TO BE REMOVED.
- * @removed
- */
- @Deprecated
- @Nullable
- public Slice bindSlice(@NonNull Intent intent,
- @NonNull List<SliceSpec> supportedSpecs) {
- return bindSlice(intent, new ArraySet<>(supportedSpecs));
- }
-
- /**
* Determine whether a particular process and user ID has been granted
* permission to access a specific slice URI.
*
diff --git a/core/java/android/app/slice/SliceProvider.java b/core/java/android/app/slice/SliceProvider.java
index 63835cb5446b..42c3aa6aa0ea 100644
--- a/core/java/android/app/slice/SliceProvider.java
+++ b/core/java/android/app/slice/SliceProvider.java
@@ -209,15 +209,6 @@ public abstract class SliceProvider extends ContentProvider {
* @see Slice#HINT_PARTIAL
*/
public Slice onBindSlice(Uri sliceUri, Set<SliceSpec> supportedSpecs) {
- return onBindSlice(sliceUri, new ArrayList<>(supportedSpecs));
- }
-
- /**
- * @deprecated TO BE REMOVED
- * @removed
- */
- @Deprecated
- public Slice onBindSlice(Uri sliceUri, List<SliceSpec> supportedSpecs) {
return null;
}
@@ -479,7 +470,7 @@ public abstract class SliceProvider extends ContentProvider {
} finally {
Handler.getMain().removeCallbacks(mAnr);
}
- Slice.Builder parent = new Slice.Builder(sliceUri);
+ Slice.Builder parent = new Slice.Builder(sliceUri, null);
Slice.Builder childAction = new Slice.Builder(parent)
.addIcon(Icon.createWithResource(context,
com.android.internal.R.drawable.ic_permission), null,
@@ -492,7 +483,8 @@ public abstract class SliceProvider extends ContentProvider {
.getTheme().resolveAttribute(android.R.attr.colorAccent, tv, true);
int deviceDefaultAccent = tv.data;
- parent.addSubSlice(new Slice.Builder(sliceUri.buildUpon().appendPath("permission").build())
+ Uri subSliceUri = sliceUri.buildUpon().appendPath("permission").build();
+ Slice.Builder subSlice = new Slice.Builder(subSliceUri, null)
.addIcon(Icon.createWithResource(context,
com.android.internal.R.drawable.ic_arrow_forward), null,
Collections.emptyList())
@@ -500,8 +492,8 @@ public abstract class SliceProvider extends ContentProvider {
Collections.emptyList())
.addInt(deviceDefaultAccent, SUBTYPE_COLOR,
Collections.emptyList())
- .addSubSlice(childAction.build(), null)
- .build(), null);
+ .addSubSlice(childAction.build(), null);
+ parent.addSubSlice(subSlice.build(), null);
return parent.addHints(Arrays.asList(Slice.HINT_PERMISSION_REQUEST)).build();
}
diff --git a/core/java/android/app/time/TEST_MAPPING b/core/java/android/app/time/TEST_MAPPING
index 0f7a0700b370..7673acacbfbe 100644
--- a/core/java/android/app/time/TEST_MAPPING
+++ b/core/java/android/app/time/TEST_MAPPING
@@ -15,10 +15,7 @@
"exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
- }
- ],
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ },
{
"name": "FrameworksTimeServicesTests",
"options": [
diff --git a/core/java/android/app/timedetector/TEST_MAPPING b/core/java/android/app/timedetector/TEST_MAPPING
index 43dd82f8a26e..c7ca6a230d43 100644
--- a/core/java/android/app/timedetector/TEST_MAPPING
+++ b/core/java/android/app/timedetector/TEST_MAPPING
@@ -15,10 +15,7 @@
"exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
- }
- ],
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ },
{
"name": "FrameworksTimeServicesTests",
"options": [
diff --git a/core/java/android/app/timezonedetector/TEST_MAPPING b/core/java/android/app/timezonedetector/TEST_MAPPING
index 2be5614b54a5..c8d0bb2306cd 100644
--- a/core/java/android/app/timezonedetector/TEST_MAPPING
+++ b/core/java/android/app/timezonedetector/TEST_MAPPING
@@ -15,10 +15,7 @@
"exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
- }
- ],
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ },
{
"name": "FrameworksTimeServicesTests",
"options": [
diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl
index ebd5d649fc2b..cf191784b728 100644
--- a/core/java/android/app/usage/IUsageStatsManager.aidl
+++ b/core/java/android/app/usage/IUsageStatsManager.aidl
@@ -22,6 +22,7 @@ import android.app.usage.BroadcastResponseStatsList;
import android.app.usage.UsageEvents;
import android.app.usage.UsageEventsQuery;
import android.content.pm.ParceledListSlice;
+import android.os.PersistableBundle;
/**
* System private API for talking with the UsageStatsManagerService.
@@ -77,6 +78,8 @@ interface IUsageStatsManager {
String callingPackage);
void reportUsageStop(in IBinder activity, String token, String callingPackage);
void reportUserInteraction(String packageName, int userId);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.REPORT_USAGE_STATS)")
+ void reportUserInteractionWithBundle(String packageName, int userId, in PersistableBundle eventExtras);
int getUsageSource();
void forceUsageSourceSettingRead();
long getLastTimeAnyComponentUsed(String packageName, String callingPackage);
diff --git a/core/java/android/app/usage/ParcelableUsageEventList.java b/core/java/android/app/usage/ParcelableUsageEventList.java
index aa3239237478..7bc6cb9f616a 100644
--- a/core/java/android/app/usage/ParcelableUsageEventList.java
+++ b/core/java/android/app/usage/ParcelableUsageEventList.java
@@ -223,6 +223,7 @@ public final class ParcelableUsageEventList implements Parcelable {
event.mContentAnnotations = null;
event.mNotificationChannelId = null;
event.mLocusId = null;
+ event.mExtras = null;
switch (event.mEventType) {
case Event.CONFIGURATION_CHANGE -> {
@@ -237,6 +238,11 @@ public final class ParcelableUsageEventList implements Parcelable {
case Event.STANDBY_BUCKET_CHANGED -> event.mBucketAndReason = in.readInt();
case Event.NOTIFICATION_INTERRUPTION -> event.mNotificationChannelId = in.readString();
case Event.LOCUS_ID_SET -> event.mLocusId = in.readString();
+ case Event.USER_INTERACTION -> {
+ if (in.readInt() != 0) {
+ event.mExtras = in.readPersistableBundle(getClass().getClassLoader());
+ }
+ }
}
event.mFlags = in.readInt();
@@ -263,6 +269,14 @@ public final class ParcelableUsageEventList implements Parcelable {
case Event.STANDBY_BUCKET_CHANGED -> dest.writeInt(event.mBucketAndReason);
case Event.NOTIFICATION_INTERRUPTION -> dest.writeString(event.mNotificationChannelId);
case Event.LOCUS_ID_SET -> dest.writeString(event.mLocusId);
+ case Event.USER_INTERACTION -> {
+ if (event.mExtras != null) {
+ dest.writeInt(1);
+ dest.writePersistableBundle(event.mExtras);
+ } else {
+ dest.writeInt(0);
+ }
+ }
}
dest.writeInt(event.mFlags);
}
diff --git a/core/java/android/app/usage/StorageStatsManager.java b/core/java/android/app/usage/StorageStatsManager.java
index 1ef15637d578..a4b17537f4b2 100644
--- a/core/java/android/app/usage/StorageStatsManager.java
+++ b/core/java/android/app/usage/StorageStatsManager.java
@@ -35,8 +35,6 @@ import android.os.UserHandle;
import android.os.storage.CrateInfo;
import android.os.storage.StorageManager;
-import com.android.internal.util.Preconditions;
-
import java.io.File;
import java.io.IOException;
import java.util.Collection;
@@ -77,7 +75,7 @@ public class StorageStatsManager {
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public boolean isQuotaSupported(String uuid) {
return isQuotaSupported(convert(uuid));
@@ -120,7 +118,7 @@ public class StorageStatsManager {
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public long getTotalBytes(String uuid) throws IOException {
return getTotalBytes(convert(uuid));
@@ -152,7 +150,7 @@ public class StorageStatsManager {
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public long getFreeBytes(String uuid) throws IOException {
return getFreeBytes(convert(uuid));
@@ -221,7 +219,7 @@ public class StorageStatsManager {
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public StorageStats queryStatsForPackage(String uuid, String packageName,
UserHandle user) throws PackageManager.NameNotFoundException, IOException {
@@ -262,7 +260,7 @@ public class StorageStatsManager {
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public StorageStats queryStatsForUid(String uuid, int uid) throws IOException {
return queryStatsForUid(convert(uuid), uid);
@@ -300,7 +298,7 @@ public class StorageStatsManager {
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public StorageStats queryStatsForUser(String uuid, UserHandle user) throws IOException {
return queryStatsForUser(convert(uuid), user);
@@ -337,7 +335,7 @@ public class StorageStatsManager {
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public ExternalStorageStats queryExternalStatsForUser(String uuid, UserHandle user)
throws IOException {
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index 6c7eba06dea7..9eb73b32a2a7 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -16,7 +16,9 @@
package android.app.usage;
import android.annotation.CurrentTimeMillisLong;
+import android.annotation.FlaggedApi;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
@@ -24,6 +26,7 @@ import android.content.res.Configuration;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
+import android.os.PersistableBundle;
import android.util.Log;
import java.lang.annotation.Retention;
@@ -551,6 +554,22 @@ public final class UsageEvents implements Parcelable {
public int mLocusIdToken = UNASSIGNED_TOKEN;
/** @hide */
+ public PersistableBundle mExtras = null;
+
+ /** @hide */
+ public static class UserInteractionEventExtrasToken {
+ public int mCategoryToken = UNASSIGNED_TOKEN;
+ public int mActionToken = UNASSIGNED_TOKEN;
+
+ public UserInteractionEventExtrasToken() {
+ // Do nothing.
+ }
+ }
+
+ /** @hide */
+ public UserInteractionEventExtrasToken mUserInteractionExtrasToken = null;
+
+ /** @hide */
@EventFlags
public int mFlags;
@@ -650,6 +669,21 @@ public final class UsageEvents implements Parcelable {
}
/**
+ * Retrieves a map of extended data from the event if the event is of type
+ * {@link #USER_INTERACTION}.
+ *
+ * @return the map of all extras that associated with the reported user interaction
+ * event. The returned {@link PersistableBundle} will contain the extras
+ * {@link UsageStatsManager#EXTRA_EVENT_CATEGORY} and
+ * {@link UsageStatsManager#EXTRA_EVENT_ACTION}. {@link PersistableBundle#EMPTY}
+ * will be returned if the details are not available.
+ */
+ @FlaggedApi(Flags.FLAG_USER_INTERACTION_TYPE_API)
+ public @NonNull PersistableBundle getExtras() {
+ return mExtras == null ? PersistableBundle.EMPTY : mExtras;
+ }
+
+ /**
* Returns a {@link Configuration} for this event if the event is of type
* {@link #CONFIGURATION_CHANGE}, otherwise it returns null.
*/
@@ -747,6 +781,7 @@ public final class UsageEvents implements Parcelable {
mBucketAndReason = orig.mBucketAndReason;
mNotificationChannelId = orig.mNotificationChannelId;
mLocusId = orig.mLocusId;
+ mExtras = orig.mExtras;
}
}
@@ -802,6 +837,7 @@ public final class UsageEvents implements Parcelable {
if (mEventCount != mEventsToWrite.size()) {
Log.w(TAG, "Partial usage event list received: " + mEventCount + " != "
+ mEventsToWrite.size());
+ mEventCount = mEventsToWrite.size();
}
}
@@ -987,6 +1023,14 @@ public final class UsageEvents implements Parcelable {
case Event.LOCUS_ID_SET:
p.writeString(event.mLocusId);
break;
+ case Event.USER_INTERACTION:
+ if (event.mExtras != null) {
+ p.writeInt(1);
+ p.writePersistableBundle(event.mExtras);
+ } else {
+ p.writeInt(0);
+ }
+ break;
}
p.writeInt(event.mFlags);
}
@@ -1036,6 +1080,7 @@ public final class UsageEvents implements Parcelable {
eventOut.mContentAnnotations = null;
eventOut.mNotificationChannelId = null;
eventOut.mLocusId = null;
+ eventOut.mExtras = null;
switch (eventOut.mEventType) {
case Event.CONFIGURATION_CHANGE:
@@ -1059,6 +1104,11 @@ public final class UsageEvents implements Parcelable {
case Event.LOCUS_ID_SET:
eventOut.mLocusId = p.readString();
break;
+ case Event.USER_INTERACTION:
+ if (p.readInt() != 0) {
+ eventOut.mExtras = p.readPersistableBundle(getClass().getClassLoader());
+ }
+ break;
}
eventOut.mFlags = p.readInt();
}
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 4f1c993bfa1a..85d223d01ee8 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -28,6 +28,7 @@ import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.annotation.UserHandleAware;
+import android.annotation.UserIdInt;
import android.app.Activity;
import android.app.BroadcastOptions;
import android.app.PendingIntent;
@@ -35,6 +36,7 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.pm.ParceledListSlice;
import android.os.Build;
+import android.os.PersistableBundle;
import android.os.PowerWhitelistManager;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -392,6 +394,23 @@ public final class UsageStatsManager {
@SystemApi
public static final String EXTRA_TIME_USED = "android.app.usage.extra.TIME_USED";
+ /**
+ * A String extra, when used with {@link UsageEvents.Event#getExtras}, that indicates
+ * the category of the user interaction associated with the event. The category cannot
+ * be more than 127 characters, longer value will be truncated to 127 characters.
+ */
+ @FlaggedApi(Flags.FLAG_USER_INTERACTION_TYPE_API)
+ public static final String EXTRA_EVENT_CATEGORY =
+ "android.app.usage.extra.EVENT_CATEGORY";
+
+ /**
+ * A String extra, when used with {@link UsageEvents.Event#getExtras}, that indicates
+ * the action of the user interaction associated with the event. The action cannot be
+ * more than 127 characters, longer value will be truncated to 127 characters.
+ */
+ @FlaggedApi(Flags.FLAG_USER_INTERACTION_TYPE_API)
+ public static final String EXTRA_EVENT_ACTION =
+ "android.app.usage.extra.EVENT_ACTION";
/**
* App usage observers will consider the task root package the source of usage.
@@ -562,10 +581,10 @@ public final class UsageStatsManager {
* then {@code null} will be returned.</em>
*
* @param beginTime The inclusive beginning of the range of events to include in the results.
- * Defined in terms of "Unix time", see
- * {@link java.lang.System#currentTimeMillis}.
+ * Defined in terms of "Unix time", see
+ * {@link java.lang.System#currentTimeMillis}.
* @param endTime The exclusive end of the range of events to include in the results. Defined
- * in terms of "Unix time", see {@link java.lang.System#currentTimeMillis}.
+ * in terms of "Unix time", see {@link java.lang.System#currentTimeMillis}.
* @return A {@link UsageEvents}.
*/
public UsageEvents queryEvents(long beginTime, long endTime) {
@@ -611,10 +630,10 @@ public final class UsageStatsManager {
* then {@code null} will be returned.</em>
*
* @param beginTime The inclusive beginning of the range of events to include in the results.
- * Defined in terms of "Unix time", see
- * {@link java.lang.System#currentTimeMillis}.
+ * Defined in terms of "Unix time", see
+ * {@link java.lang.System#currentTimeMillis}.
* @param endTime The exclusive end of the range of events to include in the results. Defined
- * in terms of "Unix time", see {@link java.lang.System#currentTimeMillis}.
+ * in terms of "Unix time", see {@link java.lang.System#currentTimeMillis}.
* @return A {@link UsageEvents} object.
*
* @see #queryEvents(long, long)
@@ -1128,6 +1147,7 @@ public final class UsageStatsManager {
* Reports user interaction with a given package in the given user.
*
* <p><em>This method is only for use by the system</em>
+ *
* @hide
*/
@RequiresPermission(android.Manifest.permission.REPORT_USAGE_STATS)
@@ -1140,6 +1160,38 @@ public final class UsageStatsManager {
}
/**
+ * Reports user interaction with given package and a particular {@code extras}
+ * in the given user.
+ *
+ * <p>
+ * Note: The structure of {@code extras} is a {@link PersistableBundle} with the
+ * category {@link #EXTRA_EVENT_CATEGORY} and the action {@link #EXTRA_EVENT_ACTION}.
+ * Category provides additional detail about the user interaction, the value
+ * is defined in namespace based. Example: android.app.notification could be used to
+ * indicate that the reported user interaction is related to notification. Action
+ * indicates the general action that performed.
+ * </p>
+ *
+ * @param packageName The package name of the app
+ * @param userId The user id who triggers the user interaction
+ * @param extras The {@link PersistableBundle} that will be used to specify the
+ * extra details for the user interaction event. The {@link PersistableBundle}
+ * must contain the extras {@link #EXTRA_EVENT_CATEGORY},
+ * {@link #EXTRA_EVENT_ACTION}. Cannot be empty.
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_USER_INTERACTION_TYPE_API)
+ @RequiresPermission(android.Manifest.permission.REPORT_USAGE_STATS)
+ public void reportUserInteraction(@NonNull String packageName, @UserIdInt int userId,
+ @NonNull PersistableBundle extras) {
+ try {
+ mService.reportUserInteractionWithBundle(packageName, userId, extras);
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Report usage associated with a particular {@code token} has started. Tokens are app defined
* strings used to represent usage of in-app features. Apps with the {@link
* android.Manifest.permission#OBSERVE_APP_USAGE} permission can register time limit observers
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index 51a7f1ce8c5f..6e451479c5a4 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -558,7 +558,7 @@ public class AppWidgetManager {
}
}).toArray(ComponentName[]::new));
} catch (Exception e) {
- Log.e(TAG, "Nofity service of inheritance info", e);
+ Log.e(TAG, "Notify service of inheritance info", e);
}
});
}
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index e0ce917fa3b3..e4a03c596254 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -1358,6 +1358,36 @@ public final class CompanionDeviceManager {
}
/**
+ * Return the current state of consent for permission transfer for the association.
+ * True if the user has allowed permission transfer for the association, false otherwise.
+ *
+ * <p>
+ * Note: The initial user consent is collected via
+ * {@link #buildPermissionTransferUserConsentIntent(int) a permission transfer user consent dialog}.
+ * After the user has made their initial selection, they can toggle the permission transfer
+ * feature in the settings.
+ * This method always returns the state of the toggle setting.
+ * </p>
+ *
+ * @param associationId The unique {@link AssociationInfo#getId ID} assigned to the association
+ * of the companion device recorded by CompanionDeviceManager
+ * @return True if the user has consented to the permission transfer, or false otherwise.
+ * @throws DeviceNotAssociatedException Exception if the companion device is not associated with
+ * the user or the calling app.
+ */
+ @UserHandleAware
+ @FlaggedApi(Flags.FLAG_PERM_SYNC_USER_CONSENT)
+ public boolean isPermissionTransferUserConsented(int associationId) {
+ try {
+ return mService.isPermissionTransferUserConsented(mContext.getOpPackageName(),
+ mContext.getUserId(), associationId);
+ } catch (RemoteException e) {
+ ExceptionUtils.propagateIfInstanceOf(e.getCause(), DeviceNotAssociatedException.class);
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Start system data transfer which has been previously approved by the user.
*
* <p>Before calling this method, the app needs to make sure there's a communication channel
diff --git a/core/java/android/companion/ICompanionDeviceManager.aidl b/core/java/android/companion/ICompanionDeviceManager.aidl
index c5a19888205c..22689f3b85c7 100644
--- a/core/java/android/companion/ICompanionDeviceManager.aidl
+++ b/core/java/android/companion/ICompanionDeviceManager.aidl
@@ -97,6 +97,8 @@ interface ICompanionDeviceManager {
PendingIntent buildPermissionTransferUserConsentIntent(String callingPackage, int userId,
int associationId);
+ boolean isPermissionTransferUserConsented(String callingPackage, int userId, int associationId);
+
void startSystemDataTransfer(String packageName, int userId, int associationId,
in ISystemDataTransferCallback callback);
diff --git a/core/java/android/companion/flags.aconfig b/core/java/android/companion/flags.aconfig
index 6e33dff3a379..9e410b86b6bd 100644
--- a/core/java/android/companion/flags.aconfig
+++ b/core/java/android/companion/flags.aconfig
@@ -27,3 +27,10 @@ flag {
description: "Enable device presence APIs"
bug: "283000075"
}
+
+flag {
+ name: "perm_sync_user_consent"
+ namespace: "companion"
+ description: "Expose perm sync user consent API"
+ bug: "309528663"
+} \ No newline at end of file
diff --git a/core/java/android/companion/virtual/IVirtualDevice.aidl b/core/java/android/companion/virtual/IVirtualDevice.aidl
index 102cbf3a7e31..3520c0b4d724 100644
--- a/core/java/android/companion/virtual/IVirtualDevice.aidl
+++ b/core/java/android/companion/virtual/IVirtualDevice.aidl
@@ -246,4 +246,10 @@ interface IVirtualDevice {
*/
@EnforcePermission("CREATE_VIRTUAL_DEVICE")
void unregisterVirtualCamera(in VirtualCameraConfig camera);
+
+ /**
+ * Returns the id of the virtual camera with given config.
+ */
+ @EnforcePermission("CREATE_VIRTUAL_DEVICE")
+ int getVirtualCameraId(in VirtualCameraConfig camera);
}
diff --git a/core/java/android/companion/virtual/VirtualDeviceInternal.java b/core/java/android/companion/virtual/VirtualDeviceInternal.java
index da8277c24f6c..003dffb1f9c1 100644
--- a/core/java/android/companion/virtual/VirtualDeviceInternal.java
+++ b/core/java/android/companion/virtual/VirtualDeviceInternal.java
@@ -19,6 +19,7 @@ package android.companion.virtual;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.UserIdInt;
import android.app.PendingIntent;
import android.companion.virtual.audio.VirtualAudioDevice;
@@ -340,12 +341,18 @@ public class VirtualDeviceInternal {
return mVirtualAudioDevice;
}
+ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
@NonNull
VirtualCamera createVirtualCamera(@NonNull VirtualCameraConfig config) {
- return new VirtualCamera(mVirtualDevice, config);
+ try {
+ mVirtualDevice.registerVirtualCamera(config);
+ return new VirtualCamera(mVirtualDevice,
+ Integer.toString(mVirtualDevice.getVirtualCameraId(config)), config);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
- @NonNull
void setShowPointerIcon(boolean showPointerIcon) {
try {
mVirtualDevice.setShowPointerIcon(showPointerIcon);
diff --git a/core/java/android/companion/virtual/camera/VirtualCamera.java b/core/java/android/companion/virtual/camera/VirtualCamera.java
index beee86fcfac2..9d6c14b5b9a8 100644
--- a/core/java/android/companion/virtual/camera/VirtualCamera.java
+++ b/core/java/android/companion/virtual/camera/VirtualCamera.java
@@ -54,6 +54,8 @@ import java.util.concurrent.Executor;
public final class VirtualCamera implements Closeable {
private final IVirtualDevice mVirtualDevice;
+
+ private final String mCameraId;
private final VirtualCameraConfig mConfig;
/**
@@ -63,18 +65,13 @@ public final class VirtualCamera implements Closeable {
* @param config Configuration for the new virtual camera
* @hide
*/
- @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
public VirtualCamera(
- @NonNull IVirtualDevice virtualDevice, @NonNull VirtualCameraConfig config) {
- mVirtualDevice = virtualDevice;
+ @NonNull IVirtualDevice virtualDevice,
+ @NonNull String cameraId,
+ @NonNull VirtualCameraConfig config) {
+ mVirtualDevice = Objects.requireNonNull(virtualDevice);
+ mCameraId = Objects.requireNonNull(cameraId);
mConfig = Objects.requireNonNull(config);
- Objects.requireNonNull(virtualDevice);
- // TODO(b/310857519): Avoid registration inside constructor.
- try {
- mVirtualDevice.registerVirtualCamera(config);
- } catch (RemoteException e) {
- e.rethrowFromSystemServer();
- }
}
/** Returns the configuration of this virtual camera instance. */
@@ -83,6 +80,15 @@ public final class VirtualCamera implements Closeable {
return mConfig;
}
+ /**
+ * Returns the id of this virtual camera instance.
+ * @hide
+ */
+ @NonNull
+ public String getId() {
+ return mCameraId;
+ }
+
@Override
@RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
public void close() {
diff --git a/core/java/android/content/AttributionSource.java b/core/java/android/content/AttributionSource.java
index 4b2cee698df2..697c25c2a1ec 100644
--- a/core/java/android/content/AttributionSource.java
+++ b/core/java/android/content/AttributionSource.java
@@ -730,10 +730,7 @@ public final class AttributionSource implements Parcelable {
/**
* The next app to receive the permission protected data.
- *
- * @deprecated Use {@link #setNextAttributionSource} instead.
*/
- @Deprecated
public @NonNull Builder setNext(@Nullable AttributionSource value) {
checkNotUsed();
mBuilderFieldsSet |= 0x20;
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 1c6c7b5baa58..b75c64dcc3c1 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -72,6 +72,7 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
+import android.os.Flags;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.IBinder;
@@ -4214,6 +4215,7 @@ public abstract class Context {
DEVICE_LOCK_SERVICE,
VIRTUALIZATION_SERVICE,
GRAMMATICAL_INFLECTION_SERVICE,
+ SECURITY_STATE_SERVICE,
})
@Retention(RetentionPolicy.SOURCE)
@@ -5818,6 +5820,17 @@ public abstract class Context {
/**
* Use with {@link #getSystemService(String)} to retrieve a
+ * {@link android.media.tv.ad.TvAdManager} for interacting with TV client-side advertisement
+ * services on the device.
+ *
+ * @see #getSystemService(String)
+ * @see android.media.tv.ad.TvAdManager
+ */
+ @FlaggedApi(android.media.tv.flags.Flags.FLAG_ENABLE_AD_SERVICE_FW)
+ public static final String TV_AD_SERVICE = "tv_ad";
+
+ /**
+ * Use with {@link #getSystemService(String)} to retrieve a
* {@link android.media.tv.TunerResourceManager} for interacting with TV
* tuner resources on the device.
*
@@ -6478,6 +6491,16 @@ public abstract class Context {
public static final String SHARED_CONNECTIVITY_SERVICE = "shared_connectivity";
/**
+ * Use with {@link #getSystemService(String)} to retrieve a
+ * {@link android.os.SecurityStateManager} for accessing the security state manager service.
+ *
+ * @see #getSystemService(String)
+ * @see android.os.SecurityStateManager
+ */
+ @FlaggedApi(Flags.FLAG_SECURITY_STATE_SERVICE)
+ public static final String SECURITY_STATE_SERVICE = "security_state";
+
+ /**
* Determine whether the given permission is allowed for a particular
* process and user ID running in the system.
*
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 4327c7acf0f0..0a8029c44d73 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -71,6 +71,7 @@ import java.util.function.IntConsumer;
* another Context. Can be subclassed to modify behavior without changing
* the original Context.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ContextWrapper extends Context {
@UnsupportedAppUsage
Context mBase;
@@ -1430,6 +1431,7 @@ public class ContextWrapper extends Context {
* @throws IllegalStateException if this method calls before {@link #attachBaseContext(Context)}
*/
@Override
+ @android.ravenwood.annotation.RavenwoodThrow
public void registerComponentCallbacks(ComponentCallbacks callback) {
if (mBase != null) {
mBase.registerComponentCallbacks(callback);
@@ -1464,6 +1466,7 @@ public class ContextWrapper extends Context {
* @throws IllegalStateException if this method calls before {@link #attachBaseContext(Context)}
*/
@Override
+ @android.ravenwood.annotation.RavenwoodThrow
public void unregisterComponentCallbacks(ComponentCallbacks callback) {
// It usually means the ComponentCallbacks is registered before this ContextWrapper attaches
// to a base Context and Application is targeting prior to S-v2. We should unregister the
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index c7a86fbe0171..38bcfa220af4 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -5353,11 +5353,11 @@ public class Intent implements Parcelable, Cloneable {
* Broadcast Action: Sent to the responsible installer of an archived package when unarchival
* is requested.
*
- * @see android.content.pm.PackageInstaller#requestUnarchive(String)
- * @hide
+ * @see android.content.pm.PackageInstaller#requestUnarchive
*/
- @SystemApi
@FlaggedApi(android.content.pm.Flags.FLAG_ARCHIVING)
+ @BroadcastBehavior(explicitOnly = true)
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_UNARCHIVE_PACKAGE = "android.intent.action.UNARCHIVE_PACKAGE";
// ---------------------------------------------------------------------
diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java
index 1cfdb8b37fcd..5736a6d8cb4a 100644
--- a/core/java/android/content/pm/PackageInfo.java
+++ b/core/java/android/content/pm/PackageInfo.java
@@ -20,7 +20,6 @@ import android.annotation.CurrentTimeMillisLong;
import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.os.Parcel;
@@ -522,9 +521,7 @@ public class PackageInfo implements Parcelable {
/**
* Returns the time at which the app was archived for the user. Units are as
* per {@link System#currentTimeMillis()}.
- * @hide
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public @CurrentTimeMillisLong long getArchiveTimeMillis() {
return mArchiveTimeMillis;
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 6df1f600c3ef..d35c3922e9b7 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -354,10 +354,7 @@ public class PackageInstaller {
/**
* Extra field for the package name of a package that is requested to be unarchived. Sent as
* part of the {@link android.content.Intent#ACTION_UNARCHIVE_PACKAGE} intent.
- *
- * @hide
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public static final String EXTRA_UNARCHIVE_PACKAGE_NAME =
"android.content.pm.extra.UNARCHIVE_PACKAGE_NAME";
@@ -366,22 +363,16 @@ public class PackageInstaller {
* Extra field for the unarchive ID. Sent as
* part of the {@link android.content.Intent#ACTION_UNARCHIVE_PACKAGE} intent.
*
- * @see Session#setUnarchiveId(int)
- *
- * @hide
+ * @see SessionParams#setUnarchiveId
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public static final String EXTRA_UNARCHIVE_ID =
"android.content.pm.extra.UNARCHIVE_ID";
/**
* If true, the requestor of the unarchival has specified that the app should be unarchived
- * for {@link android.os.UserHandle#ALL}.
- *
- * @hide
+ * for all users.
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public static final String EXTRA_UNARCHIVE_ALL_USERS =
"android.content.pm.extra.UNARCHIVE_ALL_USERS";
@@ -398,9 +389,7 @@ public class PackageInstaller {
* failure dialog.
*
* @see #requestUnarchive
- * @hide
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public static final String EXTRA_UNARCHIVE_STATUS = "android.content.pm.extra.UNARCHIVE_STATUS";
@@ -675,10 +664,7 @@ public class PackageInstaller {
*
* <p> Note that this does not mean that the unarchival has completed. This status should be
* sent before any longer asynchronous action (e.g. app download) is started.
- *
- * @hide
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public static final int UNARCHIVAL_OK = 0;
@@ -687,10 +673,7 @@ public class PackageInstaller {
*
* <p> An example use case for this could be that the user needs to login to allow the
* download for a paid app.
- *
- * @hide
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public static final int UNARCHIVAL_ERROR_USER_ACTION_NEEDED = 1;
@@ -700,19 +683,13 @@ public class PackageInstaller {
* <p> The installer can optionally provide a {@code userActionIntent} for a space-clearing
* dialog. If no action is provided, then a generic intent
* {@link android.os.storage.StorageManager#ACTION_MANAGE_STORAGE} is started instead.
- *
- * @hide
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public static final int UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE = 2;
/**
* The device is not connected to the internet
- *
- * @hide
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public static final int UNARCHIVAL_ERROR_NO_CONNECTIVITY = 3;
@@ -720,10 +697,7 @@ public class PackageInstaller {
* The installer responsible for the unarchival is disabled.
*
* <p> Should only be used by the system.
- *
- * @hide
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public static final int UNARCHIVAL_ERROR_INSTALLER_DISABLED = 4;
@@ -731,19 +705,13 @@ public class PackageInstaller {
* The installer responsible for the unarchival has been uninstalled
*
* <p> Should only be used by the system.
- *
- * @hide
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public static final int UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED = 5;
/**
* Generic error: The app cannot be unarchived.
- *
- * @hide
*/
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public static final int UNARCHIVAL_GENERIC_ERROR = 100;
@@ -2364,12 +2332,10 @@ public class PackageInstaller {
* @param statusReceiver Callback used to notify when the operation is completed.
* @throws PackageManager.NameNotFoundException If {@code packageName} isn't found or not
* available to the caller or isn't archived.
- * @hide
*/
@RequiresPermission(anyOf = {
Manifest.permission.DELETE_PACKAGES,
Manifest.permission.REQUEST_DELETE_PACKAGES})
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public void requestArchive(@NonNull String packageName, @NonNull IntentSender statusReceiver)
throws PackageManager.NameNotFoundException {
@@ -2395,19 +2361,16 @@ public class PackageInstaller {
*
* @param statusReceiver Callback used to notify whether the installer has accepted the
* unarchival request or an error has occurred. The status update will be
- * sent though {@link EXTRA_UNARCHIVE_STATUS}. Only one status will be
+ * sent though {@link #EXTRA_UNARCHIVE_STATUS}. Only one status will be
* sent.
* @throws PackageManager.NameNotFoundException If {@code packageName} isn't found or not
* visible to the caller or if the package has no
* installer on the device anymore to unarchive it.
* @throws IOException If parameters were unsatisfiable, such as lack of disk space.
- *
- * @hide
*/
@RequiresPermission(anyOf = {
Manifest.permission.INSTALL_PACKAGES,
Manifest.permission.REQUEST_INSTALL_PACKAGES})
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public void requestUnarchive(@NonNull String packageName, @NonNull IntentSender statusReceiver)
throws IOException, PackageManager.NameNotFoundException {
@@ -2435,12 +2398,10 @@ public class PackageInstaller {
* @param userActionIntent Optional intent to start a follow up action required to
* facilitate the unarchival flow (e.g. user needs to log in).
* @throws PackageManager.NameNotFoundException if no unarchival with {@code unarchiveId} exists
- * @hide
*/
@RequiresPermission(anyOf = {
Manifest.permission.INSTALL_PACKAGES,
Manifest.permission.REQUEST_INSTALL_PACKAGES})
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public void reportUnarchivalStatus(int unarchiveId, @UnarchivalStatus int status,
long requiredStorageBytes, @Nullable PendingIntent userActionIntent)
@@ -3454,11 +3415,8 @@ public class PackageInstaller {
* <p> The ID should be retrieved from the unarchive intent and passed into the
* session that's being created to unarchive the app in question. Used to link the unarchive
* intent and the install session to disambiguate.
- *
- * @hide
*/
@FlaggedApi(Flags.FLAG_ARCHIVING)
- @SystemApi
public void setUnarchiveId(int unarchiveId) {
this.unarchiveId = unarchiveId;
}
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java
index c7091ad99199..70e6f9864eb6 100644
--- a/core/java/android/content/pm/PackageItemInfo.java
+++ b/core/java/android/content/pm/PackageItemInfo.java
@@ -177,12 +177,10 @@ public class PackageItemInfo {
/**
* Whether the package is currently in an archived state.
*
- * <p>Packages can be archived through {@link PackageArchiver} and do not have any APKs stored
- * on the device, but do keep the data directory.
- * @hide
+ * <p>Packages can be archived through {@link PackageInstaller#requestArchive} and do not have
+ * any APKs stored on the device, but do keep the data directory.
+ *
*/
- // TODO(b/278553670) Unhide and update @links before launch.
- @SystemApi
@FlaggedApi(Flags.FLAG_ARCHIVING)
public boolean isArchived;
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 6775f9b8d84d..a22fe3f1452b 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -1263,18 +1263,14 @@ public abstract class PackageManager {
/**
* Flag parameter to also retrieve some information about archived packages.
- * Packages can be archived through
- * {@link PackageInstaller#requestArchive(String, IntentSender)} and do not have any APKs stored
- * on the device, but do keep the data directory.
+ * Packages can be archived through {@link PackageInstaller#requestArchive} and do not have any
+ * APKs stored on the device, but do keep the data directory.
* <p> Note: Archived apps are a subset of apps returned by {@link #MATCH_UNINSTALLED_PACKAGES}.
* <p> Note: this flag may cause less information about currently installed
* applications to be returned.
* <p> Note: use of this flag requires the android.permission.QUERY_ALL_PACKAGES
* permission to see uninstalled packages.
- * @hide
*/
- // TODO(b/278553670) Unhide and update @links before launch.
- @SystemApi
@FlaggedApi(android.content.pm.Flags.FLAG_ARCHIVING)
public static final long MATCH_ARCHIVED_PACKAGES = 1L << 32;
@@ -8969,10 +8965,7 @@ public abstract class PackageManager {
*
* @throws NameNotFoundException if the given package name is not available to the caller.
* @see PackageInstaller#requestArchive(String, IntentSender)
- *
- * @hide
*/
- @SystemApi
@FlaggedApi(android.content.pm.Flags.FLAG_ARCHIVING)
public boolean isAppArchivable(@NonNull String packageName) throws NameNotFoundException {
throw new UnsupportedOperationException("isAppArchivable not implemented");
diff --git a/core/java/android/content/pm/flags.aconfig b/core/java/android/content/pm/flags.aconfig
index a565f6825e7a..1b90570e4609 100644
--- a/core/java/android/content/pm/flags.aconfig
+++ b/core/java/android/content/pm/flags.aconfig
@@ -94,3 +94,17 @@ flag {
description: "Feature flag to read install related information from an APK."
bug: "275658500"
}
+
+flag {
+ name: "use_pia_v2"
+ namespace: "package_manager_service"
+ description: "Feature flag to enable the refactored Package Installer app with updated UI."
+ bug: "182205982"
+}
+
+flag {
+ name: "improve_install_dont_kill"
+ namespace: "package_manager_service"
+ description: "Feature flag to reduce app crashes caused by split installs with INSTALL_DONT_KILL"
+ bug: "291212866"
+}
diff --git a/core/java/android/content/res/flags.aconfig b/core/java/android/content/res/flags.aconfig
index 1b8eb0748737..40592a151fa7 100644
--- a/core/java/android/content/res/flags.aconfig
+++ b/core/java/android/content/res/flags.aconfig
@@ -15,3 +15,12 @@ flag {
description: "Feature flag for passing in an AssetFileDescriptor to create an frro"
bug: "304478666"
}
+
+flag {
+ name: "manifest_flagging"
+ namespace: "resource_manager"
+ description: "Feature flag for flagging manifest entries"
+ bug: "297373084"
+ # This flag is read in PackageParser at boot time, and in aapt2 which is a build tool.
+ is_fixed_read_only: true
+}
diff --git a/core/java/android/hardware/SensorPrivacyManager.java b/core/java/android/hardware/SensorPrivacyManager.java
index d786d9a20189..18c95bfbb297 100644
--- a/core/java/android/hardware/SensorPrivacyManager.java
+++ b/core/java/android/hardware/SensorPrivacyManager.java
@@ -66,6 +66,13 @@ public final class SensorPrivacyManager {
+ ".extra.sensor";
/**
+ * An extra containing the notification id that triggered the intent
+ * @hide
+ */
+ public static final String EXTRA_NOTIFICATION_ID = SensorPrivacyManager.class.getName()
+ + ".extra.notification_id";
+
+ /**
* An extra indicating if all sensors are affected
* @hide
*/
diff --git a/core/java/android/hardware/camera2/params/RecommendedStreamConfigurationMap.java b/core/java/android/hardware/camera2/params/RecommendedStreamConfigurationMap.java
index d4ce0ebbc528..5cbb0bbadc4c 100644
--- a/core/java/android/hardware/camera2/params/RecommendedStreamConfigurationMap.java
+++ b/core/java/android/hardware/camera2/params/RecommendedStreamConfigurationMap.java
@@ -16,8 +16,6 @@
package android.hardware.camera2.params;
-import static com.android.internal.R.string.hardware;
-
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
diff --git a/core/java/android/hardware/input/InputDeviceSensorManager.java b/core/java/android/hardware/input/InputDeviceSensorManager.java
index 05024ea95eda..8afcc78f66a2 100644
--- a/core/java/android/hardware/input/InputDeviceSensorManager.java
+++ b/core/java/android/hardware/input/InputDeviceSensorManager.java
@@ -17,6 +17,7 @@
package android.hardware.input;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.hardware.HardwareBuffer;
import android.hardware.Sensor;
import android.hardware.SensorAdditionalInfo;
@@ -37,7 +38,6 @@ import android.util.SparseArray;
import android.view.InputDevice;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.os.SomeArgs;
import java.util.ArrayList;
import java.util.HashMap;
@@ -49,14 +49,14 @@ import java.util.Map;
* sensors.
* @hide
*/
-public class InputDeviceSensorManager implements InputManager.InputDeviceListener {
+public class InputDeviceSensorManager {
private static final String TAG = "InputDeviceSensorManager";
private static final boolean DEBUG = false;
private static final int MSG_SENSOR_ACCURACY_CHANGED = 1;
private static final int MSG_SENSOR_CHANGED = 2;
- private InputManagerGlobal mGlobal;
+ private final InputManagerGlobal mGlobal;
// sensor map from device id to sensor list
@GuardedBy("mInputSensorLock")
@@ -66,19 +66,16 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
private InputSensorEventListener mInputServiceSensorListener;
@GuardedBy("mInputSensorLock")
private final ArrayList<InputSensorEventListenerDelegate> mInputSensorEventListeners =
- new ArrayList<InputSensorEventListenerDelegate>();
- private final HandlerThread mSensorThread;
- private final Handler mSensorHandler;
+ new ArrayList<>();
+
+ // The sensor thread is only initialized if there is a listener added without a handler.
+ @GuardedBy("mInputSensorLock")
+ @Nullable
+ private HandlerThread mSensorThread;
public InputDeviceSensorManager(InputManagerGlobal inputManagerGlobal) {
mGlobal = inputManagerGlobal;
- mSensorThread = new HandlerThread("SensorThread");
- mSensorThread.start();
- mSensorHandler = new Handler(mSensorThread.getLooper());
-
- // Register the input device listener
- mGlobal.registerInputDeviceListener(this, mSensorHandler);
// Initialize the sensor list
initializeSensors();
}
@@ -105,7 +102,6 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
}
}
- @Override
public void onInputDeviceAdded(int deviceId) {
synchronized (mInputSensorLock) {
if (!mSensors.containsKey(deviceId)) {
@@ -117,14 +113,12 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
}
}
- @Override
public void onInputDeviceRemoved(int deviceId) {
synchronized (mInputSensorLock) {
mSensors.remove(deviceId);
}
}
- @Override
public void onInputDeviceChanged(int deviceId) {
synchronized (mInputSensorLock) {
mSensors.remove(deviceId);
@@ -133,14 +127,11 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
}
private static boolean sensorEquals(@NonNull Sensor lhs, @NonNull Sensor rhs) {
- if (lhs.getType() == rhs.getType() && lhs.getId() == rhs.getId()) {
- return true;
- }
- return false;
+ return lhs.getType() == rhs.getType() && lhs.getId() == rhs.getId();
}
private void populateSensorsForInputDeviceLocked(int deviceId, InputSensorInfo[] sensorInfos) {
- List<Sensor> sensors = new ArrayList<Sensor>();
+ List<Sensor> sensors = new ArrayList<>();
for (int i = 0; i < sensorInfos.length; i++) {
Sensor sensor = new Sensor(sensorInfos[i]);
if (DEBUG) {
@@ -197,6 +188,11 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
}
synchronized (mInputSensorLock) {
Sensor sensor = getInputDeviceSensorLocked(deviceId, sensorType);
+ if (sensor == null) {
+ Slog.wtf(TAG, "onInputSensorChanged: Got sensor update for device " + deviceId
+ + " but the sensor was not found.");
+ return;
+ }
for (int i = 0; i < mInputSensorEventListeners.size(); i++) {
InputSensorEventListenerDelegate listener =
mInputSensorEventListeners.get(i);
@@ -252,20 +248,16 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
private static final class InputSensorEventListenerDelegate extends Handler {
private final SensorEventListener mListener;
- private final int mDelayUs;
- private final int mMaxBatchReportLatencyUs;
// List of sensors being listened to
- private List<Sensor> mSensors = new ArrayList<Sensor>();
+ private final List<Sensor> mSensors = new ArrayList<>();
// Sensor event array by sensor type, preallocate sensor events for each sensor of listener
// to avoid allocation and garbage collection for each listener callback.
- private final SparseArray<SensorEvent> mSensorEvents = new SparseArray<SensorEvent>();
+ private final SparseArray<SensorEvent> mSensorEvents = new SparseArray<>();
InputSensorEventListenerDelegate(SensorEventListener listener, Sensor sensor,
- int delayUs, int maxBatchReportLatencyUs, Handler handler) {
- super(handler != null ? handler.getLooper() : Looper.myLooper());
+ Looper looper) {
+ super(looper);
mListener = listener;
- mDelayUs = delayUs;
- mMaxBatchReportLatencyUs = maxBatchReportLatencyUs;
addSensor(sensor);
}
@@ -280,12 +272,13 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
/**
* Remove sensor from sensor list for listener
*/
- public void removeSensor(Sensor sensor) {
+ public void removeSensor(@Nullable Sensor sensor) {
// If sensor is not specified the listener will be unregistered for all sensors
// and the sensor list is cleared.
if (sensor == null) {
mSensors.clear();
mSensorEvents.clear();
+ return;
}
for (Sensor s : mSensors) {
if (sensorEquals(s, sensor)) {
@@ -306,7 +299,7 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
}
}
mSensors.add(sensor);
- final int vecLength = sensor.getMaxLengthValuesArray(sensor, Build.VERSION.SDK_INT);
+ final int vecLength = Sensor.getMaxLengthValuesArray(sensor, Build.VERSION.SDK_INT);
SensorEvent event = new SensorEvent(sensor, SensorManager.SENSOR_STATUS_NO_CONTACT,
0 /* timestamp */, new float[vecLength]);
mSensorEvents.put(sensor.getType(), event);
@@ -345,7 +338,6 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
* Send sensor changed message
*/
public void sendSensorChanged(SensorEvent event) {
- SomeArgs args = SomeArgs.obtain();
obtainMessage(MSG_SENSOR_CHANGED, event).sendToTarget();
}
@@ -353,7 +345,6 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
* Send sensor accuracy changed message
*/
public void sendSensorAccuracyChanged(int deviceId, int sensorType, int accuracy) {
- SomeArgs args = SomeArgs.obtain();
obtainMessage(MSG_SENSOR_ACCURACY_CHANGED, deviceId, sensorType, accuracy)
.sendToTarget();
}
@@ -442,15 +433,21 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
Slog.e(TAG, "Trigger Sensors should use the requestTriggerSensor.");
return false;
}
+
if (maxBatchReportLatencyUs < 0 || delayUs < 0) {
Slog.e(TAG, "maxBatchReportLatencyUs and delayUs should be non-negative");
return false;
}
- if (getSensorForInputDevice(sensor.getId(), sensor.getType()) != null) {
- synchronized (mInputSensorLock) {
+ synchronized (mInputSensorLock) {
+ if (getSensorForInputDevice(sensor.getId(), sensor.getType()) != null) {
final int deviceId = sensor.getId();
- InputDevice inputDevice = InputDevice.getDevice(deviceId);
+ final InputDevice inputDevice = mGlobal.getInputDevice(deviceId);
+ if (inputDevice == null) {
+ Slog.e(TAG, "input device not found for sensor " + sensor.getId());
+ return false;
+ }
+
if (!inputDevice.hasSensor()) {
Slog.e(TAG, "The device doesn't have the sensor:" + sensor);
return false;
@@ -461,9 +458,7 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
return false;
}
}
- }
- synchronized (mInputSensorLock) {
// Register the InputManagerService sensor listener if not yet.
if (mInputServiceSensorListener == null) {
mInputServiceSensorListener = new InputSensorEventListener();
@@ -476,9 +471,8 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
int idx = findSensorEventListenerLocked(listener);
if (idx < 0) {
InputSensorEventListenerDelegate d =
- new InputSensorEventListenerDelegate(listener, sensor, delayUs,
- maxBatchReportLatencyUs,
- handler == null ? mSensorHandler : handler);
+ new InputSensorEventListenerDelegate(listener, sensor,
+ getLooperForListenerLocked(handler));
mInputSensorEventListeners.add(d);
} else {
// The listener is already registered, see if it wants to listen to more sensors.
@@ -489,6 +483,19 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
return true;
}
+ @GuardedBy("mInputSensorLock")
+ @NonNull
+ private Looper getLooperForListenerLocked(@Nullable Handler requestedHandler) {
+ if (requestedHandler != null) {
+ return requestedHandler.getLooper();
+ }
+ if (mSensorThread == null) {
+ mSensorThread = new HandlerThread("SensorThread");
+ mSensorThread.start();
+ }
+ return mSensorThread.getLooper();
+ }
+
private void unregisterListenerInternal(SensorEventListener listener, Sensor sensor) {
if (DEBUG) {
Slog.d(TAG, "unregisterListenerImpl listener=" + listener + " sensor=" + sensor);
@@ -503,7 +510,7 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
if (idx >= 0) {
InputSensorEventListenerDelegate delegate =
mInputSensorEventListeners.get(idx);
- sensorsRegistered = new ArrayList<Sensor>(delegate.getSensors());
+ sensorsRegistered = new ArrayList<>(delegate.getSensors());
// Get the sensor types the listener is listening to
delegate.removeSensor(sensor);
if (delegate.isEmpty()) {
@@ -515,7 +522,7 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
return;
}
// If no delegation remains, unregister the listener to input service
- if (mInputServiceSensorListener != null && mInputSensorEventListeners.size() == 0) {
+ if (mInputServiceSensorListener != null && mInputSensorEventListeners.isEmpty()) {
mGlobal.unregisterSensorListener(mInputServiceSensorListener);
mInputServiceSensorListener = null;
}
@@ -545,7 +552,7 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
}
}
- private boolean flush(SensorEventListener listener) {
+ private boolean flushInternal(SensorEventListener listener) {
synchronized (mInputSensorLock) {
int idx = findSensorEventListenerLocked(listener);
if (idx < 0) {
@@ -601,7 +608,7 @@ public class InputDeviceSensorManager implements InputManager.InputDeviceListene
@Override
protected boolean flushImpl(SensorEventListener listener) {
- return flush(listener);
+ return flushInternal(listener);
}
@Override
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index 7b8419e6c6f7..abbf95403d80 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -1095,62 +1095,6 @@ public final class InputManager {
}
/**
- * Get sensors information as list.
- *
- * @hide
- */
- public InputSensorInfo[] getSensorList(int deviceId) {
- return mGlobal.getSensorList(deviceId);
- }
-
- /**
- * Enable input device sensor
- *
- * @hide
- */
- public boolean enableSensor(int deviceId, int sensorType, int samplingPeriodUs,
- int maxBatchReportLatencyUs) {
- return mGlobal.enableSensor(deviceId, sensorType, samplingPeriodUs,
- maxBatchReportLatencyUs);
- }
-
- /**
- * Enable input device sensor
- *
- * @hide
- */
- public void disableSensor(int deviceId, int sensorType) {
- mGlobal.disableSensor(deviceId, sensorType);
- }
-
- /**
- * Flush input device sensor
- *
- * @hide
- */
- public boolean flushSensor(int deviceId, int sensorType) {
- return mGlobal.flushSensor(deviceId, sensorType);
- }
-
- /**
- * Register input device sensor listener
- *
- * @hide
- */
- public boolean registerSensorListener(IInputSensorEventListener listener) {
- return mGlobal.registerSensorListener(listener);
- }
-
- /**
- * Unregister input device sensor listener
- *
- * @hide
- */
- public void unregisterSensorListener(IInputSensorEventListener listener) {
- mGlobal.unregisterSensorListener(listener);
- }
-
- /**
* Add a runtime association between the input port and the display port. This overrides any
* static associations.
* @param inputPort The port of the input device.
diff --git a/core/java/android/hardware/input/InputManagerGlobal.java b/core/java/android/hardware/input/InputManagerGlobal.java
index 8c598aeae67c..cf1dfe3fceb1 100644
--- a/core/java/android/hardware/input/InputManagerGlobal.java
+++ b/core/java/android/hardware/input/InputManagerGlobal.java
@@ -100,6 +100,9 @@ public final class InputManagerGlobal {
@GuardedBy("mKeyboardBacklightListenerLock")
@Nullable private IKeyboardBacklightListener mKeyboardBacklightListener;
+ // InputDeviceSensorManager gets notified synchronously from the binder thread when input
+ // devices change, so it must be synchronized with the input device listeners.
+ @GuardedBy("mInputDeviceListeners")
@Nullable private InputDeviceSensorManager mInputDeviceSensorManager;
private static InputManagerGlobal sInstance;
@@ -250,6 +253,9 @@ public final class InputManagerGlobal {
Log.d(TAG, "Device removed: " + deviceId);
}
mInputDevices.removeAt(i);
+ if (mInputDeviceSensorManager != null) {
+ mInputDeviceSensorManager.onInputDeviceRemoved(deviceId);
+ }
sendMessageToInputDeviceListenersLocked(
InputDeviceListenerDelegate.MSG_DEVICE_REMOVED, deviceId);
}
@@ -267,6 +273,9 @@ public final class InputManagerGlobal {
Log.d(TAG, "Device changed: " + deviceId);
}
mInputDevices.setValueAt(index, null);
+ if (mInputDeviceSensorManager != null) {
+ mInputDeviceSensorManager.onInputDeviceChanged(deviceId);
+ }
sendMessageToInputDeviceListenersLocked(
InputDeviceListenerDelegate.MSG_DEVICE_CHANGED, deviceId);
}
@@ -276,6 +285,9 @@ public final class InputManagerGlobal {
Log.d(TAG, "Device added: " + deviceId);
}
mInputDevices.put(deviceId, null);
+ if (mInputDeviceSensorManager != null) {
+ mInputDeviceSensorManager.onInputDeviceAdded(deviceId);
+ }
sendMessageToInputDeviceListenersLocked(
InputDeviceListenerDelegate.MSG_DEVICE_ADDED, deviceId);
}
@@ -930,14 +942,17 @@ public final class InputManagerGlobal {
*/
@NonNull
public SensorManager getInputDeviceSensorManager(int deviceId) {
- if (mInputDeviceSensorManager == null) {
- mInputDeviceSensorManager = new InputDeviceSensorManager(this);
+ synchronized (mInputDeviceListeners) {
+ if (mInputDeviceSensorManager == null) {
+ mInputDeviceSensorManager = new InputDeviceSensorManager(this);
+ }
+ return mInputDeviceSensorManager.getSensorManager(deviceId);
}
- return mInputDeviceSensorManager.getSensorManager(deviceId);
}
/**
- * @see InputManager#getSensorList(int)
+ * Get information about all of the sensors supported by an input device
+ * @see InputDeviceSensorManager
*/
InputSensorInfo[] getSensorList(int deviceId) {
try {
@@ -948,7 +963,7 @@ public final class InputManagerGlobal {
}
/**
- * @see InputManager#enableSensor(int, int, int, int)
+ * @see InputDeviceSensorManager
*/
boolean enableSensor(int deviceId, int sensorType, int samplingPeriodUs,
int maxBatchReportLatencyUs) {
@@ -961,7 +976,7 @@ public final class InputManagerGlobal {
}
/**
- * @see InputManager#disableSensor(int, int)
+ * @see InputDeviceSensorManager
*/
void disableSensor(int deviceId, int sensorType) {
try {
@@ -972,7 +987,7 @@ public final class InputManagerGlobal {
}
/**
- * @see InputManager#flushSensor(int, int)
+ * @see InputDeviceSensorManager
*/
boolean flushSensor(int deviceId, int sensorType) {
try {
@@ -983,7 +998,7 @@ public final class InputManagerGlobal {
}
/**
- * @see InputManager#registerSensorListener(IInputSensorEventListener)
+ * @see InputDeviceSensorManager
*/
boolean registerSensorListener(IInputSensorEventListener listener) {
try {
@@ -994,7 +1009,7 @@ public final class InputManagerGlobal {
}
/**
- * @see InputManager#unregisterSensorListener(IInputSensorEventListener)
+ * @see InputDeviceSensorManager
*/
void unregisterSensorListener(IInputSensorEventListener listener) {
try {
diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java
index ed3100251040..eabe13b0c54f 100644
--- a/core/java/android/os/BatteryUsageStats.java
+++ b/core/java/android/os/BatteryUsageStats.java
@@ -123,6 +123,12 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
private static final int STATSD_PULL_ATOM_MAX_BYTES = 45000;
+ private static final int[] UID_USAGE_TIME_PROCESS_STATES = {
+ BatteryConsumer.PROCESS_STATE_FOREGROUND,
+ BatteryConsumer.PROCESS_STATE_BACKGROUND,
+ BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE
+ };
+
private final int mDischargePercentage;
private final double mBatteryCapacityMah;
private final long mStatsStartTimestampMs;
@@ -516,6 +522,22 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
proto.write(
BatteryUsageStatsAtomsProto.UidBatteryConsumer.TIME_IN_BACKGROUND_MILLIS,
bgMs);
+ for (int processState : UID_USAGE_TIME_PROCESS_STATES) {
+ final long timeInStateMillis = consumer.getTimeInProcessStateMs(processState);
+ if (timeInStateMillis <= 0) {
+ continue;
+ }
+ final long timeInStateToken = proto.start(
+ BatteryUsageStatsAtomsProto.UidBatteryConsumer.TIME_IN_STATE);
+ proto.write(
+ BatteryUsageStatsAtomsProto.UidBatteryConsumer.TimeInState.PROCESS_STATE,
+ processState);
+ proto.write(
+ BatteryUsageStatsAtomsProto.UidBatteryConsumer.TimeInState
+ .TIME_IN_STATE_MILLIS,
+ timeInStateMillis);
+ proto.end(timeInStateToken);
+ }
proto.end(token);
if (proto.getRawSize() >= maxRawSize) {
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index 5b24dcacbf53..3a32b2bab682 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -52,9 +52,11 @@ import android.provider.DocumentsContract.Document;
import android.provider.MediaStore;
import android.system.ErrnoException;
import android.system.Os;
+import android.system.OsConstants;
import android.system.StructStat;
import android.text.TextUtils;
import android.util.DataUnit;
+import android.util.EmptyArray;
import android.util.Log;
import android.util.Slog;
import android.webkit.MimeTypeMap;
@@ -64,7 +66,6 @@ import com.android.internal.util.ArrayUtils;
import com.android.internal.util.SizedInputStream;
import libcore.io.IoUtils;
-import libcore.util.EmptyArray;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
@@ -94,6 +95,7 @@ import java.util.zip.CheckedInputStream;
/**
* Utility methods useful for working with files.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class FileUtils {
private static final String TAG = "FileUtils";
@@ -116,9 +118,6 @@ public final class FileUtils {
private FileUtils() {
}
- private static final String CAMERA_DIR_LOWER_CASE = "/storage/emulated/" + UserHandle.myUserId()
- + "/dcim/camera";
-
/** Regular expression for safe filenames: no spaces or metacharacters.
*
* Use a preload holder so that FileUtils can be compile-time initialized.
@@ -133,6 +132,21 @@ public final class FileUtils {
private static final long COPY_CHECKPOINT_BYTES = 524288;
+ static {
+ sEnableCopyOptimizations = shouldEnableCopyOptimizations();
+ }
+
+ @android.ravenwood.annotation.RavenwoodReplace
+ private static boolean shouldEnableCopyOptimizations() {
+ // Advanced copy operations enabled by default
+ return true;
+ }
+
+ private static boolean shouldEnableCopyOptimizations$ravenwood() {
+ // Disabled under Ravenwood due to missing kernel support
+ return false;
+ }
+
/**
* Listener that is called periodically as progress is made.
*/
@@ -150,6 +164,7 @@ public final class FileUtils {
* @hide
*/
@UnsupportedAppUsage
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static int setPermissions(File path, int mode, int uid, int gid) {
return setPermissions(path.getAbsolutePath(), mode, uid, gid);
}
@@ -164,6 +179,7 @@ public final class FileUtils {
* @hide
*/
@UnsupportedAppUsage
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static int setPermissions(String path, int mode, int uid, int gid) {
try {
Os.chmod(path, mode);
@@ -194,6 +210,7 @@ public final class FileUtils {
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static int setPermissions(FileDescriptor fd, int mode, int uid, int gid) {
try {
Os.fchmod(fd, mode);
@@ -221,6 +238,7 @@ public final class FileUtils {
* @param to File where attributes should be copied to.
* @hide
*/
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static void copyPermissions(@NonNull File from, @NonNull File to) throws IOException {
try {
final StructStat stat = Os.stat(from.getAbsolutePath());
@@ -236,6 +254,7 @@ public final class FileUtils {
* @hide
*/
@Deprecated
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static int getUid(String path) {
try {
return Os.stat(path).st_uid;
@@ -314,11 +333,7 @@ public final class FileUtils {
}
try (FileOutputStream out = new FileOutputStream(destFile)) {
copy(in, out);
- try {
- Os.fsync(out.getFD());
- } catch (ErrnoException e) {
- throw e.rethrowAsIOException();
- }
+ sync(out);
}
}
@@ -475,6 +490,7 @@ public final class FileUtils {
* @hide
*/
@VisibleForTesting
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static long copyInternalSplice(FileDescriptor in, FileDescriptor out, long count,
CancellationSignal signal, Executor executor, ProgressListener listener)
throws ErrnoException {
@@ -516,6 +532,7 @@ public final class FileUtils {
* @hide
*/
@VisibleForTesting
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static long copyInternalSendfile(FileDescriptor in, FileDescriptor out, long count,
CancellationSignal signal, Executor executor, ProgressListener listener)
throws ErrnoException {
@@ -699,6 +716,7 @@ public final class FileUtils {
*
* @hide
*/
+ @android.ravenwood.annotation.RavenwoodReplace
public static void bytesToFile(String filename, byte[] content) throws IOException {
if (filename.startsWith("/proc/")) {
final int oldMask = StrictMode.allowThreadDiskWritesMask();
@@ -714,6 +732,14 @@ public final class FileUtils {
}
}
+ /** @hide */
+ public static void bytesToFile$ravenwood(String filename, byte[] content) throws IOException {
+ // No StrictMode support, so we can just directly write
+ try (FileOutputStream fos = new FileOutputStream(filename)) {
+ fos.write(content);
+ }
+ }
+
/**
* Writes string to file. Basically same as "echo -n $string > $filename"
*
@@ -1176,6 +1202,7 @@ public final class FileUtils {
*
* @hide
*/
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = MimeTypeMap.class)
public static String[] splitFileName(String mimeType, String displayName) {
String name;
String ext;
@@ -1423,11 +1450,13 @@ public final class FileUtils {
* indicate a failure to flush bytes to the underlying resource.
*/
@Deprecated
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires ART support")
public static void closeQuietly(@Nullable FileDescriptor fd) {
IoUtils.closeQuietly(fd);
}
/** {@hide} */
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = OsConstants.class)
public static int translateModeStringToPosix(String mode) {
// Quick check for invalid chars
for (int i = 0; i < mode.length(); i++) {
@@ -1462,6 +1491,7 @@ public final class FileUtils {
}
/** {@hide} */
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = OsConstants.class)
public static String translateModePosixToString(int mode) {
String res = "";
if ((mode & O_ACCMODE) == O_RDWR) {
@@ -1483,6 +1513,7 @@ public final class FileUtils {
}
/** {@hide} */
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = OsConstants.class)
public static int translateModePosixToPfd(int mode) {
int res = 0;
if ((mode & O_ACCMODE) == O_RDWR) {
@@ -1507,6 +1538,7 @@ public final class FileUtils {
}
/** {@hide} */
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = OsConstants.class)
public static int translateModePfdToPosix(int mode) {
int res = 0;
if ((mode & MODE_READ_WRITE) == MODE_READ_WRITE) {
@@ -1531,6 +1563,7 @@ public final class FileUtils {
}
/** {@hide} */
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = OsConstants.class)
public static int translateModeAccessToPosix(int mode) {
if (mode == F_OK) {
// There's not an exact mapping, so we attempt a read-only open to
@@ -1549,6 +1582,7 @@ public final class FileUtils {
/** {@hide} */
@VisibleForTesting
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static ParcelFileDescriptor convertToModernFd(FileDescriptor fd) {
Context context = AppGlobals.getInitialApplication();
if (UserHandle.getAppId(Process.myUid()) == getMediaProviderAppId(context)) {
@@ -1565,6 +1599,7 @@ public final class FileUtils {
}
}
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
private static int getMediaProviderAppId(Context context) {
if (sMediaProviderAppId != -1) {
return sMediaProviderAppId;
@@ -1605,10 +1640,12 @@ public final class FileUtils {
return this;
}
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static MemoryPipe createSource(byte[] data) throws IOException {
return new MemoryPipe(data, false).startInternal();
}
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static MemoryPipe createSink(byte[] data) throws IOException {
return new MemoryPipe(data, true).startInternal();
}
diff --git a/core/java/android/os/IHintSession.aidl b/core/java/android/os/IHintSession.aidl
index 6b43e73d10e7..fe85da26e610 100644
--- a/core/java/android/os/IHintSession.aidl
+++ b/core/java/android/os/IHintSession.aidl
@@ -17,6 +17,8 @@
package android.os;
+import android.os.WorkDuration;
+
/** {@hide} */
oneway interface IHintSession {
void updateTargetWorkDuration(long targetDurationNanos);
@@ -24,4 +26,5 @@ oneway interface IHintSession {
void close();
void sendHint(int hint);
void setMode(int mode, boolean enabled);
+ void reportActualWorkDuration2(in WorkDuration[] workDurations);
}
diff --git a/core/java/android/os/ISecurityStateManager.aidl b/core/java/android/os/ISecurityStateManager.aidl
new file mode 100644
index 000000000000..8ae624d0371d
--- /dev/null
+++ b/core/java/android/os/ISecurityStateManager.aidl
@@ -0,0 +1,26 @@
+/* //device/java/android/android/os/ISecurityStateManager.aidl
+**
+** Copyright 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.os;
+
+import android.os.Bundle;
+import android.os.PersistableBundle;
+
+/** @hide */
+interface ISecurityStateManager {
+ Bundle getGlobalSecurityState();
+}
diff --git a/core/java/android/os/Message.java b/core/java/android/os/Message.java
index da647e2b78cb..161951ead77f 100644
--- a/core/java/android/os/Message.java
+++ b/core/java/android/os/Message.java
@@ -16,6 +16,7 @@
package android.os;
+import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
@@ -437,6 +438,7 @@ public final class Message implements Parcelable {
* @see #getData()
* @see #setData(Bundle)
*/
+ @Nullable
public Bundle peekData() {
return data;
}
diff --git a/core/java/android/os/PerformanceHintManager.java b/core/java/android/os/PerformanceHintManager.java
index 11084b88fad1..e0059105c21f 100644
--- a/core/java/android/os/PerformanceHintManager.java
+++ b/core/java/android/os/PerformanceHintManager.java
@@ -103,7 +103,7 @@ public final class PerformanceHintManager {
* Any call in this class will change its internal data, so you must do your own thread
* safety to protect from racing.
*
- * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ * All timings should be in {@link SystemClock#uptimeNanos()}.
*/
public static class Session implements Closeable {
private long mNativeSessionPtr;
@@ -269,6 +269,40 @@ public final class PerformanceHintManager {
public @Nullable int[] getThreadIds() {
return nativeGetThreadIds(mNativeSessionPtr);
}
+
+ /**
+ * Reports the work duration for the last cycle of work.
+ *
+ * The system will attempt to adjust the core placement of the threads within the thread
+ * group and/or the frequency of the core on which they are run to bring the actual duration
+ * close to the target duration.
+ *
+ * @param workDuration the work duration of each component.
+ * @throws IllegalArgumentException if work period start timestamp is not positive, or
+ * actual total duration is not positive, or actual CPU duration is not positive,
+ * or actual GPU duration is negative.
+ */
+ @FlaggedApi(Flags.FLAG_ADPF_GPU_REPORT_ACTUAL_WORK_DURATION)
+ public void reportActualWorkDuration(@NonNull WorkDuration workDuration) {
+ if (workDuration.mWorkPeriodStartTimestampNanos <= 0) {
+ throw new IllegalArgumentException(
+ "the work period start timestamp should be positive.");
+ }
+ if (workDuration.mActualTotalDurationNanos <= 0) {
+ throw new IllegalArgumentException("the actual total duration should be positive.");
+ }
+ if (workDuration.mActualCpuDurationNanos <= 0) {
+ throw new IllegalArgumentException("the actual CPU duration should be positive.");
+ }
+ if (workDuration.mActualGpuDurationNanos < 0) {
+ throw new IllegalArgumentException(
+ "the actual GPU duration should be non negative.");
+ }
+ nativeReportActualWorkDuration(mNativeSessionPtr,
+ workDuration.mWorkPeriodStartTimestampNanos,
+ workDuration.mActualTotalDurationNanos,
+ workDuration.mActualCpuDurationNanos, workDuration.mActualGpuDurationNanos);
+ }
}
private static native long nativeAcquireManager();
@@ -285,4 +319,7 @@ public final class PerformanceHintManager {
private static native void nativeSetThreads(long nativeSessionPtr, int[] tids);
private static native void nativeSetPreferPowerEfficiency(long nativeSessionPtr,
boolean enabled);
+ private static native void nativeReportActualWorkDuration(long nativeSessionPtr,
+ long workPeriodStartTimestampNanos, long actualTotalDurationNanos,
+ long actualCpuDurationNanos, long actualGpuDurationNanos);
}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 11bddfb5b0f0..f4795f89e66d 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -16,7 +16,6 @@
package android.os;
-import android.annotation.FlaggedApi;
import android.Manifest.permission;
import android.annotation.CallbackExecutor;
import android.annotation.CurrentTimeMillisLong;
@@ -3103,7 +3102,8 @@ public final class PowerManager {
/**
* Intent that is broadcast when Low Power Standby is enabled or disabled.
- * This broadcast is only sent to registered receivers.
+ * This broadcast is only sent to registered receivers and receivers holding
+ * {@code android.permission.MANAGE_LOW_POWER_STANDBY}.
*
* @see #isLowPowerStandbyEnabled()
*/
@@ -3113,7 +3113,8 @@ public final class PowerManager {
/**
* Intent that is broadcast when Low Power Standby policy is changed.
- * This broadcast is only sent to registered receivers.
+ * This broadcast is only sent to registered receivers and receivers holding
+ * {@code android.permission.MANAGE_LOW_POWER_STANDBY}.
*
* @see #isExemptFromLowPowerStandby()
* @see #isAllowedInLowPowerStandby(int)
@@ -3125,7 +3126,6 @@ public final class PowerManager {
/**
* Intent that is broadcast when Low Power Standby exempt ports change.
- * This broadcast is only sent to registered receivers.
*
* @see #getActiveLowPowerStandbyPorts
* @hide
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 11660f9930c3..7e07e1f2e499 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -853,6 +853,7 @@ public class Process {
args.argi2 = pid;
args.argi3 = Long.hashCode(Thread.currentThread().getId());
args.argi4 = THREAD_PRIORITY_DEFAULT;
+ args.arg1 = Boolean.TRUE; // backgroundOk
return args;
});
}
@@ -1105,6 +1106,11 @@ public class Process {
final SomeArgs args =
Preconditions.requireNonNullViaRavenwoodRule(sIdentity$ravenwood).get();
if (args.argi3 == tid) {
+ boolean backgroundOk = (args.arg1 == Boolean.TRUE);
+ if (priority >= THREAD_PRIORITY_BACKGROUND && !backgroundOk) {
+ throw new IllegalArgumentException(
+ "Priority " + priority + " blocked by setCanSelfBackground()");
+ }
args.argi4 = priority;
} else {
throw new UnsupportedOperationException(
@@ -1119,8 +1125,16 @@ public class Process {
*
* @hide
*/
+ @android.ravenwood.annotation.RavenwoodReplace
public static final native void setCanSelfBackground(boolean backgroundOk);
+ /** @hide */
+ public static final void setCanSelfBackground$ravenwood(boolean backgroundOk) {
+ final SomeArgs args =
+ Preconditions.requireNonNullViaRavenwoodRule(sIdentity$ravenwood).get();
+ args.arg1 = Boolean.valueOf(backgroundOk);
+ }
+
/**
* Sets the scheduling group for a thread.
* @hide
diff --git a/core/java/android/os/SecurityStateManager.java b/core/java/android/os/SecurityStateManager.java
new file mode 100644
index 000000000000..4fa61e0ca782
--- /dev/null
+++ b/core/java/android/os/SecurityStateManager.java
@@ -0,0 +1,81 @@
+/*
+ * 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.os;
+
+import static java.util.Objects.requireNonNull;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.SystemService;
+import android.content.Context;
+
+/**
+ * SecurityStateManager provides the functionality to query the security status of the system and
+ * platform components. For example, this includes the system and vendor security patch level.
+ */
+@FlaggedApi(Flags.FLAG_SECURITY_STATE_SERVICE)
+@SystemService(Context.SECURITY_STATE_SERVICE)
+public class SecurityStateManager {
+
+ /**
+ * The system SPL key returned as part of the {@code Bundle} from
+ * {@code getGlobalSecurityState}.
+ */
+ public static final String KEY_SYSTEM_SPL = "system_spl";
+
+ /**
+ * The vendor SPL key returned as part of the {@code Bundle} from
+ * {@code getGlobalSecurityState}.
+ */
+ public static final String KEY_VENDOR_SPL = "vendor_spl";
+
+ /**
+ * The kernel version key returned as part of the {@code Bundle} from
+ * {@code getGlobalSecurityState}.
+ */
+ public static final String KEY_KERNEL_VERSION = "kernel_version";
+
+ private final ISecurityStateManager mService;
+
+ /**
+ * @hide
+ */
+ public SecurityStateManager(ISecurityStateManager service) {
+ mService = requireNonNull(service, "missing ISecurityStateManager");
+ }
+
+ /**
+ * Returns the current global security state. Each key-value pair is a mapping of a component
+ * of the global security state to its current version/SPL (security patch level). For example,
+ * the {@code KEY_SYSTEM_SPL} key will map to the SPL of the system as defined in
+ * {@link android.os.Build.VERSION}. The bundle will also include mappings from WebView packages
+ * and packages listed under config {@code config_securityStatePackages} to their respective
+ * versions as defined in {@link android.content.pm.PackageInfo#versionName}.
+ *
+ * @return A {@code Bundle} that contains the global security state information as
+ * string-to-string key-value pairs.
+ */
+ @FlaggedApi(Flags.FLAG_SECURITY_STATE_SERVICE)
+ @NonNull
+ public Bundle getGlobalSecurityState() {
+ try {
+ return mService.getGlobalSecurityState();
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+}
diff --git a/core/java/android/os/SystemClock.java b/core/java/android/os/SystemClock.java
index 2e6cccbd435f..23bd30a21c4c 100644
--- a/core/java/android/os/SystemClock.java
+++ b/core/java/android/os/SystemClock.java
@@ -16,6 +16,7 @@
package android.os;
+import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.app.IAlarmManager;
import android.app.time.UnixEpochTime;
@@ -205,8 +206,8 @@ public final class SystemClock {
* Returns nanoseconds since boot, not counting time spent in deep sleep.
*
* @return nanoseconds of non-sleep uptime since boot.
- * @hide
*/
+ @FlaggedApi(Flags.FLAG_ADPF_GPU_REPORT_ACTUAL_WORK_DURATION)
@CriticalNative
@android.ravenwood.annotation.RavenwoodReplace
public static native long uptimeNanos();
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index ec6d20fbc0f5..c280d132ae38 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -16,6 +16,7 @@
package android.os;
+import static android.app.admin.DevicePolicyResources.Drawables.Style.SOLID_COLORED;
import static android.app.admin.DevicePolicyResources.Strings.Core.WORK_PROFILE_BADGED_LABEL;
import static android.app.admin.DevicePolicyResources.UNDEFINED;
@@ -5652,6 +5653,38 @@ public class UserManager {
}
/**
+ * Retrieves a user badge associated with the current context user. This is only
+ * applicable to profile users since non-profile users do not have badges.
+ *
+ * @return A {@link Drawable} user badge corresponding to the context user
+ * @throws android.content.res.Resources.NotFoundException if the user is not a profile or
+ * does not have a badge defined.
+ * @hide
+ */
+ @SystemApi
+ @UserHandleAware(
+ requiresAnyOfPermissionsIfNotCallerProfileGroup = {
+ Manifest.permission.MANAGE_USERS,
+ Manifest.permission.INTERACT_ACROSS_USERS})
+ @SuppressLint("UnflaggedApi") // b/306636213
+ public @NonNull Drawable getUserBadge() {
+ if (!isProfile(mUserId)) {
+ throw new Resources.NotFoundException("No badge found for this user.");
+ }
+ if (isManagedProfile(mUserId)) {
+ DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
+ return dpm.getResources().getDrawable(
+ android.app.admin.DevicePolicyResources.Drawables.WORK_PROFILE_ICON_BADGE,
+ SOLID_COLORED, () -> getDefaultUserBadge(mUserId));
+ }
+ return getDefaultUserBadge(mUserId);
+ }
+
+ private Drawable getDefaultUserBadge(@UserIdInt int userId){
+ return mContext.getResources().getDrawable(getUserBadgeResId(userId), mContext.getTheme());
+ }
+
+ /**
* If the target user is a profile of the calling user or the caller
* is itself a profile, then this returns a copy of the label with
* badging for accessibility services like talkback. E.g. passing in "Email"
diff --git a/core/java/android/os/WorkDuration.aidl b/core/java/android/os/WorkDuration.aidl
new file mode 100644
index 000000000000..0f61204d72c4
--- /dev/null
+++ b/core/java/android/os/WorkDuration.aidl
@@ -0,0 +1,19 @@
+/*
+ * 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.os;
+
+parcelable WorkDuration cpp_header "android/WorkDuration.h"; \ No newline at end of file
diff --git a/core/java/android/os/WorkDuration.java b/core/java/android/os/WorkDuration.java
new file mode 100644
index 000000000000..4fdc34fb60d1
--- /dev/null
+++ b/core/java/android/os/WorkDuration.java
@@ -0,0 +1,213 @@
+/*
+ * 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.os;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+
+import java.util.Objects;
+
+/**
+ * WorkDuration contains the measured time in nano seconds of the workload
+ * in each component, see
+ * {@link PerformanceHintManager.Session#reportActualWorkDuration(WorkDuration)}.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+@FlaggedApi(Flags.FLAG_ADPF_GPU_REPORT_ACTUAL_WORK_DURATION)
+public final class WorkDuration implements Parcelable {
+ long mWorkPeriodStartTimestampNanos = 0;
+ long mActualTotalDurationNanos = 0;
+ long mActualCpuDurationNanos = 0;
+ long mActualGpuDurationNanos = 0;
+ long mTimestampNanos = 0;
+
+ public static final @NonNull Creator<WorkDuration> CREATOR = new Creator<>() {
+ @Override
+ public WorkDuration createFromParcel(Parcel in) {
+ return new WorkDuration(in);
+ }
+
+ @Override
+ public WorkDuration[] newArray(int size) {
+ return new WorkDuration[size];
+ }
+ };
+
+ public WorkDuration() {}
+
+ public WorkDuration(long workPeriodStartTimestampNanos,
+ long actualTotalDurationNanos,
+ long actualCpuDurationNanos,
+ long actualGpuDurationNanos) {
+ mWorkPeriodStartTimestampNanos = workPeriodStartTimestampNanos;
+ mActualTotalDurationNanos = actualTotalDurationNanos;
+ mActualCpuDurationNanos = actualCpuDurationNanos;
+ mActualGpuDurationNanos = actualGpuDurationNanos;
+ }
+
+ /**
+ * @hide
+ */
+ public WorkDuration(long workPeriodStartTimestampNanos,
+ long actualTotalDurationNanos,
+ long actualCpuDurationNanos,
+ long actualGpuDurationNanos,
+ long timestampNanos) {
+ mWorkPeriodStartTimestampNanos = workPeriodStartTimestampNanos;
+ mActualTotalDurationNanos = actualTotalDurationNanos;
+ mActualCpuDurationNanos = actualCpuDurationNanos;
+ mActualGpuDurationNanos = actualGpuDurationNanos;
+ mTimestampNanos = timestampNanos;
+ }
+
+ WorkDuration(@NonNull Parcel in) {
+ mWorkPeriodStartTimestampNanos = in.readLong();
+ mActualTotalDurationNanos = in.readLong();
+ mActualCpuDurationNanos = in.readLong();
+ mActualGpuDurationNanos = in.readLong();
+ mTimestampNanos = in.readLong();
+ }
+
+ /**
+ * Sets the work period start timestamp in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public void setWorkPeriodStartTimestampNanos(long workPeriodStartTimestampNanos) {
+ if (workPeriodStartTimestampNanos <= 0) {
+ throw new IllegalArgumentException(
+ "the work period start timestamp should be positive.");
+ }
+ mWorkPeriodStartTimestampNanos = workPeriodStartTimestampNanos;
+ }
+
+ /**
+ * Sets the actual total duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public void setActualTotalDurationNanos(long actualTotalDurationNanos) {
+ if (actualTotalDurationNanos <= 0) {
+ throw new IllegalArgumentException("the actual total duration should be positive.");
+ }
+ mActualTotalDurationNanos = actualTotalDurationNanos;
+ }
+
+ /**
+ * Sets the actual CPU duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public void setActualCpuDurationNanos(long actualCpuDurationNanos) {
+ if (actualCpuDurationNanos <= 0) {
+ throw new IllegalArgumentException("the actual CPU duration should be positive.");
+ }
+ mActualCpuDurationNanos = actualCpuDurationNanos;
+ }
+
+ /**
+ * Sets the actual GPU duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public void setActualGpuDurationNanos(long actualGpuDurationNanos) {
+ if (actualGpuDurationNanos < 0) {
+ throw new IllegalArgumentException("the actual GPU duration should be non negative.");
+ }
+ mActualGpuDurationNanos = actualGpuDurationNanos;
+ }
+
+ /**
+ * Returns the work period start timestamp based in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public long getWorkPeriodStartTimestampNanos() {
+ return mWorkPeriodStartTimestampNanos;
+ }
+
+ /**
+ * Returns the actual total duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public long getActualTotalDurationNanos() {
+ return mActualTotalDurationNanos;
+ }
+
+ /**
+ * Returns the actual CPU duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public long getActualCpuDurationNanos() {
+ return mActualCpuDurationNanos;
+ }
+
+ /**
+ * Returns the actual GPU duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public long getActualGpuDurationNanos() {
+ return mActualGpuDurationNanos;
+ }
+
+ /**
+ * @hide
+ */
+ public long getTimestampNanos() {
+ return mTimestampNanos;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeLong(mWorkPeriodStartTimestampNanos);
+ dest.writeLong(mActualTotalDurationNanos);
+ dest.writeLong(mActualCpuDurationNanos);
+ dest.writeLong(mActualGpuDurationNanos);
+ dest.writeLong(mTimestampNanos);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof WorkDuration)) {
+ return false;
+ }
+ WorkDuration workDuration = (WorkDuration) obj;
+ return workDuration.mTimestampNanos == this.mTimestampNanos
+ && workDuration.mWorkPeriodStartTimestampNanos == this.mWorkPeriodStartTimestampNanos
+ && workDuration.mActualTotalDurationNanos == this.mActualTotalDurationNanos
+ && workDuration.mActualCpuDurationNanos == this.mActualCpuDurationNanos
+ && workDuration.mActualGpuDurationNanos == this.mActualGpuDurationNanos;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mWorkPeriodStartTimestampNanos, mActualTotalDurationNanos,
+ mActualCpuDurationNanos, mActualGpuDurationNanos, mTimestampNanos);
+ }
+}
diff --git a/core/java/android/os/flags.aconfig b/core/java/android/os/flags.aconfig
index a78f221fc962..980c13c5c2d6 100644
--- a/core/java/android/os/flags.aconfig
+++ b/core/java/android/os/flags.aconfig
@@ -57,8 +57,22 @@ flag {
}
flag {
+ name: "security_state_service"
+ namespace: "dynamic_spl"
+ description: "Guards the Security State API."
+ bug: "302189431"
+}
+
+flag {
name: "battery_saver_supported_check_api"
namespace: "backstage_power"
description: "Guards a new API in PowerManager to check if battery saver is supported or not."
bug: "305067031"
-} \ No newline at end of file
+}
+
+flag {
+ name: "adpf_gpu_report_actual_work_duration"
+ namespace: "game"
+ description: "Guards the ADPF GPU APIs."
+ bug: "284324521"
+}
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 6853892348d9..78a12f75a508 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -1738,23 +1738,6 @@ public class StorageManager {
return RoSystemProperties.CRYPTO_FILE_ENCRYPTED;
}
- /** {@hide}
- * @deprecated Use {@link #isFileEncrypted} instead, since emulated FBE is no longer supported.
- */
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- @Deprecated
- public static boolean isFileEncryptedNativeOnly() {
- return isFileEncrypted();
- }
-
- /** {@hide}
- * @deprecated Use {@link #isFileEncrypted} instead, since emulated FBE is no longer supported.
- */
- @Deprecated
- public static boolean isFileEncryptedNativeOrEmulated() {
- return isFileEncrypted();
- }
-
/** {@hide} */
public static boolean hasAdoptable() {
switch (SystemProperties.get(PROP_ADOPTABLE)) {
diff --git a/core/java/android/os/vibrator/persistence/VibrationXmlParser.java b/core/java/android/os/vibrator/persistence/VibrationXmlParser.java
index fed1053e2a12..3d711a7b69d5 100644
--- a/core/java/android/os/vibrator/persistence/VibrationXmlParser.java
+++ b/core/java/android/os/vibrator/persistence/VibrationXmlParser.java
@@ -56,9 +56,9 @@ import java.util.List;
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <predefined-effect name="click" />
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
@@ -66,7 +66,7 @@ import java.util.List;
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <waveform-effect>
* <waveform-entry amplitude="default" durationMs="10" />
* <waveform-entry amplitude="0" durationMs="10" />
@@ -77,7 +77,7 @@ import java.util.List;
* <waveform-entry amplitude="255" durationMs="20" />
* </repeating>
* </waveform-effect>
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
@@ -85,31 +85,31 @@ import java.util.List;
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <primitive-effect name="click" />
* <primitive-effect name="slow_rise" scale="0.8" />
* <primitive-effect name="quick_fall" delayMs="50" />
* <primitive-effect name="tick" scale="0.5" delayMs="100" />
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
* <p>When the root element represents a selection list of vibration effects, the root tag should be
* a <vibration-select> tag. The root element should contain a list of vibration serializations.
- * Each vibration within the root-element should follow the format discussed for the <vibration> tag
- * above. See example below:
+ * Each vibration within the root-element should follow the format discussed for the
+ * <vibration-effect> tag above. See example below:
*
* <pre>
* {@code
* <vibration-select>
- * <vibration>
+ * <vibration-effect>
* <predefined-effect name="click" />
- * </vibration>
- * <vibration>
+ * </vibration-effect>
+ * <vibration-effect>
* <waveform-effect>
* <waveform-entry amplitude="default" durationMs="10" />
* </waveform-effect>
- * </vibration>
+ * </vibration-effect>
* </vibration-select>
* }
* </pre>
@@ -262,12 +262,12 @@ public final class VibrationXmlParser {
* {@link ParsedVibration}.
*
* <p>Same as {@link #parseDocument(Reader, int)}, but, instead of parsing the full XML content,
- * it takes a parser that points to either a <vibration> or a <vibration-select> start tag. No
- * other parser position, including start of document, is considered valid.
+ * it takes a parser that points to either a <vibration-effect> or a <vibration-select> start
+ * tag. No other parser position, including start of document, is considered valid.
*
- * <p>This method parses until an end "vibration" or "vibration-select" tag (depending on the
- * start tag found at the start of parsing). After a successful parsing, the parser will point
- * to the end tag.
+ * <p>This method parses until an end "vibration-effect" or "vibration-select" tag (depending
+ * on the start tag found at the start of parsing). After a successful parsing, the parser
+ * will point to the end tag.
*
* @throws IOException error parsing from given {@link TypedXmlPullParser}.
* @throws VibrationXmlParserException if the XML tag cannot be parsed into a
@@ -308,7 +308,7 @@ public final class VibrationXmlParser {
String tagName = parser.getName();
switch(tagName) {
- case XmlConstants.TAG_VIBRATION:
+ case XmlConstants.TAG_VIBRATION_EFFECT:
return new ParsedVibration(parseVibrationEffectInternal(parser, flags));
case XmlConstants.TAG_VIBRATION_SELECT:
return parseVibrationSelectInternal(parser, flags);
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index ff6ec29bb8ac..1a33b768a039 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2542,6 +2542,7 @@ public final class Settings {
* ComponentName)} and only use this action to start an activity if they return {@code false}.
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ @FlaggedApi(android.credentials.flags.Flags.FLAG_NEW_SETTINGS_INTENTS)
public static final String ACTION_CREDENTIAL_PROVIDER =
"android.settings.CREDENTIAL_PROVIDER";
@@ -8845,6 +8846,24 @@ public final class Settings {
"reduce_bright_colors_persist_across_reboots";
/**
+ * Setting that specifies whether Even Dimmer - a feature that allows the brightness
+ * slider to go below what the display can conventionally do, should be enabled.
+ *
+ * @hide
+ */
+ public static final String EVEN_DIMMER_ACTIVATED =
+ "even_dimmer_activated";
+
+ /**
+ * Setting that specifies which nits level Even Dimmer should allow the screen brightness
+ * to go down to.
+ *
+ * @hide
+ */
+ public static final String EVEN_DIMMER_MIN_NITS =
+ "even_dimmer_min_nits";
+
+ /**
* List of the enabled print services.
*
* N and beyond uses {@link #DISABLED_PRINT_SERVICES}. But this might be used in an upgrade
@@ -14975,6 +14994,38 @@ public final class Settings {
public static final String APP_OPS_CONSTANTS = "app_ops_constants";
/**
+ * Device Idle (Doze) specific settings.
+ * This is encoded as a key=value list, separated by commas. Ex:
+ *
+ * "inactive_to=60000,sensing_to=400000"
+ *
+ * The following keys are supported:
+ *
+ * <pre>
+ * inactive_to (long)
+ * sensing_to (long)
+ * motion_inactive_to (long)
+ * idle_after_inactive_to (long)
+ * idle_pending_to (long)
+ * max_idle_pending_to (long)
+ * idle_pending_factor (float)
+ * quick_doze_delay_to (long)
+ * idle_to (long)
+ * max_idle_to (long)
+ * idle_factor (float)
+ * min_time_to_alarm (long)
+ * max_temp_app_whitelist_duration (long)
+ * notification_whitelist_duration (long)
+ * </pre>
+ *
+ * <p>
+ * Type: string
+ * @hide
+ * @see com.android.server.DeviceIdleController.Constants
+ */
+ public static final String DEVICE_IDLE_CONSTANTS = "device_idle_constants";
+
+ /**
* Battery Saver specific settings
* This is encoded as a key=value list, separated by commas. Ex:
*
diff --git a/core/java/android/security/OWNERS b/core/java/android/security/OWNERS
index 33a67aed6023..533d459e532b 100644
--- a/core/java/android/security/OWNERS
+++ b/core/java/android/security/OWNERS
@@ -8,4 +8,4 @@ per-file *NetworkSecurityPolicy.java = file:net/OWNERS
per-file Confirmation*.java = file:/keystore/OWNERS
per-file FileIntegrityManager.java = file:platform/system/security:/fsverity/OWNERS
per-file IFileIntegrityService.aidl = file:platform/system/security:/fsverity/OWNERS
-per-file *.aconfig = victorhsieh@google.com
+per-file *.aconfig = victorhsieh@google.com,eranm@google.com
diff --git a/core/java/android/security/flags.aconfig b/core/java/android/security/flags.aconfig
index 0133bd822182..0dc04133e664 100644
--- a/core/java/android/security/flags.aconfig
+++ b/core/java/android/security/flags.aconfig
@@ -8,7 +8,7 @@ flag {
}
flag {
- name: "fix_unlocked_device_required_keys"
+ name: "fix_unlocked_device_required_keys_v2"
namespace: "hardware_backed_security"
description: "Fix bugs in behavior of UnlockedDeviceRequired keystore keys"
bug: "296464083"
diff --git a/core/java/android/service/controls/ControlsProviderService.java b/core/java/android/service/controls/ControlsProviderService.java
index 0272bb9842d6..5cbde9fed433 100644
--- a/core/java/android/service/controls/ControlsProviderService.java
+++ b/core/java/android/service/controls/ControlsProviderService.java
@@ -16,6 +16,8 @@
package android.service.controls;
import android.Manifest;
+import android.annotation.FlaggedApi;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
@@ -33,12 +35,15 @@ import android.os.Message;
import android.os.RemoteException;
import android.service.controls.actions.ControlAction;
import android.service.controls.actions.ControlActionWrapper;
+import android.service.controls.flags.Flags;
import android.service.controls.templates.ControlTemplate;
import android.text.TextUtils;
import android.util.Log;
import com.android.internal.util.Preconditions;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.concurrent.Flow.Publisher;
import java.util.concurrent.Flow.Subscriber;
@@ -82,6 +87,40 @@ public abstract class ControlsProviderService extends Service {
public static final String EXTRA_LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS =
"android.service.controls.extra.LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS";
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({CONTROLS_SURFACE_ACTIVITY_PANEL, CONTROLS_SURFACE_DREAM})
+ public @interface ControlsSurface {
+ }
+
+ /**
+ * Controls are being shown on the device controls activity panel.
+ */
+ @FlaggedApi(Flags.FLAG_HOME_PANEL_DREAM)
+ public static final int CONTROLS_SURFACE_ACTIVITY_PANEL = 0;
+
+ /**
+ * Controls are being shown as a dream, while the device is idle.
+ */
+ @FlaggedApi(Flags.FLAG_HOME_PANEL_DREAM)
+ public static final int CONTROLS_SURFACE_DREAM = 1;
+
+ /**
+ * Integer extra whose value specifies the surface which controls are being displayed on.
+ * <p>
+ * The possible values are:
+ * <ul>
+ * <li>{@link #CONTROLS_SURFACE_ACTIVITY_PANEL}
+ * <li>{@link #CONTROLS_SURFACE_DREAM}
+ * </ul>
+ *
+ * This is passed with the intent when the panel specified by {@link #META_DATA_PANEL_ACTIVITY}
+ * is launched.
+ */
+ @FlaggedApi(Flags.FLAG_HOME_PANEL_DREAM)
+ public static final String EXTRA_CONTROLS_SURFACE =
+ "android.service.controls.extra.CONTROLS_SURFACE";
+
/**
* @hide
*/
diff --git a/core/java/android/service/controls/flags/flags.aconfig b/core/java/android/service/controls/flags/flags.aconfig
new file mode 100644
index 000000000000..3a288440d362
--- /dev/null
+++ b/core/java/android/service/controls/flags/flags.aconfig
@@ -0,0 +1,8 @@
+package: "android.service.controls.flags"
+
+flag {
+ name: "home_panel_dream"
+ namespace: "systemui"
+ description: "Enables the home controls dream feature."
+ bug: "298025023"
+}
diff --git a/core/java/android/service/notification/NotificationRankingUpdate.java b/core/java/android/service/notification/NotificationRankingUpdate.java
index 2a4cbaf79a75..7660ed96d30e 100644
--- a/core/java/android/service/notification/NotificationRankingUpdate.java
+++ b/core/java/android/service/notification/NotificationRankingUpdate.java
@@ -15,7 +15,6 @@
*/
package android.service.notification;
-import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.app.Notification;
import android.os.Bundle;
@@ -26,6 +25,7 @@ import android.system.ErrnoException;
import android.system.OsConstants;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import java.nio.ByteBuffer;
@@ -75,10 +75,6 @@ public class NotificationRankingUpdate implements Parcelable {
}
// We only need read-only access to the shared memory region.
buffer = mRankingMapFd.mapReadOnly();
- if (buffer == null) {
- mRankingMap = null;
- return;
- }
byte[] payload = new byte[buffer.remaining()];
buffer.get(payload);
mapParcel.unmarshall(payload, 0, payload.length);
@@ -98,7 +94,7 @@ public class NotificationRankingUpdate implements Parcelable {
} finally {
mapParcel.recycle();
if (buffer != null && mRankingMapFd != null) {
- mRankingMapFd.unmap(buffer);
+ SharedMemory.unmap(buffer);
mRankingMapFd.close();
}
}
@@ -210,6 +206,7 @@ public class NotificationRankingUpdate implements Parcelable {
new NotificationListenerService.Ranking[0]
)
);
+ ByteBuffer buffer = null;
try {
// Parcels the ranking map and measures its size.
@@ -217,13 +214,10 @@ public class NotificationRankingUpdate implements Parcelable {
int mapSize = mapParcel.dataSize();
// Creates a new SharedMemory object with enough space to hold the ranking map.
- SharedMemory mRankingMapFd = SharedMemory.create(mSharedMemoryName, mapSize);
- if (mRankingMapFd == null) {
- return;
- }
+ mRankingMapFd = SharedMemory.create(mSharedMemoryName, mapSize);
// Gets a read/write buffer mapping the entire shared memory region.
- final ByteBuffer buffer = mRankingMapFd.mapReadWrite();
+ buffer = mRankingMapFd.mapReadWrite();
// Puts the ranking map into the shared memory region buffer.
buffer.put(mapParcel.marshall(), 0, mapSize);
// Protects the region from being written to, by setting it to be read-only.
@@ -238,6 +232,12 @@ public class NotificationRankingUpdate implements Parcelable {
throw new RuntimeException(e);
} finally {
mapParcel.recycle();
+ // To prevent memory leaks, we can close the ranking map fd here.
+ // This is safe to do because a reference to this still exists.
+ if (buffer != null && mRankingMapFd != null) {
+ SharedMemory.unmap(buffer);
+ mRankingMapFd.close();
+ }
}
} else {
out.writeParcelable(mRankingMap, flags);
@@ -247,7 +247,7 @@ public class NotificationRankingUpdate implements Parcelable {
/**
* @hide
*/
- public static final @android.annotation.NonNull Parcelable.Creator<NotificationRankingUpdate> CREATOR
+ public static final @NonNull Parcelable.Creator<NotificationRankingUpdate> CREATOR
= new Parcelable.Creator<NotificationRankingUpdate>() {
public NotificationRankingUpdate createFromParcel(Parcel parcel) {
return new NotificationRankingUpdate(parcel);
diff --git a/core/java/android/service/notification/NotificationStats.java b/core/java/android/service/notification/NotificationStats.java
index e5ad85cb526f..07367df7bc91 100644
--- a/core/java/android/service/notification/NotificationStats.java
+++ b/core/java/android/service/notification/NotificationStats.java
@@ -15,10 +15,12 @@
*/
package android.service.notification;
+import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.app.Flags;
import android.app.RemoteInput;
import android.os.Parcel;
import android.os.Parcelable;
@@ -36,6 +38,7 @@ public final class NotificationStats implements Parcelable {
private boolean mSeen;
private boolean mExpanded;
private boolean mDirectReplied;
+ private boolean mSmartReplied;
private boolean mSnoozed;
private boolean mViewedSettings;
private boolean mInteracted;
@@ -125,6 +128,9 @@ public final class NotificationStats implements Parcelable {
mSeen = in.readByte() != 0;
mExpanded = in.readByte() != 0;
mDirectReplied = in.readByte() != 0;
+ if (Flags.lifetimeExtensionRefactor()) {
+ mSmartReplied = in.readByte() != 0;
+ }
mSnoozed = in.readByte() != 0;
mViewedSettings = in.readByte() != 0;
mInteracted = in.readByte() != 0;
@@ -137,6 +143,9 @@ public final class NotificationStats implements Parcelable {
dest.writeByte((byte) (mSeen ? 1 : 0));
dest.writeByte((byte) (mExpanded ? 1 : 0));
dest.writeByte((byte) (mDirectReplied ? 1 : 0));
+ if (Flags.lifetimeExtensionRefactor()) {
+ dest.writeByte((byte) (mSmartReplied ? 1 : 0));
+ }
dest.writeByte((byte) (mSnoozed ? 1 : 0));
dest.writeByte((byte) (mViewedSettings ? 1 : 0));
dest.writeByte((byte) (mInteracted ? 1 : 0));
@@ -210,6 +219,23 @@ public final class NotificationStats implements Parcelable {
}
/**
+ * Returns whether the user has replied to a notification that has a smart reply at least once.
+ */
+ @FlaggedApi(Flags.FLAG_LIFETIME_EXTENSION_REFACTOR)
+ public boolean hasSmartReplied() {
+ return mSmartReplied;
+ }
+
+ /**
+ * Records that the user has replied to a notification that has a smart reply at least once.
+ */
+ @FlaggedApi(Flags.FLAG_LIFETIME_EXTENSION_REFACTOR)
+ public void setSmartReplied() {
+ mSmartReplied = true;
+ mInteracted = true;
+ }
+
+ /**
* Returns whether the user has snoozed this notification at least once.
*/
public boolean hasSnoozed() {
@@ -286,6 +312,9 @@ public final class NotificationStats implements Parcelable {
if (mSeen != that.mSeen) return false;
if (mExpanded != that.mExpanded) return false;
if (mDirectReplied != that.mDirectReplied) return false;
+ if (Flags.lifetimeExtensionRefactor()) {
+ if (mSmartReplied != that.mSmartReplied) return false;
+ }
if (mSnoozed != that.mSnoozed) return false;
if (mViewedSettings != that.mViewedSettings) return false;
if (mInteracted != that.mInteracted) return false;
@@ -297,6 +326,9 @@ public final class NotificationStats implements Parcelable {
int result = (mSeen ? 1 : 0);
result = 31 * result + (mExpanded ? 1 : 0);
result = 31 * result + (mDirectReplied ? 1 : 0);
+ if (Flags.lifetimeExtensionRefactor()) {
+ result = 31 * result + (mSmartReplied ? 1 : 0);
+ }
result = 31 * result + (mSnoozed ? 1 : 0);
result = 31 * result + (mViewedSettings ? 1 : 0);
result = 31 * result + (mInteracted ? 1 : 0);
@@ -311,6 +343,9 @@ public final class NotificationStats implements Parcelable {
sb.append("mSeen=").append(mSeen);
sb.append(", mExpanded=").append(mExpanded);
sb.append(", mDirectReplied=").append(mDirectReplied);
+ if (Flags.lifetimeExtensionRefactor()) {
+ sb.append(", mSmartReplied=").append(mSmartReplied);
+ }
sb.append(", mSnoozed=").append(mSnoozed);
sb.append(", mViewedSettings=").append(mViewedSettings);
sb.append(", mInteracted=").append(mInteracted);
diff --git a/core/java/android/service/timezone/TEST_MAPPING b/core/java/android/service/timezone/TEST_MAPPING
index e5910ea4a1fa..bf46ff2ffe06 100644
--- a/core/java/android/service/timezone/TEST_MAPPING
+++ b/core/java/android/service/timezone/TEST_MAPPING
@@ -7,10 +7,7 @@
"include-filter": "android.service."
}
]
- }
- ],
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ },
{
"name": "CtsLocationTimeZoneManagerHostTest"
}
diff --git a/core/java/android/service/voice/HotwordDetectionServiceFailure.java b/core/java/android/service/voice/HotwordDetectionServiceFailure.java
index 420dac185cb4..c8b60c4ba0ae 100644
--- a/core/java/android/service/voice/HotwordDetectionServiceFailure.java
+++ b/core/java/android/service/voice/HotwordDetectionServiceFailure.java
@@ -89,6 +89,11 @@ public final class HotwordDetectionServiceFailure implements Parcelable {
@FlaggedApi(Flags.FLAG_ALLOW_TRAINING_DATA_EGRESS_FROM_HDS)
public static final int ERROR_CODE_ON_TRAINING_DATA_SECURITY_EXCEPTION = 9;
+ /** Indicates shutdown of {@link HotwordDetectionService} due to voice activation op being
+ * disabled. */
+ @FlaggedApi(Flags.FLAG_ALLOW_TRAINING_DATA_EGRESS_FROM_HDS)
+ public static final int ERROR_CODE_SHUTDOWN_HDS_ON_VOICE_ACTIVATION_OP_DISABLED = 10;
+
/**
* @hide
*/
@@ -100,7 +105,10 @@ public final class HotwordDetectionServiceFailure implements Parcelable {
ERROR_CODE_DETECT_TIMEOUT,
ERROR_CODE_ON_DETECTED_SECURITY_EXCEPTION,
ERROR_CODE_ON_DETECTED_STREAM_COPY_FAILURE,
- ERROR_CODE_REMOTE_EXCEPTION
+ ERROR_CODE_REMOTE_EXCEPTION,
+ ERROR_CODE_ON_TRAINING_DATA_EGRESS_LIMIT_EXCEEDED,
+ ERROR_CODE_ON_TRAINING_DATA_SECURITY_EXCEPTION,
+ ERROR_CODE_SHUTDOWN_HDS_ON_VOICE_ACTIVATION_OP_DISABLED,
})
@Retention(RetentionPolicy.SOURCE)
public @interface HotwordDetectionServiceErrorCode {}
diff --git a/core/java/android/speech/SpeechRecognizer.java b/core/java/android/speech/SpeechRecognizer.java
index e6fcc0c391b2..388f08a92c95 100644
--- a/core/java/android/speech/SpeechRecognizer.java
+++ b/core/java/android/speech/SpeechRecognizer.java
@@ -28,31 +28,15 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
-import android.os.Binder;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.CloseGuard;
-import android.util.Log;
-import android.util.Slog;
import com.android.internal.R;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.Reference;
import java.util.List;
-import java.util.Objects;
-import java.util.Queue;
import java.util.concurrent.Executor;
-import java.util.concurrent.LinkedBlockingQueue;
/**
* This class provides access to the speech recognition service. This service allows access to the
@@ -72,11 +56,6 @@ import java.util.concurrent.LinkedBlockingQueue;
* permission to use this class.
*/
public class SpeechRecognizer {
- /** DEBUG value to enable verbose debug prints */
- private static final boolean DBG = false;
-
- /** Log messages identifier */
- private static final String TAG = "SpeechRecognizer";
/**
* Key used to retrieve an {@code ArrayList<String>} from the {@link Bundle} passed to the
@@ -303,106 +282,17 @@ public class SpeechRecognizer {
private static final int MSG_CHECK_RECOGNITION_SUPPORT = 6;
private static final int MSG_TRIGGER_MODEL_DOWNLOAD = 7;
- /** The actual RecognitionService endpoint */
- private IRecognitionService mService;
-
- private final CloseGuard mCloseGuard = new CloseGuard();
-
- /** Context with which the manager was created */
- private final Context mContext;
-
- /** Component to direct service intent to */
- private final ComponentName mServiceComponent;
-
- /** Whether to use on-device speech recognizer. */
- private final boolean mOnDevice;
-
- private IRecognitionServiceManager mManagerService;
-
- /** Handler that will execute the main tasks */
- private Handler mHandler = new Handler(Looper.getMainLooper()) {
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_START:
- handleStartListening((Intent) msg.obj);
- break;
- case MSG_STOP:
- handleStopMessage();
- break;
- case MSG_CANCEL:
- handleCancelMessage();
- break;
- case MSG_CHANGE_LISTENER:
- handleChangeListener((RecognitionListener) msg.obj);
- break;
- case MSG_SET_TEMPORARY_ON_DEVICE_COMPONENT:
- handleSetTemporaryComponent((ComponentName) msg.obj);
- break;
- case MSG_CHECK_RECOGNITION_SUPPORT:
- CheckRecognitionSupportArgs args = (CheckRecognitionSupportArgs) msg.obj;
- handleCheckRecognitionSupport(
- args.mIntent, args.mCallbackExecutor, args.mCallback);
- break;
- case MSG_TRIGGER_MODEL_DOWNLOAD:
- ModelDownloadListenerArgs modelDownloadListenerArgs =
- (ModelDownloadListenerArgs) msg.obj;
- handleTriggerModelDownload(
- modelDownloadListenerArgs.mIntent,
- modelDownloadListenerArgs.mExecutor,
- modelDownloadListenerArgs.mModelDownloadListener);
- break;
- }
- }
- };
-
- /**
- * Temporary queue, saving the messages until the connection will be established, afterwards,
- * only mHandler will receive the messages
- */
- private final Queue<Message> mPendingTasks = new LinkedBlockingQueue<>();
-
- /** The Listener that will receive all the callbacks */
- private final InternalRecognitionListener mListener = new InternalRecognitionListener();
-
- private final IBinder mClientToken = new Binder();
-
- /**
- * The right way to create a {@code SpeechRecognizer} is by using
- * {@link #createSpeechRecognizer} static factory method
- */
- private SpeechRecognizer(final Context context, final ComponentName serviceComponent) {
- this(context, serviceComponent, false);
- }
-
- /**
- * The right way to create a {@code SpeechRecognizer} is by using
- * {@link #createOnDeviceSpeechRecognizer} static factory method
- */
- private SpeechRecognizer(final Context context, boolean onDevice) {
- this(context, null, onDevice);
- }
-
- private SpeechRecognizer(
- final Context context,
- final ComponentName serviceComponent,
- final boolean onDevice) {
- mContext = context;
- mServiceComponent = serviceComponent;
- mOnDevice = onDevice;
- mCloseGuard.open("SpeechRecognizer#destroy()");
- }
+ SpeechRecognizer() { }
/**
* Checks whether a speech recognition service is available on the system. If this method
* returns {@code false}, {@link SpeechRecognizer#createSpeechRecognizer(Context)} will
* fail.
- *
+ *
* @param context with which {@code SpeechRecognizer} will be created
* @return {@code true} if recognition is available, {@code false} otherwise
*/
- public static boolean isRecognitionAvailable(@NonNull final Context context) {
+ public static boolean isRecognitionAvailable(@NonNull Context context) {
// TODO(b/176578753): make sure this works well with system speech recognizers.
final List<ResolveInfo> list = context.getPackageManager().queryIntentServices(
new Intent(RecognitionService.SERVICE_INTERFACE), 0);
@@ -418,7 +308,7 @@ public class SpeechRecognizer {
* @param context with which on-device {@code SpeechRecognizer} will be created
* @return {@code true} if on-device recognition is available, {@code false} otherwise
*/
- public static boolean isOnDeviceRecognitionAvailable(@NonNull final Context context) {
+ public static boolean isOnDeviceRecognitionAvailable(@NonNull Context context) {
ComponentName componentName =
ComponentName.unflattenFromString(
context.getString(R.string.config_defaultOnDeviceSpeechRecognitionService));
@@ -449,7 +339,7 @@ public class SpeechRecognizer {
* @return a new {@code SpeechRecognizer}
*/
@MainThread
- public static SpeechRecognizer createSpeechRecognizer(final Context context) {
+ public static SpeechRecognizer createSpeechRecognizer(Context context) {
return createSpeechRecognizer(context, null);
}
@@ -483,19 +373,19 @@ public class SpeechRecognizer {
* </queries>
* }</pre>
*
- * @param context in which to create {@code SpeechRecognizer}
+ * @param context in which to create {@code SpeechRecognizer}
* @param serviceComponent the {@link ComponentName} of a specific service to direct this
- * {@code SpeechRecognizer} to
+ * {@code SpeechRecognizer} to
* @return a new {@code SpeechRecognizer}
*/
@MainThread
- public static SpeechRecognizer createSpeechRecognizer(final Context context,
- final ComponentName serviceComponent) {
+ public static SpeechRecognizer createSpeechRecognizer(Context context,
+ ComponentName serviceComponent) {
if (context == null) {
throw new IllegalArgumentException("Context cannot be null");
}
- checkIsCalledFromMainThread();
- return new SpeechRecognizer(context, serviceComponent);
+ SpeechRecognizerImpl.checkIsCalledFromMainThread();
+ return wrapWithProxy(new SpeechRecognizerImpl(context, serviceComponent));
}
/**
@@ -515,11 +405,15 @@ public class SpeechRecognizer {
*/
@NonNull
@MainThread
- public static SpeechRecognizer createOnDeviceSpeechRecognizer(@NonNull final Context context) {
+ public static SpeechRecognizer createOnDeviceSpeechRecognizer(@NonNull Context context) {
if (!isOnDeviceRecognitionAvailable(context)) {
throw new UnsupportedOperationException("On-device recognition is not available");
}
- return lenientlyCreateOnDeviceSpeechRecognizer(context);
+ return wrapWithProxy(SpeechRecognizerImpl.lenientlyCreateOnDeviceSpeechRecognizer(context));
+ }
+
+ private static SpeechRecognizer wrapWithProxy(SpeechRecognizer delegate) {
+ return new SpeechRecognizerProxy(delegate);
}
/**
@@ -532,42 +426,21 @@ public class SpeechRecognizer {
@NonNull
@MainThread
public static SpeechRecognizer createOnDeviceTestingSpeechRecognizer(
- @NonNull final Context context) {
- return lenientlyCreateOnDeviceSpeechRecognizer(context);
- }
-
- @NonNull
- @MainThread
- private static SpeechRecognizer lenientlyCreateOnDeviceSpeechRecognizer(
- @NonNull final Context context) {
- if (context == null) {
- throw new IllegalArgumentException("Context cannot be null");
- }
- checkIsCalledFromMainThread();
- return new SpeechRecognizer(context, /* onDevice */ true);
+ @NonNull Context context) {
+ return wrapWithProxy(SpeechRecognizerImpl.lenientlyCreateOnDeviceSpeechRecognizer(context));
}
/**
* Sets the listener that will receive all the callbacks. The previous unfinished commands will
* be executed with the old listener, while any following command will be executed with the new
* listener.
- *
+ *
* @param listener listener that will receive all the callbacks from the created
- * {@link SpeechRecognizer}, this must not be null.
+ * {@link SpeechRecognizer}, this must not be null.
*/
@MainThread
public void setRecognitionListener(RecognitionListener listener) {
- checkIsCalledFromMainThread();
- if (mListener.mInternalListener == null) {
- // This shortcut is needed because otherwise, if there's an error connecting, it never
- // gets delivered. I.e., the onSuccess callback set up in connectToSystemService does
- // not get called, MSG_CHANGE_LISTENER does not get executed, so the onError in the same
- // place does not get forwarded anywhere.
- // Thread-wise, this is safe as both this method and the handler are on the UI thread.
- handleChangeListener(listener);
- } else {
- putMessage(Message.obtain(mHandler, MSG_CHANGE_LISTENER, listener));
- }
+ throw new UnsupportedOperationException();
}
/**
@@ -576,28 +449,13 @@ public class SpeechRecognizer {
* no notifications will be received.
*
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
- * may also contain optional extras, see {@link RecognizerIntent}. If these values are
- * not set explicitly, default values will be used by the recognizer.
+ * may also contain optional extras, see {@link RecognizerIntent}. If
+ * these values are not set explicitly, default values will be used by
+ * the recognizer.
*/
@MainThread
- public void startListening(final Intent recognizerIntent) {
- if (recognizerIntent == null) {
- throw new IllegalArgumentException("intent must not be null");
- }
- checkIsCalledFromMainThread();
-
- if (DBG) {
- Slog.i(TAG, "#startListening called");
- if (mService == null) {
- Slog.i(TAG, "Connection is not established yet");
- }
- }
-
- if (mService == null) {
- // First time connection: first establish a connection, then dispatch #startListening.
- connectToSystemService();
- }
- putMessage(Message.obtain(mHandler, MSG_START, recognizerIntent));
+ public void startListening(Intent recognizerIntent) {
+ throw new UnsupportedOperationException();
}
/**
@@ -621,16 +479,7 @@ public class SpeechRecognizer {
*/
@MainThread
public void stopListening() {
- checkIsCalledFromMainThread();
-
- if (DBG) {
- Slog.i(TAG, "#stopListening called");
- if (mService == null) {
- Slog.i(TAG, "Connection is not established yet");
- }
- }
-
- putMessage(Message.obtain(mHandler, MSG_STOP));
+ throw new UnsupportedOperationException();
}
/**
@@ -640,8 +489,7 @@ public class SpeechRecognizer {
*/
@MainThread
public void cancel() {
- checkIsCalledFromMainThread();
- putMessage(Message.obtain(mHandler, MSG_CANCEL));
+ throw new UnsupportedOperationException();
}
/**
@@ -649,30 +497,15 @@ public class SpeechRecognizer {
* {@link SpeechRecognizer#startListening(Intent)}.
*
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
- * may also contain optional extras. See {@link RecognizerIntent} for the list of
- * supported extras, any unlisted extra might be ignored.
- * @param supportListener the listener on which to receive the support query results.
+ * may also contain optional extras. See {@link RecognizerIntent} for
+ * the list of supported extras, any unlisted extra might be ignored.
+ * @param supportListener the listener on which to receive the support query results.
*/
public void checkRecognitionSupport(
@NonNull Intent recognizerIntent,
@NonNull @CallbackExecutor Executor executor,
@NonNull RecognitionSupportCallback supportListener) {
- Objects.requireNonNull(recognizerIntent, "intent must not be null");
- Objects.requireNonNull(supportListener, "listener must not be null");
-
- if (DBG) {
- Slog.i(TAG, "#checkRecognitionSupport called");
- if (mService == null) {
- Slog.i(TAG, "Connection is not established yet");
- }
- }
-
- if (mService == null) {
- // First time connection: first establish a connection, then dispatch.
- connectToSystemService();
- }
- putMessage(Message.obtain(mHandler, MSG_CHECK_RECOGNITION_SUPPORT,
- new CheckRecognitionSupportArgs(recognizerIntent, executor, supportListener)));
+ throw new UnsupportedOperationException();
}
/**
@@ -681,23 +514,10 @@ public class SpeechRecognizer {
* {@link #checkRecognitionSupport(Intent, Executor, RecognitionSupportCallback)}.
*
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
- * may also contain optional extras, see {@link RecognizerIntent}.
+ * may also contain optional extras, see {@link RecognizerIntent}.
*/
public void triggerModelDownload(@NonNull Intent recognizerIntent) {
- Objects.requireNonNull(recognizerIntent, "intent must not be null");
- if (DBG) {
- Slog.i(TAG, "#triggerModelDownload without a listener called");
- if (mService == null) {
- Slog.i(TAG, "Connection is not established yet");
- }
- }
- if (mService == null) {
- // First time connection: first establish a connection, then dispatch.
- connectToSystemService();
- }
- putMessage(Message.obtain(
- mHandler, MSG_TRIGGER_MODEL_DOWNLOAD,
- new ModelDownloadListenerArgs(recognizerIntent, null, null)));
+ throw new UnsupportedOperationException();
}
/**
@@ -725,28 +545,15 @@ public class SpeechRecognizer {
* {@link ModelDownloadListener#onError(int)} will be called.
*
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
- * may also contain optional extras, see {@link RecognizerIntent}.
- * @param executor for dispatching listener callbacks
- * @param listener on which to receive updates about the model download request.
+ * may also contain optional extras, see {@link RecognizerIntent}.
+ * @param executor for dispatching listener callbacks
+ * @param listener on which to receive updates about the model download request.
*/
public void triggerModelDownload(
@NonNull Intent recognizerIntent,
@NonNull @CallbackExecutor Executor executor,
@NonNull ModelDownloadListener listener) {
- Objects.requireNonNull(recognizerIntent, "intent must not be null");
- if (DBG) {
- Slog.i(TAG, "#triggerModelDownload with a listener called");
- if (mService == null) {
- Slog.i(TAG, "Connection is not established yet");
- }
- }
- if (mService == null) {
- // First time connection: first establish a connection, then dispatch.
- connectToSystemService();
- }
- putMessage(Message.obtain(
- mHandler, MSG_TRIGGER_MODEL_DOWNLOAD,
- new ModelDownloadListenerArgs(recognizerIntent, executor, listener)));
+ throw new UnsupportedOperationException();
}
/**
@@ -755,479 +562,19 @@ public class SpeechRecognizer {
* <p>This is only expected to be called in tests, system would reject calls from client apps.
*
* @param componentName name of the component to set temporary replace speech recognizer. {@code
- * null} value resets the recognizer to default.
- *
+ * null} value resets the recognizer to default.
* @hide
*/
@TestApi
@RequiresPermission(Manifest.permission.MANAGE_SPEECH_RECOGNITION)
public void setTemporaryOnDeviceRecognizer(@Nullable ComponentName componentName) {
- mHandler.sendMessage(
- Message.obtain(mHandler, MSG_SET_TEMPORARY_ON_DEVICE_COMPONENT, componentName));
- }
-
- private static void checkIsCalledFromMainThread() {
- if (Looper.myLooper() != Looper.getMainLooper()) {
- throw new RuntimeException(
- "SpeechRecognizer should be used only from the application's main thread");
- }
- }
-
- private void putMessage(Message msg) {
- if (mService == null) {
- mPendingTasks.offer(msg);
- } else {
- mHandler.sendMessage(msg);
- }
- }
-
- /** sends the actual message to the service */
- private void handleStartListening(Intent recognizerIntent) {
- if (!checkOpenConnection()) {
- return;
- }
- try {
- mService.startListening(recognizerIntent, mListener, mContext.getAttributionSource());
- if (DBG) Log.d(TAG, "service start listening command succeeded");
- } catch (final Exception e) {
- Log.e(TAG, "startListening() failed", e);
- mListener.onError(ERROR_CLIENT);
- }
- }
-
- /** sends the actual message to the service */
- private void handleStopMessage() {
- if (!checkOpenConnection()) {
- return;
- }
- try {
- mService.stopListening(mListener);
- if (DBG) Log.d(TAG, "service stop listening command succeeded");
- } catch (final Exception e) {
- Log.e(TAG, "stopListening() failed", e);
- mListener.onError(ERROR_CLIENT);
- }
- }
-
- /** sends the actual message to the service */
- private void handleCancelMessage() {
- if (!checkOpenConnection()) {
- return;
- }
- try {
- mService.cancel(mListener, /*isShutdown*/ false);
- if (DBG) Log.d(TAG, "service cancel command succeeded");
- } catch (final Exception e) {
- Log.e(TAG, "cancel() failed", e);
- mListener.onError(ERROR_CLIENT);
- }
- }
-
- private void handleSetTemporaryComponent(ComponentName componentName) {
- if (DBG) {
- Log.d(TAG, "handleSetTemporaryComponent, componentName=" + componentName);
- }
-
- if (!maybeInitializeManagerService()) {
- return;
- }
-
- try {
- mManagerService.setTemporaryComponent(componentName);
- } catch (final RemoteException e) {
- e.rethrowFromSystemServer();
- }
- }
-
- private void handleCheckRecognitionSupport(
- Intent recognizerIntent,
- Executor callbackExecutor,
- RecognitionSupportCallback recognitionSupportCallback) {
- if (!maybeInitializeManagerService() || !checkOpenConnection()) {
- return;
- }
- try {
- mService.checkRecognitionSupport(
- recognizerIntent,
- mContext.getAttributionSource(),
- new InternalSupportCallback(callbackExecutor, recognitionSupportCallback));
- if (DBG) Log.d(TAG, "service support command succeeded");
- } catch (final Exception e) {
- Log.e(TAG, "checkRecognitionSupport() failed", e);
- callbackExecutor.execute(() -> recognitionSupportCallback.onError(ERROR_CLIENT));
- }
- }
-
- private void handleTriggerModelDownload(
- Intent recognizerIntent,
- @Nullable Executor callbackExecutor,
- @Nullable ModelDownloadListener modelDownloadListener) {
- if (!maybeInitializeManagerService() || !checkOpenConnection()) {
- return;
- }
-
- // Trigger model download without a listener.
- if (modelDownloadListener == null) {
- try {
- mService.triggerModelDownload(
- recognizerIntent, mContext.getAttributionSource(), null);
- if (DBG) Log.d(TAG, "triggerModelDownload() without a listener");
- } catch (final Exception e) {
- Log.e(TAG, "triggerModelDownload() without a listener failed", e);
- mListener.onError(ERROR_CLIENT);
- }
- }
- // Trigger model download with a listener.
- else {
- try {
- mService.triggerModelDownload(
- recognizerIntent, mContext.getAttributionSource(),
- new InternalModelDownloadListener(callbackExecutor, modelDownloadListener));
- if (DBG) Log.d(TAG, "triggerModelDownload() with a listener");
- } catch (final Exception e) {
- Log.e(TAG, "triggerModelDownload() with a listener failed", e);
- callbackExecutor.execute(() -> modelDownloadListener.onError(ERROR_CLIENT));
- }
- }
- }
-
- private boolean checkOpenConnection() {
- if (mService != null && mService.asBinder().isBinderAlive()) {
- return true;
- }
- mListener.onError(ERROR_CLIENT);
- Log.e(TAG, "not connected to the recognition service");
- return false;
- }
-
- /** changes the listener */
- private void handleChangeListener(RecognitionListener listener) {
- if (DBG) Log.d(TAG, "handleChangeListener, listener=" + listener);
- mListener.mInternalListener = listener;
- }
-
- /** Destroys the {@code SpeechRecognizer} object. */
- public void destroy() {
- try {
- if (mService != null) {
- try {
- mService.cancel(mListener, /*isShutdown*/ true);
- } catch (final Exception e) {
- // Not important
- }
- }
-
- mService = null;
- mPendingTasks.clear();
- mListener.mInternalListener = null;
- mCloseGuard.close();
- } finally {
- Reference.reachabilityFence(this);
- }
- }
-
- @Override
- protected void finalize() throws Throwable {
- try {
- mCloseGuard.warnIfOpen();
- destroy();
- } finally {
- super.finalize();
- }
- }
-
- /** Establishes a connection to system server proxy and initializes the session. */
- private void connectToSystemService() {
- if (!maybeInitializeManagerService()) {
- return;
- }
-
- ComponentName componentName = getSpeechRecognizerComponentName();
-
- if (!mOnDevice && componentName == null) {
- mListener.onError(ERROR_CLIENT);
- return;
- }
-
- try {
- mManagerService.createSession(
- componentName,
- mClientToken,
- mOnDevice,
- new IRecognitionServiceManagerCallback.Stub(){
- @Override
- public void onSuccess(IRecognitionService service) throws RemoteException {
- if (DBG) {
- Log.i(TAG, "Connected to speech recognition service");
- }
- mService = service;
- while (!mPendingTasks.isEmpty()) {
- mHandler.sendMessage(mPendingTasks.poll());
- }
- }
-
- @Override
- public void onError(int errorCode) throws RemoteException {
- Log.e(TAG, "Bind to system recognition service failed with error "
- + errorCode);
- mListener.onError(errorCode);
- }
- });
- } catch (RemoteException e) {
- e.rethrowFromSystemServer();
- }
- }
-
- private synchronized boolean maybeInitializeManagerService() {
- if (DBG) {
- Log.i(TAG, "#maybeInitializeManagerService found = " + mManagerService);
- }
- if (mManagerService != null) {
- return true;
- }
-
- IBinder service = ServiceManager.getService(Context.SPEECH_RECOGNITION_SERVICE);
- if (service == null && mOnDevice) {
- service = (IBinder) mContext.getSystemService(Context.SPEECH_RECOGNITION_SERVICE);
- }
- mManagerService = IRecognitionServiceManager.Stub.asInterface(service);
-
- if (mManagerService == null) {
- if (mListener != null) {
- mListener.onError(ERROR_CLIENT);
- }
- return false;
- }
- return true;
+ throw new UnsupportedOperationException();
}
/**
- * Returns the component name to be used for establishing a connection, based on the parameters
- * used during initialization.
- *
- * <p>Note the 3 different scenarios:
- * <ol>
- * <li>On-device speech recognizer which is determined by the manufacturer and not
- * changeable by the user
- * <li>Default user-selected speech recognizer as specified by
- * {@code Settings.Secure.VOICE_RECOGNITION_SERVICE}
- * <li>Custom speech recognizer supplied by the client.
+ * Destroys the {@code SpeechRecognizer} object.
*/
- private ComponentName getSpeechRecognizerComponentName() {
- if (mOnDevice) {
- return null;
- }
-
- if (mServiceComponent != null) {
- return mServiceComponent;
- }
-
- String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(),
- Settings.Secure.VOICE_RECOGNITION_SERVICE);
-
- if (TextUtils.isEmpty(serviceComponent)) {
- Log.e(TAG, "no selected voice recognition service");
- mListener.onError(ERROR_CLIENT);
- return null;
- }
-
- return ComponentName.unflattenFromString(serviceComponent);
- }
-
- private static class CheckRecognitionSupportArgs {
- final Intent mIntent;
- final Executor mCallbackExecutor;
- final RecognitionSupportCallback mCallback;
-
- private CheckRecognitionSupportArgs(
- Intent intent,
- Executor callbackExecutor,
- RecognitionSupportCallback callback) {
- mIntent = intent;
- mCallbackExecutor = callbackExecutor;
- mCallback = callback;
- }
- }
-
- private static class ModelDownloadListenerArgs {
- final Intent mIntent;
- final Executor mExecutor;
- final ModelDownloadListener mModelDownloadListener;
-
- private ModelDownloadListenerArgs(Intent intent, Executor executor,
- ModelDownloadListener modelDownloadListener) {
- mIntent = intent;
- mExecutor = executor;
- mModelDownloadListener = modelDownloadListener;
- }
- }
-
- /**
- * Internal wrapper of IRecognitionListener which will propagate the results to
- * RecognitionListener
- */
- private static class InternalRecognitionListener extends IRecognitionListener.Stub {
- private RecognitionListener mInternalListener;
-
- private static final int MSG_BEGINNING_OF_SPEECH = 1;
- private static final int MSG_BUFFER_RECEIVED = 2;
- private static final int MSG_END_OF_SPEECH = 3;
- private static final int MSG_ERROR = 4;
- private static final int MSG_READY_FOR_SPEECH = 5;
- private static final int MSG_RESULTS = 6;
- private static final int MSG_PARTIAL_RESULTS = 7;
- private static final int MSG_RMS_CHANGED = 8;
- private static final int MSG_ON_EVENT = 9;
- private static final int MSG_SEGMENT_RESULTS = 10;
- private static final int MSG_SEGMENT_END_SESSION = 11;
- private static final int MSG_LANGUAGE_DETECTION = 12;
-
- private final Handler mInternalHandler = new Handler(Looper.getMainLooper()) {
- @Override
- public void handleMessage(Message msg) {
- if (mInternalListener == null) {
- return;
- }
- switch (msg.what) {
- case MSG_BEGINNING_OF_SPEECH:
- mInternalListener.onBeginningOfSpeech();
- break;
- case MSG_BUFFER_RECEIVED:
- mInternalListener.onBufferReceived((byte[]) msg.obj);
- break;
- case MSG_END_OF_SPEECH:
- mInternalListener.onEndOfSpeech();
- break;
- case MSG_ERROR:
- mInternalListener.onError((Integer) msg.obj);
- break;
- case MSG_READY_FOR_SPEECH:
- mInternalListener.onReadyForSpeech((Bundle) msg.obj);
- break;
- case MSG_RESULTS:
- mInternalListener.onResults((Bundle) msg.obj);
- break;
- case MSG_PARTIAL_RESULTS:
- mInternalListener.onPartialResults((Bundle) msg.obj);
- break;
- case MSG_RMS_CHANGED:
- mInternalListener.onRmsChanged((Float) msg.obj);
- break;
- case MSG_ON_EVENT:
- mInternalListener.onEvent(msg.arg1, (Bundle) msg.obj);
- break;
- case MSG_SEGMENT_RESULTS:
- mInternalListener.onSegmentResults((Bundle) msg.obj);
- break;
- case MSG_SEGMENT_END_SESSION:
- mInternalListener.onEndOfSegmentedSession();
- break;
- case MSG_LANGUAGE_DETECTION:
- mInternalListener.onLanguageDetection((Bundle) msg.obj);
- break;
- }
- }
- };
-
- public void onBeginningOfSpeech() {
- Message.obtain(mInternalHandler, MSG_BEGINNING_OF_SPEECH).sendToTarget();
- }
-
- public void onBufferReceived(final byte[] buffer) {
- Message.obtain(mInternalHandler, MSG_BUFFER_RECEIVED, buffer).sendToTarget();
- }
-
- public void onEndOfSpeech() {
- Message.obtain(mInternalHandler, MSG_END_OF_SPEECH).sendToTarget();
- }
-
- public void onError(final int error) {
- Message.obtain(mInternalHandler, MSG_ERROR, error).sendToTarget();
- }
-
- public void onReadyForSpeech(final Bundle noiseParams) {
- Message.obtain(mInternalHandler, MSG_READY_FOR_SPEECH, noiseParams).sendToTarget();
- }
-
- public void onResults(final Bundle results) {
- Message.obtain(mInternalHandler, MSG_RESULTS, results).sendToTarget();
- }
-
- public void onPartialResults(final Bundle results) {
- Message.obtain(mInternalHandler, MSG_PARTIAL_RESULTS, results).sendToTarget();
- }
-
- public void onRmsChanged(final float rmsdB) {
- Message.obtain(mInternalHandler, MSG_RMS_CHANGED, rmsdB).sendToTarget();
- }
-
- public void onSegmentResults(final Bundle bundle) {
- Message.obtain(mInternalHandler, MSG_SEGMENT_RESULTS, bundle).sendToTarget();
- }
-
- public void onEndOfSegmentedSession() {
- Message.obtain(mInternalHandler, MSG_SEGMENT_END_SESSION).sendToTarget();
- }
-
- public void onLanguageDetection(final Bundle results) {
- Message.obtain(mInternalHandler, MSG_LANGUAGE_DETECTION, results).sendToTarget();
- }
-
- public void onEvent(final int eventType, final Bundle params) {
- Message.obtain(mInternalHandler, MSG_ON_EVENT, eventType, eventType, params)
- .sendToTarget();
- }
- }
-
- private static class InternalSupportCallback extends IRecognitionSupportCallback.Stub {
- private final Executor mExecutor;
- private final RecognitionSupportCallback mCallback;
-
- private InternalSupportCallback(Executor executor, RecognitionSupportCallback callback) {
- this.mExecutor = executor;
- this.mCallback = callback;
- }
-
- @Override
- public void onSupportResult(RecognitionSupport recognitionSupport) throws RemoteException {
- mExecutor.execute(() -> mCallback.onSupportResult(recognitionSupport));
- }
-
- @Override
- public void onError(int errorCode) throws RemoteException {
- mExecutor.execute(() -> mCallback.onError(errorCode));
- }
- }
-
- private static class InternalModelDownloadListener extends IModelDownloadListener.Stub {
- private final Executor mExecutor;
- private final ModelDownloadListener mModelDownloadListener;
-
- private InternalModelDownloadListener(
- Executor executor,
- @NonNull ModelDownloadListener modelDownloadListener) {
- mExecutor = executor;
- mModelDownloadListener = modelDownloadListener;
- }
-
- @Override
- public void onProgress(int completedPercent) throws RemoteException {
- mExecutor.execute(() -> mModelDownloadListener.onProgress(completedPercent));
- }
-
- @Override
- public void onSuccess() throws RemoteException {
- mExecutor.execute(() -> mModelDownloadListener.onSuccess());
- }
-
- @Override
- public void onScheduled() throws RemoteException {
- mExecutor.execute(() -> mModelDownloadListener.onScheduled());
- }
-
- @Override
- public void onError(int error) throws RemoteException {
- mExecutor.execute(() -> mModelDownloadListener.onError(error));
- }
+ public void destroy() {
+ throw new UnsupportedOperationException();
}
}
diff --git a/core/java/android/speech/SpeechRecognizerImpl.java b/core/java/android/speech/SpeechRecognizerImpl.java
new file mode 100644
index 000000000000..6c008743f07a
--- /dev/null
+++ b/core/java/android/speech/SpeechRecognizerImpl.java
@@ -0,0 +1,745 @@
+/*
+ * Copyright (C) 2010 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.speech;
+
+import android.Manifest;
+import android.annotation.CallbackExecutor;
+import android.annotation.MainThread;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.Slog;
+
+import java.util.Objects;
+import java.util.Queue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * @hide
+ */
+class SpeechRecognizerImpl extends SpeechRecognizer {
+ /** DEBUG value to enable verbose debug prints */
+ private static final boolean DBG = false;
+
+ /** Log messages identifier */
+ private static final String TAG = "SpeechRecognizer";
+
+ /** action codes */
+ private static final int MSG_START = 1;
+ private static final int MSG_STOP = 2;
+ private static final int MSG_CANCEL = 3;
+ private static final int MSG_CHANGE_LISTENER = 4;
+ private static final int MSG_SET_TEMPORARY_ON_DEVICE_COMPONENT = 5;
+ private static final int MSG_CHECK_RECOGNITION_SUPPORT = 6;
+ private static final int MSG_TRIGGER_MODEL_DOWNLOAD = 7;
+
+ /** The actual RecognitionService endpoint */
+ private IRecognitionService mService;
+
+ /** Context with which the manager was created */
+ private final Context mContext;
+
+ /** Component to direct service intent to */
+ private final ComponentName mServiceComponent;
+
+ /** Whether to use on-device speech recognizer. */
+ private final boolean mOnDevice;
+
+ private IRecognitionServiceManager mManagerService;
+
+ /** Handler that will execute the main tasks */
+ private Handler mHandler = new Handler(Looper.getMainLooper()) {
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_START:
+ handleStartListening((Intent) msg.obj);
+ break;
+ case MSG_STOP:
+ handleStopMessage();
+ break;
+ case MSG_CANCEL:
+ handleCancelMessage();
+ break;
+ case MSG_CHANGE_LISTENER:
+ handleChangeListener((RecognitionListener) msg.obj);
+ break;
+ case MSG_SET_TEMPORARY_ON_DEVICE_COMPONENT:
+ handleSetTemporaryComponent((ComponentName) msg.obj);
+ break;
+ case MSG_CHECK_RECOGNITION_SUPPORT:
+ CheckRecognitionSupportArgs args = (CheckRecognitionSupportArgs) msg.obj;
+ handleCheckRecognitionSupport(
+ args.mIntent, args.mCallbackExecutor, args.mCallback);
+ break;
+ case MSG_TRIGGER_MODEL_DOWNLOAD:
+ ModelDownloadListenerArgs modelDownloadListenerArgs =
+ (ModelDownloadListenerArgs) msg.obj;
+ handleTriggerModelDownload(
+ modelDownloadListenerArgs.mIntent,
+ modelDownloadListenerArgs.mExecutor,
+ modelDownloadListenerArgs.mModelDownloadListener);
+ break;
+ }
+ }
+ };
+
+ /**
+ * Temporary queue, saving the messages until the connection will be established, afterwards,
+ * only mHandler will receive the messages
+ */
+ private final Queue<Message> mPendingTasks = new LinkedBlockingQueue<>();
+
+ /** The Listener that will receive all the callbacks */
+ private final InternalRecognitionListener mListener = new InternalRecognitionListener();
+
+ private final IBinder mClientToken = new Binder();
+
+ /**
+ * The right way to create a {@code SpeechRecognizer} is by using
+ * {@link #createSpeechRecognizer} static factory method
+ */
+ /* package */ SpeechRecognizerImpl(
+ final Context context,
+ final ComponentName serviceComponent) {
+ this(context, serviceComponent, false);
+ }
+
+ /**
+ * The right way to create a {@code SpeechRecognizer} is by using
+ * {@link #createOnDeviceSpeechRecognizer} static factory method
+ */
+ /* package */ SpeechRecognizerImpl(final Context context, boolean onDevice) {
+ this(context, null, onDevice);
+ }
+
+ private SpeechRecognizerImpl(
+ final Context context,
+ final ComponentName serviceComponent,
+ final boolean onDevice) {
+ mContext = context;
+ mServiceComponent = serviceComponent;
+ mOnDevice = onDevice;
+ }
+
+ @NonNull
+ @MainThread
+ /* package */ static SpeechRecognizerImpl lenientlyCreateOnDeviceSpeechRecognizer(
+ @NonNull final Context context) {
+ if (context == null) {
+ throw new IllegalArgumentException("Context cannot be null");
+ }
+ checkIsCalledFromMainThread();
+ return new SpeechRecognizerImpl(context, /* onDevice */ true);
+ }
+
+ @Override
+ @MainThread
+ public void setRecognitionListener(RecognitionListener listener) {
+ checkIsCalledFromMainThread();
+ if (mListener.mInternalListener == null) {
+ // This shortcut is needed because otherwise, if there's an error connecting, it never
+ // gets delivered. I.e., the onSuccess callback set up in connectToSystemService does
+ // not get called, MSG_CHANGE_LISTENER does not get executed, so the onError in the same
+ // place does not get forwarded anywhere.
+ // Thread-wise, this is safe as both this method and the handler are on the UI thread.
+ handleChangeListener(listener);
+ } else {
+ putMessage(Message.obtain(mHandler, MSG_CHANGE_LISTENER, listener));
+ }
+ }
+
+ @Override
+ @MainThread
+ public void startListening(final Intent recognizerIntent) {
+ if (recognizerIntent == null) {
+ throw new IllegalArgumentException("intent must not be null");
+ }
+ checkIsCalledFromMainThread();
+
+ if (DBG) {
+ Slog.i(TAG, "#startListening called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+
+ if (mService == null) {
+ // First time connection: first establish a connection, then dispatch #startListening.
+ connectToSystemService();
+ }
+ putMessage(Message.obtain(mHandler, MSG_START, recognizerIntent));
+ }
+
+ @Override
+ @MainThread
+ public void stopListening() {
+ checkIsCalledFromMainThread();
+
+ if (DBG) {
+ Slog.i(TAG, "#stopListening called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+
+ putMessage(Message.obtain(mHandler, MSG_STOP));
+ }
+
+ @Override
+ @MainThread
+ public void cancel() {
+ checkIsCalledFromMainThread();
+ putMessage(Message.obtain(mHandler, MSG_CANCEL));
+ }
+
+ @Override
+ public void checkRecognitionSupport(
+ @NonNull Intent recognizerIntent,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull RecognitionSupportCallback supportListener) {
+ Objects.requireNonNull(recognizerIntent, "intent must not be null");
+ Objects.requireNonNull(supportListener, "listener must not be null");
+
+ if (DBG) {
+ Slog.i(TAG, "#checkRecognitionSupport called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+
+ if (mService == null) {
+ // First time connection: first establish a connection, then dispatch.
+ connectToSystemService();
+ }
+ putMessage(Message.obtain(mHandler, MSG_CHECK_RECOGNITION_SUPPORT,
+ new CheckRecognitionSupportArgs(recognizerIntent, executor, supportListener)));
+ }
+
+ @Override
+ public void triggerModelDownload(@NonNull Intent recognizerIntent) {
+ Objects.requireNonNull(recognizerIntent, "intent must not be null");
+ if (DBG) {
+ Slog.i(TAG, "#triggerModelDownload without a listener called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+ if (mService == null) {
+ // First time connection: first establish a connection, then dispatch.
+ connectToSystemService();
+ }
+ putMessage(Message.obtain(
+ mHandler, MSG_TRIGGER_MODEL_DOWNLOAD,
+ new ModelDownloadListenerArgs(recognizerIntent, null, null)));
+ }
+
+ @Override
+ public void triggerModelDownload(
+ @NonNull Intent recognizerIntent,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull ModelDownloadListener listener) {
+ Objects.requireNonNull(recognizerIntent, "intent must not be null");
+ if (DBG) {
+ Slog.i(TAG, "#triggerModelDownload with a listener called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+ if (mService == null) {
+ // First time connection: first establish a connection, then dispatch.
+ connectToSystemService();
+ }
+ putMessage(Message.obtain(
+ mHandler, MSG_TRIGGER_MODEL_DOWNLOAD,
+ new ModelDownloadListenerArgs(recognizerIntent, executor, listener)));
+ }
+
+ @Override
+ @RequiresPermission(Manifest.permission.MANAGE_SPEECH_RECOGNITION)
+ public void setTemporaryOnDeviceRecognizer(@Nullable ComponentName componentName) {
+ mHandler.sendMessage(
+ Message.obtain(mHandler, MSG_SET_TEMPORARY_ON_DEVICE_COMPONENT, componentName));
+ }
+
+ /* package */ static void checkIsCalledFromMainThread() {
+ if (Looper.myLooper() != Looper.getMainLooper()) {
+ throw new RuntimeException(
+ "SpeechRecognizer should be used only from the application's main thread");
+ }
+ }
+
+ private void putMessage(Message msg) {
+ if (mService == null) {
+ mPendingTasks.offer(msg);
+ } else {
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ /** sends the actual message to the service */
+ private void handleStartListening(Intent recognizerIntent) {
+ if (!checkOpenConnection()) {
+ return;
+ }
+ try {
+ mService.startListening(recognizerIntent, mListener, mContext.getAttributionSource());
+ if (DBG) Log.d(TAG, "service start listening command succeeded");
+ } catch (final Exception e) {
+ Log.e(TAG, "startListening() failed", e);
+ mListener.onError(ERROR_CLIENT);
+ }
+ }
+
+ /** sends the actual message to the service */
+ private void handleStopMessage() {
+ if (!checkOpenConnection()) {
+ return;
+ }
+ try {
+ mService.stopListening(mListener);
+ if (DBG) Log.d(TAG, "service stop listening command succeeded");
+ } catch (final Exception e) {
+ Log.e(TAG, "stopListening() failed", e);
+ mListener.onError(ERROR_CLIENT);
+ }
+ }
+
+ /** sends the actual message to the service */
+ private void handleCancelMessage() {
+ if (!checkOpenConnection()) {
+ return;
+ }
+ try {
+ mService.cancel(mListener, /*isShutdown*/ false);
+ if (DBG) Log.d(TAG, "service cancel command succeeded");
+ } catch (final Exception e) {
+ Log.e(TAG, "cancel() failed", e);
+ mListener.onError(ERROR_CLIENT);
+ }
+ }
+
+ private void handleSetTemporaryComponent(ComponentName componentName) {
+ if (DBG) {
+ Log.d(TAG, "handleSetTemporaryComponent, componentName=" + componentName);
+ }
+
+ if (!maybeInitializeManagerService()) {
+ return;
+ }
+
+ try {
+ mManagerService.setTemporaryComponent(componentName);
+ } catch (final RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ private void handleCheckRecognitionSupport(
+ Intent recognizerIntent,
+ Executor callbackExecutor,
+ RecognitionSupportCallback recognitionSupportCallback) {
+ if (!maybeInitializeManagerService() || !checkOpenConnection()) {
+ return;
+ }
+ try {
+ mService.checkRecognitionSupport(
+ recognizerIntent,
+ mContext.getAttributionSource(),
+ new InternalSupportCallback(callbackExecutor, recognitionSupportCallback));
+ if (DBG) Log.d(TAG, "service support command succeeded");
+ } catch (final Exception e) {
+ Log.e(TAG, "checkRecognitionSupport() failed", e);
+ callbackExecutor.execute(() -> recognitionSupportCallback.onError(ERROR_CLIENT));
+ }
+ }
+
+ private void handleTriggerModelDownload(
+ Intent recognizerIntent,
+ @Nullable Executor callbackExecutor,
+ @Nullable ModelDownloadListener modelDownloadListener) {
+ if (!maybeInitializeManagerService() || !checkOpenConnection()) {
+ return;
+ }
+
+ if (modelDownloadListener == null) {
+ // Trigger model download without a listener.
+ try {
+ mService.triggerModelDownload(
+ recognizerIntent, mContext.getAttributionSource(), null);
+ if (DBG) Log.d(TAG, "triggerModelDownload() without a listener");
+ } catch (final Exception e) {
+ Log.e(TAG, "triggerModelDownload() without a listener failed", e);
+ mListener.onError(ERROR_CLIENT);
+ }
+ } else {
+ // Trigger model download with a listener.
+ try {
+ mService.triggerModelDownload(
+ recognizerIntent, mContext.getAttributionSource(),
+ new InternalModelDownloadListener(callbackExecutor, modelDownloadListener));
+ if (DBG) Log.d(TAG, "triggerModelDownload() with a listener");
+ } catch (final Exception e) {
+ Log.e(TAG, "triggerModelDownload() with a listener failed", e);
+ callbackExecutor.execute(() -> modelDownloadListener.onError(ERROR_CLIENT));
+ }
+ }
+ }
+
+ private boolean checkOpenConnection() {
+ if (mService != null && mService.asBinder().isBinderAlive()) {
+ return true;
+ }
+ mListener.onError(ERROR_CLIENT);
+ Log.e(TAG, "not connected to the recognition service");
+ return false;
+ }
+
+ /** changes the listener */
+ private void handleChangeListener(RecognitionListener listener) {
+ if (DBG) Log.d(TAG, "handleChangeListener, listener=" + listener);
+ mListener.mInternalListener = listener;
+ }
+
+ @Override
+ public void destroy() {
+ if (mService != null) {
+ try {
+ mService.cancel(mListener, /*isShutdown*/ true);
+ } catch (final Exception e) {
+ // Not important
+ }
+ }
+
+ mService = null;
+ mPendingTasks.clear();
+ mListener.mInternalListener = null;
+ }
+
+ /** Establishes a connection to system server proxy and initializes the session. */
+ private void connectToSystemService() {
+ if (!maybeInitializeManagerService()) {
+ return;
+ }
+
+ ComponentName componentName = getSpeechRecognizerComponentName();
+
+ if (!mOnDevice && componentName == null) {
+ mListener.onError(ERROR_CLIENT);
+ return;
+ }
+
+ try {
+ mManagerService.createSession(
+ componentName,
+ mClientToken,
+ mOnDevice,
+ new IRecognitionServiceManagerCallback.Stub(){
+ @Override
+ public void onSuccess(IRecognitionService service) throws RemoteException {
+ if (DBG) {
+ Log.i(TAG, "Connected to speech recognition service");
+ }
+ mService = service;
+ while (!mPendingTasks.isEmpty()) {
+ mHandler.sendMessage(mPendingTasks.poll());
+ }
+ }
+
+ @Override
+ public void onError(int errorCode) throws RemoteException {
+ Log.e(TAG, "Bind to system recognition service failed with error "
+ + errorCode);
+ mListener.onError(errorCode);
+ }
+ });
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ private synchronized boolean maybeInitializeManagerService() {
+ if (DBG) {
+ Log.i(TAG, "#maybeInitializeManagerService found = " + mManagerService);
+ }
+ if (mManagerService != null) {
+ return true;
+ }
+
+ IBinder service = ServiceManager.getService(Context.SPEECH_RECOGNITION_SERVICE);
+ if (service == null && mOnDevice) {
+ service = (IBinder) mContext.getSystemService(Context.SPEECH_RECOGNITION_SERVICE);
+ }
+ mManagerService = IRecognitionServiceManager.Stub.asInterface(service);
+
+ if (mManagerService == null) {
+ if (mListener != null) {
+ mListener.onError(ERROR_CLIENT);
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Returns the component name to be used for establishing a connection, based on the parameters
+ * used during initialization.
+ *
+ * <p>Note the 3 different scenarios:
+ * <ol>
+ * <li>On-device speech recognizer which is determined by the manufacturer and not
+ * changeable by the user
+ * <li>Default user-selected speech recognizer as specified by
+ * {@code Settings.Secure.VOICE_RECOGNITION_SERVICE}
+ * <li>Custom speech recognizer supplied by the client.
+ * </ol>
+ */
+ @SuppressWarnings("NonUserGetterCalled")
+ private ComponentName getSpeechRecognizerComponentName() {
+ if (mOnDevice) {
+ return null;
+ }
+
+ if (mServiceComponent != null) {
+ return mServiceComponent;
+ }
+
+ String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(),
+ Settings.Secure.VOICE_RECOGNITION_SERVICE);
+
+ if (TextUtils.isEmpty(serviceComponent)) {
+ Log.e(TAG, "no selected voice recognition service");
+ mListener.onError(ERROR_CLIENT);
+ return null;
+ }
+
+ return ComponentName.unflattenFromString(serviceComponent);
+ }
+
+ private static class CheckRecognitionSupportArgs {
+ final Intent mIntent;
+ final Executor mCallbackExecutor;
+ final RecognitionSupportCallback mCallback;
+
+ private CheckRecognitionSupportArgs(
+ Intent intent,
+ Executor callbackExecutor,
+ RecognitionSupportCallback callback) {
+ mIntent = intent;
+ mCallbackExecutor = callbackExecutor;
+ mCallback = callback;
+ }
+ }
+
+ private static class ModelDownloadListenerArgs {
+ final Intent mIntent;
+ final Executor mExecutor;
+ final ModelDownloadListener mModelDownloadListener;
+
+ private ModelDownloadListenerArgs(Intent intent, Executor executor,
+ ModelDownloadListener modelDownloadListener) {
+ mIntent = intent;
+ mExecutor = executor;
+ mModelDownloadListener = modelDownloadListener;
+ }
+ }
+
+ /**
+ * Internal wrapper of IRecognitionListener which will propagate the results to
+ * RecognitionListener
+ */
+ private static class InternalRecognitionListener extends IRecognitionListener.Stub {
+ private RecognitionListener mInternalListener;
+
+ private static final int MSG_BEGINNING_OF_SPEECH = 1;
+ private static final int MSG_BUFFER_RECEIVED = 2;
+ private static final int MSG_END_OF_SPEECH = 3;
+ private static final int MSG_ERROR = 4;
+ private static final int MSG_READY_FOR_SPEECH = 5;
+ private static final int MSG_RESULTS = 6;
+ private static final int MSG_PARTIAL_RESULTS = 7;
+ private static final int MSG_RMS_CHANGED = 8;
+ private static final int MSG_ON_EVENT = 9;
+ private static final int MSG_SEGMENT_RESULTS = 10;
+ private static final int MSG_SEGMENT_END_SESSION = 11;
+ private static final int MSG_LANGUAGE_DETECTION = 12;
+
+ private final Handler mInternalHandler = new Handler(Looper.getMainLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ if (mInternalListener == null) {
+ return;
+ }
+ switch (msg.what) {
+ case MSG_BEGINNING_OF_SPEECH:
+ mInternalListener.onBeginningOfSpeech();
+ break;
+ case MSG_BUFFER_RECEIVED:
+ mInternalListener.onBufferReceived((byte[]) msg.obj);
+ break;
+ case MSG_END_OF_SPEECH:
+ mInternalListener.onEndOfSpeech();
+ break;
+ case MSG_ERROR:
+ mInternalListener.onError((Integer) msg.obj);
+ break;
+ case MSG_READY_FOR_SPEECH:
+ mInternalListener.onReadyForSpeech((Bundle) msg.obj);
+ break;
+ case MSG_RESULTS:
+ mInternalListener.onResults((Bundle) msg.obj);
+ break;
+ case MSG_PARTIAL_RESULTS:
+ mInternalListener.onPartialResults((Bundle) msg.obj);
+ break;
+ case MSG_RMS_CHANGED:
+ mInternalListener.onRmsChanged((Float) msg.obj);
+ break;
+ case MSG_ON_EVENT:
+ mInternalListener.onEvent(msg.arg1, (Bundle) msg.obj);
+ break;
+ case MSG_SEGMENT_RESULTS:
+ mInternalListener.onSegmentResults((Bundle) msg.obj);
+ break;
+ case MSG_SEGMENT_END_SESSION:
+ mInternalListener.onEndOfSegmentedSession();
+ break;
+ case MSG_LANGUAGE_DETECTION:
+ mInternalListener.onLanguageDetection((Bundle) msg.obj);
+ break;
+ }
+ }
+ };
+
+ public void onBeginningOfSpeech() {
+ Message.obtain(mInternalHandler, MSG_BEGINNING_OF_SPEECH).sendToTarget();
+ }
+
+ public void onBufferReceived(final byte[] buffer) {
+ Message.obtain(mInternalHandler, MSG_BUFFER_RECEIVED, buffer).sendToTarget();
+ }
+
+ public void onEndOfSpeech() {
+ Message.obtain(mInternalHandler, MSG_END_OF_SPEECH).sendToTarget();
+ }
+
+ public void onError(final int error) {
+ Message.obtain(mInternalHandler, MSG_ERROR, error).sendToTarget();
+ }
+
+ public void onReadyForSpeech(final Bundle noiseParams) {
+ Message.obtain(mInternalHandler, MSG_READY_FOR_SPEECH, noiseParams).sendToTarget();
+ }
+
+ public void onResults(final Bundle results) {
+ Message.obtain(mInternalHandler, MSG_RESULTS, results).sendToTarget();
+ }
+
+ public void onPartialResults(final Bundle results) {
+ Message.obtain(mInternalHandler, MSG_PARTIAL_RESULTS, results).sendToTarget();
+ }
+
+ public void onRmsChanged(final float rmsdB) {
+ Message.obtain(mInternalHandler, MSG_RMS_CHANGED, rmsdB).sendToTarget();
+ }
+
+ public void onSegmentResults(final Bundle bundle) {
+ Message.obtain(mInternalHandler, MSG_SEGMENT_RESULTS, bundle).sendToTarget();
+ }
+
+ public void onEndOfSegmentedSession() {
+ Message.obtain(mInternalHandler, MSG_SEGMENT_END_SESSION).sendToTarget();
+ }
+
+ public void onLanguageDetection(final Bundle results) {
+ Message.obtain(mInternalHandler, MSG_LANGUAGE_DETECTION, results).sendToTarget();
+ }
+
+ public void onEvent(final int eventType, final Bundle params) {
+ Message.obtain(mInternalHandler, MSG_ON_EVENT, eventType, eventType, params)
+ .sendToTarget();
+ }
+ }
+
+ private static class InternalSupportCallback extends IRecognitionSupportCallback.Stub {
+ private final Executor mExecutor;
+ private final RecognitionSupportCallback mCallback;
+
+ private InternalSupportCallback(Executor executor, RecognitionSupportCallback callback) {
+ this.mExecutor = executor;
+ this.mCallback = callback;
+ }
+
+ @Override
+ public void onSupportResult(RecognitionSupport recognitionSupport) throws RemoteException {
+ mExecutor.execute(() -> mCallback.onSupportResult(recognitionSupport));
+ }
+
+ @Override
+ public void onError(int errorCode) throws RemoteException {
+ mExecutor.execute(() -> mCallback.onError(errorCode));
+ }
+ }
+
+ private static class InternalModelDownloadListener extends IModelDownloadListener.Stub {
+ private final Executor mExecutor;
+ private final ModelDownloadListener mModelDownloadListener;
+
+ private InternalModelDownloadListener(
+ Executor executor,
+ @NonNull ModelDownloadListener modelDownloadListener) {
+ mExecutor = executor;
+ mModelDownloadListener = modelDownloadListener;
+ }
+
+ @Override
+ public void onProgress(int completedPercent) throws RemoteException {
+ mExecutor.execute(() -> mModelDownloadListener.onProgress(completedPercent));
+ }
+
+ @Override
+ public void onSuccess() throws RemoteException {
+ mExecutor.execute(() -> mModelDownloadListener.onSuccess());
+ }
+
+ @Override
+ public void onScheduled() throws RemoteException {
+ mExecutor.execute(() -> mModelDownloadListener.onScheduled());
+ }
+
+ @Override
+ public void onError(int error) throws RemoteException {
+ mExecutor.execute(() -> mModelDownloadListener.onError(error));
+ }
+ }
+}
diff --git a/core/java/android/speech/SpeechRecognizerProxy.java b/core/java/android/speech/SpeechRecognizerProxy.java
new file mode 100644
index 000000000000..be9be9a94538
--- /dev/null
+++ b/core/java/android/speech/SpeechRecognizerProxy.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2010 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.speech;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.util.CloseGuard;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.lang.ref.Reference;
+import java.util.concurrent.Executor;
+
+/**
+ * @hide
+ */
+class SpeechRecognizerProxy extends SpeechRecognizer {
+
+ private final CloseGuard mCloseGuard = new CloseGuard();
+
+ private final SpeechRecognizer mDelegate;
+
+ SpeechRecognizerProxy(final SpeechRecognizer delegate) {
+ mDelegate = delegate;
+ mCloseGuard.open("SpeechRecognizer#destroy()");
+ }
+
+ @Override
+ public void setRecognitionListener(RecognitionListener listener) {
+ mDelegate.setRecognitionListener(listener);
+ }
+
+ @Override
+ public void startListening(Intent recognizerIntent) {
+ mDelegate.startListening(recognizerIntent);
+ }
+
+ @Override
+ public void stopListening() {
+ mDelegate.stopListening();
+ }
+
+ @Override
+ public void cancel() {
+ mDelegate.cancel();
+ }
+
+ @Override
+ public void destroy() {
+ try {
+ mCloseGuard.close();
+ mDelegate.destroy();
+ } finally {
+ Reference.reachabilityFence(this);
+ }
+ }
+
+ @Override
+ public void checkRecognitionSupport(
+ @NonNull Intent recognizerIntent,
+ @NonNull Executor executor,
+ @NonNull RecognitionSupportCallback supportListener) {
+ mDelegate.checkRecognitionSupport(recognizerIntent, executor, supportListener);
+ }
+
+ @Override
+ public void triggerModelDownload(@NonNull Intent recognizerIntent) {
+ mDelegate.triggerModelDownload(recognizerIntent);
+ }
+
+ @Override
+ public void triggerModelDownload(
+ @NonNull Intent recognizerIntent,
+ @NonNull Executor executor,
+ @NonNull ModelDownloadListener listener) {
+ mDelegate.triggerModelDownload(recognizerIntent, executor, listener);
+ }
+
+ @Override
+ public void setTemporaryOnDeviceRecognizer(@Nullable ComponentName componentName) {
+ mDelegate.setTemporaryOnDeviceRecognizer(componentName);
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ mCloseGuard.warnIfOpen();
+ destroy();
+ } finally {
+ super.finalize();
+ }
+ }
+}
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index 47c29d968558..89aceb9d76e9 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -3913,7 +3913,6 @@ public abstract class Layout {
* @see Layout.Builder
*/
@NonNull
- @FlaggedApi(FLAG_USE_BOUNDS_FOR_WIDTH)
public final CharSequence getText() {
return mText;
}
diff --git a/core/java/android/util/AtomicFile.java b/core/java/android/util/AtomicFile.java
index d084a9ec2648..36800eac254d 100644
--- a/core/java/android/util/AtomicFile.java
+++ b/core/java/android/util/AtomicFile.java
@@ -48,6 +48,7 @@ import java.util.function.Consumer;
* be accessed or modified concurrently by multiple threads or processes. The caller is responsible
* for ensuring appropriate mutual exclusion invariants whenever it accesses the file.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AtomicFile {
private static final String LOG_TAG = "AtomicFile";
@@ -68,6 +69,8 @@ public class AtomicFile {
* @hide Internal constructor that also allows you to have the class
* automatically log commit events.
*/
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy =
+ SystemConfigFileCommitEventLogger.class)
public AtomicFile(File baseName, String commitTag) {
this(baseName, new SystemConfigFileCommitEventLogger(commitTag));
}
diff --git a/core/java/android/util/LruCache.java b/core/java/android/util/LruCache.java
index 3f7fdd898a41..be1ec4187ddc 100644
--- a/core/java/android/util/LruCache.java
+++ b/core/java/android/util/LruCache.java
@@ -18,6 +18,7 @@ package android.util;
import android.compat.annotation.UnsupportedAppUsage;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -61,6 +62,7 @@ import java.util.Map;
* of <a href="http://developer.android.com/sdk/compatibility-library.html">Android's
* Support Package</a> for earlier releases.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class LruCache<K, V> {
@UnsupportedAppUsage
private final LinkedHashMap<K, V> map;
@@ -208,7 +210,7 @@ public class LruCache<K, V> {
break;
}
- Map.Entry<K, V> toEvict = map.eldest();
+ Map.Entry<K, V> toEvict = eldest();
if (toEvict == null) {
break;
}
@@ -224,6 +226,16 @@ public class LruCache<K, V> {
}
}
+ @android.ravenwood.annotation.RavenwoodReplace
+ private Map.Entry<K, V> eldest() {
+ return map.eldest();
+ }
+
+ private Map.Entry<K, V> eldest$ravenwood() {
+ final Iterator<Map.Entry<K, V>> it = map.entrySet().iterator();
+ return it.hasNext() ? it.next() : null;
+ }
+
/**
* Removes the entry for {@code key} if it exists.
*
diff --git a/core/java/android/view/AttachedSurfaceControl.java b/core/java/android/view/AttachedSurfaceControl.java
index fd5517d29d74..f28574ecb3b2 100644
--- a/core/java/android/view/AttachedSurfaceControl.java
+++ b/core/java/android/view/AttachedSurfaceControl.java
@@ -27,9 +27,6 @@ import android.window.SurfaceSyncGroup;
import com.android.window.flags.Flags;
-import java.util.concurrent.Executor;
-import java.util.function.Consumer;
-
/**
* Provides an interface to the root-Surface of a View Hierarchy or Window. This
* is used in combination with the {@link android.view.SurfaceControl} API to enable
@@ -197,42 +194,6 @@ public interface AttachedSurfaceControl {
}
/**
- * Add a trusted presentation listener on the SurfaceControl associated with this window.
- *
- * @param t Transaction that the trusted presentation listener is added on. This should
- * be applied by the caller.
- * @param thresholds The {@link SurfaceControl.TrustedPresentationThresholds} that will specify
- * when the to invoke the callback.
- * @param executor The {@link Executor} where the callback will be invoked on.
- * @param listener The {@link Consumer} that will receive the callbacks when entered or
- * exited the threshold.
- *
- * @see SurfaceControl.Transaction#setTrustedPresentationCallback(SurfaceControl,
- * SurfaceControl.TrustedPresentationThresholds, Executor, Consumer)
- *
- * @hide b/287076178 un-hide with API bump
- */
- default void addTrustedPresentationCallback(@NonNull SurfaceControl.Transaction t,
- @NonNull SurfaceControl.TrustedPresentationThresholds thresholds,
- @NonNull Executor executor, @NonNull Consumer<Boolean> listener) {
- }
-
- /**
- * Remove a trusted presentation listener on the SurfaceControl associated with this window.
- *
- * @param t Transaction that the trusted presentation listener removed on. This should
- * be applied by the caller.
- * @param listener The {@link Consumer} that was previously registered with
- * addTrustedPresentationCallback that should be removed.
- *
- * @see SurfaceControl.Transaction#clearTrustedPresentationCallback(SurfaceControl)
- * @hide b/287076178 un-hide with API bump
- */
- default void removeTrustedPresentationCallback(@NonNull SurfaceControl.Transaction t,
- @NonNull Consumer<Boolean> listener) {
- }
-
- /**
* Transfer the currently in progress touch gesture from the host to the requested
* {@link SurfaceControlViewHost.SurfacePackage}. This requires that the
* SurfaceControlViewHost was created with the current host's inputToken.
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 17bbee6d020f..36b74e39072a 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -73,6 +73,8 @@ import android.window.ISurfaceSyncGroupCompletedListener;
import android.window.ITaskFpsCallback;
import android.window.ScreenCapture;
import android.window.WindowContextInfo;
+import android.window.ITrustedPresentationListener;
+import android.window.TrustedPresentationThresholds;
/**
* System private interface to the window manager.
@@ -1075,4 +1077,10 @@ interface IWindowManager
@JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
+ ".permission.MONITOR_INPUT)")
void unregisterDecorViewGestureListener(IDecorViewGestureListener listener, int displayId);
+
+ void registerTrustedPresentationListener(in IBinder window, in ITrustedPresentationListener listener,
+ in TrustedPresentationThresholds thresholds, int id);
+
+
+ void unregisterTrustedPresentationListener(in ITrustedPresentationListener listener, int id);
}
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java
index 90663c7ad38e..147c15bea076 100644
--- a/core/java/android/view/InsetsController.java
+++ b/core/java/android/view/InsetsController.java
@@ -216,6 +216,14 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
default CompatibilityInfo.Translator getTranslator() {
return null;
}
+
+ /**
+ * Notifies when the state of running animation is changed. The state is either "running" or
+ * "idle".
+ *
+ * @param running {@code true} if there is any animation running; {@code false} otherwise.
+ */
+ default void notifyAnimationRunningStateChanged(boolean running) {}
}
private static final String TAG = "InsetsController";
@@ -749,6 +757,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
final InsetsAnimationControlRunner runner = new InsetsResizeAnimationRunner(
mFrame, state1, mToState, RESIZE_INTERPOLATOR,
ANIMATION_DURATION_RESIZE, mTypes, InsetsController.this);
+ if (mRunningAnimations.isEmpty()) {
+ mHost.notifyAnimationRunningStateChanged(true);
+ }
mRunningAnimations.add(new RunningAnimation(runner, runner.getAnimationType()));
}
};
@@ -1382,6 +1393,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
}
}
ImeTracker.forLogging().onProgress(statsToken, ImeTracker.PHASE_CLIENT_ANIMATION_RUNNING);
+ if (mRunningAnimations.isEmpty()) {
+ mHost.notifyAnimationRunningStateChanged(true);
+ }
mRunningAnimations.add(new RunningAnimation(runner, animationType));
if (DEBUG) Log.d(TAG, "Animation added to runner. useInsetsAnimationThread: "
+ useInsetsAnimationThread);
@@ -1588,6 +1602,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
break;
}
}
+ if (mRunningAnimations.isEmpty()) {
+ mHost.notifyAnimationRunningStateChanged(false);
+ }
onAnimationStateChanged(removedTypes, false /* running */);
}
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index d0a4d1a30681..ad0bf7c95c70 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -197,7 +197,9 @@ public class Surface implements Parcelable {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"FRAME_RATE_COMPATIBILITY_"},
- value = {FRAME_RATE_COMPATIBILITY_DEFAULT, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE})
+ value = {FRAME_RATE_COMPATIBILITY_DEFAULT, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
+ FRAME_RATE_COMPATIBILITY_EXACT, FRAME_RATE_COMPATIBILITY_NO_VOTE,
+ FRAME_RATE_COMPATIBILITY_MIN, FRAME_RATE_COMPATIBILITY_GTE})
public @interface FrameRateCompatibility {}
// From native_window.h. Keep these in sync.
@@ -242,6 +244,13 @@ public class Surface implements Parcelable {
*/
public static final int FRAME_RATE_COMPATIBILITY_MIN = 102;
+ // From window.h. Keep these in sync.
+ /**
+ * The surface requests a frame rate that is greater than or equal to {@code frameRate}.
+ * @hide
+ */
+ public static final int FRAME_RATE_COMPATIBILITY_GTE = 103;
+
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"CHANGE_FRAME_RATE_"},
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index d58c07d96d49..a268bcaf7288 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -34,6 +34,7 @@ import static android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY;
import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
import static android.view.flags.Flags.toolkitSetFrameRateReadOnly;
import static android.view.flags.Flags.viewVelocityApi;
+import static android.view.inputmethod.Flags.FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR;
import static com.android.internal.util.FrameworkStatsLog.TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__DEEP_PRESS;
import static com.android.internal.util.FrameworkStatsLog.TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__LONG_PRESS;
@@ -5154,9 +5155,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
private Runnable mHandwritingDelegatorCallback;
private String mAllowedHandwritingDelegatePackageName;
- // These two fields are set if the view is a handwriting delegate.
+ // These three fields are set if the view is a handwriting delegate.
private boolean mIsHandwritingDelegate;
private String mAllowedHandwritingDelegatorPackageName;
+ private @InputMethodManager.HandwritingDelegateFlags int mHandwritingDelegateFlags;
/**
* Solid color to use as a background when creating the drawing cache. Enables
@@ -12747,6 +12749,30 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
+ * Sets flags configuring the handwriting delegation behavior for this delegate editor view.
+ *
+ * <p>This method has no effect unless {@link #setIsHandwritingDelegate} is also called to
+ * configure this view to act as a handwriting delegate.
+ *
+ * @param flags {@link InputMethodManager#HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED} or
+ * {@code 0}
+ */
+ @FlaggedApi(FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR)
+ public void setHandwritingDelegateFlags(
+ @InputMethodManager.HandwritingDelegateFlags int flags) {
+ mHandwritingDelegateFlags = flags;
+ }
+
+ /**
+ * Returns flags configuring the handwriting delegation behavior for this delegate editor view,
+ * as set by {@link #setHandwritingDelegateFlags}.
+ */
+ @FlaggedApi(FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR)
+ public @InputMethodManager.HandwritingDelegateFlags int getHandwritingDelegateFlags() {
+ return mHandwritingDelegateFlags;
+ }
+
+ /**
* Gets the coordinates of this view in the coordinate space of the
* {@link Surface} that contains the view.
*
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 7a6c2929c706..2fcd675a8f98 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -92,6 +92,7 @@ import static android.view.WindowManagerGlobal.RELAYOUT_RES_CANCEL_AND_REDRAW;
import static android.view.WindowManagerGlobal.RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS;
import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED;
import static android.view.accessibility.Flags.forceInvertColor;
+import static android.view.accessibility.Flags.reduceWindowContentChangedEventThrottle;
import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.IME_FOCUS_CONTROLLER;
import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.INSETS_CONTROLLER;
import static android.view.flags.Flags.toolkitSetFrameRateReadOnly;
@@ -816,6 +817,8 @@ public final class ViewRootImpl implements ViewParent,
private long mFpsPrevTime = -1;
private int mFpsNumFrames;
+ private boolean mInsetsAnimationRunning;
+
/**
* The resolved pointer icon type requested by this window.
* A null value indicates the resolved pointer icon has not yet been calculated.
@@ -991,7 +994,7 @@ public final class ViewRootImpl implements ViewParent,
// for idleness handling.
private boolean mHasIdledMessage = false;
// time for touch boost period.
- private static final int FRAME_RATE_TOUCH_BOOST_TIME = 1500;
+ private static final int FRAME_RATE_TOUCH_BOOST_TIME = 3000;
// time for checking idle status periodically.
private static final int FRAME_RATE_IDLENESS_CHECK_TIME_MILLIS = 500;
// time for revaluating the idle status before lowering the frame rate.
@@ -2179,6 +2182,16 @@ public final class ViewRootImpl implements ViewParent,
}
}
+ /**
+ * Notify the when the running state of a insets animation changed.
+ */
+ @VisibleForTesting
+ public void notifyInsetsAnimationRunningStateChanged(boolean running) {
+ if (sToolkitSetFrameRateReadOnlyFlagValue) {
+ mInsetsAnimationRunning = running;
+ }
+ }
+
@Override
public void requestLayout() {
if (!mHandlingLayoutInLayoutRequest) {
@@ -2436,6 +2449,19 @@ public final class ViewRootImpl implements ViewParent,
if (updateBoundsLayer(t)) {
applyTransactionOnDraw(t);
}
+
+ // Set the frame rate selection strategy to FRAME_RATE_SELECTION_STRATEGY_SELF
+ // This strategy ensures that the frame rate specifications do not cascade down to
+ // the descendant layers. This is particularly important for applications like Chrome,
+ // where child surfaces should adhere to default behavior instead of no preference
+ if (sToolkitSetFrameRateReadOnlyFlagValue) {
+ try {
+ mFrameRateTransaction.setFrameRateSelectionStrategy(sc,
+ sc.FRAME_RATE_SELECTION_STRATEGY_SELF).applyAsyncUnsafe();
+ } catch (Exception e) {
+ Log.e(mTag, "Unable to set frame rate selection strategy ", e);
+ }
+ }
}
private void destroySurface() {
@@ -11355,6 +11381,10 @@ public final class ViewRootImpl implements ViewParent,
}
private boolean canContinueThrottle(View source, int changeType) {
+ if (!reduceWindowContentChangedEventThrottle()) {
+ // Old behavior. Always throttle.
+ return true;
+ }
if (mSource == null) {
// We don't have a pending event.
return true;
@@ -11913,18 +11943,6 @@ public final class ViewRootImpl implements ViewParent,
scheduleTraversals();
}
- @Override
- public void addTrustedPresentationCallback(@NonNull SurfaceControl.Transaction t,
- @NonNull SurfaceControl.TrustedPresentationThresholds thresholds,
- @NonNull Executor executor, @NonNull Consumer<Boolean> listener) {
- t.setTrustedPresentationCallback(getSurfaceControl(), thresholds, executor, listener);
- }
-
- @Override
- public void removeTrustedPresentationCallback(@NonNull SurfaceControl.Transaction t,
- @NonNull Consumer<Boolean> listener) {
- t.clearTrustedPresentationCallback(getSurfaceControl());
- }
private void logAndTrace(String msg) {
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
@@ -11938,7 +11956,7 @@ public final class ViewRootImpl implements ViewParent,
return;
}
- int frameRateCategory = mIsFrameRateBoosting
+ int frameRateCategory = mIsFrameRateBoosting || mInsetsAnimationRunning
? FRAME_RATE_CATEGORY_HIGH : preferredFrameRateCategory;
try {
@@ -12052,6 +12070,14 @@ public final class ViewRootImpl implements ViewParent,
}
/**
+ * Get the value of mLastPreferredFrameRateCategory
+ */
+ @VisibleForTesting
+ public int getLastPreferredFrameRateCategory() {
+ return mLastPreferredFrameRateCategory;
+ }
+
+ /**
* Get the value of mPreferredFrameRate
*/
@VisibleForTesting
diff --git a/core/java/android/view/ViewRootInsetsControllerHost.java b/core/java/android/view/ViewRootInsetsControllerHost.java
index a2708eead171..40730e8de849 100644
--- a/core/java/android/view/ViewRootInsetsControllerHost.java
+++ b/core/java/android/view/ViewRootInsetsControllerHost.java
@@ -279,6 +279,13 @@ public class ViewRootInsetsControllerHost implements InsetsController.Host {
return null;
}
+ @Override
+ public void notifyAnimationRunningStateChanged(boolean running) {
+ if (mViewRoot != null) {
+ mViewRoot.notifyInsetsAnimationRunningStateChanged(running);
+ }
+ }
+
private boolean isVisibleToUser() {
return mViewRoot.getHostVisibility() == View.VISIBLE;
}
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 046ea77f196d..f668088e6b44 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -122,7 +122,9 @@ import android.view.WindowInsets.Side.InsetsSide;
import android.view.WindowInsets.Type;
import android.view.WindowInsets.Type.InsetsType;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.window.ITrustedPresentationListener;
import android.window.TaskFpsCallback;
+import android.window.TrustedPresentationThresholds;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -5884,4 +5886,35 @@ public interface WindowManager extends ViewManager {
default boolean replaceContentOnDisplayWithSc(int displayId, @NonNull SurfaceControl sc) {
throw new UnsupportedOperationException();
}
+
+ /**
+ * Add a trusted presentation listener associated with a window. If the listener has already
+ * been registered, an AndroidRuntimeException will be thrown.
+ *
+ * @param window The Window to add the trusted presentation listener for
+ * @param thresholds The {@link TrustedPresentationThresholds} that will specify
+ * when the to invoke the callback.
+ * @param executor The {@link Executor} where the callback will be invoked on.
+ * @param listener The {@link ITrustedPresentationListener} that will receive the callbacks
+ * when entered or exited trusted presentation per the thresholds.
+ *
+ * @hide b/287076178 un-hide with API bump
+ */
+ default void registerTrustedPresentationListener(@NonNull IBinder window,
+ @NonNull TrustedPresentationThresholds thresholds, @NonNull Executor executor,
+ @NonNull Consumer<Boolean> listener) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Removes a presentation listener associated with a window. If the listener was not previously
+ * registered, the call will be a noop.
+ *
+ * @hide
+ * @see #registerTrustedPresentationListener(IBinder,
+ * TrustedPresentationThresholds, Executor, Consumer)
+ */
+ default void unregisterTrustedPresentationListener(@NonNull Consumer<Boolean> listener) {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index 214f1ec3d1ec..a7d814e9ab8c 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -30,9 +30,13 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.util.AndroidRuntimeException;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
+import android.util.Pair;
import android.view.inputmethod.InputMethodManager;
+import android.window.ITrustedPresentationListener;
+import android.window.TrustedPresentationThresholds;
import com.android.internal.util.FastPrintWriter;
@@ -43,6 +47,7 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.WeakHashMap;
import java.util.concurrent.Executor;
+import java.util.function.Consumer;
import java.util.function.IntConsumer;
/**
@@ -143,6 +148,9 @@ public final class WindowManagerGlobal {
private Runnable mSystemPropertyUpdater;
+ private final TrustedPresentationListener mTrustedPresentationListener =
+ new TrustedPresentationListener();
+
private WindowManagerGlobal() {
}
@@ -324,7 +332,7 @@ public final class WindowManagerGlobal {
final Context context = view.getContext();
if (context != null
&& (context.getApplicationInfo().flags
- & ApplicationInfo.FLAG_HARDWARE_ACCELERATED) != 0) {
+ & ApplicationInfo.FLAG_HARDWARE_ACCELERATED) != 0) {
wparams.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
}
}
@@ -482,7 +490,7 @@ public final class WindowManagerGlobal {
if (who != null) {
WindowLeaked leak = new WindowLeaked(
what + " " + who + " has leaked window "
- + root.getView() + " that was originally added here");
+ + root.getView() + " that was originally added here");
leak.setStackTrace(root.getLocation().getStackTrace());
Log.e(TAG, "", leak);
}
@@ -790,6 +798,86 @@ public final class WindowManagerGlobal {
}
}
+ public void registerTrustedPresentationListener(@NonNull IBinder window,
+ @NonNull TrustedPresentationThresholds thresholds, Executor executor,
+ @NonNull Consumer<Boolean> listener) {
+ mTrustedPresentationListener.addListener(window, thresholds, listener, executor);
+ }
+
+ public void unregisterTrustedPresentationListener(@NonNull Consumer<Boolean> listener) {
+ mTrustedPresentationListener.removeListener(listener);
+ }
+
+ private final class TrustedPresentationListener extends
+ ITrustedPresentationListener.Stub {
+ private static int sId = 0;
+ private final ArrayMap<Consumer<Boolean>, Pair<Integer, Executor>> mListeners =
+ new ArrayMap<>();
+
+ private final Object mTplLock = new Object();
+
+ private void addListener(IBinder window, TrustedPresentationThresholds thresholds,
+ Consumer<Boolean> listener, Executor executor) {
+ synchronized (mTplLock) {
+ if (mListeners.containsKey(listener)) {
+ throw new AndroidRuntimeException("Trying to add duplicate listener");
+ }
+ int id = sId++;
+ mListeners.put(listener, new Pair<>(id, executor));
+ try {
+ WindowManagerGlobal.getWindowManagerService()
+ .registerTrustedPresentationListener(window, this, thresholds, id);
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
+ }
+ }
+ }
+
+ private void removeListener(Consumer<Boolean> listener) {
+ synchronized (mTplLock) {
+ var removedListener = mListeners.remove(listener);
+ if (removedListener == null) {
+ Log.i(TAG, "listener " + listener + " does not exist.");
+ return;
+ }
+
+ try {
+ WindowManagerGlobal.getWindowManagerService()
+ .unregisterTrustedPresentationListener(this, removedListener.first);
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
+ }
+ }
+ }
+
+ @Override
+ public void onTrustedPresentationChanged(int[] inTrustedStateListenerIds,
+ int[] outOfTrustedStateListenerIds) {
+ ArrayList<Runnable> firedListeners = new ArrayList<>();
+ synchronized (mTplLock) {
+ mListeners.forEach((listener, idExecutorPair) -> {
+ final var listenerId = idExecutorPair.first;
+ final var executor = idExecutorPair.second;
+ for (int id : inTrustedStateListenerIds) {
+ if (listenerId == id) {
+ firedListeners.add(() -> executor.execute(
+ () -> listener.accept(/*presentationState*/true)));
+ }
+ }
+ for (int id : outOfTrustedStateListenerIds) {
+ if (listenerId == id) {
+ firedListeners.add(() -> executor.execute(
+ () -> listener.accept(/*presentationState*/false)));
+ }
+ }
+ });
+ }
+ for (int i = 0; i < firedListeners.size(); i++) {
+ firedListeners.get(i).run();
+ }
+ }
+ }
+
/** @hide */
public void addWindowlessRoot(ViewRootImpl impl) {
synchronized (mLock) {
@@ -801,7 +889,7 @@ public final class WindowManagerGlobal {
public void removeWindowlessRoot(ViewRootImpl impl) {
synchronized (mLock) {
mWindowlessRoots.remove(impl);
- }
+ }
}
public void setRecentsAppBehindSystemBars(boolean behindSystemBars) {
diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java
index d7b74b3bcfe2..b4b1fde89a46 100644
--- a/core/java/android/view/WindowManagerImpl.java
+++ b/core/java/android/view/WindowManagerImpl.java
@@ -37,6 +37,7 @@ import android.os.StrictMode;
import android.util.Log;
import android.window.ITaskFpsCallback;
import android.window.TaskFpsCallback;
+import android.window.TrustedPresentationThresholds;
import android.window.WindowContext;
import android.window.WindowMetricsController;
import android.window.WindowProvider;
@@ -508,4 +509,17 @@ public final class WindowManagerImpl implements WindowManager {
}
return false;
}
+
+ @Override
+ public void registerTrustedPresentationListener(@NonNull IBinder window,
+ @NonNull TrustedPresentationThresholds thresholds, @NonNull Executor executor,
+ @NonNull Consumer<Boolean> listener) {
+ mGlobal.registerTrustedPresentationListener(window, thresholds, executor, listener);
+ }
+
+ @Override
+ public void unregisterTrustedPresentationListener(@NonNull Consumer<Boolean> listener) {
+ mGlobal.unregisterTrustedPresentationListener(listener);
+
+ }
}
diff --git a/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl b/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl
index a11c6d0ce956..a404bd6f8c97 100644
--- a/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl
+++ b/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl
@@ -54,7 +54,7 @@ oneway interface IWindowMagnificationConnection {
* @param displayId the logical display id.
* @param scale magnification scale.
*/
- void setScale(int displayId, float scale);
+ void setScaleForWindowMagnification(int displayId, float scale);
/**
* Disables window magnification on specified display with animation.
diff --git a/core/java/android/view/accessibility/flags/accessibility_flags.aconfig b/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
index c337cb45d3a6..b29967888312 100644
--- a/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
+++ b/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
@@ -34,7 +34,7 @@ flag {
namespace: "accessibility"
name: "flash_notification_system_api"
description: "Makes flash notification APIs as system APIs for calling from mainline module"
- bug: "282821643"
+ bug: "303131332"
}
flag {
@@ -53,7 +53,21 @@ flag {
flag {
namespace: "accessibility"
+ name: "reduce_window_content_changed_event_throttle"
+ description: "Reduces the throttle of AccessibilityEvent of TYPE_WINDOW_CONTENT_CHANGED"
+ bug: "277305460"
+}
+
+flag {
+ namespace: "accessibility"
name: "update_always_on_a11y_service"
description: "Updates the Always-On A11yService state when the user changes the enablement of the shortcut."
bug: "298869916"
}
+
+flag {
+ name: "enable_system_pinch_zoom_gesture"
+ namespace: "accessibility"
+ description: "Feature flag for system pinch zoom gesture detector and related opt-out apis"
+ bug: "283323770"
+} \ No newline at end of file
diff --git a/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java b/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
index 614102bc7f92..c244287a1a5d 100644
--- a/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
+++ b/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
@@ -514,14 +514,15 @@ final class IInputMethodManagerGlobalInvoker {
@NonNull IInputMethodClient client,
@UserIdInt int userId,
@NonNull String delegatePackageName,
- @NonNull String delegatorPackageName) {
+ @NonNull String delegatorPackageName,
+ @InputMethodManager.HandwritingDelegateFlags int flags) {
final IInputMethodManager service = getService();
if (service == null) {
return false;
}
try {
return service.acceptStylusHandwritingDelegation(
- client, userId, delegatePackageName, delegatorPackageName);
+ client, userId, delegatePackageName, delegatorPackageName, flags);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 589b7a3eeda4..6d7a543060c7 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -17,6 +17,7 @@
package android.view.inputmethod;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
+import static android.view.inputmethod.Flags.FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR;
import static android.view.inputmethod.InputConnection.CURSOR_UPDATE_IMMEDIATE;
import static android.view.inputmethod.InputConnection.CURSOR_UPDATE_MONITOR;
import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.DISPLAY_ID;
@@ -425,6 +426,23 @@ public final class InputMethodManager {
private static final boolean OPTIMIZE_NONEDITABLE_VIEWS =
SystemProperties.getBoolean("debug.imm.optimize_noneditable_views", true);
+ /** @hide */
+ @IntDef(flag = true, prefix = { "HANDWRITING_DELEGATE_FLAG_" }, value = {
+ HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface HandwritingDelegateFlags {}
+
+ /**
+ * Flag indicating that views from the default home screen ({@link Intent#CATEGORY_HOME}) may
+ * act as a handwriting delegator for the delegate editor view. If set, views from the home
+ * screen package will be trusted for handwriting delegation, in addition to views in the {@code
+ * delegatorPackageName} passed to {@link #acceptStylusHandwritingDelegation(View, String,
+ * int)}.
+ */
+ @FlaggedApi(FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR)
+ public static final int HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED = 0x0001;
+
/**
* @deprecated Use {@link IInputMethodManagerGlobalInvoker} instead.
*/
@@ -2345,17 +2363,20 @@ public final class InputMethodManager {
* @see #isStylusHandwritingAvailable()
*/
public void startStylusHandwriting(@NonNull View view) {
- startStylusHandwritingInternal(view, null /* delegatorPackageName */);
+ startStylusHandwritingInternal(
+ view, /* delegatorPackageName= */ null, /* handwritingDelegateFlags= */ 0);
}
private boolean startStylusHandwritingInternal(
- @NonNull View view, @Nullable String delegatorPackageName) {
+ @NonNull View view, @Nullable String delegatorPackageName,
+ @HandwritingDelegateFlags int handwritingDelegateFlags) {
Objects.requireNonNull(view);
// Re-dispatch if there is a context mismatch.
final InputMethodManager fallbackImm = getFallbackInputMethodManagerIfNecessary(view);
if (fallbackImm != null) {
- fallbackImm.startStylusHandwritingInternal(view, delegatorPackageName);
+ fallbackImm.startStylusHandwritingInternal(
+ view, delegatorPackageName, handwritingDelegateFlags);
}
boolean useDelegation = !TextUtils.isEmpty(delegatorPackageName);
@@ -2375,7 +2396,7 @@ public final class InputMethodManager {
if (useDelegation) {
return IInputMethodManagerGlobalInvoker.acceptStylusHandwritingDelegation(
mClient, UserHandle.myUserId(), view.getContext().getOpPackageName(),
- delegatorPackageName);
+ delegatorPackageName, handwritingDelegateFlags);
} else {
IInputMethodManagerGlobalInvoker.startStylusHandwriting(mClient);
}
@@ -2470,16 +2491,17 @@ public final class InputMethodManager {
*/
public boolean acceptStylusHandwritingDelegation(@NonNull View delegateView) {
return startStylusHandwritingInternal(
- delegateView, delegateView.getContext().getOpPackageName());
+ delegateView, delegateView.getContext().getOpPackageName(),
+ delegateView.getHandwritingDelegateFlags());
}
/**
* Accepts and starts a stylus handwriting session on the delegate view, if handwriting
* initiation delegation was previously requested using
- * {@link #prepareStylusHandwritingDelegation(View, String)} from te delegator and the view
+ * {@link #prepareStylusHandwritingDelegation(View, String)} from the delegator and the view
* belongs to a specified delegate package.
*
- * <p>Note: If delegator and delegate are in same application package use
+ * <p>Note: If delegator and delegate are in the same application package, use
* {@link #acceptStylusHandwritingDelegation(View)} instead.</p>
*
* @param delegateView delegate view capable of receiving input via {@link InputConnection}
@@ -2493,8 +2515,35 @@ public final class InputMethodManager {
public boolean acceptStylusHandwritingDelegation(
@NonNull View delegateView, @NonNull String delegatorPackageName) {
Objects.requireNonNull(delegatorPackageName);
+ return startStylusHandwritingInternal(
+ delegateView, delegatorPackageName, delegateView.getHandwritingDelegateFlags());
+ }
+
+ /**
+ * Accepts and starts a stylus handwriting session on the delegate view, if handwriting
+ * initiation delegation was previously requested using {@link
+ * #prepareStylusHandwritingDelegation(View, String)} from the delegator and the view belongs to
+ * a specified delegate package.
+ *
+ * <p>Note: If delegator and delegate are in the same application package, use {@link
+ * #acceptStylusHandwritingDelegation(View)} instead.
+ *
+ * @param delegateView delegate view capable of receiving input via {@link InputConnection} on
+ * which {@link #startStylusHandwriting(View)} will be called.
+ * @param delegatorPackageName package name of the delegator that handled initial stylus stroke.
+ * @param flags {@link #HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED} or {@code 0}
+ * @return {@code true} if view belongs to allowed delegate package declared in {@link
+ * #prepareStylusHandwritingDelegation(View, String)} and handwriting session can start.
+ * @see #prepareStylusHandwritingDelegation(View, String)
+ * @see #acceptStylusHandwritingDelegation(View)
+ */
+ @FlaggedApi(FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR)
+ public boolean acceptStylusHandwritingDelegation(
+ @NonNull View delegateView, @NonNull String delegatorPackageName,
+ @HandwritingDelegateFlags int flags) {
+ Objects.requireNonNull(delegatorPackageName);
- return startStylusHandwritingInternal(delegateView, delegatorPackageName);
+ return startStylusHandwritingInternal(delegateView, delegatorPackageName, flags);
}
/**
diff --git a/core/java/android/view/inputmethod/flags.aconfig b/core/java/android/view/inputmethod/flags.aconfig
index 7486362195d0..dc6aa6cdc048 100644
--- a/core/java/android/view/inputmethod/flags.aconfig
+++ b/core/java/android/view/inputmethod/flags.aconfig
@@ -31,3 +31,10 @@ flag {
bug: "284527000"
is_fixed_read_only: true
}
+
+flag {
+ name: "home_screen_handwriting_delegator"
+ namespace: "input_method"
+ description: "Feature flag for supporting stylus handwriting delegation from RemoteViews on the home screen"
+ bug: "279959705"
+}
diff --git a/core/java/android/webkit/IWebViewUpdateService.aidl b/core/java/android/webkit/IWebViewUpdateService.aidl
index e17773159ec5..c6bd20cec07d 100644
--- a/core/java/android/webkit/IWebViewUpdateService.aidl
+++ b/core/java/android/webkit/IWebViewUpdateService.aidl
@@ -79,4 +79,9 @@ interface IWebViewUpdateService {
* Used by Settings to enable/disable multiprocess.
*/
void enableMultiProcess(boolean enable);
+
+ /**
+ * Used by Settings to get the default WebView package.
+ */
+ WebViewProviderInfo getDefaultWebViewPackage();
}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 1acebf4df590..da3134856731 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -16,11 +16,14 @@
package android.widget;
+import static android.view.inputmethod.Flags.FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR;
+
import android.annotation.AttrRes;
import android.annotation.ColorInt;
import android.annotation.ColorRes;
import android.annotation.DimenRes;
import android.annotation.DrawableRes;
+import android.annotation.FlaggedApi;
import android.annotation.IdRes;
import android.annotation.IntDef;
import android.annotation.LayoutRes;
@@ -92,6 +95,7 @@ import android.util.TypedValue.ComplexDimensionUnit;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.LayoutInflater.Filter;
+import android.view.MotionEvent;
import android.view.RemotableViewMethod;
import android.view.View;
import android.view.ViewGroup;
@@ -239,6 +243,7 @@ public class RemoteViews implements Parcelable, Filter {
private static final int SET_REMOTE_COLLECTION_ITEMS_ADAPTER_TAG = 31;
private static final int ATTRIBUTE_REFLECTION_ACTION_TAG = 32;
private static final int SET_REMOTE_ADAPTER_TAG = 33;
+ private static final int SET_ON_STYLUS_HANDWRITING_RESPONSE_TAG = 34;
/** @hide **/
@IntDef(prefix = "MARGIN_", value = {
@@ -1510,6 +1515,53 @@ public class RemoteViews implements Parcelable, Filter {
}
}
+ /** Helper action to configure handwriting delegation via {@link PendingIntent}. */
+ private class SetOnStylusHandwritingResponse extends Action {
+ final PendingIntent mPendingIntent;
+
+ SetOnStylusHandwritingResponse(@IdRes int id, @Nullable PendingIntent pendingIntent) {
+ this.mViewId = id;
+ this.mPendingIntent = pendingIntent;
+ }
+
+ SetOnStylusHandwritingResponse(@NonNull Parcel parcel) {
+ mViewId = parcel.readInt();
+ mPendingIntent = PendingIntent.readPendingIntentOrNullFromParcel(parcel);
+ }
+
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(mViewId);
+ PendingIntent.writePendingIntentOrNullToParcel(mPendingIntent, dest);
+ }
+
+ @Override
+ public void apply(View root, ViewGroup rootParent, ActionApplyParams params) {
+ final View target = root.findViewById(mViewId);
+ if (target == null) return;
+
+ if (hasFlags(FLAG_WIDGET_IS_COLLECTION_CHILD)) {
+ Log.w(LOG_TAG, "Cannot use setOnStylusHandwritingPendingIntent for collection item "
+ + "(id: " + mViewId + ")");
+ return;
+ }
+
+ if (mPendingIntent != null) {
+ RemoteResponse response = RemoteResponse.fromPendingIntent(mPendingIntent);
+ target.setHandwritingDelegatorCallback(
+ () -> response.handleViewInteraction(target, params.handler));
+ target.setAllowedHandwritingDelegatePackage(mPendingIntent.getCreatorPackage());
+ } else {
+ target.setHandwritingDelegatorCallback(null);
+ target.setAllowedHandwritingDelegatePackage(null);
+ }
+ }
+
+ @Override
+ public int getActionTag() {
+ return SET_ON_STYLUS_HANDWRITING_RESPONSE_TAG;
+ }
+ }
+
/**
* Equivalent to calling
* {@link android.widget.CompoundButton#setOnCheckedChangeListener(
@@ -4189,6 +4241,8 @@ public class RemoteViews implements Parcelable, Filter {
return new SetRemoteCollectionItemListAdapterAction(parcel);
case ATTRIBUTE_REFLECTION_ACTION_TAG:
return new AttributeReflectionAction(parcel);
+ case SET_ON_STYLUS_HANDWRITING_RESPONSE_TAG:
+ return new SetOnStylusHandwritingResponse(parcel);
default:
throw new ActionException("Tag " + tag + " not found");
}
@@ -4742,6 +4796,33 @@ public class RemoteViews implements Parcelable, Filter {
}
/**
+ * Equivalent to calling {@link View#setHandwritingDelegatorCallback(Runnable)} to send the
+ * provided {@link PendingIntent}.
+ *
+ * <p>A common use case is a remote view which looks like a text editor but does not actually
+ * support text editing itself, and clicking on the remote view launches an activity containing
+ * an EditText. To support handwriting initiation in this case, this method can be called on the
+ * remote view to configure it as a handwriting delegator, meaning that stylus movement on the
+ * remote view triggers a {@link PendingIntent} and starts handwriting mode for the delegate
+ * EditText. The {@link PendingIntent} is typically the same as the one passed to {@link
+ * #setOnClickPendingIntent} which launches the activity containing the EditText. The EditText
+ * should call {@link View#setIsHandwritingDelegate} to set it as a delegate, and also use
+ * {@link View#setAllowedHandwritingDelegatorPackage} or {@link
+ * android.view.inputmethod.InputMethodManager#HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED}
+ * if necessary to support delegators from the package displaying the remote view.
+ *
+ * @param viewId identifier of the view that will trigger the {@link PendingIntent} when a
+ * stylus {@link MotionEvent} occurs within the view's bounds
+ * @param pendingIntent the {@link PendingIntent} to send, or {@code null} to clear the
+ * handwriting delegation
+ */
+ @FlaggedApi(FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR)
+ public void setOnStylusHandwritingPendingIntent(
+ @IdRes int viewId, @Nullable PendingIntent pendingIntent) {
+ addAction(new SetOnStylusHandwritingResponse(viewId, pendingIntent));
+ }
+
+ /**
* @hide
* Equivalent to calling
* {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)},
diff --git a/core/java/android/window/ITaskOrganizerController.aidl b/core/java/android/window/ITaskOrganizerController.aidl
index e10f7c838c74..478aeece0888 100644
--- a/core/java/android/window/ITaskOrganizerController.aidl
+++ b/core/java/android/window/ITaskOrganizerController.aidl
@@ -70,20 +70,4 @@ interface ITaskOrganizerController {
/** Updates a state of camera compat control for stretched issues in the viewfinder. */
void updateCameraCompatControlState(in WindowContainerToken task, int state);
-
- /**
- * Controls whether ignore orientation request logic in {@link
- * com.android.server.wm.DisplayArea} is disabled at runtime and how to optionally map some
- * requested orientations to others.
- *
- * @param isDisabled when {@code true}, the system always ignores the value of {@link
- * com.android.server.wm.DisplayArea#getIgnoreOrientationRequest} and app
- * requested orientation is respected.
- * @param fromOrientations The orientations we want to map to the correspondent orientations
- * in toOrientation.
- * @param toOrientations The orientations we map to the ones in fromOrientations at the same
- * index
- */
- void setOrientationRequestPolicy(boolean isIgnoreOrientationRequestDisabled,
- in int[] fromOrientations, in int[] toOrientations);
}
diff --git a/core/java/android/window/ITrustedPresentationListener.aidl b/core/java/android/window/ITrustedPresentationListener.aidl
new file mode 100644
index 000000000000..b33128abb7e5
--- /dev/null
+++ b/core/java/android/window/ITrustedPresentationListener.aidl
@@ -0,0 +1,24 @@
+/*
+ * 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.window;
+
+/**
+ * @hide
+ */
+oneway interface ITrustedPresentationListener {
+ void onTrustedPresentationChanged(in int[] enteredTrustedStateIds, in int[] exitedTrustedStateIds);
+} \ No newline at end of file
diff --git a/core/java/android/window/TaskFragmentOperation.java b/core/java/android/window/TaskFragmentOperation.java
index 4e0f9a51c0a0..0ec9ffe6390b 100644
--- a/core/java/android/window/TaskFragmentOperation.java
+++ b/core/java/android/window/TaskFragmentOperation.java
@@ -108,6 +108,18 @@ public final class TaskFragmentOperation implements Parcelable {
*/
public static final int OP_TYPE_REORDER_TO_TOP_OF_TASK = 13;
+ /**
+ * Creates a decor surface in the parent Task of the TaskFragment. The created decor surface
+ * will be provided in {@link TaskFragmentTransaction#TYPE_TASK_FRAGMENT_PARENT_INFO_CHANGED}
+ * event callback.
+ */
+ public static final int OP_TYPE_CREATE_TASK_FRAGMENT_DECOR_SURFACE = 14;
+
+ /**
+ * Removes the decor surface in the parent Task of the TaskFragment.
+ */
+ public static final int OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE = 15;
+
@IntDef(prefix = { "OP_TYPE_" }, value = {
OP_TYPE_UNKNOWN,
OP_TYPE_CREATE_TASK_FRAGMENT,
@@ -124,6 +136,8 @@ public final class TaskFragmentOperation implements Parcelable {
OP_TYPE_SET_ISOLATED_NAVIGATION,
OP_TYPE_REORDER_TO_BOTTOM_OF_TASK,
OP_TYPE_REORDER_TO_TOP_OF_TASK,
+ OP_TYPE_CREATE_TASK_FRAGMENT_DECOR_SURFACE,
+ OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface OperationType {}
diff --git a/core/java/android/window/TaskFragmentParentInfo.java b/core/java/android/window/TaskFragmentParentInfo.java
index e6eeca4b4801..a77c23475c60 100644
--- a/core/java/android/window/TaskFragmentParentInfo.java
+++ b/core/java/android/window/TaskFragmentParentInfo.java
@@ -22,6 +22,9 @@ import android.app.WindowConfiguration;
import android.content.res.Configuration;
import android.os.Parcel;
import android.os.Parcelable;
+import android.view.SurfaceControl;
+
+import java.util.Objects;
/**
* The information about the parent Task of a particular TaskFragment
@@ -37,12 +40,15 @@ public class TaskFragmentParentInfo implements Parcelable {
private final boolean mHasDirectActivity;
+ @Nullable private final SurfaceControl mDecorSurface;
+
public TaskFragmentParentInfo(@NonNull Configuration configuration, int displayId,
- boolean visible, boolean hasDirectActivity) {
+ boolean visible, boolean hasDirectActivity, @Nullable SurfaceControl decorSurface) {
mConfiguration.setTo(configuration);
mDisplayId = displayId;
mVisible = visible;
mHasDirectActivity = hasDirectActivity;
+ mDecorSurface = decorSurface;
}
public TaskFragmentParentInfo(@NonNull TaskFragmentParentInfo info) {
@@ -50,6 +56,7 @@ public class TaskFragmentParentInfo implements Parcelable {
mDisplayId = info.mDisplayId;
mVisible = info.mVisible;
mHasDirectActivity = info.mHasDirectActivity;
+ mDecorSurface = info.mDecorSurface;
}
/** The {@link Configuration} of the parent Task */
@@ -92,7 +99,13 @@ public class TaskFragmentParentInfo implements Parcelable {
return false;
}
return getWindowingMode() == that.getWindowingMode() && mDisplayId == that.mDisplayId
- && mVisible == that.mVisible && mHasDirectActivity == that.mHasDirectActivity;
+ && mVisible == that.mVisible && mHasDirectActivity == that.mHasDirectActivity
+ && mDecorSurface == that.mDecorSurface;
+ }
+
+ @Nullable
+ public SurfaceControl getDecorSurface() {
+ return mDecorSurface;
}
@WindowConfiguration.WindowingMode
@@ -107,6 +120,7 @@ public class TaskFragmentParentInfo implements Parcelable {
+ ", displayId=" + mDisplayId
+ ", visible=" + mVisible
+ ", hasDirectActivity=" + mHasDirectActivity
+ + ", decorSurface=" + mDecorSurface
+ "}";
}
@@ -128,7 +142,8 @@ public class TaskFragmentParentInfo implements Parcelable {
return mConfiguration.equals(that.mConfiguration)
&& mDisplayId == that.mDisplayId
&& mVisible == that.mVisible
- && mHasDirectActivity == that.mHasDirectActivity;
+ && mHasDirectActivity == that.mHasDirectActivity
+ && mDecorSurface == that.mDecorSurface;
}
@Override
@@ -137,6 +152,7 @@ public class TaskFragmentParentInfo implements Parcelable {
result = 31 * result + mDisplayId;
result = 31 * result + (mVisible ? 1 : 0);
result = 31 * result + (mHasDirectActivity ? 1 : 0);
+ result = 31 * result + Objects.hashCode(mDecorSurface);
return result;
}
@@ -146,6 +162,7 @@ public class TaskFragmentParentInfo implements Parcelable {
dest.writeInt(mDisplayId);
dest.writeBoolean(mVisible);
dest.writeBoolean(mHasDirectActivity);
+ dest.writeTypedObject(mDecorSurface, flags);
}
private TaskFragmentParentInfo(Parcel in) {
@@ -153,6 +170,7 @@ public class TaskFragmentParentInfo implements Parcelable {
mDisplayId = in.readInt();
mVisible = in.readBoolean();
mHasDirectActivity = in.readBoolean();
+ mDecorSurface = in.readTypedObject(SurfaceControl.CREATOR);
}
public static final Creator<TaskFragmentParentInfo> CREATOR =
diff --git a/core/java/android/window/TaskOrganizer.java b/core/java/android/window/TaskOrganizer.java
index cd1275c23ed6..6d36b579dcc2 100644
--- a/core/java/android/window/TaskOrganizer.java
+++ b/core/java/android/window/TaskOrganizer.java
@@ -266,31 +266,6 @@ public class TaskOrganizer extends WindowOrganizer {
}
/**
- * Controls whether ignore orientation request logic in {@link
- * com.android.server.wm.DisplayArea} is disabled at runtime and how to optionally map some
- * requested orientation to others.
- *
- * @param isIgnoreOrientationRequestDisabled when {@code true}, the system always ignores the
- * value of {@link com.android.server.wm.DisplayArea#getIgnoreOrientationRequest}
- * and app requested orientation is respected.
- * @param fromOrientations The orientations we want to map to the correspondent orientations
- * in toOrientation.
- * @param toOrientations The orientations we map to the ones in fromOrientations at the same
- * index
- * @hide
- */
- @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
- public void setOrientationRequestPolicy(boolean isIgnoreOrientationRequestDisabled,
- @Nullable int[] fromOrientations, @Nullable int[] toOrientations) {
- try {
- mTaskOrganizerController.setOrientationRequestPolicy(isIgnoreOrientationRequestDisabled,
- fromOrientations, toOrientations);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* Gets the executor to run callbacks on.
* @hide
*/
diff --git a/core/java/android/window/TrustedPresentationListener.java b/core/java/android/window/TrustedPresentationListener.java
new file mode 100644
index 000000000000..02fd6d98fb0d
--- /dev/null
+++ b/core/java/android/window/TrustedPresentationListener.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 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.window;
+
+/**
+ * @hide
+ */
+public interface TrustedPresentationListener {
+
+ void onTrustedPresentationChanged(boolean inTrustedPresentationState);
+
+}
diff --git a/core/java/android/window/TrustedPresentationThresholds.aidl b/core/java/android/window/TrustedPresentationThresholds.aidl
new file mode 100644
index 000000000000..d7088bf0fddc
--- /dev/null
+++ b/core/java/android/window/TrustedPresentationThresholds.aidl
@@ -0,0 +1,3 @@
+package android.window;
+
+parcelable TrustedPresentationThresholds;
diff --git a/core/java/android/window/TrustedPresentationThresholds.java b/core/java/android/window/TrustedPresentationThresholds.java
new file mode 100644
index 000000000000..801d35c49228
--- /dev/null
+++ b/core/java/android/window/TrustedPresentationThresholds.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 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.window;
+
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.view.SurfaceControl;
+
+import androidx.annotation.NonNull;
+
+/**
+ * @hide
+ */
+public final class TrustedPresentationThresholds implements Parcelable {
+ /**
+ * The min alpha the {@link SurfaceControl} is required to have to be considered inside the
+ * threshold.
+ */
+ @FloatRange(from = 0f, fromInclusive = false, to = 1f)
+ public final float mMinAlpha;
+
+ /**
+ * The min fraction of the SurfaceControl that was presented to the user to be considered
+ * inside the threshold.
+ */
+ @FloatRange(from = 0f, fromInclusive = false, to = 1f)
+ public final float mMinFractionRendered;
+
+ /**
+ * The time in milliseconds required for the {@link SurfaceControl} to be in the threshold.
+ */
+ @IntRange(from = 1)
+ public final int mStabilityRequirementMs;
+
+ private void checkValid() {
+ if (mMinAlpha <= 0 || mMinFractionRendered <= 0 || mStabilityRequirementMs < 1) {
+ throw new IllegalArgumentException(
+ "TrustedPresentationThresholds values are invalid");
+ }
+ }
+
+ /**
+ * Creates a new TrustedPresentationThresholds.
+ *
+ * @param minAlpha The min alpha the {@link SurfaceControl} is required to
+ * have to be considered inside the
+ * threshold.
+ * @param minFractionRendered The min fraction of the SurfaceControl that was presented
+ * to the user to be considered
+ * inside the threshold.
+ * @param stabilityRequirementMs The time in milliseconds required for the
+ * {@link SurfaceControl} to be in the threshold.
+ */
+ public TrustedPresentationThresholds(
+ @FloatRange(from = 0f, fromInclusive = false, to = 1f) float minAlpha,
+ @FloatRange(from = 0f, fromInclusive = false, to = 1f) float minFractionRendered,
+ @IntRange(from = 1) int stabilityRequirementMs) {
+ this.mMinAlpha = minAlpha;
+ this.mMinFractionRendered = minFractionRendered;
+ this.mStabilityRequirementMs = stabilityRequirementMs;
+ checkValid();
+ }
+
+ @Override
+ public String toString() {
+ return "TrustedPresentationThresholds { "
+ + "minAlpha = " + mMinAlpha + ", "
+ + "minFractionRendered = " + mMinFractionRendered + ", "
+ + "stabilityRequirementMs = " + mStabilityRequirementMs
+ + " }";
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeFloat(mMinAlpha);
+ dest.writeFloat(mMinFractionRendered);
+ dest.writeInt(mStabilityRequirementMs);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * @hide
+ */
+ TrustedPresentationThresholds(@NonNull Parcel in) {
+ mMinAlpha = in.readFloat();
+ mMinFractionRendered = in.readFloat();
+ mStabilityRequirementMs = in.readInt();
+
+ checkValid();
+ }
+
+ /**
+ * @hide
+ */
+ public static final @NonNull Creator<TrustedPresentationThresholds> CREATOR =
+ new Creator<TrustedPresentationThresholds>() {
+ @Override
+ public TrustedPresentationThresholds[] newArray(int size) {
+ return new TrustedPresentationThresholds[size];
+ }
+
+ @Override
+ public TrustedPresentationThresholds createFromParcel(@NonNull Parcel in) {
+ return new TrustedPresentationThresholds(in);
+ }
+ };
+}
diff --git a/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java b/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java
index 7be27be2e798..1bd098291a2a 100644
--- a/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java
+++ b/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java
@@ -87,10 +87,6 @@ public class SystemUiSystemPropertiesFlags {
public static final Flag NOTIF_COOLDOWN_RULE = devFlag(
"persist.debug.sysui.notification.notif_cooldown_rule", "rule1");
- /** b/301242692: Visit extra URIs used in notifications to prevent security issues. */
- public static final Flag VISIT_RISKY_URIS = devFlag(
- "persist.sysui.notification.visit_risky_uris");
-
/** b/303716154: For debugging only: use short bitmap duration. */
public static final Flag DEBUG_SHORT_BITMAP_DURATION = devFlag(
"persist.sysui.notification.debug_short_bitmap_duration");
diff --git a/core/java/com/android/internal/display/RefreshRateSettingsUtils.java b/core/java/com/android/internal/display/RefreshRateSettingsUtils.java
index f5fe12eb66c0..e55c64199f45 100644
--- a/core/java/com/android/internal/display/RefreshRateSettingsUtils.java
+++ b/core/java/com/android/internal/display/RefreshRateSettingsUtils.java
@@ -37,22 +37,11 @@ public class RefreshRateSettingsUtils {
* @return The highest refresh rate
*/
public static float findHighestRefreshRateForDefaultDisplay(Context context) {
- return findHighestRefreshRate(context, Display.DEFAULT_DISPLAY);
- }
-
- /**
- * Find the highest refresh rate among all the modes of the specified display.
- *
- * @param context The context
- * @param displayId The display ID
- * @return The highest refresh rate
- */
- public static float findHighestRefreshRate(Context context, int displayId) {
final DisplayManager dm = context.getSystemService(DisplayManager.class);
- final Display display = dm.getDisplay(displayId);
+ final Display display = dm.getDisplay(Display.DEFAULT_DISPLAY);
if (display == null) {
- Log.w(TAG, "No valid display device with ID = " + displayId);
+ Log.w(TAG, "No valid default display device");
return DEFAULT_REFRESH_RATE;
}
diff --git a/core/java/com/android/internal/protolog/ProtoLogGroup.java b/core/java/com/android/internal/protolog/ProtoLogGroup.java
index 4bb7c33b41e2..8c2a52560050 100644
--- a/core/java/com/android/internal/protolog/ProtoLogGroup.java
+++ b/core/java/com/android/internal/protolog/ProtoLogGroup.java
@@ -93,6 +93,7 @@ public enum ProtoLogGroup implements IProtoLogGroup {
WM_DEBUG_DREAM(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true, Consts.TAG_WM),
WM_DEBUG_DIMMER(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
+ WM_DEBUG_TPL(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
TEST_GROUP(true, true, false, "WindowManagerProtoLogTest");
private final boolean mEnabled;
diff --git a/core/java/com/android/internal/vibrator/persistence/SerializedVibrationEffect.java b/core/java/com/android/internal/vibrator/persistence/SerializedVibrationEffect.java
index 84e8647991da..23df3048e69c 100644
--- a/core/java/com/android/internal/vibrator/persistence/SerializedVibrationEffect.java
+++ b/core/java/com/android/internal/vibrator/persistence/SerializedVibrationEffect.java
@@ -65,9 +65,9 @@ final class SerializedVibrationEffect implements XmlSerializedVibration<Vibratio
@Override
public void write(@NonNull TypedXmlSerializer serializer)
throws IOException {
- serializer.startTag(XmlConstants.NAMESPACE, XmlConstants.TAG_VIBRATION);
+ serializer.startTag(XmlConstants.NAMESPACE, XmlConstants.TAG_VIBRATION_EFFECT);
writeContent(serializer);
- serializer.endTag(XmlConstants.NAMESPACE, XmlConstants.TAG_VIBRATION);
+ serializer.endTag(XmlConstants.NAMESPACE, XmlConstants.TAG_VIBRATION_EFFECT);
}
@Override
diff --git a/core/java/com/android/internal/vibrator/persistence/VibrationEffectXmlParser.java b/core/java/com/android/internal/vibrator/persistence/VibrationEffectXmlParser.java
index 3561fe458085..2b8b61d50a6c 100644
--- a/core/java/com/android/internal/vibrator/persistence/VibrationEffectXmlParser.java
+++ b/core/java/com/android/internal/vibrator/persistence/VibrationEffectXmlParser.java
@@ -18,7 +18,7 @@ package com.android.internal.vibrator.persistence;
import static com.android.internal.vibrator.persistence.XmlConstants.TAG_PREDEFINED_EFFECT;
import static com.android.internal.vibrator.persistence.XmlConstants.TAG_PRIMITIVE_EFFECT;
-import static com.android.internal.vibrator.persistence.XmlConstants.TAG_VIBRATION;
+import static com.android.internal.vibrator.persistence.XmlConstants.TAG_VIBRATION_EFFECT;
import static com.android.internal.vibrator.persistence.XmlConstants.TAG_WAVEFORM_EFFECT;
import android.annotation.NonNull;
@@ -44,9 +44,9 @@ import java.util.List;
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <predefined-effect name="click" />
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
@@ -54,7 +54,7 @@ import java.util.List;
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <waveform-effect>
* <waveform-entry amplitude="default" durationMs="10" />
* <waveform-entry amplitude="0" durationMs="10" />
@@ -65,7 +65,7 @@ import java.util.List;
* <waveform-entry amplitude="255" durationMs="20" />
* </repeating>
* </waveform-effect>
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
@@ -73,10 +73,10 @@ import java.util.List;
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <primitive-effect name="click" />
* <primitive-effect name="tick" scale="0.5" delayMs="100" />
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
@@ -94,7 +94,7 @@ public class VibrationEffectXmlParser {
public static XmlSerializedVibration<VibrationEffect> parseTag(
@NonNull TypedXmlPullParser parser, @XmlConstants.Flags int flags)
throws XmlParserException, IOException {
- XmlValidator.checkStartTag(parser, TAG_VIBRATION);
+ XmlValidator.checkStartTag(parser, TAG_VIBRATION_EFFECT);
XmlValidator.checkTagHasNoUnexpectedAttributes(parser);
return parseVibrationContent(parser, flags);
diff --git a/core/java/com/android/internal/vibrator/persistence/XmlConstants.java b/core/java/com/android/internal/vibrator/persistence/XmlConstants.java
index 6b69a158220c..8b92153b27db 100644
--- a/core/java/com/android/internal/vibrator/persistence/XmlConstants.java
+++ b/core/java/com/android/internal/vibrator/persistence/XmlConstants.java
@@ -35,7 +35,7 @@ public final class XmlConstants {
public static final String NAMESPACE = null;
- public static final String TAG_VIBRATION = "vibration";
+ public static final String TAG_VIBRATION_EFFECT = "vibration-effect";
public static final String TAG_VIBRATION_SELECT = "vibration-select";
public static final String TAG_PREDEFINED_EFFECT = "predefined-effect";
diff --git a/core/java/com/android/internal/vibrator/persistence/XmlSerializedVibration.java b/core/java/com/android/internal/vibrator/persistence/XmlSerializedVibration.java
index f807ab939c3a..3233fa224694 100644
--- a/core/java/com/android/internal/vibrator/persistence/XmlSerializedVibration.java
+++ b/core/java/com/android/internal/vibrator/persistence/XmlSerializedVibration.java
@@ -54,7 +54,8 @@ public interface XmlSerializedVibration<T> {
*
* <p>This allows the same serialized representation of a vibration to be used in different
* contexts (e.g. a {@link android.os.VibrationEffect} can be written into any of the tags
- * {@code <vibration>}, {@code <parallel-vibration>} or {@code <vibration vibratorId="0">}).
+ * {@code <vibration-effect>}, {@code <parallel-vibration-effect>}
+ * or {@code <vibration-effect vibratorId="0">}).
*
* @param serializer The output XML serializer where the vibration will be written
*/
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index 1c3fd93cb895..595bf3b8eb97 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -152,8 +152,8 @@ interface IInputMethodManager {
in String delegatorPackageName);
/** Accepts and starts a stylus handwriting session for the delegate view **/
- boolean acceptStylusHandwritingDelegation(in IInputMethodClient client,
- in int userId, in String delegatePackageName, in String delegatorPackageName);
+ boolean acceptStylusHandwritingDelegation(in IInputMethodClient client, in int userId,
+ in String delegatePackageName, in String delegatorPackageName, int flags);
/** Returns {@code true} if currently selected IME supports Stylus handwriting. */
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
diff --git a/core/java/com/android/server/LocalServices.java b/core/java/com/android/server/LocalServices.java
index 9c632ea725a9..2a10918a5161 100644
--- a/core/java/com/android/server/LocalServices.java
+++ b/core/java/com/android/server/LocalServices.java
@@ -29,6 +29,7 @@ import android.util.ArrayMap;
*
* {@hide}
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class LocalServices {
private LocalServices() {}
@@ -69,4 +70,14 @@ public final class LocalServices {
sLocalServiceObjects.remove(type);
}
}
+
+ /**
+ * Remove all known service instances, must be only used in tests.
+ */
+ @VisibleForTesting
+ public static void removeAllServicesForTest() {
+ synchronized (sLocalServiceObjects) {
+ sLocalServiceObjects.clear();
+ }
+ }
}
diff --git a/core/jni/android_os_PerformanceHintManager.cpp b/core/jni/android_os_PerformanceHintManager.cpp
index 95bf49fe501e..aebe7ea7ee61 100644
--- a/core/jni/android_os_PerformanceHintManager.cpp
+++ b/core/jni/android_os_PerformanceHintManager.cpp
@@ -16,15 +16,16 @@
#define LOG_TAG "PerfHint-jni"
-#include "jni.h"
-
+#include <android/performance_hint.h>
#include <dlfcn.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedPrimitiveArray.h>
#include <utils/Log.h>
+
#include <vector>
#include "core_jni_helpers.h"
+#include "jni.h"
namespace android {
@@ -44,6 +45,11 @@ typedef void (*APH_sendHint)(APerformanceHintSession*, int32_t);
typedef int (*APH_setThreads)(APerformanceHintSession*, const pid_t*, size_t);
typedef void (*APH_getThreadIds)(APerformanceHintSession*, int32_t* const, size_t* const);
typedef void (*APH_setPreferPowerEfficiency)(APerformanceHintSession*, bool);
+typedef void (*APH_reportActualWorkDuration2)(APerformanceHintSession*, AWorkDuration*);
+
+typedef AWorkDuration* (*AWD_create)();
+typedef void (*AWD_setTimeNanos)(AWorkDuration*, int64_t);
+typedef void (*AWD_release)(AWorkDuration*);
bool gAPerformanceHintBindingInitialized = false;
APH_getManager gAPH_getManagerFn = nullptr;
@@ -56,6 +62,14 @@ APH_sendHint gAPH_sendHintFn = nullptr;
APH_setThreads gAPH_setThreadsFn = nullptr;
APH_getThreadIds gAPH_getThreadIdsFn = nullptr;
APH_setPreferPowerEfficiency gAPH_setPreferPowerEfficiencyFn = nullptr;
+APH_reportActualWorkDuration2 gAPH_reportActualWorkDuration2Fn = nullptr;
+
+AWD_create gAWD_createFn = nullptr;
+AWD_setTimeNanos gAWD_setWorkPeriodStartTimestampNanosFn = nullptr;
+AWD_setTimeNanos gAWD_setActualTotalDurationNanosFn = nullptr;
+AWD_setTimeNanos gAWD_setActualCpuDurationNanosFn = nullptr;
+AWD_setTimeNanos gAWD_setActualGpuDurationNanosFn = nullptr;
+AWD_release gAWD_releaseFn = nullptr;
void ensureAPerformanceHintBindingInitialized() {
if (gAPerformanceHintBindingInitialized) return;
@@ -112,9 +126,46 @@ void ensureAPerformanceHintBindingInitialized() {
(APH_setPreferPowerEfficiency)dlsym(handle_,
"APerformanceHint_setPreferPowerEfficiency");
LOG_ALWAYS_FATAL_IF(gAPH_setPreferPowerEfficiencyFn == nullptr,
- "Failed to find required symbol"
+ "Failed to find required symbol "
"APerformanceHint_setPreferPowerEfficiency!");
+ gAPH_reportActualWorkDuration2Fn =
+ (APH_reportActualWorkDuration2)dlsym(handle_,
+ "APerformanceHint_reportActualWorkDuration2");
+ LOG_ALWAYS_FATAL_IF(gAPH_reportActualWorkDuration2Fn == nullptr,
+ "Failed to find required symbol "
+ "APerformanceHint_reportActualWorkDuration2!");
+
+ gAWD_createFn = (AWD_create)dlsym(handle_, "AWorkDuration_create");
+ LOG_ALWAYS_FATAL_IF(gAWD_createFn == nullptr,
+ "Failed to find required symbol AWorkDuration_create!");
+
+ gAWD_setWorkPeriodStartTimestampNanosFn =
+ (AWD_setTimeNanos)dlsym(handle_, "AWorkDuration_setWorkPeriodStartTimestampNanos");
+ LOG_ALWAYS_FATAL_IF(gAWD_setWorkPeriodStartTimestampNanosFn == nullptr,
+ "Failed to find required symbol "
+ "AWorkDuration_setWorkPeriodStartTimestampNanos!");
+
+ gAWD_setActualTotalDurationNanosFn =
+ (AWD_setTimeNanos)dlsym(handle_, "AWorkDuration_setActualTotalDurationNanos");
+ LOG_ALWAYS_FATAL_IF(gAWD_setActualTotalDurationNanosFn == nullptr,
+ "Failed to find required symbol "
+ "AWorkDuration_setActualTotalDurationNanos!");
+
+ gAWD_setActualCpuDurationNanosFn =
+ (AWD_setTimeNanos)dlsym(handle_, "AWorkDuration_setActualCpuDurationNanos");
+ LOG_ALWAYS_FATAL_IF(gAWD_setActualCpuDurationNanosFn == nullptr,
+ "Failed to find required symbol AWorkDuration_setActualCpuDurationNanos!");
+
+ gAWD_setActualGpuDurationNanosFn =
+ (AWD_setTimeNanos)dlsym(handle_, "AWorkDuration_setActualGpuDurationNanos");
+ LOG_ALWAYS_FATAL_IF(gAWD_setActualGpuDurationNanosFn == nullptr,
+ "Failed to find required symbol AWorkDuration_setActualGpuDurationNanos!");
+
+ gAWD_releaseFn = (AWD_release)dlsym(handle_, "AWorkDuration_release");
+ LOG_ALWAYS_FATAL_IF(gAWD_releaseFn == nullptr,
+ "Failed to find required symbol AWorkDuration_release!");
+
gAPerformanceHintBindingInitialized = true;
}
@@ -238,6 +289,25 @@ static void nativeSetPreferPowerEfficiency(JNIEnv* env, jclass clazz, jlong nati
enabled);
}
+static void nativeReportActualWorkDuration2(JNIEnv* env, jclass clazz, jlong nativeSessionPtr,
+ jlong workPeriodStartTimestampNanos,
+ jlong actualTotalDurationNanos,
+ jlong actualCpuDurationNanos,
+ jlong actualGpuDurationNanos) {
+ ensureAPerformanceHintBindingInitialized();
+
+ AWorkDuration* workDuration = gAWD_createFn();
+ gAWD_setWorkPeriodStartTimestampNanosFn(workDuration, workPeriodStartTimestampNanos);
+ gAWD_setActualTotalDurationNanosFn(workDuration, actualTotalDurationNanos);
+ gAWD_setActualCpuDurationNanosFn(workDuration, actualCpuDurationNanos);
+ gAWD_setActualGpuDurationNanosFn(workDuration, actualGpuDurationNanos);
+
+ gAPH_reportActualWorkDuration2Fn(reinterpret_cast<APerformanceHintSession*>(nativeSessionPtr),
+ workDuration);
+
+ gAWD_releaseFn(workDuration);
+}
+
static const JNINativeMethod gPerformanceHintMethods[] = {
{"nativeAcquireManager", "()J", (void*)nativeAcquireManager},
{"nativeGetPreferredUpdateRateNanos", "(J)J", (void*)nativeGetPreferredUpdateRateNanos},
@@ -249,6 +319,7 @@ static const JNINativeMethod gPerformanceHintMethods[] = {
{"nativeSetThreads", "(J[I)V", (void*)nativeSetThreads},
{"nativeGetThreadIds", "(J)[I", (void*)nativeGetThreadIds},
{"nativeSetPreferPowerEfficiency", "(JZ)V", (void*)nativeSetPreferPowerEfficiency},
+ {"nativeReportActualWorkDuration", "(JJJJJ)V", (void*)nativeReportActualWorkDuration2},
};
int register_android_os_PerformanceHintManager(JNIEnv* env) {
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index 4d6ed80aa763..3887dd7a753f 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -268,6 +268,13 @@ message SecureSettingsProto {
optional SettingProto enhanced_voice_privacy_enabled = 23 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ message EvenDimmer {
+ optional SettingProto even_dimmer_activated = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto even_dimmer_min_nits = 2 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ }
+
+ optional EvenDimmer even_dimmer = 98;
+
optional SettingProto font_weight_adjustment = 85 [ (android.privacy).dest = DEST_AUTOMATIC ];
message Gesture {
@@ -712,5 +719,5 @@ message SecureSettingsProto {
// Please insert fields in alphabetical order and group them into messages
// if possible (to avoid reaching the method limit).
- // Next tag = 98;
+ // Next tag = 99;
}
diff --git a/core/proto/android/server/usagestatsservice_v2.proto b/core/proto/android/server/usagestatsservice_v2.proto
index d5cf60d94e3a..c242c9ca3218 100644
--- a/core/proto/android/server/usagestatsservice_v2.proto
+++ b/core/proto/android/server/usagestatsservice_v2.proto
@@ -110,6 +110,7 @@ message EventObfuscatedProto {
optional int32 task_root_package_token = 11;
optional int32 task_root_class_token = 12;
optional int32 locus_id_token = 13;
+ optional ObfuscatedUserInteractionExtrasProto interaction_extras = 14;
}
/**
@@ -129,6 +130,7 @@ message PendingEventProto {
optional string task_root_package = 11;
optional string task_root_class = 12;
optional string locus_id = 13 [(.android.privacy).dest = DEST_EXPLICIT];
+ optional bytes extras = 14;
}
/**
@@ -145,3 +147,11 @@ message ObfuscatedPackagesProto {
// Stores the mappings for every package
repeated PackagesMap packages_map = 2;
}
+
+/**
+ * Store the relevant information from extra details for user interaction event.
+ */
+message ObfuscatedUserInteractionExtrasProto {
+ optional int32 category_token = 1;
+ optional int32 action_token = 2;
+}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 002164011e84..cf41a06a824e 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -102,6 +102,7 @@
<protected-broadcast android:name="android.intent.action.OVERLAY_PRIORITY_CHANGED" />
<protected-broadcast android:name="android.intent.action.MY_PACKAGE_SUSPENDED" />
<protected-broadcast android:name="android.intent.action.MY_PACKAGE_UNSUSPENDED" />
+ <protected-broadcast android:name="android.intent.action.UNARCHIVE_PACKAGE" />
<protected-broadcast android:name="android.os.action.POWER_SAVE_MODE_CHANGED" />
<protected-broadcast android:name="android.os.action.DEVICE_IDLE_MODE_CHANGED" />
diff --git a/core/res/res/raw/default_ringtone_vibration_effect.ahv b/core/res/res/raw/default_ringtone_vibration_effect.ahv
index c66fc046316b..c4a27a4dc797 100644
--- a/core/res/res/raw/default_ringtone_vibration_effect.ahv
+++ b/core/res/res/raw/default_ringtone_vibration_effect.ahv
@@ -18,7 +18,7 @@
*/
-->
-<vibration>
+<vibration-effect>
<waveform-effect>
<waveform-entry amplitude="0" durationMs="0" />
<waveform-entry amplitude="255" durationMs="12" />
@@ -44,4 +44,4 @@
<waveform-entry amplitude="0" durationMs="1000" />
</repeating>
</waveform-effect>
-</vibration> \ No newline at end of file
+</vibration-effect> \ No newline at end of file
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index f5b828922165..625b1413e403 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Sleutelborduitleg is gestel op <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> … Tik om dit te verander."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fisieke sleutelborde is opgestel"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tik om sleutelborde te bekyk"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index fbef501115b6..1ec3ffd91b41 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"የቁልፍ ሰሌዳ አቀማመጥ ወደ <xliff:g id="LAYOUT_1">%1$s</xliff:g>፣ <xliff:g id="LAYOUT_2">%2$s</xliff:g>፣ <xliff:g id="LAYOUT_3">%3$s</xliff:g> ተቀናብሯል… ለመቀጠል መታ ያድርጉ።"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"የተዋቀሩ አካላዊ የቁልፍ ሰሌዳዎች"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"የቁልፍ ሰሌዳዎችን ለማየት መታ ያድርጉ"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"የግል"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"አባዛ"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"ሥራ"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"ሥራ 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"ሥራ 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"ሙከራ"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"የጋራ"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 9ca2d1996156..04fb30076217 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1694,7 +1694,7 @@
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"إزالة"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"هل تريد رفع مستوى الصوت فوق المستوى الموصى به؟\n\nقد يضر سماع صوت عالٍ لفترات طويلة بسمعك."</string>
<string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"هل تريد مواصلة الاستماع بصوت عالٍ؟\n\nكان مستوى صوت سمّاعة الرأس مرتفعًا لمدة أطول مما يُنصَح به، وقد يضر هذا بسمعك."</string>
- <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"تم رصد صوت مرتفع\n\nكان مستوى صوت سمّاعة الرأس مرتفعًا لمدة أطول مما يُنصَح به، وقد يضر هذا بسمعك."</string>
+ <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"تم رصد صوت مرتفع\n\nكان مستوى صوت سمّاعة الرأس أعلى من المستوى الذي يُنصَح به، ما قد يضرّ بسمعك."</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"هل تريد استخدام اختصار \"سهولة الاستخدام\"؟"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"عند تفعيل الاختصار، يؤدي الضغط على زرّي التحكّم في مستوى الصوت معًا لمدة 3 ثوانٍ إلى تفعيل إحدى ميزات إمكانية الوصول."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"هل تريد تفعيل الاختصار لميزات إمكانية الوصول؟"</string>
@@ -2363,4 +2363,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"تم ضبط تنسيق لوحة المفاتيح على <xliff:g id="LAYOUT_1">%1$s</xliff:g> و<xliff:g id="LAYOUT_2">%2$s</xliff:g> و<xliff:g id="LAYOUT_3">%3$s</xliff:g>… انقر لتغييره."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"تم إعداد لوحات المفاتيح الخارجية"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"انقر لعرض لوحات المفاتيح."</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 7473f4924220..826844f4321b 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"কীব’ৰ্ডৰ লে’আউট <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> হিচাপে ছেট কৰা হৈছে… সলনি কৰিবলৈ টিপক।"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ভৌতিক কীব’ৰ্ড কনফিগাৰ কৰা হৈছে"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"কীব’ৰ্ড চাবলৈ টিপক"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index b1002e2cdd5d..66a5670ff178 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Klaviatura düzəni <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> kimi ayarlanıb… Dəyişmək üçün toxunun."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fiziki klaviaturalar konfiqurasiya edilib"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Klaviaturalara baxmaq üçün toxunun"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 196818a755c3..b6121edacfaf 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Raspored tastature je podešen na <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Dodirnite da biste promenili."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fizičke tastature su konfigurisane"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Dodirnite da biste videli tastature"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index d7efa8ac6597..3c01f1b4a2fe 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -2361,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Раскладка клавіятуры наладжана для наступных моў: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Націсніце, каб змяніць."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Фізічныя клавіятуры наладжаны"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Націсніце, каб праглядзець клавіятуры"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index b9e1db4816c7..3b1ff9e075f4 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"За клавиатурната подредба са зададени <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> и <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Докоснете за промяна."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физическите клавиатури са конфигурирани"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Докоснете за преглед на клавиатурите"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 669c99e935a0..58dd7c2165ad 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"এটি কোনও একটি অ্যাপের সাথে অথবা হার্ডওয়্যার সেন্সরের সাথে আপনার ইন্টার‍্যাকশন ট্র্যাক করতে এবং আপনার হয়ে বিভিন্ন অ্যাপের সাথে ইন্টার‍্যাক্ট করতে পারে।"</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"অনুমতি দিন"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"খারিজ করুন"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"আনইনস্টল করুন"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"কোনও অ্যাপ অনুমতির অনুরোধ আড়াল করছে তাই আপনার উত্তর যাচাই করা যাবে না।"</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"কোনও ফিচার ব্যবহার করা শুরু করতে, সেটিতে ট্যাপ করুন:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"অ্যাক্সেসিবিলিটি বোতামের সাহায্যে আপনি যেসব ফিচার ব্যবহার করতে চান সেগুলি বেছে নিন"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"ভলিউম কী শর্টকাটের সাহায্যে আপনি যেসব ফিচার ব্যবহার করতে চান সেগুলি বেছে নিন"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"কীবোর্ড লেআউট <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>-এ সেট করা আছে… পালটাতে ট্যাপ করুন।"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ফিজিক্যাল কীবোর্ড কনফিগার করা হয়েছে"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"কীবোর্ড দেখতে ট্যাপ করুন"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 9dcd8693f886..aa66e02e8c97 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Raspored tastature je postavljen na <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Dodirnite da promijenite."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fizičke tastature su konfigurirane"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Dodirnite da pregledate tastature"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 66e76ac083e9..be8654db08f6 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Disseny del teclat definit en <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toca per canviar-ho."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclats físic configurats"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toca per veure els teclats"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 1acb8d44b890..ed2f93a88bce 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1712,10 +1712,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Služba může sledovat vaše interakce s aplikací nebo hardwarovým senzorem a komunikovat s aplikacemi namísto vás."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Povolit"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Zakázat"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Odinstalovat"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Žádost o oprávnění skrývá nějaká aplikace, proto vaši odpověď nelze ověřit."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Chcete-li některou funkci začít používat, klepněte na ni:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Vyberte funkce, které budete používat s tlačítkem přístupnosti"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Vyberte funkce, které budete používat se zkratkou tlačítka hlasitosti"</string>
@@ -2363,4 +2361,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Rozložení klávesnice je nastaveno na <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Klepnutím jej změníte."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fyzické klávesnice byly nakonfigurovány"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Klepnutím zobrazíte klávesnice"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Soukromé"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Klonovat"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Práce"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Práce 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Práce 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Komunální"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index bedd941c6543..35def43ac231 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tastaturlayoutet er angivet som <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tryk for at ændre dette."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fysiske tastaturer er konfigureret"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tryk for at se tastaturer"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 2867da922018..50501c68900a 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1711,7 +1711,7 @@
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Zulassen"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Ablehnen"</string>
<string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Deinstallieren"</string>
- <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Eine App verdeckt die Berechtigungsanfrage und deine Antwort kann deshalb nicht überprüft werden."</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Die Berechtigungsanfrage wird durch eine andere App verdeckt. Daher kann deine Antwort nicht geprüft werden."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Zum Auswählen der gewünschten Funktion tippen:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Funktionen auswählen, die du mit der Schaltfläche \"Bedienungshilfen\" verwenden möchtest"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Funktionen für Verknüpfung mit Lautstärketaste auswählen"</string>
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tastaturlayout festgelegt auf <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Zum Ändern tippen."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Physische Tastaturen konfiguriert"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Zum Ansehen der Tastaturen tippen"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Privat"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Klon"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Geschäftlich"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Geschäftlich 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Geschäftlich 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Gemeinsam genutzt"</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index b6b4da2116c4..dc73c218cc58 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Η διάταξη πληκτρολογίου ορίστηκε σε <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Πατήστε για αλλαγή."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Τα φυσικά πληκτρολόγια διαμορφώθηκαν"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Πατήστε για να δείτε πληκτρολόγια"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Ιδιωτικό"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Κλώνος"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Εργασία"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Εργασία 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Εργασία 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Δοκιμή"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Κοινόχρηστο"</string>
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 94ae6cb493c8..179bdb435420 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Keyboard layout set to <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tap to change."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Physical keyboards configured"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tap to view keyboards"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index ec41583fd00d..5fb0e5aa83ee 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Keyboard layout set to <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tap to change."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Physical keyboards configured"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tap to view keyboards"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Private"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Clone"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Work"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Work 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Work 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Communal"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 2c155244cefe..2a4f88e52b10 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Keyboard layout set to <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tap to change."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Physical keyboards configured"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tap to view keyboards"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index ff910802f0f8..0f08d2fb7fd8 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Keyboard layout set to <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tap to change."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Physical keyboards configured"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tap to view keyboards"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index b1dd1f1438b5..0bdd29744875 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‏‎‏‏‎‏‏‎‎‏‎Keyboard layout set to ‎‏‎‎‏‏‎<xliff:g id="LAYOUT_1">%1$s</xliff:g>‎‏‎‎‏‏‏‎, ‎‏‎‎‏‏‎<xliff:g id="LAYOUT_2">%2$s</xliff:g>‎‏‎‎‏‏‏‎, ‎‏‎‎‏‏‎<xliff:g id="LAYOUT_3">%3$s</xliff:g>‎‏‎‎‏‏‏‎… Tap to change.‎‏‎‎‏‎"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‏‎‏‏‏‎‎‏‏‎Physical keyboards configured‎‏‎‎‏‎"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‎‎‏‎‎Tap to view keyboards‎‏‎‎‏‎"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‎‎‏‏‎‎‎‏‎‎‎‏‎‎‏‎‎‎‎Private‎‏‎‎‏‎"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‏‏‎‎‎‏‎‎‎‎‎‎‏‎‏‏‎‏‎Clone‎‏‎‎‏‎"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎Work‎‏‎‎‏‎"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‏‏‎Work 2‎‏‎‎‏‎"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎Work 3‎‏‎‎‏‎"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‎‏‎‏‏‎Test‎‏‎‎‏‎"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‏‏‎‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‎‏‏‎Communal‎‏‎‎‏‎"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 39a479e55b26..bef851d20f9b 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -2360,4 +2360,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Diseño de teclado establecido en <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>. Presiona para cambiar esta opción."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Presiona para ver los teclados"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Privado"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Clonar"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Trabajo"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Trabajo 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Trabajo 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Probar"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Compartido"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 30ed6247d62f..29f0f8f7623a 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1691,7 +1691,7 @@
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"Quitar"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"¿Quieres subir el volumen por encima del nivel recomendado?\n\nEscuchar sonidos fuertes durante mucho tiempo puede dañar los oídos."</string>
<string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"¿Seguir escuchando a un volumen alto?\n\nEl volumen de los auriculares ha estado alto durante más tiempo del recomendado, lo que puede dañar tu audición."</string>
- <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Sonido alto detectado\n\nEl volumen de los auriculares está más alto de lo recomendado, lo que puede dañar tu audición."</string>
+ <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Volumen alto detectado\n\nEl volumen de los auriculares está más alto de lo recomendado, lo que puede dañar tu audición."</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"¿Utilizar acceso directo de accesibilidad?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Si el acceso directo está activado, pulsa los dos botones de volumen durante 3 segundos para iniciar una función de accesibilidad."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"¿Quieres activar el acceso directo a las funciones de accesibilidad?"</string>
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Diseño del teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toca para cambiarlo."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toca para ver los teclados"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index c4ea35188a8f..4a42b0066a96 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Klaviatuuripaigutuseks on määratud <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> … puudutage muutmiseks."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Füüsilised klaviatuurid on seadistatud"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Puudutage klaviatuuride vaatamiseks"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 26362d5ed812..3b76e8886613 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Ezarri da <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> eta <xliff:g id="LAYOUT_3">%3$s</xliff:g> gisa teklatuaren diseinua… Diseinu hori aldatzeko, sakatu hau."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Konfiguratu dira teklatu fisikoak"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Sakatu hau teklatuak ikusteko"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index c96c5809e697..71dbc43bb4ec 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1711,7 +1711,7 @@
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"اجازه دادن"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"مجاز نبودن"</string>
<string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"حذف نصب"</string>
- <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"برنامه‌ای درخواست اجازه را می‌پوشاند و بنابراین نمی‌توان پاسخ شما را تأیید کرد."</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"پاسخ شما تأیید نشد زیرا یک برنامه درخواست اجازه را مسدود کرده است."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"برای استفاده از ویژگی، روی آن ضربه بزنید:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"انتخاب ویژگی‌های موردنظر برای استفاده با دکمه دسترس‌پذیری"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"انتخاب ویژگی‌های موردنظر برای استفاده با میان‌بر کلید میزان صدا"</string>
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"جانمایی صفحه‌کلید چنین تنظیم شد: <xliff:g id="LAYOUT_1">%1$s</xliff:g>، <xliff:g id="LAYOUT_2">%2$s</xliff:g>، <xliff:g id="LAYOUT_3">%3$s</xliff:g>… برای تغییر ضربه بزنید"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"صفحه‌کلیدهای فیزیکی پیکربندی شدند"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"برای مشاهده صفحه‌کلیدها ضربه بزنید"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index c2037863fab1..c69bafebcf86 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Näppäimistöasetteluksi valittu <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Muuta asetuksia napauttamalla."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fyysiset näppäimistöt määritetty"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Katso näppäimistöt napauttamalla"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index f06d20f60f46..6c88f456d1b7 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Disposition du clavier définie à <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Touchez pour modifier."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Claviers physiques configurés"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Touchez pour afficher les claviers"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index b69db321c3f1..e0345dd881df 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -2360,4 +2360,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Disposition du clavier définie sur <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Appuyez pour la modifier."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Claviers physiques configurés"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Appuyez pour voir les claviers"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Privé"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Clone"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Professionnel"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Professionnel 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Professionnel 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Commun"</string>
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index f26dbfb9c941..c1e2bbfe51ad 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"O deseño do teclado estableceuse en <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toca para cambialo."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Configuráronse varios teclados físicos"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toca para ver os teclados"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index d64e33a0fb5f..da75282afe5b 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"કીબોર્ડનું લેઆઉટ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> પર સેટ કરવામાં આવ્યું છે… બદલવા માટે ટૅપ કરો."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ભૌતિક કીબોર્ડની ગોઠવણી કરવામાં આવી છે"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"કીબોર્ડ જોવા માટે ટૅપ કરો"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 61db7849cecf..d448b51a4c18 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1951,7 +1951,7 @@
<string name="language_selection_title" msgid="52674936078683285">"भाषा जोड़ें"</string>
<string name="country_selection_title" msgid="5221495687299014379">"क्षेत्र प्राथमिकता"</string>
<string name="search_language_hint" msgid="7004225294308793583">"भाषा का नाम लिखें"</string>
- <string name="language_picker_section_suggested" msgid="6556199184638990447">"दिए गए सुझाव"</string>
+ <string name="language_picker_section_suggested" msgid="6556199184638990447">"सुझाई गई भाषाएं"</string>
<string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"सुझाए गए देश/इलाके"</string>
<string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"सुझाई गई भाषाएं"</string>
<string name="region_picker_section_suggested_bilingual" msgid="704607569328224133">"सुझाए गए इलाके"</string>
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"कीबोर्ड का लेआउट <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… पर सेट कर दिया गया है. इसे बदलने के लिए टैप करें."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"फ़िज़िकल कीबोर्ड कॉन्फ़िगर किए गए"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"कीबोर्ड देखने के लिए टैप करें"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 4b9b7bcac02d..5ee152741691 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Raspored tipkovnice postavljen je na <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Dodirnite da biste ga promijenili."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fizičke su tipkovnice konfigurirane"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Dodirnite da bi se prikazale tipkovnice"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 5827300505b1..2c4c77e30301 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"A billentyűzetkiosztás a következőkre van beállítva: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… A módosításhoz koppintson."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fizikai billentyűzetek beállítva"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Koppintson a billentyűzetek megtekintéséhez"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 9e313a6380d5..482e0751253e 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Կարող է հետագծել ձեր գործողությունները հավելվածներում և սարքակազմի սենսորների վրա, ինչպես նաև հավելվածներում կատարել գործողություններ ձեր անունից։"</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Թույլատրել"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Մերժել"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Ապատեղադրել"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Հավելվածը թաքցնում է թույլտվության հայտը, ուստի ձեր պատասխանը հնարավոր չէ ստուգել։"</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Ընտրեք՝ որ գործառույթն օգտագործել"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Ընտրեք գործառույթները, որոնք կբացվեն «Հատուկ գործառույթներ» կոճակի միջոցով"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Ընտրեք գործառույթները, որոնք կբացվեն ձայնի կարգավորման կոճակի միջոցով"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Ստեղնաշարի համար կարգավորված են <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> դասավորությունները։ Հպեք փոխելու համար։"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Ֆիզիկական ստեղնաշարերը կարգավորված են"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Հպեք՝ ստեղնաշարերը դիտելու համար"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index b4044aa3a0be..f18d83459294 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1247,7 +1247,7 @@
<string name="unsupported_display_size_show" msgid="980129850974919375">"Selalu tampilkan"</string>
<string name="unsupported_compile_sdk_message" msgid="7326293500707890537">"<xliff:g id="APP_NAME">%1$s</xliff:g> dibuat untuk versi OS Android yang tidak kompatibel dan mungkin berperilaku tak terduga. Versi aplikasi yang diupdate mungkin tersedia."</string>
<string name="unsupported_compile_sdk_show" msgid="1601210057960312248">"Selalu tampilkan"</string>
- <string name="unsupported_compile_sdk_check_update" msgid="1103639989147664456">"Periksa apakah ada update"</string>
+ <string name="unsupported_compile_sdk_check_update" msgid="1103639989147664456">"Periksa update"</string>
<string name="smv_application" msgid="3775183542777792638">"Apl <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) telah melanggar kebijakan StrictMode yang diberlakukannya sendiri."</string>
<string name="smv_process" msgid="1398801497130695446">"Proses <xliff:g id="PROCESS">%1$s</xliff:g> telah melanggar kebijakan StrictMode yang diberlakukan secara otomatis."</string>
<string name="android_upgrading_title" product="default" msgid="7279077384220829683">"Mengupdate ponsel…"</string>
@@ -1989,7 +1989,7 @@
<string name="app_streaming_blocked_message_for_settings_dialog" product="tablet" msgid="3286849551133045896">"Setelan ini tidak dapat diakses di <xliff:g id="DEVICE">%1$s</xliff:g>. Coba di tablet."</string>
<string name="app_streaming_blocked_message_for_settings_dialog" product="default" msgid="6264287556598916295">"Setelan ini tidak dapat diakses di <xliff:g id="DEVICE">%1$s</xliff:g>. Coba di ponsel."</string>
<string name="deprecated_target_sdk_message" msgid="5246906284426844596">"Aplikasi ini dibuat untuk versi lama Android. Aplikasi mungkin tidak berfungsi dengan baik dan tidak menyertakan perlindungan privasi dan keamanan terbaru. Periksa update, atau hubungi developer aplikasi."</string>
- <string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Periksa apakah ada update"</string>
+ <string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Periksa update"</string>
<string name="deprecated_abi_message" msgid="6820548011196218091">"Aplikasi ini tidak kompatibel dengan versi terbaru Android. Periksa update atau hubungi developer aplikasi."</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Ada pesan baru"</string>
<string name="new_sms_notification_content" msgid="3197949934153460639">"Buka aplikasi SMS untuk melihat"</string>
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tata letak keyboard disetel ke <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Ketuk untuk mengubah."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Keyboard fisik telah dikonfigurasi"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Ketuk untuk melihat keyboard"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 062b4bca44a7..30d42315d69c 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Lyklaskipan er stillt á <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Ýttu til að breyta."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Vélbúnaðarlyklaborð eru stillt"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Ýttu til að sjá lyklaborð"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Lokað"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Afrit"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Vinna"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Vinna 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Vinna 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Prófun"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Sameiginlegt"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 2e024cb06e6e..076c5a37fddb 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Layout tastiera impostato su <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tocca per cambiare l\'impostazione."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Tastiere fisiche configurate"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tocca per visualizzare le tastiere"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index e5e85c457859..e8e38474bffb 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -2360,4 +2360,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"פריסת המקלדת מוגדרת ל<xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… אפשר להקיש כדי לשנות את ההגדרה הזו."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"הוגדרו מקלדות פיזיות"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"יש להקיש כדי להציג את המקלדות"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"פרטי"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"שכפול"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"פרופיל עבודה"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"פרופיל עבודה 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"פרופיל עבודה 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"בדיקה"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"שיתופי"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 6e86b57faadb..8931518f5ef0 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"キーボードのレイアウトは<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>、<xliff:g id="LAYOUT_3">%3$s</xliff:g>などに設定されています。タップで変更できます。"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"物理キーボードの設定完了"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"タップするとキーボードを表示できます"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 34f56546e709..1ecdf74b0762 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"დაყენდა კლავიატურის განლაგება: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… შეეხეთ შესაცვლელად."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ფიზიკური კლავიატურები კონფიგურირებულია"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"შეეხეთ კლავიატურების სანახავად"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"პირადი"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"კლონი"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"სამსახური"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"სამსახური 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"სამსახური 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"სატესტო"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"საერთო"</string>
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 839f3f9a643e..3e33115d32ef 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Пернетақта схемасы \"<xliff:g id="LAYOUT_1">%1$s</xliff:g>\", \"<xliff:g id="LAYOUT_2">%2$s</xliff:g>\", \"<xliff:g id="LAYOUT_3">%3$s</xliff:g>\" деп орнатылды… Өзгерту үшін түртіңіз."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физикалық пернетақталар конфигурацияланды"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Пернетақталарды көру үшін түртіңіз."</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 9a29150f59ce..0bcf992af0c7 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"បានកំណត់ប្លង់ក្ដារចុចទៅ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… សូមចុចដើម្បីប្ដូរ។"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"បានកំណត់រចនាសម្ព័ន្ធ​ក្ដារចុចរូបវន្ត"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"ចុចដើម្បីមើលក្ដារចុច"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 9f1700dff4b7..a69601ad937f 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಅನ್ನು <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> ಗೆ ಸೆಟ್ ಮಾಡಲಾಗಿದೆ… ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್‌ಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"ಕೀಬೋರ್ಡ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 907e8025bfbc..77d45c789563 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"키보드 레이아웃이 <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>로 설정됩니다. 변경하려면 탭하세요."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"실제 키보드에 구성됨"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"키보드를 보려면 탭하세요."</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 5efcfc4bbf3c..ee7b40713624 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Баскычтопко төмөнкү калып коюлду: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Өзгөртүү үчүн басыңыз."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физикалык баскычтоптор конфигурацияланды"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Баскычтопторду көрүү үчүн басыңыз"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index d0f698d9864b..d9698e320d45 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"ຕັ້ງໂຄງຮ່າງແປ້ນພິມເປັນ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… ແຕະເພື່ອປ່ຽນແປງ."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ຕັ້ງຄ່າແປ້ນພິມແທ້ແລ້ວ"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"ແຕະເພື່ອເບິ່ງແປ້ນພິມ"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 6b6bc5099780..2a2a0883ac74 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -2361,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Išdėstymas nustatytas į <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Palieskite, kad pakeistumėte."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Sukonfigūruotos fizinės klaviatūros"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Palieskite, kad peržiūrėtumėte klaviatūras"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 931e681295d9..8c7c206aeae4 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Ir iestatīti šādi tastatūras izkārtojumi: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Lai to mainītu, pieskarieties."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fiziskās tastatūras ir konfigurētas"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Lai skatītu tastatūras, pieskarieties"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 420adfe1ba65..4d2f72e5cc40 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Може да ја следи вашата интеракција со апликациите или со хардверските сензори и да врши интеракција со апликациите во ваше име."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Дозволи"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Одбиј"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Деинсталирај"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Апликација го прикрива барањето за дозвола, па вашиот одговор не може да се потврди."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Допрете на функција за да почнете да ја користите:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Изберете ги функциите што ќе ги користите со копчето за пристапност"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Изберете ги функциите што ќе ги користите со кратенката за копчето за јачина на звук"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Распоредот на тастатурата е поставен на <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Допрете за да промените."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физичките тастатури се конфигурирани"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Допрете за да ги видите тастатурите"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 466dab6b7165..be405751eca3 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"കീബോർഡ് ലേഔട്ട് ആയി ഇനിപ്പറയുന്നവ സജ്ജീകരിച്ചു: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… മാറ്റാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"യഥാർത്ഥ കീബോർഡുകൾ കോൺഫിഗർ ചെയ്‌തു"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"കീബോർഡുകൾ കാണാൻ ടാപ്പ് ചെയ്യുക"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 3cb9cb28636f..c215b88a6d8e 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Гарын бүдүүвчийг <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> болгож тохируулсан… Өөрчлөхийн тулд товшино уу."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Биет гарыг тохируулсан"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Гарыг харахын тулд товшино уу"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index b20754b6fbb1..03fcc1767a75 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"कीबोर्ड लेआउट <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> वर सेट करा… बदलण्यासाठी टॅप करा."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"वास्तविक कीबोर्ड कॉंफिगर केला"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"कीबोर्ड पाहण्यासाठी टॅप करा"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 6b1742ce01e0..84b79a806904 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Reka letak papan kekunci ditetapkan kepada <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Ketik untuk menukar reka letak."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Papan kekunci fizikal dikonfigurasikan"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Ketik untuk melihat papan kekunci"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index edbe31f078d8..01906b91f6e9 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"၎င်းသည် သင်နှင့် အက်ပ်တစ်ခု (သို့) အာရုံခံကိရိယာအကြား ပြန်လှန်တုံ့ပြန်မှုများကို မှတ်သားနိုင်ပြီး သင့်ကိုယ်စား အက်ပ်များနှင့် ပြန်လှန်တုံ့ပြန်နိုင်သည်။"</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"ခွင့်ပြုရန်"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"ပယ်ရန်"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"ပရိုဂရမ်ကို ဖယ်ရှားရန်"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"အက်ပ်တစ်ခုသည် ခွင့်ပြုချက်တောင်းဆိုမှုကို ပိတ်နေသဖြင့် သင့်တုံ့ပြန်မှုကို စိစစ်၍မရပါ။"</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ဝန်ဆောင်မှုကို စတင်အသုံးပြုရန် တို့ပါ−"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"အများသုံးနိုင်မှု ခလုတ်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုများကို ရွေးပါ"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"အသံခလုတ် ဖြတ်လမ်းလင့်ခ်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုများကို ရွေးပါ"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"ကီးဘုတ်အပြင်အဆင်ကို <xliff:g id="LAYOUT_1">%1$s</xliff:g>၊ <xliff:g id="LAYOUT_2">%2$s</xliff:g>၊ <xliff:g id="LAYOUT_3">%3$s</xliff:g> သို့ သတ်မှတ်လိုက်သည်… ပြောင်းရန် တို့ပါ။"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ပကတိကီးဘုတ်များကို စီစဉ်သတ်မှတ်ထားသည်"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"ကီးဘုတ်များကြည့်ရန် တို့ပါ"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 0732e67b4235..d8e3b40ee46e 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tastaturoppsettet er satt til <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> … Trykk for å endre det."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"De fysiske tastaturene er konfigurert"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Trykk for å se tastaturene"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 7ac4c14d3622..126f61277491 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"किबोर्ड लेआउट <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> भाषामा सेट गरिएको छ… बदल्न ट्याप गर्नुहोस्।"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"भौतिक किबोर्डहरू कन्फिगर गरिएका छन्"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"किबोर्डहरू हेर्न ट्याप गर्नुहोस्"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 8f086895dd7d..bc187978fb78 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Toetsenbordindeling ingesteld op <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tik om te wijzigen."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fysieke toetsenborden zijn ingesteld"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tik om toetsenborden te bekijken"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index e91e005f095b..7f66887bee92 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"କୀବୋର୍ଡ ଲେଆଉଟକୁ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>ରେ ସେଟ କରାଯାଇଛି… ପରିବର୍ତ୍ତନ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ଫିଜିକାଲ କୀବୋର୍ଡଗୁଡ଼ିକୁ କନଫିଗର କରାଯାଇଛି"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"କୀବୋର୍ଡଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ ଟାପ କରନ୍ତୁ"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 29a0094ccdaa..039614931a64 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"ਕੀ-ਬੋਰਡ ਦਾ ਖਾਕਾ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> \'ਤੇ ਸੈੱਟ ਹੈ… ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ਭੌਤਿਕ ਕੀ-ਬੋਰਡਾਂ ਦਾ ਸੰਰੂਪਣ ਕੀਤਾ ਗਿਆ"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"ਕੀ-ਬੋਰਡਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 208810d8ea61..66d5570e0379 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -2361,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Ustawiono układ klawiatury <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Kliknij, aby to zmienić."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Skonfigurowano klawiatury fizyczne"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Kliknij, aby wyświetlić klawiatury"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index c509ed59c742..e32c7389137d 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Layout do teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toque para mudar."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toque para conferir os teclados"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index daa2504c71ce..15e08baf6c16 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -2360,4 +2360,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Esquema do teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toque para o alterar."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toque para ver os teclados"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Privado"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Clone"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Trabalho"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Trabalho 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Trabalho 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Teste"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Comum"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index c509ed59c742..e32c7389137d 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Layout do teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toque para mudar."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toque para conferir os teclados"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 562fcc90f35e..7b411809b779 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -2360,4 +2360,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tastatura este setată la <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Atinge pentru a schimba."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Tastaturile fizice au fost configurate"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Atinge pentru a vedea tastaturile"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Privat"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Clonează"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Serviciu"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Serviciu 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Serviciu 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Comun"</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 84a47760008c..2f16db38d2df 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -2361,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Настроены раскладки клавиатуры для яз.: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> и др. Нажмите, чтобы изменить."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физические клавиатуры настроены"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Нажмите, чтобы посмотреть подключенные клавиатуры."</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index c54e7688d57d..ac86d7b1979f 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"මෙයට යෙදුමක් හෝ දෘඪාංග සංවේදකයක් සමඟ ඔබේ අන්තර්ක්‍රියා හඹා යෑමට, සහ ඔබ වෙනුවෙන් යෙදුම් සමඟ අන්තර්ක්‍රියාවේ යෙදීමට හැකි ය."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"ඉඩ දෙන්න"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"ප්‍රතික්‍ෂේප කරන්න"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"අස්ථාපනය කරන්න"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"යෙදුමක් අවසර ඉල්ලීම අඳුරු කරන බැවින්, ඔබේ ප්‍රතිචාරය සත්‍යාපනය කළ නොහැක."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"එය භාවිත කිරීම ආරම්භ කිරීමට විශේෂාංගයක් තට්ටු කරන්න:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ප්‍රවේශ්‍යතා බොත්තම සමග භාවිත කිරීමට විශේෂාංග තෝරා ගන්න"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"හඬ පරිමා යතුරු කෙටිමග සමග භාවිත කිරීමට විශේෂාංග තෝරා ගන්න"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"යතුරු පුවරුව <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> ලෙස සකසා ඇත… වෙනස් කිරීමට තට්ටු කරන්න."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"භෞතික යතුරු පුවරුව වින්‍යාස කෙරිණි"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"යතුරු පුවරු බැලීමට තට්ටු කරන්න"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index f215323106c7..d1d7897f4242 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -2361,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Rozloženie klávesnice je nastavené na jazyky <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> a <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Môžete to zmeniť klepnutím."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fyzické klávesnice sú nakonfigurované"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Klávesnice si zobrazíte klepnutím"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index e8ba9dd3ab13..19866f334d8f 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -2361,4 +2361,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Razporeditev tipkovnice je nastavljena na »<xliff:g id="LAYOUT_1">%1$s</xliff:g>«, »<xliff:g id="LAYOUT_2">%2$s</xliff:g>«, »<xliff:g id="LAYOUT_3">%3$s</xliff:g>« … Za spremembo se dotaknite."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fizične tipkovnice so konfigurirane"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Dotaknite se za ogled tipkovnic"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Zasebno"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Klon"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Delo"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Delo 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Delo 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Preizkus"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Skupno"</string>
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 1d284408a408..2cd76fdbee62 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Mund të monitorojë ndërveprimet me një aplikacion ose një sensor hardueri dhe të ndërveprojë me aplikacionet në emrin tënd."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Lejo"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Refuzo"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Çinstalo"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Një aplikacion po fsheh kërkesën për leje, prandaj përgjigja jote nuk mund të verifikohet."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Trokit te një veçori për të filluar ta përdorësh atë:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Zgjidh veçoritë që do të përdorësh me butonin e qasshmërisë"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Zgjidh veçoritë që do të përdorësh me shkurtoren e tastit të volumit"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Struktura e tastierës u caktua në: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Trokit për ta ndryshuar."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Tastierat fizike u konfiguruan"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Trokit për të parë tastierat"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index a6c994e841fa..9e77bf68cfe6 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Распоред тастатуре је подешен на <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Додирните да бисте променили."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физичке тастатуре су конфигурисане"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Додирните да бисте видели тастатуре"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 15b7029ca053..ab5bfca9f377 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tangentbordslayouten är inställd på <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> … Tryck om du vill ändra."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fysiska tangentbord har konfigurerats"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tryck för att visa tangentbord"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index aef89eeabde7..61c0b1754a26 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Muundo wa kibodi umewekwa kuwa <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Gusa ili ubadilishe."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Mipangilio ya kibodi halisi imewekwa"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Gusa ili uangalie kibodi"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index f81e935353f4..edf6c2da383e 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"கீபோர்டு தளவமைப்பு <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… ஆகிய மொழிகளில் அமைக்கப்பட்டது, மாற்ற தட்டவும்."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"கீபோர்டுகள் உள்ளமைக்கப்பட்டன"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"கீபோர்டுகளைப் பார்க்க தட்டவும்"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 671aefb0ee09..d862e2f57651 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"కీబోర్డ్ లేఅవుట్ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>‌కు సెట్ చేయబడింది… మార్చడానికి ట్యాప్ చేయండి."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ఫిజికల్ కీబోర్డ్‌లు కాన్ఫిగర్ చేయబడ్డాయి"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"కీబోర్డ్‌లను చూడటానికి ట్యాప్ చేయండి"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 2d5ddf45a16b..bda7e8ad40a4 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"ตั้งค่ารูปแบบแป้นพิมพ์เป็นภาษา<xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… แตะเพื่อเปลี่ยน"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"กำหนดค่าแป้นพิมพ์จริงแล้ว"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"แตะเพื่อดูแป้นพิมพ์"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 47c4b5e15efd..53201ea1e07c 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Naitakda ang layout ng keyboard sa <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… I-tap para baguhin."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Na-configure ang mga pisikal na keyboard"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"I-tap para tingnan ang mga keyboard"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 03536fe12c4f..ee1168f64114 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Klavye düzeni <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> olarak ayarlandı… Değiştirmek için dokunun."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fiziksel klavyeler yapılandırıldı"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Klavyeleri görüntülemek için dokunun"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 24cbc3f634e8..b1adf52f5562 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1712,10 +1712,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Цей сервіс може відстежувати вашу взаємодію з додатком чи апаратним датчиком, а також взаємодіяти з додатками від вашого імені."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Дозволити"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Заборонити"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Видалити"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Інший додаток перекриває запит на доступ, тому вашу відповідь не вдається підтвердити."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Натисніть функцію, щоб почати використовувати її:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Виберіть функції для кнопки спеціальних можливостей"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Виберіть функції для комбінації з клавішами гучності"</string>
@@ -2363,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Вибрано такі розкладки клавіатури: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Натисніть, щоб змінити."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Фізичні клавіатури налаштовано"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Натисніть, щоб переглянути клавіатури"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 728b5eeaf678..92fd2664b259 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"یہ کسی ایپ یا ہارڈویئر سینسر کے ساتھ آپ کے تعاملات کو ٹریک کر سکتا ہے، اور آپ کی طرف سے ایپس کے ساتھ تعامل کر سکتا ہے۔"</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"اجازت دیں"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"مسترد کریں"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"اَن انسٹال کریں"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"ایپ اجازت کی درخواست کو مبہم کر رہی ہے لہذا آپ کے جواب کی تصدیق نہیں کی جا سکتی۔"</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ایک خصوصیت کا استعمال شروع کرنے کیلئے اسے تھپتھپائیں:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ایکسیسبیلٹی بٹن کے ساتھ استعمال کرنے کیلئے خصوصیات منتخب کریں"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"والیوم کلید کے شارٹ کٹ کے ساتھ استعمال کرنے کیلئے خصوصیات منتخب کریں"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"کی بورڈ لے آؤٹ <xliff:g id="LAYOUT_1">%1$s</xliff:g>، <xliff:g id="LAYOUT_2">%2$s</xliff:g>، <xliff:g id="LAYOUT_3">%3$s</xliff:g> پر سیٹ ہے… تبدیل کرنے کے لیے تھپتھپائیں۔"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"فزیکل کی بورڈز کنفیگر کئے گئے"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"کی بورڈز دیکھنے کے لیے تھپتھپائیں"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 1e1807ef1337..79d9f9dc044c 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Ilova yoki qurilma sensori bilan munosabatlaringizni kuzatishi hamda sizning nomingizdan ilovalar bilan ishlashi mumkin."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Ruxsat"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Rad etish"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Oʻchirib tashlash"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Ilova ruxsat olish talabini berkitmoqda, shu sababdan javobingizni tasdiqlash imkonsiz."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Kerakli funksiyani tanlang"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Qulayliklar tugmasi bilan foydalanish uchun funksiyalarni tanlang"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Tovush tugmasi bilan ishga tushiriladigan funksiyalarni tanlang"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Klaviatura terilmasi bunga sozlandi: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Oʻzgartirish uchun ustiga bosing."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Tashqi klaviaturalar sozlandi"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Klaviaturalarni ochish uchun ustiga bosing"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 94ebd97b066d..2ddf49f16046 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Đã thiết lập bố cục bàn phím thành <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Hãy nhấn để thay đổi."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Đã định cấu hình bàn phím vật lý"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Nhấn để xem bàn phím"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 108f507b07cd..f3b6a395568b 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"键盘布局已设为<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>、<xliff:g id="LAYOUT_3">%3$s</xliff:g>…点按即可更改。"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"已配置物理键盘"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"点按即可查看键盘"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index a37f9a878240..bf72080874ca 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"鍵盤版面配置已設定為<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>、<xliff:g id="LAYOUT_3">%3$s</xliff:g>…輕按即可變更。"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"已設定實體鍵盤"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"輕按即可查看鍵盤"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 5dced74b698e..1158cfdc33e2 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"可追蹤你與應用程式或硬體感應器的互動,並代表你與應用程式進行互動。"</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"允許"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"拒絕"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"解除安裝"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"應用程式遮擋了權限要求,因此系統無法驗證你的回覆。"</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"輕觸即可開始使用所需功能:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"選擇要搭配無障礙工具按鈕使用的功能"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"選擇要搭配音量快速鍵使用的功能"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"鍵盤配置已設為<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>、<xliff:g id="LAYOUT_3">%3$s</xliff:g>…輕觸即可變更。"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"已設定實體鍵盤"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"輕觸即可查看鍵盤"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index aaa1787e1534..db7c253f21d8 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Uhlaka lwekhibhodi lusethelwe ku-<xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Thepha ukuze ushintshe."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Amakhibhodi aphathekayo amisiwe"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Thepha ukuze ubuke amakhibhodi"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 98897d89bf6d..ba1f3924bff3 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1522,6 +1522,10 @@
config_screenBrightnessSettingDefaultFloat instead -->
<integer name="config_screenBrightnessSettingDefault">102</integer>
+ <!-- Maximum screen brightness setting when screen brightness capped in Wear Bedtime mode.
+ The value must be in the range [0, 255]. -->
+ <integer name="config_screenBrightnessCapForWearBedtimeMode">20</integer>
+
<!-- Minimum screen brightness setting allowed by power manager.
-2 is invalid so setting will resort to int value specified above.
Set this to 0.0 to allow screen to go to minimal brightness.
@@ -2242,6 +2246,9 @@
<!-- The default volume for the ring stream -->
<integer name="config_audio_ring_vol_default">5</integer>
+ <!-- The default min volume for the alarm stream -->
+ <integer name="config_audio_alarm_min_vol">1</integer>
+
<!-- The default value for whether head tracking for
spatial audio is enabled for a newly connected audio device -->
<bool name="config_spatial_audio_head_tracking_enabled_default">false</bool>
@@ -4989,6 +4996,11 @@
<!-- Component name for the default module metadata provider on this device -->
<string name="config_defaultModuleMetadataProvider" translatable="false">com.android.modulemetadata</string>
+ <!-- Packages that contain a security state.
+ {@link SecurityStateManager#getGlobalSecurityState} will read and report the state/version
+ of these packages. -->
+ <string-array name="config_securityStatePackages" translatable="false" />
+
<!-- Package name for the default Health Connect app.
OEMs can set this with their own health app package name to define a default app with high
priority for the app to store the health data. If set the app always has priority of 1
@@ -6821,6 +6833,9 @@
window that does not wrap content). -->
<bool name="config_allowFloatingWindowsFillScreen">false</bool>
+ <!-- Whether to enable left-right split in portrait on this device -->
+ <bool name="config_leftRightSplitInPortrait">false</bool>
+
<!-- Whether scroll haptic feedback is enabled for rotary encoder scrolls on
{@link MotionEvent#AXIS_SCROLL} generated by {@link InputDevice#SOURCE_ROTARY_ENCODER}
devices. -->
diff --git a/core/res/res/values/config_device_idle.xml b/core/res/res/values/config_device_idle.xml
index bc9ca3decec3..7a707c0a6cdc 100644
--- a/core/res/res/values/config_device_idle.xml
+++ b/core/res/res/values/config_device_idle.xml
@@ -28,7 +28,7 @@
<integer name="device_idle_flex_time_short_ms">60000</integer>
<!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_AFTER_INACTIVE_TIMEOUT -->
- <integer name="device_idle_light_after_inactive_to_ms">240000</integer>
+ <integer name="device_idle_light_after_inactive_to_ms">60000</integer>
<!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_TIMEOUT -->
<integer name="device_idle_light_idle_to_ms">300000</integer>
@@ -43,7 +43,7 @@
<item name="device_idle_light_idle_factor" format="float" type="integer">2.0</item>
<!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_INCREASE_LINEARLY -->
- <bool name="device_idle_light_idle_increase_linearly">false</bool>
+ <bool name="device_idle_light_idle_increase_linearly">true</bool>
<!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_LINEAR_INCREASE_FACTOR_MS -->
<integer name="device_idle_light_idle_linear_increase_factor_ms">300000</integer>
@@ -52,7 +52,7 @@
<integer name="device_idle_light_idle_flex_linear_increase_factor_ms">60000</integer>
<!-- Default for DeviceIdleController.Constants.LIGHT_MAX_IDLE_TIMEOUT -->
- <integer name="device_idle_light_max_idle_to_ms">900000</integer>
+ <integer name="device_idle_light_max_idle_to_ms">1800000</integer>
<!-- Default for DeviceIdleController.Constants.LIGHT_IDLE_MAINTENANCE_MIN_BUDGET -->
<integer name="device_idle_light_idle_maintenance_min_budget_ms">60000</integer>
@@ -67,13 +67,13 @@
<integer name="device_idle_min_deep_maintenance_time_ms">30000</integer>
<!-- Default for DeviceIdleController.Constants.INACTIVE_TIMEOUT -->
- <integer name="device_idle_inactive_to_ms">1800000</integer>
+ <integer name="device_idle_inactive_to_ms">60000</integer>
<!-- Default for DeviceIdleController.Constants.SENSING_TIMEOUT -->
- <integer name="device_idle_sensing_to_ms">240000</integer>
+ <integer name="device_idle_sensing_to_ms">30000</integer>
<!-- Default for DeviceIdleController.Constants.LOCATING_TIMEOUT -->
- <integer name="device_idle_locating_to_ms">30000</integer>
+ <integer name="device_idle_locating_to_ms">15000</integer>
<!-- Default for DeviceIdleController.Constants.LOCATION_ACCURACY -->
<item name="device_idle_location_accuracy" format="float" type="integer">20.0</item>
@@ -85,7 +85,7 @@
<integer name="device_idle_motion_inactive_to_flex_ms">60000</integer>
<!-- Default for DeviceIdleController.Constants.IDLE_AFTER_INACTIVE_TIMEOUT -->
- <integer name="device_idle_idle_after_inactive_to_ms">1800000</integer>
+ <integer name="device_idle_idle_after_inactive_to_ms">60000</integer>
<!-- Default for DeviceIdleController.Constants.IDLE_PENDING_TIMEOUT -->
<integer name="device_idle_idle_pending_to_ms">300000</integer>
@@ -100,7 +100,7 @@
<integer name="device_idle_quick_doze_delay_to_ms">60000</integer>
<!-- Default for DeviceIdleController.Constants.IDLE_TIMEOUT -->
- <integer name="device_idle_idle_to_ms">3600000</integer>
+ <integer name="device_idle_idle_to_ms">900000</integer>
<!-- Default for DeviceIdleController.Constants.MAX_IDLE_TIMEOUT -->
<integer name="device_idle_max_idle_to_ms">21600000</integer>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 017688ade387..7787c5d394e4 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -287,6 +287,7 @@
<java-symbol type="integer" name="config_audio_notif_vol_steps" />
<java-symbol type="integer" name="config_audio_ring_vol_default" />
<java-symbol type="integer" name="config_audio_ring_vol_steps" />
+ <java-symbol type="integer" name="config_audio_alarm_min_vol" />
<java-symbol type="bool" name="config_spatial_audio_head_tracking_enabled_default" />
<java-symbol type="bool" name="config_avoidGfxAccel" />
<java-symbol type="bool" name="config_bluetooth_address_validation" />
@@ -406,6 +407,7 @@
<java-symbol type="bool" name="config_supportsMultiWindow" />
<java-symbol type="bool" name="config_supportsSplitScreenMultiWindow" />
<java-symbol type="bool" name="config_supportsMultiDisplay" />
+ <java-symbol type="bool" name="config_leftRightSplitInPortrait" />
<java-symbol type="integer" name="config_supportsNonResizableMultiWindow" />
<java-symbol type="integer" name="config_respectsActivityMinWidthHeightMultiWindow" />
<java-symbol type="dimen" name="config_minPercentageMultiWindowSupportHeight" />
@@ -1274,6 +1276,7 @@
<java-symbol type="array" name="policy_exempt_apps" />
<java-symbol type="array" name="vendor_policy_exempt_apps" />
<java-symbol type="array" name="cloneable_apps" />
+ <java-symbol type="array" name="config_securityStatePackages" />
<java-symbol type="drawable" name="default_wallpaper" />
<java-symbol type="drawable" name="default_lock_wallpaper" />
@@ -2078,6 +2081,7 @@
<java-symbol type="integer" name="config_screenBrightnessSettingMinimum" />
<java-symbol type="integer" name="config_screenBrightnessSettingMaximum" />
<java-symbol type="integer" name="config_screenBrightnessSettingDefault" />
+ <java-symbol type="integer" name="config_screenBrightnessCapForWearBedtimeMode" />
<java-symbol type="dimen" name="config_screenBrightnessSettingMinimumFloat" />
<java-symbol type="dimen" name="config_screenBrightnessSettingMaximumFloat" />
<java-symbol type="dimen" name="config_screenBrightnessSettingDefaultFloat" />
diff --git a/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java b/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java
index aaaa3c7740c5..ac1f7d0e345f 100644
--- a/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java
+++ b/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java
@@ -48,6 +48,11 @@ public class BatteryUsageStatsPulledTest {
private static final int UID_1 = 2000;
private static final int UID_2 = 3000;
private static final int UID_3 = 4000;
+ private static final int[] UID_USAGE_TIME_PROCESS_STATES = {
+ BatteryConsumer.PROCESS_STATE_FOREGROUND,
+ BatteryConsumer.PROCESS_STATE_BACKGROUND,
+ BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE
+ };
@Test
public void testGetStatsProto() {
@@ -195,6 +200,20 @@ public class BatteryUsageStatsPulledTest {
assertEquals("For uid " + uid,
uidConsumer.getTimeInStateMs(android.os.UidBatteryConsumer.STATE_BACKGROUND),
uidConsumerProto.timeInBackgroundMillis);
+ for (int processState : UID_USAGE_TIME_PROCESS_STATES) {
+ final long timeInStateMillis = uidConsumer.getTimeInProcessStateMs(processState);
+ if (timeInStateMillis <= 0) {
+ continue;
+ }
+ assertEquals("For uid " + uid + ", process state " + processState,
+ timeInStateMillis,
+ Arrays.stream(uidConsumerProto.timeInState)
+ .filter(timeInState -> timeInState.processState == processState)
+ .findFirst()
+ .orElseThrow()
+ .timeInStateMillis);
+ }
+
if (expectNullBatteryConsumerData) {
assertNull("For uid " + uid, uidConsumerProto.batteryConsumerData);
} else {
@@ -250,8 +269,8 @@ public class BatteryUsageStatsPulledTest {
final UidBatteryConsumer.Builder uidBuilder = builder
.getOrCreateUidBatteryConsumerBuilder(UID_0)
.setPackageWithHighestDrain("myPackage0")
- .setTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND, 1000)
- .setTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND, 2000)
+ .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_FOREGROUND, 1000)
+ .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_BACKGROUND, 2000)
.setConsumedPower(
BatteryConsumer.POWER_COMPONENT_SCREEN, 300)
.setConsumedPower(
@@ -285,7 +304,7 @@ public class BatteryUsageStatsPulledTest {
builder.getOrCreateUidBatteryConsumerBuilder(UID_1)
.setPackageWithHighestDrain("myPackage1")
- .setTimeInStateMs(android.os.UidBatteryConsumer.STATE_FOREGROUND, 1234);
+ .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_FOREGROUND, 1234);
builder.getOrCreateUidBatteryConsumerBuilder(UID_2)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN,
@@ -331,8 +350,10 @@ public class BatteryUsageStatsPulledTest {
// significantly larger than 50 Kb
for (int i = 0; i < 3000; i++) {
builder.getOrCreateUidBatteryConsumerBuilder(i)
- .setTimeInStateMs(android.os.UidBatteryConsumer.STATE_FOREGROUND, 1 * 60 * 1000)
- .setTimeInStateMs(android.os.UidBatteryConsumer.STATE_BACKGROUND, 2 * 60 * 1000)
+ .setTimeInProcessStateMs(
+ BatteryConsumer.PROCESS_STATE_FOREGROUND, 1 * 60 * 1000)
+ .setTimeInProcessStateMs(
+ BatteryConsumer.PROCESS_STATE_BACKGROUND, 2 * 60 * 1000)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, 30)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 40);
}
@@ -340,16 +361,16 @@ public class BatteryUsageStatsPulledTest {
// Add a UID with much larger battery footprint
final int largeConsumerUid = 3001;
builder.getOrCreateUidBatteryConsumerBuilder(largeConsumerUid)
- .setTimeInStateMs(android.os.UidBatteryConsumer.STATE_FOREGROUND, 10 * 60 * 1000)
- .setTimeInStateMs(android.os.UidBatteryConsumer.STATE_BACKGROUND, 20 * 60 * 1000)
+ .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_FOREGROUND, 10 * 60 * 1000)
+ .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_BACKGROUND, 20 * 60 * 1000)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, 300)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 400);
// Add a UID with much larger usage duration
final int highUsageUid = 3002;
builder.getOrCreateUidBatteryConsumerBuilder(highUsageUid)
- .setTimeInStateMs(android.os.UidBatteryConsumer.STATE_FOREGROUND, 60 * 60 * 1000)
- .setTimeInStateMs(android.os.UidBatteryConsumer.STATE_BACKGROUND, 120 * 60 * 1000)
+ .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_FOREGROUND, 60 * 60 * 1000)
+ .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_BACKGROUND, 120 * 60 * 1000)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, 3)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 4);
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index 445ddf52bf1c..37f592f5797b 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -66,6 +66,7 @@ android_test {
"testables",
"com.android.text.flags-aconfig-java",
"flag-junit",
+ "ravenwood-junit",
],
libs: [
@@ -163,3 +164,15 @@ android_library {
"framework-res",
],
}
+
+android_ravenwood_test {
+ name: "FrameworksCoreTestsRavenwood",
+ static_libs: [
+ "androidx.annotation_annotation",
+ "androidx.test.rules",
+ ],
+ srcs: [
+ "src/android/os/FileUtilsTest.java",
+ ],
+ auto_gen_config: true,
+}
diff --git a/core/tests/coretests/src/android/app/usage/ParcelableUsageEventListTest.java b/core/tests/coretests/src/android/app/usage/ParcelableUsageEventListTest.java
index 5a202c5e8834..9dce899aa92d 100644
--- a/core/tests/coretests/src/android/app/usage/ParcelableUsageEventListTest.java
+++ b/core/tests/coretests/src/android/app/usage/ParcelableUsageEventListTest.java
@@ -28,6 +28,7 @@ import static org.mockito.ArgumentMatchers.anyString;
import android.app.usage.UsageEvents.Event;
import android.content.res.Configuration;
import android.os.Parcel;
+import android.os.PersistableBundle;
import android.test.suitebuilder.annotation.LargeTest;
import androidx.test.runner.AndroidJUnit4;
@@ -140,6 +141,12 @@ public class ParcelableUsageEventListTest {
case Event.LOCUS_ID_SET:
event.mLocusId = anyString();
break;
+ case Event.USER_INTERACTION:
+ PersistableBundle extras = new PersistableBundle();
+ extras.putString(UsageStatsManager.EXTRA_EVENT_CATEGORY, anyString());
+ extras.putString(UsageStatsManager.EXTRA_EVENT_ACTION, anyString());
+ event.mExtras = extras;
+ break;
}
event.mFlags = anyInt();
@@ -176,6 +183,14 @@ public class ParcelableUsageEventListTest {
case Event.LOCUS_ID_SET:
assertEquals(ue1.mLocusId, ue2.mLocusId);
break;
+ case Event.USER_INTERACTION:
+ final PersistableBundle extras1 = ue1.getExtras();
+ final PersistableBundle extras2 = ue2.getExtras();
+ assertEquals(extras1.getString(UsageStatsManager.EXTRA_EVENT_CATEGORY),
+ extras2.getString(UsageStatsManager.EXTRA_EVENT_CATEGORY));
+ assertEquals(extras1.getString(UsageStatsManager.EXTRA_EVENT_ACTION),
+ extras2.getString(UsageStatsManager.EXTRA_EVENT_ACTION));
+ break;
}
assertEquals(ue1.mFlags, ue2.mFlags);
diff --git a/core/tests/coretests/src/android/app/usage/UsageStatsPersistenceTest.java b/core/tests/coretests/src/android/app/usage/UsageStatsPersistenceTest.java
index 083e37a3aaa6..fae714842b9b 100644
--- a/core/tests/coretests/src/android/app/usage/UsageStatsPersistenceTest.java
+++ b/core/tests/coretests/src/android/app/usage/UsageStatsPersistenceTest.java
@@ -72,7 +72,7 @@ public class UsageStatsPersistenceTest {
"mShortcutId", "mShortcutIdToken", "mBucketAndReason", "mInstanceId",
"mNotificationChannelId", "mNotificationChannelIdToken", "mTaskRootPackage",
"mTaskRootPackageToken", "mTaskRootClass", "mTaskRootClassToken", "mLocusId",
- "mLocusIdToken"};
+ "mLocusIdToken", "mExtras", "mUserInteractionExtrasToken"};
// All fields in this list are defined in UsageEvents.Event but not persisted
private static final String[] USAGEEVENTS_IGNORED_FIELDS = {"mAction", "mContentAnnotations",
"mContentType", "DEVICE_EVENT_PACKAGE_NAME", "FLAG_IS_PACKAGE_INSTANT_APP",
diff --git a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
index 87c167c0df07..4a9cb7180a3f 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
@@ -83,6 +83,12 @@ public class ResourcesManagerTest extends TestCase {
}
@Override
+ protected AssetManager createAssetManager(@NonNull final ResourcesKey key,
+ ResourcesManager.ApkAssetsSupplier apkSupplier) {
+ return createAssetManager(key);
+ }
+
+ @Override
protected DisplayMetrics getDisplayMetrics(int displayId, DisplayAdjustments daj) {
return mDisplayMetricsMap.get(displayId);
}
@@ -100,7 +106,7 @@ public class ResourcesManagerTest extends TestCase {
null, APP_ONE_RES_DIR, null, null, null, null, null, null,
CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null, null);
assertNotNull(newResources);
- assertSame(resources, newResources);
+ assertSame(resources.getImpl(), newResources.getImpl());
}
@SmallTest
diff --git a/core/tests/coretests/src/android/os/FileUtilsTest.java b/core/tests/coretests/src/android/os/FileUtilsTest.java
index a0d8183b8da7..60500d53292a 100644
--- a/core/tests/coretests/src/android/os/FileUtilsTest.java
+++ b/core/tests/coretests/src/android/os/FileUtilsTest.java
@@ -51,20 +51,17 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.content.Context;
import android.os.FileUtils.MemoryPipe;
+import android.platform.test.annotations.IgnoreUnderRavenwood;
+import android.platform.test.ravenwood.RavenwoodRule;
import android.provider.DocumentsContract.Document;
import android.util.DataUnit;
-import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
-import com.google.android.collect.Sets;
-
-import libcore.io.Streams;
-
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -74,12 +71,19 @@ import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
@RunWith(AndroidJUnit4.class)
public class FileUtilsTest {
+ @Rule
+ public final RavenwoodRule mRavenwood = new RavenwoodRule();
+
private static final String TEST_DATA =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
@@ -90,17 +94,13 @@ public class FileUtilsTest {
private final int[] DATA_SIZES = { 32, 32_000, 32_000_000 };
- private Context getContext() {
- return InstrumentationRegistry.getContext();
- }
-
@Before
public void setUp() throws Exception {
- mDir = getContext().getDir("testing", Context.MODE_PRIVATE);
+ mDir = Files.createTempDirectory("FileUtils").toFile();
mTestFile = new File(mDir, "test.file");
mCopyFile = new File(mDir, "copy.file");
- mTarget = getContext().getFilesDir();
+ mTarget = mDir;
FileUtils.deleteContents(mTarget);
}
@@ -152,6 +152,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = MemoryPipe.class)
public void testCopy_FileToPipe() throws Exception {
for (int size : DATA_SIZES) {
final File src = new File(mTarget, "src");
@@ -172,6 +173,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = MemoryPipe.class)
public void testCopy_PipeToFile() throws Exception {
for (int size : DATA_SIZES) {
final File dest = new File(mTarget, "dest");
@@ -191,6 +193,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = MemoryPipe.class)
public void testCopy_PipeToPipe() throws Exception {
for (int size : DATA_SIZES) {
byte[] expected = new byte[size];
@@ -208,6 +211,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = MemoryPipe.class)
public void testCopy_ShortPipeToFile() throws Exception {
byte[] source = new byte[33_000_000];
new Random().nextBytes(source);
@@ -424,6 +428,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = android.webkit.MimeTypeMap.class)
public void testBuildUniqueFile_normal() throws Exception {
assertNameEquals("test.jpg", FileUtils.buildUniqueFile(mTarget, "image/jpeg", "test"));
assertNameEquals("test.jpg", FileUtils.buildUniqueFile(mTarget, "image/jpeg", "test.jpg"));
@@ -443,6 +448,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = android.webkit.MimeTypeMap.class)
public void testBuildUniqueFile_unknown() throws Exception {
assertNameEquals("test",
FileUtils.buildUniqueFile(mTarget, "application/octet-stream", "test"));
@@ -456,6 +462,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = android.webkit.MimeTypeMap.class)
public void testBuildUniqueFile_dir() throws Exception {
assertNameEquals("test", FileUtils.buildUniqueFile(mTarget, Document.MIME_TYPE_DIR, "test"));
new File(mTarget, "test").mkdir();
@@ -470,6 +477,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = android.webkit.MimeTypeMap.class)
public void testBuildUniqueFile_increment() throws Exception {
assertNameEquals("test.jpg", FileUtils.buildUniqueFile(mTarget, "image/jpeg", "test.jpg"));
new File(mTarget, "test.jpg").createNewFile();
@@ -489,6 +497,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = android.webkit.MimeTypeMap.class)
public void testBuildUniqueFile_mimeless() throws Exception {
assertNameEquals("test.jpg", FileUtils.buildUniqueFile(mTarget, "test.jpg"));
new File(mTarget, "test.jpg").createNewFile();
@@ -584,6 +593,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testTranslateMode() throws Exception {
assertTranslate("r", O_RDONLY, MODE_READ_ONLY);
@@ -603,6 +613,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testMalformedTransate_int() throws Exception {
try {
// The non-standard Linux access mode 3 should throw
@@ -614,6 +625,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testMalformedTransate_string() throws Exception {
try {
// The non-standard Linux access mode 3 should throw
@@ -625,6 +637,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testTranslateMode_Invalid() throws Exception {
try {
translateModeStringToPosix("rwx");
@@ -639,6 +652,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testTranslateMode_Access() throws Exception {
assertEquals(O_RDONLY, translateModeAccessToPosix(F_OK));
assertEquals(O_RDONLY, translateModeAccessToPosix(R_OK));
@@ -648,6 +662,7 @@ public class FileUtilsTest {
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testConvertToModernFd() throws Exception {
final String nonce = String.valueOf(System.nanoTime());
@@ -720,13 +735,24 @@ public class FileUtilsTest {
private byte[] readFile(File file) throws Exception {
try (FileInputStream in = new FileInputStream(file);
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
- Streams.copy(in, out);
+ copy(in, out);
return out.toByteArray();
}
}
+ private static int copy(InputStream in, OutputStream out) throws IOException {
+ int total = 0;
+ byte[] buffer = new byte[8192];
+ int c;
+ while ((c = in.read(buffer)) != -1) {
+ total += c;
+ out.write(buffer, 0, c);
+ }
+ return total;
+ }
+
private void assertDirContents(String... expected) {
- final HashSet<String> expectedSet = Sets.newHashSet(expected);
+ final HashSet<String> expectedSet = new HashSet<>(Arrays.asList(expected));
String[] actual = mDir.list();
if (actual == null) actual = new String[0];
diff --git a/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java
index 20ba4270e6fc..9b4dec4118a1 100644
--- a/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java
+++ b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java
@@ -182,4 +182,42 @@ public class PerformanceHintManagerTest {
s.setPreferPowerEfficiency(true);
s.setPreferPowerEfficiency(true);
}
+
+ @Test
+ public void testReportActualWorkDurationWithWorkDurationClass() {
+ Session s = createSession();
+ assumeNotNull(s);
+ s.updateTargetWorkDuration(16);
+ s.reportActualWorkDuration(new WorkDuration(1, 12, 8, 6));
+ s.reportActualWorkDuration(new WorkDuration(1, 33, 14, 20));
+ s.reportActualWorkDuration(new WorkDuration(1, 14, 10, 6));
+ }
+
+ @Test
+ public void testReportActualWorkDurationWithWorkDurationClass_IllegalArgument() {
+ Session s = createSession();
+ assumeNotNull(s);
+ s.updateTargetWorkDuration(16);
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(-1, 12, 8, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(0, 12, 8, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(1, -1, 8, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(1, 0, 8, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(1, 12, -1, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(1, 12, 0, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(1, 12, 8, -1));
+ });
+ }
}
diff --git a/core/tests/coretests/src/android/service/notification/NotificationRankingUpdateTest.java b/core/tests/coretests/src/android/service/notification/NotificationRankingUpdateTest.java
index 0855268411eb..1bdb006c3465 100644
--- a/core/tests/coretests/src/android/service/notification/NotificationRankingUpdateTest.java
+++ b/core/tests/coretests/src/android/service/notification/NotificationRankingUpdateTest.java
@@ -472,6 +472,9 @@ public class NotificationRankingUpdateTest {
NotificationRankingUpdate nru = generateUpdate(getContext());
Parcel parcel = Parcel.obtain();
nru.writeToParcel(parcel, 0);
+ if (Flags.rankingUpdateAshmem()) {
+ assertTrue(nru.isFdNotNullAndClosed());
+ }
parcel.setDataPosition(0);
NotificationRankingUpdate nru1 = NotificationRankingUpdate.CREATOR.createFromParcel(parcel);
// The rankingUpdate file descriptor is only non-null in the new path.
diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java
index e0e3a3542cb0..617262203c6b 100644
--- a/core/tests/coretests/src/android/view/ViewRootImplTest.java
+++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java
@@ -628,6 +628,42 @@ public class ViewRootImplTest {
});
}
+ /**
+ * We should boost the frame rate if the value of mInsetsAnimationRunning is true.
+ */
+ @Test
+ @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ public void votePreferredFrameRate_insetsAnimation() {
+ View view = new View(sContext);
+ WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
+ wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check
+
+ sInstrumentation.runOnMainSync(() -> {
+ WindowManager wm = sContext.getSystemService(WindowManager.class);
+ Display display = wm.getDefaultDisplay();
+ DisplayMetrics metrics = new DisplayMetrics();
+ display.getMetrics(metrics);
+ wmlp.width = (int) (metrics.widthPixels * 0.9);
+ wmlp.height = (int) (metrics.heightPixels * 0.9);
+ wm.addView(view, wmlp);
+ });
+ sInstrumentation.waitForIdleSync();
+
+ ViewRootImpl viewRootImpl = view.getViewRootImpl();
+ sInstrumentation.runOnMainSync(() -> {
+ view.invalidate();
+ assertEquals(viewRootImpl.getLastPreferredFrameRateCategory(),
+ FRAME_RATE_CATEGORY_NORMAL);
+ viewRootImpl.notifyInsetsAnimationRunningStateChanged(true);
+ view.invalidate();
+ });
+ sInstrumentation.waitForIdleSync();
+
+ sInstrumentation.runOnMainSync(() -> {
+ assertEquals(viewRootImpl.getLastPreferredFrameRateCategory(),
+ FRAME_RATE_CATEGORY_HIGH);
+ });
+ }
@Test
public void forceInvertOffDarkThemeOff_forceDarkModeDisabled() {
diff --git a/core/tests/utiltests/Android.bp b/core/tests/utiltests/Android.bp
index 06340a222ac6..967047e74555 100644
--- a/core/tests/utiltests/Android.bp
+++ b/core/tests/utiltests/Android.bp
@@ -57,8 +57,10 @@ android_ravenwood_test {
static_libs: [
"androidx.annotation_annotation",
"androidx.test.rules",
+ "mockito_ravenwood",
],
srcs: [
+ "src/android/util/AtomicFileTest.java",
"src/android/util/DataUnitTest.java",
"src/android/util/EventLogTest.java",
"src/android/util/IndentingPrintWriterTest.java",
diff --git a/core/tests/utiltests/src/android/util/AtomicFileTest.java b/core/tests/utiltests/src/android/util/AtomicFileTest.java
index 6f597141172f..742307ba8c70 100644
--- a/core/tests/utiltests/src/android/util/AtomicFileTest.java
+++ b/core/tests/utiltests/src/android/util/AtomicFileTest.java
@@ -23,16 +23,16 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.longThat;
import static org.mockito.Mockito.spy;
-import android.app.Instrumentation;
-import android.content.Context;
import android.os.SystemClock;
+import android.platform.test.annotations.IgnoreUnderRavenwood;
+import android.platform.test.ravenwood.RavenwoodRule;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -46,9 +46,13 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
@RunWith(Parameterized.class)
public class AtomicFileTest {
+ @Rule
+ public final RavenwoodRule mRavenwood = new RavenwoodRule();
+
private static final String BASE_NAME = "base";
private static final String NEW_NAME = BASE_NAME + ".new";
private static final String LEGACY_BACKUP_NAME = BASE_NAME + ".bak";
@@ -80,14 +84,10 @@ public class AtomicFileTest {
@Parameterized.Parameter(3)
public byte[] mExpectedBytes;
- private final Instrumentation mInstrumentation =
- InstrumentationRegistry.getInstrumentation();
- private final Context mContext = mInstrumentation.getContext();
-
- private final File mDirectory = mContext.getFilesDir();
- private final File mBaseFile = new File(mDirectory, BASE_NAME);
- private final File mNewFile = new File(mDirectory, NEW_NAME);
- private final File mLegacyBackupFile = new File(mDirectory, LEGACY_BACKUP_NAME);
+ private File mDirectory;
+ private File mBaseFile;
+ private File mNewFile;
+ private File mLegacyBackupFile;
@Parameterized.Parameters(name = "{0}")
public static Object[][] data() {
@@ -199,6 +199,13 @@ public class AtomicFileTest {
}
@Before
+ public void setUp() throws Exception {
+ mDirectory = Files.createTempDirectory("AtomicFile").toFile();
+ mBaseFile = new File(mDirectory, BASE_NAME);
+ mNewFile = new File(mDirectory, NEW_NAME);
+ mLegacyBackupFile = new File(mDirectory, LEGACY_BACKUP_NAME);
+ }
+
@After
public void deleteFiles() {
mBaseFile.delete();
@@ -274,6 +281,7 @@ public class AtomicFileTest {
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = SystemConfigFileCommitEventLogger.class)
public void testTimeLogging() throws Exception {
var logger = spy(new SystemConfigFileCommitEventLogger("name"));
var file = new AtomicFile(mBaseFile, logger);
diff --git a/core/tests/vibrator/src/android/os/vibrator/persistence/VibrationEffectXmlSerializationTest.java b/core/tests/vibrator/src/android/os/vibrator/persistence/VibrationEffectXmlSerializationTest.java
index 2814a5f5366c..7d8c53faaec4 100644
--- a/core/tests/vibrator/src/android/os/vibrator/persistence/VibrationEffectXmlSerializationTest.java
+++ b/core/tests/vibrator/src/android/os/vibrator/persistence/VibrationEffectXmlSerializationTest.java
@@ -74,18 +74,18 @@ public class VibrationEffectXmlSerializationTest {
.addPrimitive(PRIMITIVE_CLICK)
.addPrimitive(PRIMITIVE_TICK, 0.2497f)
.compose();
- String xml = "<vibration>"
+ String xml = "<vibration-effect>"
+ "<primitive-effect name=\"click\"/>"
+ "<primitive-effect name=\"tick\" scale=\"0.2497\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
VibrationEffect effect2 = VibrationEffect.startComposition()
.addPrimitive(PRIMITIVE_LOW_TICK, 1f, 356)
.addPrimitive(PRIMITIVE_SPIN, 0.6364f, 7)
.compose();
- String xml2 = "<vibration>"
+ String xml2 = "<vibration-effect>"
+ "<primitive-effect name=\"low_tick\" delayMs=\"356\"/>"
+ "<primitive-effect name=\"spin\" scale=\"0.6364\" delayMs=\"7\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
TypedXmlPullParser parser = createXmlPullParser(xml);
assertParseElementSucceeds(parser, effect);
@@ -95,7 +95,7 @@ public class VibrationEffectXmlSerializationTest {
// Test no-issues when an end-tag follows the vibration XML.
// To test this, starting with the corresponding "start-tag" is necessary.
parser = createXmlPullParser("<next-tag>" + xml + "</next-tag>");
- // Move the parser once to point to the "<vibration> tag.
+ // Move the parser once to point to the "<vibration-effect> tag.
parser.next();
assertParseElementSucceeds(parser, effect);
parser.next();
@@ -114,7 +114,7 @@ public class VibrationEffectXmlSerializationTest {
assertEndOfDocument(parser);
// Check when there is comment before the end tag.
- xml = "<vibration><primitive-effect name=\"tick\"/><!-- comment --></vibration>";
+ xml = "<vibration-effect><primitive-effect name=\"tick\"/><!-- hi --></vibration-effect>";
parser = createXmlPullParser(xml);
assertParseElementSucceeds(
parser, VibrationEffect.startComposition().addPrimitive(PRIMITIVE_TICK).compose());
@@ -128,18 +128,18 @@ public class VibrationEffectXmlSerializationTest {
.addPrimitive(PRIMITIVE_CLICK)
.addPrimitive(PRIMITIVE_TICK, 0.2497f)
.compose();
- String vibrationXml1 = "<vibration>"
+ String vibrationXml1 = "<vibration-effect>"
+ "<primitive-effect name=\"click\"/>"
+ "<primitive-effect name=\"tick\" scale=\"0.2497\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
VibrationEffect effect2 = VibrationEffect.startComposition()
.addPrimitive(PRIMITIVE_LOW_TICK, 1f, 356)
.addPrimitive(PRIMITIVE_SPIN, 0.6364f, 7)
.compose();
- String vibrationXml2 = "<vibration>"
+ String vibrationXml2 = "<vibration-effect>"
+ "<primitive-effect name=\"low_tick\" delayMs=\"356\"/>"
+ "<primitive-effect name=\"spin\" scale=\"0.6364\" delayMs=\"7\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
String xml = "<vibration-select>" + vibrationXml1 + vibrationXml2 + "</vibration-select>";
TypedXmlPullParser parser = createXmlPullParser(xml);
@@ -150,7 +150,7 @@ public class VibrationEffectXmlSerializationTest {
// Test no-issues when an end-tag follows the vibration XML.
// To test this, starting with the corresponding "start-tag" is necessary.
parser = createXmlPullParser("<next-tag>" + xml + "</next-tag>");
- // Move the parser once to point to the "<vibration> tag.
+ // Move the parser once to point to the "<vibration-effect> tag.
parser.next();
assertParseElementSucceeds(parser, effect1, effect2);
parser.next();
@@ -183,7 +183,8 @@ public class VibrationEffectXmlSerializationTest {
@Test
public void testParseElement_withHiddenApis_onlySucceedsWithFlag() throws Exception {
// Check when the root tag is "vibration".
- String xml = "<vibration><predefined-effect name=\"texture_tick\"/></vibration>";
+ String xml =
+ "<vibration-effect><predefined-effect name=\"texture_tick\"/></vibration-effect>";
assertParseElementSucceeds(createXmlPullParser(xml),
VibrationXmlSerializer.FLAG_ALLOW_HIDDEN_APIS,
VibrationEffect.get(VibrationEffect.EFFECT_TEXTURE_TICK));
@@ -201,29 +202,29 @@ public class VibrationEffectXmlSerializationTest {
public void testParseElement_badXml_throwsException() throws Exception {
// No "vibration-select" tag.
assertParseElementFails(
- "<vibration>random text<primitive-effect name=\"click\"/></vibration>");
- assertParseElementFails("<bad-tag><primitive-effect name=\"click\"/></vibration>");
- assertParseElementFails("<primitive-effect name=\"click\"/></vibration>");
- assertParseElementFails("<vibration><primitive-effect name=\"click\"/>");
+ "<vibration-effect>rand text<primitive-effect name=\"click\"/></vibration-effect>");
+ assertParseElementFails("<bad-tag><primitive-effect name=\"click\"/></vibration-effect>");
+ assertParseElementFails("<primitive-effect name=\"click\"/></vibration-effect>");
+ assertParseElementFails("<vibration-effect><primitive-effect name=\"click\"/>");
// Incomplete XML.
assertParseElementFails("<vibration-select><primitive-effect name=\"click\"/>");
assertParseElementFails("<vibration-select>"
- + "<vibration>"
+ + "<vibration-effect>"
+ "<primitive-effect name=\"low_tick\" delayMs=\"356\"/>"
- + "</vibration>");
+ + "</vibration-effect>");
// Bad vibration XML.
assertParseElementFails("<vibration-select>"
+ "<primitive-effect name=\"low_tick\" delayMs=\"356\"/>"
- + "</vibration>"
+ + "</vibration-effect>"
+ "</vibration-select>");
// "vibration-select" tag should have no attributes.
assertParseElementFails("<vibration-select bad_attr=\"123\">"
- + "<vibration>"
+ + "<vibration-effect>"
+ "<predefined-effect name=\"tick\"/>"
- + "</vibration>"
+ + "</vibration-effect>"
+ "</vibration-select>");
}
@@ -235,12 +236,12 @@ public class VibrationEffectXmlSerializationTest {
.addPrimitive(PRIMITIVE_LOW_TICK, 1f, 356)
.addPrimitive(PRIMITIVE_SPIN, 0.6364f, 7)
.compose();
- String xml = "<vibration>"
+ String xml = "<vibration-effect>"
+ "<primitive-effect name=\"click\"/>"
+ "<primitive-effect name=\"tick\" scale=\"0.2497\"/>"
+ "<primitive-effect name=\"low_tick\" delayMs=\"356\"/>"
+ "<primitive-effect name=\"spin\" scale=\"0.6364\" delayMs=\"7\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
assertPublicApisParserSucceeds(xml, effect);
assertPublicApisSerializerSucceeds(effect, "click", "tick", "low_tick", "spin");
@@ -254,8 +255,9 @@ public class VibrationEffectXmlSerializationTest {
@Test
public void testParseDocument_withVibrationSelectTag_withHiddenApis_onlySucceedsWithFlag()
throws Exception {
- // Check when the root tag is "vibration".
- String xml = "<vibration><predefined-effect name=\"texture_tick\"/></vibration>";
+ // Check when the root tag is "vibration-effect".
+ String xml =
+ "<vibration-effect><predefined-effect name=\"texture_tick\"/></vibration-effect>";
assertParseDocumentSucceeds(xml,
VibrationXmlSerializer.FLAG_ALLOW_HIDDEN_APIS,
VibrationEffect.get(VibrationEffect.EFFECT_TEXTURE_TICK));
@@ -273,14 +275,14 @@ public class VibrationEffectXmlSerializationTest {
public void testWaveforms_allSucceed() throws IOException {
VibrationEffect effect = VibrationEffect.createWaveform(new long[]{123, 456, 789, 0},
new int[]{254, 1, 255, 0}, /* repeat= */ 0);
- String xml = "<vibration>"
+ String xml = "<vibration-effect>"
+ "<waveform-effect><repeating>"
+ "<waveform-entry durationMs=\"123\" amplitude=\"254\"/>"
+ "<waveform-entry durationMs=\"456\" amplitude=\"1\"/>"
+ "<waveform-entry durationMs=\"789\" amplitude=\"255\"/>"
+ "<waveform-entry durationMs=\"0\" amplitude=\"0\"/>"
+ "</repeating></waveform-effect>"
- + "</vibration>";
+ + "</vibration-effect>";
assertPublicApisParserSucceeds(xml, effect);
assertPublicApisSerializerSucceeds(effect, "123", "456", "789", "254", "1", "255", "0");
@@ -297,7 +299,8 @@ public class VibrationEffectXmlSerializationTest {
for (Map.Entry<String, Integer> entry : createPublicPredefinedEffectsMap().entrySet()) {
VibrationEffect effect = VibrationEffect.get(entry.getValue());
String xml = String.format(
- "<vibration><predefined-effect name=\"%s\"/></vibration>", entry.getKey());
+ "<vibration-effect><predefined-effect name=\"%s\"/></vibration-effect>",
+ entry.getKey());
assertPublicApisParserSucceeds(xml, effect);
assertPublicApisSerializerSucceeds(effect, entry.getKey());
@@ -314,7 +317,8 @@ public class VibrationEffectXmlSerializationTest {
for (Map.Entry<String, Integer> entry : createHiddenPredefinedEffectsMap().entrySet()) {
VibrationEffect effect = VibrationEffect.get(entry.getValue());
String xml = String.format(
- "<vibration><predefined-effect name=\"%s\"/></vibration>", entry.getKey());
+ "<vibration-effect><predefined-effect name=\"%s\"/></vibration-effect>",
+ entry.getKey());
assertPublicApisParserFails(xml);
assertPublicApisSerializerFails(effect);
@@ -332,7 +336,8 @@ public class VibrationEffectXmlSerializationTest {
boolean nonDefaultFallback = !PrebakedSegment.DEFAULT_SHOULD_FALLBACK;
VibrationEffect effect = VibrationEffect.get(entry.getValue(), nonDefaultFallback);
String xml = String.format(
- "<vibration><predefined-effect name=\"%s\" fallback=\"%s\"/></vibration>",
+ "<vibration-effect><predefined-effect name=\"%s\" fallback=\"%s\"/>"
+ + "</vibration-effect>",
entry.getKey(), nonDefaultFallback);
assertPublicApisParserFails(xml);
@@ -378,7 +383,7 @@ public class VibrationEffectXmlSerializationTest {
private void assertParseElementSucceeds(
TypedXmlPullParser parser, int flags, VibrationEffect... effects) throws Exception {
String tagName = parser.getName();
- assertThat(Set.of("vibration", "vibration-select")).contains(tagName);
+ assertThat(Set.of("vibration-effect", "vibration-select")).contains(tagName);
assertThat(parseElement(parser, flags).getVibrationEffects()).containsExactly(effects);
assertThat(parser.getEventType()).isEqualTo(XmlPullParser.END_TAG);
diff --git a/core/xsd/Android.bp b/core/xsd/Android.bp
index 4e418d6cc0f0..39b531167155 100644
--- a/core/xsd/Android.bp
+++ b/core/xsd/Android.bp
@@ -20,7 +20,7 @@ xsd_config {
api_dir: "vibrator/vibration/schema",
package_name: "com.android.internal.vibrator.persistence",
root_elements: [
- "vibration",
+ "vibration-effect",
"vibration-select",
],
}
diff --git a/core/xsd/vibrator/vibration/schema/current.txt b/core/xsd/vibrator/vibration/schema/current.txt
index 176638462397..f0e13c4e8ca3 100644
--- a/core/xsd/vibrator/vibration/schema/current.txt
+++ b/core/xsd/vibrator/vibration/schema/current.txt
@@ -37,8 +37,8 @@ package com.android.internal.vibrator.persistence {
enum_constant public static final com.android.internal.vibrator.persistence.PrimitiveEffectName tick;
}
- public class Vibration {
- ctor public Vibration();
+ public class VibrationEffect {
+ ctor public VibrationEffect();
method public com.android.internal.vibrator.persistence.PredefinedEffect getPredefinedEffect_optional();
method public com.android.internal.vibrator.persistence.PrimitiveEffect getPrimitiveEffect_optional();
method public com.android.internal.vibrator.persistence.WaveformEffect getWaveformEffect_optional();
@@ -49,7 +49,7 @@ package com.android.internal.vibrator.persistence {
public class VibrationSelect {
ctor public VibrationSelect();
- method public java.util.List<com.android.internal.vibrator.persistence.Vibration> getVibration();
+ method public java.util.List<com.android.internal.vibrator.persistence.VibrationEffect> getVibrationEffect();
}
public enum WaveformAmplitudeDefault {
@@ -80,7 +80,7 @@ package com.android.internal.vibrator.persistence {
public class XmlParser {
ctor public XmlParser();
method public static String readText(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public static com.android.internal.vibrator.persistence.Vibration readVibration(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static com.android.internal.vibrator.persistence.VibrationEffect readVibrationEffect(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public static com.android.internal.vibrator.persistence.VibrationSelect readVibrationSelect(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public static void skip(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
}
diff --git a/core/xsd/vibrator/vibration/vibration-plus-hidden-apis.xsd b/core/xsd/vibrator/vibration/vibration-plus-hidden-apis.xsd
index 679b9fa019ac..fcd250b4fc06 100644
--- a/core/xsd/vibrator/vibration/vibration-plus-hidden-apis.xsd
+++ b/core/xsd/vibrator/vibration/vibration-plus-hidden-apis.xsd
@@ -25,7 +25,7 @@
<!-- Root tag definitions -->
- <xs:element name="vibration" type="Vibration"/>
+ <xs:element name="vibration-effect" type="VibrationEffect"/>
<xs:element name="vibration-select" type="VibrationSelect"/>
@@ -33,11 +33,11 @@
<xs:complexType name="VibrationSelect">
<xs:sequence>
- <xs:element name="vibration" type="Vibration" minOccurs="0" maxOccurs="unbounded" />
+ <xs:element name="vibration-effect" type="VibrationEffect" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
- <xs:complexType name="Vibration">
+ <xs:complexType name="VibrationEffect">
<xs:choice>
<!-- Waveform vibration effect -->
diff --git a/core/xsd/vibrator/vibration/vibration.xsd b/core/xsd/vibrator/vibration/vibration.xsd
index 8406562b8579..b9de6914b9dc 100644
--- a/core/xsd/vibrator/vibration/vibration.xsd
+++ b/core/xsd/vibrator/vibration/vibration.xsd
@@ -23,7 +23,7 @@
<!-- Root tag definitions -->
- <xs:element name="vibration" type="Vibration"/>
+ <xs:element name="vibration-effect" type="VibrationEffect"/>
<xs:element name="vibration-select" type="VibrationSelect"/>
@@ -31,11 +31,11 @@
<xs:complexType name="VibrationSelect">
<xs:sequence>
- <xs:element name="vibration" type="Vibration" minOccurs="0" maxOccurs="unbounded" />
+ <xs:element name="vibration-effect" type="VibrationEffect" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
- <xs:complexType name="Vibration">
+ <xs:complexType name="VibrationEffect">
<xs:choice>
<!-- Waveform vibration effect -->
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index d36ac3914ff3..19128212094d 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -529,6 +529,12 @@
"group": "WM_DEBUG_TASKS",
"at": "com\/android\/server\/wm\/ActivityStarter.java"
},
+ "-1582845629": {
+ "message": "Starting animation on %s",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_DIMMER",
+ "at": "com\/android\/server\/wm\/DimmerAnimationHelper.java"
+ },
"-1575977269": {
"message": "Skipping %s: mismatch root %s",
"level": "DEBUG",
@@ -589,6 +595,12 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "-1518132958": {
+ "message": "fractionRendered boundsOverSource=%f",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"-1517908912": {
"message": "requestScrollCapture: caught exception dispatching to window.token=%s",
"level": "WARN",
@@ -925,6 +937,12 @@
"group": "WM_DEBUG_REMOTE_ANIMATIONS",
"at": "com\/android\/server\/wm\/RemoteAnimationController.java"
},
+ "-1243510456": {
+ "message": "Dim animation requested: %s",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_DIMMER",
+ "at": "com\/android\/server\/wm\/DimmerAnimationHelper.java"
+ },
"-1237827119": {
"message": "Schedule remove starting %s startingWindow=%s animate=%b Callers=%s",
"level": "VERBOSE",
@@ -949,6 +967,12 @@
"group": "WM_DEBUG_CONTENT_RECORDING",
"at": "com\/android\/server\/wm\/ContentRecorder.java"
},
+ "-1209762265": {
+ "message": "Registering listener=%s with id=%d for window=%s with %s",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"-1209252064": {
"message": "Clear animatingExit: reason=clearAnimatingFlags win=%s",
"level": "DEBUG",
@@ -1171,6 +1195,12 @@
"group": "WM_DEBUG_BACK_PREVIEW",
"at": "com\/android\/server\/wm\/BackNavigationController.java"
},
+ "-1028213464": {
+ "message": "%s skipping animation and directly setting alpha=%f, blur=%d",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_DIMMER",
+ "at": "com\/android\/server\/wm\/DimmerAnimationHelper.java"
+ },
"-1022146708": {
"message": "Skipping %s: mismatch activity type",
"level": "DEBUG",
@@ -1315,6 +1345,12 @@
"group": "WM_DEBUG_WINDOW_TRANSITIONS",
"at": "com\/android\/server\/wm\/Transition.java"
},
+ "-888703350": {
+ "message": "Skipping %s",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"-883738232": {
"message": "Adding more than one toast window for UID at a time.",
"level": "WARN",
@@ -1795,12 +1831,6 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
- "-504637678": {
- "message": "Starting animation on dim layer %s, requested by %s, alpha: %f -> %f, blur: %d -> %d",
- "level": "VERBOSE",
- "group": "WM_DEBUG_DIMMER",
- "at": "com\/android\/server\/wm\/SmoothDimmer.java"
- },
"-503656156": {
"message": "Update process config of %s to new config %s",
"level": "VERBOSE",
@@ -2791,6 +2821,12 @@
"group": "WM_DEBUG_ORIENTATION",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "360319850": {
+ "message": "fractionRendered scale=%f",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"364992694": {
"message": "freezeDisplayRotation: current rotation=%d, new rotation=%d, caller=%s",
"level": "VERBOSE",
@@ -2971,6 +3007,12 @@
"group": "WM_DEBUG_BACK_PREVIEW",
"at": "com\/android\/server\/wm\/BackNavigationController.java"
},
+ "532771960": {
+ "message": "Adding untrusted state listener=%s with id=%d",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"535103992": {
"message": "Wallpaper may change! Adjusting",
"level": "VERBOSE",
@@ -3049,6 +3091,12 @@
"group": "WM_DEBUG_DREAM",
"at": "com\/android\/server\/wm\/ActivityTaskManagerService.java"
},
+ "605179032": {
+ "message": "checkIfInThreshold fractionRendered=%f alpha=%f currTimeMs=%d",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"608694300": {
"message": " NEW SURFACE SESSION %s",
"level": "INFO",
@@ -3277,6 +3325,12 @@
"group": "WM_SHOW_TRANSACTIONS",
"at": "com\/android\/server\/wm\/WindowState.java"
},
+ "824532141": {
+ "message": "lastState=%s newState=%s alpha=%f minAlpha=%f fractionRendered=%f minFractionRendered=%f",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"829434921": {
"message": "Draw state now committed in %s",
"level": "VERBOSE",
@@ -3571,6 +3625,12 @@
"group": "WM_SHOW_SURFACE_ALLOC",
"at": "com\/android\/server\/wm\/ScreenRotationAnimation.java"
},
+ "1090378847": {
+ "message": "Checking %d windows",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1100065297": {
"message": "Attempted to get IME policy of a display that does not exist: %d",
"level": "WARN",
@@ -3703,6 +3763,12 @@
"group": "WM_DEBUG_FOCUS",
"at": "com\/android\/server\/wm\/ActivityRecord.java"
},
+ "1251721200": {
+ "message": "unregister failed, couldn't find deathRecipient for %s with id=%d",
+ "level": "ERROR",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1252594551": {
"message": "Window types in WindowContext and LayoutParams.type should match! Type from LayoutParams is %d, but type from WindowContext is %d",
"level": "WARN",
@@ -3841,6 +3907,12 @@
"group": "WM_DEBUG_ORIENTATION",
"at": "com\/android\/server\/wm\/TaskDisplayArea.java"
},
+ "1382634842": {
+ "message": "Unregistering listener=%s with id=%d",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1393721079": {
"message": "Starting remote display change: from [rot = %d], to [%dx%d, rot = %d]",
"level": "VERBOSE",
@@ -3889,6 +3961,12 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "1445704347": {
+ "message": "coveredRegionsAbove updated with %s frame:%s region:%s",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1448683958": {
"message": "Override pending remote transitionSet=%b adapter=%s",
"level": "INFO",
@@ -4027,12 +4105,6 @@
"group": "WM_DEBUG_STATES",
"at": "com\/android\/server\/wm\/ActivityRecord.java"
},
- "1620751818": {
- "message": "Dim %s skipping animation and directly setting alpha=%f, blur=%d",
- "level": "DEBUG",
- "group": "WM_DEBUG_DIMMER",
- "at": "com\/android\/server\/wm\/SmoothDimmer.java"
- },
"1621562070": {
"message": " startWCT=%s",
"level": "VERBOSE",
@@ -4195,6 +4267,12 @@
"group": "WM_DEBUG_RECENTS_ANIMATIONS",
"at": "com\/android\/server\/wm\/RecentsAnimation.java"
},
+ "1786463281": {
+ "message": "Adding trusted state listener=%s with id=%d",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1789321832": {
"message": "Then token:%s is invalid. It might be removed",
"level": "WARN",
@@ -4369,6 +4447,12 @@
"group": "WM_DEBUG_TASKS",
"at": "com\/android\/server\/wm\/RootWindowContainer.java"
},
+ "1955470028": {
+ "message": "computeFractionRendered: visibleRegion=%s screenBounds=%s contentSize=%s scale=%f,%f",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1964565370": {
"message": "Starting remote animation",
"level": "INFO",
@@ -4653,6 +4737,9 @@
"WM_DEBUG_TASKS": {
"tag": "WindowManager"
},
+ "WM_DEBUG_TPL": {
+ "tag": "WindowManager"
+ },
"WM_DEBUG_WALLPAPER": {
"tag": "WindowManager"
},
diff --git a/data/keyboards/Generic.kcm b/data/keyboards/Generic.kcm
index 1048742adb70..e7e174064849 100644
--- a/data/keyboards/Generic.kcm
+++ b/data/keyboards/Generic.kcm
@@ -500,7 +500,7 @@ key PLUS {
key ESCAPE {
base: none
- alt, meta: fallback HOME
+ alt: fallback HOME
ctrl: fallback MENU
}
diff --git a/keystore/java/android/security/KeyStore2.java b/keystore/java/android/security/KeyStore2.java
index 5e16bcee1a0e..dd703f5eefb9 100644
--- a/keystore/java/android/security/KeyStore2.java
+++ b/keystore/java/android/security/KeyStore2.java
@@ -33,7 +33,6 @@ import android.system.keystore2.ResponseCode;
import android.util.Log;
import java.util.Calendar;
-import java.util.Objects;
/**
* @hide This should not be made public in its present form because it
@@ -139,13 +138,25 @@ public class KeyStore2 {
return new KeyStore2();
}
+ /**
+ * Gets the {@link IKeystoreService} that should be started in early_hal in Android.
+ *
+ * @throws IllegalStateException if the KeystoreService is not available or has not
+ * been initialized when called. This is a state that should not happen and indicates
+ * and error somewhere in the stack or with the calling processes access permissions.
+ */
@NonNull private synchronized IKeystoreService getService(boolean retryLookup) {
if (mBinder == null || retryLookup) {
mBinder = IKeystoreService.Stub.asInterface(ServiceManager
- .getService(KEYSTORE2_SERVICE_NAME));
- Binder.allowBlocking(mBinder.asBinder());
+ .getService(KEYSTORE2_SERVICE_NAME));
+ }
+ if (mBinder == null) {
+ throw new IllegalStateException(
+ "Could not connect to Keystore service. Keystore may have crashed or not been"
+ + " initialized");
}
- return Objects.requireNonNull(mBinder);
+ Binder.allowBlocking(mBinder.asBinder());
+ return mBinder;
}
void delete(KeyDescriptor descriptor) throws KeyStoreException {
diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/OverlayPresentationTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/OverlayPresentationTest.java
index 50cfd941adb3..4c2433fab2f8 100644
--- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/OverlayPresentationTest.java
+++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/OverlayPresentationTest.java
@@ -443,7 +443,8 @@ public class OverlayPresentationTest {
assertThat(taskContainer.getTaskFragmentContainers()).containsExactly(overlayContainer);
taskContainer.updateTaskFragmentParentInfo(new TaskFragmentParentInfo(Configuration.EMPTY,
- DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */));
+ DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */,
+ null /* decorSurface */));
mSplitController.updateOverlayContainer(mTransaction, overlayContainer);
diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java
index 02031a67e7e3..8c274a26177d 100644
--- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java
+++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java
@@ -1139,7 +1139,8 @@ public class SplitControllerTest {
public void testOnTransactionReady_taskFragmentParentInfoChanged() {
final TaskFragmentTransaction transaction = new TaskFragmentTransaction();
final TaskFragmentParentInfo parentInfo = new TaskFragmentParentInfo(Configuration.EMPTY,
- DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */);
+ DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */,
+ null /* decorSurface */);
transaction.addChange(new TaskFragmentTransaction.Change(
TYPE_TASK_FRAGMENT_PARENT_INFO_CHANGED)
.setTaskId(TASK_ID)
diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/TaskContainerTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/TaskContainerTest.java
index e56c8ab686e7..7b77235f66f7 100644
--- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/TaskContainerTest.java
+++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/TaskContainerTest.java
@@ -79,14 +79,16 @@ public class TaskContainerTest {
configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
taskContainer.updateTaskFragmentParentInfo(new TaskFragmentParentInfo(configuration,
- DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */));
+ DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */,
+ null /* decorSurface */));
assertEquals(WINDOWING_MODE_MULTI_WINDOW,
taskContainer.getWindowingModeForSplitTaskFragment(splitBounds));
configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);
taskContainer.updateTaskFragmentParentInfo(new TaskFragmentParentInfo(configuration,
- DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */));
+ DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */,
+ null /* decorSurface */));
assertEquals(WINDOWING_MODE_FREEFORM,
taskContainer.getWindowingModeForSplitTaskFragment(splitBounds));
@@ -106,13 +108,15 @@ public class TaskContainerTest {
configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
taskContainer.updateTaskFragmentParentInfo(new TaskFragmentParentInfo(configuration,
- DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */));
+ DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */,
+ null /* decorSurface */));
assertFalse(taskContainer.isInPictureInPicture());
configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_PINNED);
taskContainer.updateTaskFragmentParentInfo(new TaskFragmentParentInfo(configuration,
- DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */));
+ DEFAULT_DISPLAY, true /* visible */, false /* hasDirectActivity */,
+ null /* decorSurface */));
assertTrue(taskContainer.isInPictureInPicture());
}
diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp
index fd4522e02438..5ad144d50b87 100644
--- a/libs/WindowManager/Shell/Android.bp
+++ b/libs/WindowManager/Shell/Android.bp
@@ -160,6 +160,7 @@ android_library {
"kotlinx-coroutines-core",
"iconloader_base",
"com_android_wm_shell_flags_lib",
+ "com.android.window.flags.window-aconfig-java",
"WindowManager-Shell-proto",
"dagger2",
"jsr330",
diff --git a/libs/WindowManager/Shell/aconfig/multitasking.aconfig b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
index 4d2d960822d1..4511f3b91c5c 100644
--- a/libs/WindowManager/Shell/aconfig/multitasking.aconfig
+++ b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
@@ -50,3 +50,10 @@ flag {
bug: "290220798"
is_fixed_read_only: true
}
+
+flag {
+ name: "enable_left_right_split_in_portrait"
+ namespace: "multitasking"
+ description: "Enables left/right split in portrait"
+ bug: "291018646"
+}
diff --git a/libs/WindowManager/Shell/res/layout/docked_stack_divider.xml b/libs/WindowManager/Shell/res/layout/docked_stack_divider.xml
deleted file mode 100644
index d732b01ce106..000000000000
--- a/libs/WindowManager/Shell/res/layout/docked_stack_divider.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-
-<com.android.wm.shell.legacysplitscreen.DividerView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="match_parent"
- android:layout_width="match_parent">
-
- <View
- style="@style/DockedDividerBackground"
- android:id="@+id/docked_divider_background"
- android:background="@color/split_divider_background"/>
-
- <com.android.wm.shell.legacysplitscreen.MinimizedDockShadow
- style="@style/DockedDividerMinimizedShadow"
- android:id="@+id/minimized_dock_shadow"
- android:alpha="0"/>
-
- <com.android.wm.shell.common.split.DividerHandleView
- style="@style/DockedDividerHandle"
- android:id="@+id/docked_divider_handle"
- android:contentDescription="@string/accessibility_divider"
- android:background="@null"/>
-
-</com.android.wm.shell.legacysplitscreen.DividerView>
diff --git a/libs/WindowManager/Shell/res/layout/split_divider.xml b/libs/WindowManager/Shell/res/layout/split_divider.xml
index e3be700469a7..db35c8c57456 100644
--- a/libs/WindowManager/Shell/res/layout/split_divider.xml
+++ b/libs/WindowManager/Shell/res/layout/split_divider.xml
@@ -24,17 +24,16 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <View
- style="@style/DockedDividerBackground"
- android:id="@+id/docked_divider_background"/>
-
<com.android.wm.shell.common.split.DividerHandleView
- style="@style/DockedDividerHandle"
android:id="@+id/docked_divider_handle"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:layout_gravity="center"
android:contentDescription="@string/accessibility_divider"
android:background="@null"/>
<com.android.wm.shell.common.split.DividerRoundedCorner
+ android:id="@+id/docked_divider_rounded_corner"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
diff --git a/libs/WindowManager/Shell/res/values-land/dimens.xml b/libs/WindowManager/Shell/res/values-land/dimens.xml
index a95323fd4801..1b96fa227383 100644
--- a/libs/WindowManager/Shell/res/values-land/dimens.xml
+++ b/libs/WindowManager/Shell/res/values-land/dimens.xml
@@ -16,13 +16,6 @@
*/
-->
<resources>
- <!-- Divider handle size for legacy split screen -->
- <dimen name="docked_divider_handle_width">2dp</dimen>
- <dimen name="docked_divider_handle_height">16dp</dimen>
- <!-- Divider handle size for split screen -->
- <dimen name="split_divider_handle_width">3dp</dimen>
- <dimen name="split_divider_handle_height">72dp</dimen>
-
<!-- Padding between status bar and bubbles when displayed in expanded state, smaller
value in landscape since we have limited vertical space-->
<dimen name="bubble_padding_top">4dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values-land/styles.xml b/libs/WindowManager/Shell/res/values-land/styles.xml
deleted file mode 100644
index e89f65bef792..000000000000
--- a/libs/WindowManager/Shell/res/values-land/styles.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <style name="DockedDividerBackground">
- <item name="android:layout_width">@dimen/split_divider_bar_width</item>
- <item name="android:layout_height">match_parent</item>
- <item name="android:layout_gravity">center_horizontal</item>
- <item name="android:background">@color/split_divider_background</item>
- </style>
-
- <style name="DockedDividerHandle">
- <item name="android:layout_gravity">center</item>
- <item name="android:layout_width">48dp</item>
- <item name="android:layout_height">96dp</item>
- </style>
-
- <style name="DockedDividerMinimizedShadow">
- <item name="android:layout_width">8dp</item>
- <item name="android:layout_height">match_parent</item>
- </style>
-</resources>
-
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index f20d44df21b1..8f9de6168bc7 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -96,6 +96,9 @@
<dimen name="docked_divider_handle_width">16dp</dimen>
<dimen name="docked_divider_handle_height">2dp</dimen>
<!-- Divider handle size for split screen -->
+ <dimen name="split_divider_handle_region_width">96dp</dimen>
+ <dimen name="split_divider_handle_region_height">48dp</dimen>
+
<dimen name="split_divider_handle_width">72dp</dimen>
<dimen name="split_divider_handle_height">3dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values/styles.xml b/libs/WindowManager/Shell/res/values/styles.xml
index 468cfd5260cc..08c2a02acf55 100644
--- a/libs/WindowManager/Shell/res/values/styles.xml
+++ b/libs/WindowManager/Shell/res/values/styles.xml
@@ -60,20 +60,9 @@
<style name="DockedDividerBackground">
<item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">@dimen/split_divider_bar_width</item>
- <item name="android:layout_gravity">center_vertical</item>
- <item name="android:background">@color/split_divider_background</item>
- </style>
-
- <style name="DockedDividerMinimizedShadow">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">8dp</item>
- </style>
-
- <style name="DockedDividerHandle">
+ <item name="android:layout_height">match_parent</item>
<item name="android:layout_gravity">center</item>
- <item name="android:layout_width">96dp</item>
- <item name="android:layout_height">48dp</item>
+ <item name="android:background">@color/split_divider_background</item>
</style>
<style name="TvPipEduText">
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
index f5b877a70b84..a3eb429b1d7e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
@@ -412,6 +412,23 @@ public class BubbleExpandedView extends LinearLayout {
setLayoutDirection(LAYOUT_DIRECTION_LOCALE);
}
+
+ /** Updates the width of the task view if it changed. */
+ void updateTaskViewContentWidth() {
+ if (mTaskView != null) {
+ int width = getContentWidth();
+ if (mTaskView.getWidth() != width) {
+ FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(width, MATCH_PARENT);
+ mTaskView.setLayoutParams(lp);
+ }
+ }
+ }
+
+ private int getContentWidth() {
+ boolean isStackOnLeft = mPositioner.isStackOnLeft(mStackView.getStackPosition());
+ return mPositioner.getTaskViewContentWidth(isStackOnLeft);
+ }
+
/**
* Initialize {@link BubbleController} and {@link BubbleStackView} here, this method must need
* to be called after view inflate.
@@ -438,7 +455,12 @@ public class BubbleExpandedView extends LinearLayout {
mController.getTaskViewTransitions(), mController.getSyncTransactionQueue());
mTaskView = new TaskView(mContext, mTaskViewTaskController);
mTaskView.setListener(mController.getMainExecutor(), mTaskViewListener);
- mExpandedViewContainer.addView(mTaskView);
+
+ // set a fixed width so it is not recalculated as part of a rotation. the width will be
+ // updated manually after the rotation.
+ FrameLayout.LayoutParams lp =
+ new FrameLayout.LayoutParams(getContentWidth(), MATCH_PARENT);
+ mExpandedViewContainer.addView(mTaskView, lp);
bringChildToFront(mTaskView);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
index 1efd9df3a1d9..5d161962be4a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
@@ -375,6 +375,13 @@ public class BubblePositioner {
}
}
+ /** Returns the width of the task view content. */
+ public int getTaskViewContentWidth(boolean onLeft) {
+ int[] paddings = getExpandedViewContainerPadding(onLeft, /* isOverflow = */ false);
+ int pointerOffset = showBubblesVertically() ? getPointerSize() : 0;
+ return mPositionRect.width() - paddings[0] - paddings[2] - pointerOffset;
+ }
+
/** Gets the y position of the expanded view if it was top-aligned. */
public float getExpandedViewYTopAligned() {
final int top = getAvailableRect().top;
@@ -390,6 +397,9 @@ public class BubblePositioner {
* the screen and the size of the elements around it (e.g. padding, pointer, manage button).
*/
public int getMaxExpandedViewHeight(boolean isOverflow) {
+ if (mDeviceConfig.isLargeScreen() && !mDeviceConfig.isSmallTablet() && !isOverflow) {
+ return getExpandedViewHeightForLargeScreen();
+ }
// Subtract top insets because availableRect.height would account for that
int expandedContainerY = (int) getExpandedViewYTopAligned() - getInsets().top;
int paddingTop = showBubblesVertically()
@@ -407,6 +417,16 @@ public class BubblePositioner {
- bottomPadding;
}
+ private int getExpandedViewHeightForLargeScreen() {
+ // the expanded view height on large tablets is calculated based on the shortest screen
+ // size and is the same in both portrait and landscape
+ int maxVerticalInset = Math.max(mInsets.top, mInsets.bottom);
+ int shortestScreenSide = Math.min(getScreenRect().height(), getScreenRect().width());
+ // Subtract pointer size because it's laid out in LinearLayout with the expanded view.
+ return shortestScreenSide - maxVerticalInset * 2
+ - mManageButtonHeight - mPointerWidth - mExpandedViewPadding * 2;
+ }
+
/**
* Determines the height for the bubble, ensuring a minimum height. If the height should be as
* big as available, returns {@link #MAX_HEIGHT}.
@@ -417,15 +437,6 @@ public class BubblePositioner {
// overflow in landscape on phone is max
return MAX_HEIGHT;
}
-
- if (mDeviceConfig.isLargeScreen() && !mDeviceConfig.isSmallTablet() && !isOverflow) {
- // the expanded view height on large tablets is calculated based on the shortest screen
- // size and is the same in both portrait and landscape
- int maxVerticalInset = Math.max(mInsets.top, mInsets.bottom);
- int shortestScreenSide = Math.min(mScreenRect.height(), mScreenRect.width());
- return shortestScreenSide - 2 * maxVerticalInset - mManageButtonHeight;
- }
-
float desiredHeight = isOverflow
? mOverflowHeight
: ((Bubble) bubble).getDesiredHeight(mContext);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
index 8f904c42d247..ff4da853654d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
@@ -537,8 +537,8 @@ public class BubbleStackView extends FrameLayout
return;
}
- final boolean clickedBubbleIsCurrentlyExpandedBubble =
- clickedBubble.getKey().equals(mExpandedBubble.getKey());
+ final boolean clickedBubbleIsCurrentlyExpandedBubble = mExpandedBubble != null
+ && clickedBubble.getKey().equals(mExpandedBubble.getKey());
if (isExpanded()) {
mExpandedAnimationController.onGestureFinished();
@@ -1510,6 +1510,11 @@ public class BubbleStackView extends FrameLayout
updateExpandedView();
}
setUpManageMenu();
+ if (mShowingManage) {
+ // the manage menu location depends on the manage button location which may need a
+ // layout pass, so post this to the looper
+ post(() -> showManageMenu(true));
+ }
}
@Override
@@ -3288,6 +3293,7 @@ public class BubbleStackView extends FrameLayout
mExpandedViewContainer.setTranslationY(mPositioner.getExpandedViewY(mExpandedBubble,
mPositioner.showBubblesVertically() ? p.y : p.x));
mExpandedViewContainer.setTranslationX(0f);
+ mExpandedBubble.getExpandedView().updateTaskViewContentWidth();
mExpandedBubble.getExpandedView().updateView(
mExpandedViewContainer.getLocationOnScreen());
updatePointerPosition(false /* forIme */);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
index 79f188ab2611..50e1f7311ce0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
@@ -67,6 +67,7 @@ public class BubbleBarExpandedView extends FrameLayout implements BubbleTaskView
private boolean mIsOverflow;
private BubbleTaskViewHelper mBubbleTaskViewHelper;
private BubbleBarMenuViewController mMenuViewController;
+ private BubbleBarExpandedViewDragController mDragController;
private @Nullable Supplier<Rect> mLayerBoundsSupplier;
private @Nullable Listener mListener;
@@ -180,6 +181,8 @@ public class BubbleBarExpandedView extends FrameLayout implements BubbleTaskView
mHandleView.setOnClickListener(view -> {
mMenuViewController.showMenu(true /* animated */);
});
+
+ mDragController = new BubbleBarExpandedViewDragController(this);
}
public BubbleBarHandleView getHandleView() {
@@ -386,4 +389,11 @@ public class BubbleBarExpandedView extends FrameLayout implements BubbleTaskView
setContentVisibility(mIsContentVisible);
}
}
+
+ /**
+ * Check whether the view is animating
+ */
+ public boolean isAnimating() {
+ return mIsAnimating;
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt
new file mode 100644
index 000000000000..933794be071e
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt
@@ -0,0 +1,100 @@
+/*
+ * 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 com.android.wm.shell.bubbles.bar
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.graphics.PointF
+import android.view.MotionEvent
+import android.view.View
+import com.android.wm.shell.animation.Interpolators
+import com.android.wm.shell.common.bubbles.RelativeTouchListener
+
+/** Controller for handling drag interactions with [BubbleBarExpandedView] */
+class BubbleBarExpandedViewDragController(private val expandedView: BubbleBarExpandedView) {
+
+ init {
+ expandedView.handleView.setOnTouchListener(HandleDragListener())
+ }
+
+ private fun resetExpandedViewPosition(initialX: Float, initialY: Float) {
+ val listener = object : AnimatorListenerAdapter() {
+ override fun onAnimationStart(animation: Animator) {
+ expandedView.isAnimating = true
+ }
+
+ override fun onAnimationEnd(animation: Animator) {
+ expandedView.isAnimating = false
+ }
+ }
+ expandedView.animate()
+ .translationX(initialX)
+ .translationY(initialY)
+ .setDuration(RESET_POSITION_ANIM_DURATION)
+ .setInterpolator(Interpolators.EMPHASIZED_DECELERATE)
+ .setListener(listener)
+ .start()
+ }
+
+ private inner class HandleDragListener : RelativeTouchListener() {
+
+ private val expandedViewRestPosition = PointF()
+
+ override fun onDown(v: View, ev: MotionEvent): Boolean {
+ // While animating, don't allow new touch events
+ if (expandedView.isAnimating) {
+ return false
+ }
+ expandedViewRestPosition.x = expandedView.translationX
+ expandedViewRestPosition.y = expandedView.translationY
+ return true
+ }
+
+ override fun onMove(
+ v: View,
+ ev: MotionEvent,
+ viewInitialX: Float,
+ viewInitialY: Float,
+ dx: Float,
+ dy: Float
+ ) {
+ expandedView.translationX = expandedViewRestPosition.x + dx
+ expandedView.translationY = expandedViewRestPosition.y + dy
+ }
+
+ override fun onUp(
+ v: View,
+ ev: MotionEvent,
+ viewInitialX: Float,
+ viewInitialY: Float,
+ dx: Float,
+ dy: Float,
+ velX: Float,
+ velY: Float
+ ) {
+ resetExpandedViewPosition(expandedViewRestPosition.x, expandedViewRestPosition.y)
+ }
+
+ override fun onCancel(v: View, ev: MotionEvent, viewInitialX: Float, viewInitialY: Float) {
+ resetExpandedViewPosition(expandedViewRestPosition.x, expandedViewRestPosition.y)
+ }
+ }
+
+ companion object {
+ const val RESET_POSITION_ANIM_DURATION = 300L
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/RelativeTouchListener.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/RelativeTouchListener.kt
index d45e1265daac..4e55ba23407b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/RelativeTouchListener.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/RelativeTouchListener.kt
@@ -78,8 +78,15 @@ abstract class RelativeTouchListener : View.OnTouchListener {
velY: Float
)
+ open fun onCancel(
+ v: View,
+ ev: MotionEvent,
+ viewInitialX: Float,
+ viewInitialY: Float
+ ) {}
+
/** The raw coordinates of the last ACTION_DOWN event. */
- private val touchDown = PointF()
+ private var touchDown: PointF? = null
/** The coordinates of the view, at the time of the last ACTION_DOWN event. */
private val viewPositionOnTouchDown = PointF()
@@ -91,12 +98,11 @@ abstract class RelativeTouchListener : View.OnTouchListener {
private var performedLongClick = false
- @Suppress("UNCHECKED_CAST")
override fun onTouch(v: View, ev: MotionEvent): Boolean {
addMovement(ev)
- val dx = ev.rawX - touchDown.x
- val dy = ev.rawY - touchDown.y
+ val dx = touchDown?.let { ev.rawX - it.x } ?: 0f
+ val dy = touchDown?.let { ev.rawY - it.y } ?: 0f
when (ev.action) {
MotionEvent.ACTION_DOWN -> {
@@ -108,7 +114,7 @@ abstract class RelativeTouchListener : View.OnTouchListener {
// last gesture.
touchSlop = ViewConfiguration.get(v.context).scaledTouchSlop
- touchDown.set(ev.rawX, ev.rawY)
+ touchDown = PointF(ev.rawX, ev.rawY)
viewPositionOnTouchDown.set(v.translationX, v.translationY)
performedLongClick = false
@@ -120,6 +126,7 @@ abstract class RelativeTouchListener : View.OnTouchListener {
}
MotionEvent.ACTION_MOVE -> {
+ if (touchDown == null) return false
if (!movedEnough && hypot(dx, dy) > touchSlop && !performedLongClick) {
movedEnough = true
v.handler?.removeCallbacksAndMessages(null)
@@ -131,6 +138,7 @@ abstract class RelativeTouchListener : View.OnTouchListener {
}
MotionEvent.ACTION_UP -> {
+ if (touchDown == null) return false
if (movedEnough) {
velocityTracker.computeCurrentVelocity(1000 /* units */)
onUp(v, ev, viewPositionOnTouchDown.x, viewPositionOnTouchDown.y, dx, dy,
@@ -143,12 +151,16 @@ abstract class RelativeTouchListener : View.OnTouchListener {
velocityTracker.clear()
movedEnough = false
+ touchDown = null
}
MotionEvent.ACTION_CANCEL -> {
+ if (touchDown == null) return false
v.handler?.removeCallbacksAndMessages(null)
velocityTracker.clear()
movedEnough = false
+ touchDown = null
+ onCancel(v, ev, viewPositionOnTouchDown.x, viewPositionOnTouchDown.y)
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java
index ec2680085fb5..999da2443248 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java
@@ -68,24 +68,33 @@ public class DividerHandleView extends View {
};
private final Paint mPaint = new Paint();
- private final int mWidth;
- private final int mHeight;
- private final int mTouchingWidth;
- private final int mTouchingHeight;
+ private int mWidth;
+ private int mHeight;
+ private int mTouchingWidth;
+ private int mTouchingHeight;
private int mCurrentWidth;
private int mCurrentHeight;
private AnimatorSet mAnimator;
private boolean mTouching;
private boolean mHovering;
- private final int mHoveringWidth;
- private final int mHoveringHeight;
+ private int mHoveringWidth;
+ private int mHoveringHeight;
+ private boolean mIsLeftRightSplit;
public DividerHandleView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mPaint.setColor(getResources().getColor(R.color.docked_divider_handle, null));
mPaint.setAntiAlias(true);
- mWidth = getResources().getDimensionPixelSize(R.dimen.split_divider_handle_width);
- mHeight = getResources().getDimensionPixelSize(R.dimen.split_divider_handle_height);
+ updateDimens();
+ }
+
+ private void updateDimens() {
+ mWidth = getResources().getDimensionPixelSize(mIsLeftRightSplit
+ ? R.dimen.split_divider_handle_height
+ : R.dimen.split_divider_handle_width);
+ mHeight = getResources().getDimensionPixelSize(mIsLeftRightSplit
+ ? R.dimen.split_divider_handle_width
+ : R.dimen.split_divider_handle_height);
mCurrentWidth = mWidth;
mCurrentHeight = mHeight;
mTouchingWidth = mWidth > mHeight ? mWidth / 2 : mWidth;
@@ -94,6 +103,11 @@ public class DividerHandleView extends View {
mHoveringHeight = mHeight > mWidth ? ((int) (mHeight * 1.5f)) : mHeight;
}
+ void setIsLeftRightSplit(boolean isLeftRightSplit) {
+ mIsLeftRightSplit = isLeftRightSplit;
+ updateDimens();
+ }
+
/** Sets touching state for this handle view. */
public void setTouching(boolean touching, boolean animate) {
if (touching == mTouching) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerRoundedCorner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerRoundedCorner.java
index 364bb651d55d..834c15d6b8d6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerRoundedCorner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerRoundedCorner.java
@@ -16,7 +16,6 @@
package com.android.wm.shell.common.split;
-import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.view.RoundedCorner.POSITION_BOTTOM_LEFT;
import static android.view.RoundedCorner.POSITION_BOTTOM_RIGHT;
import static android.view.RoundedCorner.POSITION_TOP_LEFT;
@@ -47,6 +46,7 @@ public class DividerRoundedCorner extends View {
private InvertedRoundedCornerDrawInfo mTopRightCorner;
private InvertedRoundedCornerDrawInfo mBottomLeftCorner;
private InvertedRoundedCornerDrawInfo mBottomRightCorner;
+ private boolean mIsLeftRightSplit;
public DividerRoundedCorner(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
@@ -98,8 +98,8 @@ public class DividerRoundedCorner extends View {
return false;
}
- private boolean isLandscape() {
- return getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE;
+ void setIsLeftRightSplit(boolean isLeftRightSplit) {
+ mIsLeftRightSplit = isLeftRightSplit;
}
/**
@@ -134,7 +134,7 @@ public class DividerRoundedCorner extends View {
}
private void calculateStartPos(Point outPos) {
- if (isLandscape()) {
+ if (mIsLeftRightSplit) {
// Place left corner at the right side of the divider bar.
outPos.x = isLeftCorner()
? getWidth() / 2 + mDividerWidth / 2
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
index 0b0c6937553b..0f0fbd9cc12f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
@@ -16,7 +16,6 @@
package com.android.wm.shell.common.split;
-import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.view.PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW;
import static android.view.PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;
import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY;
@@ -27,6 +26,8 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.provider.DeviceConfig;
@@ -65,12 +66,15 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
public static final long TOUCH_ANIMATION_DURATION = 150;
public static final long TOUCH_RELEASE_ANIMATION_DURATION = 200;
+ private final Paint mPaint = new Paint();
+ private final Rect mBackgroundRect = new Rect();
private final int mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
private SplitLayout mSplitLayout;
private SplitWindowManager mSplitWindowManager;
private SurfaceControlViewHost mViewHost;
private DividerHandleView mHandle;
+ private DividerRoundedCorner mCorners;
private View mBackground;
private int mTouchElevation;
@@ -81,6 +85,8 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
private boolean mInteractive;
private boolean mSetTouchRegion = true;
private int mLastDraggingPosition;
+ private int mHandleRegionWidth;
+ private int mHandleRegionHeight;
/**
* Tracks divider bar visible bounds in screen-based coordination. Used to calculate with
@@ -123,7 +129,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
final DividerSnapAlgorithm snapAlgorithm = mSplitLayout.mDividerSnapAlgorithm;
- if (isLandscape()) {
+ if (mSplitLayout.isLeftRightSplit()) {
info.addAction(new AccessibilityAction(R.id.action_move_tl_full,
mContext.getString(R.string.accessibility_action_divider_left_full)));
if (snapAlgorithm.isFirstSplitTargetAvailable()) {
@@ -215,6 +221,17 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
mViewHost = viewHost;
layout.getDividerBounds(mDividerBounds);
onInsetsChanged(insetsState, false /* animate */);
+
+ final boolean isLeftRightSplit = mSplitLayout.isLeftRightSplit();
+ mHandle.setIsLeftRightSplit(isLeftRightSplit);
+ mCorners.setIsLeftRightSplit(isLeftRightSplit);
+
+ mHandleRegionWidth = getResources().getDimensionPixelSize(isLeftRightSplit
+ ? R.dimen.split_divider_handle_region_height
+ : R.dimen.split_divider_handle_region_width);
+ mHandleRegionHeight = getResources().getDimensionPixelSize(isLeftRightSplit
+ ? R.dimen.split_divider_handle_region_width
+ : R.dimen.split_divider_handle_region_height);
}
void onInsetsChanged(InsetsState insetsState, boolean animate) {
@@ -255,30 +272,47 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
super.onFinishInflate();
mDividerBar = findViewById(R.id.divider_bar);
mHandle = findViewById(R.id.docked_divider_handle);
- mBackground = findViewById(R.id.docked_divider_background);
+ mCorners = findViewById(R.id.docked_divider_rounded_corner);
mTouchElevation = getResources().getDimensionPixelSize(
R.dimen.docked_stack_divider_lift_elevation);
mDoubleTapDetector = new GestureDetector(getContext(), new DoubleTapListener());
mInteractive = true;
setOnTouchListener(this);
mHandle.setAccessibilityDelegate(mHandleDelegate);
+ setWillNotDraw(false);
+ mPaint.setColor(getResources().getColor(R.color.split_divider_background, null));
+ mPaint.setAntiAlias(true);
+ mPaint.setStyle(Paint.Style.FILL);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (mSetTouchRegion) {
- mTempRect.set(mHandle.getLeft(), mHandle.getTop(), mHandle.getRight(),
- mHandle.getBottom());
+ int startX = (mDividerBounds.width() - mHandleRegionWidth) / 2;
+ int startY = (mDividerBounds.height() - mHandleRegionHeight) / 2;
+ mTempRect.set(startX, startY, startX + mHandleRegionWidth,
+ startY + mHandleRegionHeight);
mSplitWindowManager.setTouchRegion(mTempRect);
mSetTouchRegion = false;
}
+
+ if (changed) {
+ boolean isHorizontalSplit = mSplitLayout.isLeftRightSplit();
+ int dividerSize = getResources().getDimensionPixelSize(R.dimen.split_divider_bar_width);
+ left = isHorizontalSplit ? (getWidth() - dividerSize) / 2 : 0;
+ top = isHorizontalSplit ? 0 : (getHeight() - dividerSize) / 2;
+ right = isHorizontalSplit ? left + dividerSize : getWidth();
+ bottom = isHorizontalSplit ? getHeight() : top + dividerSize;
+ mBackgroundRect.set(left, top, right, bottom);
+ }
}
@Override
public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) {
return PointerIcon.getSystemIcon(getContext(),
- isLandscape() ? TYPE_HORIZONTAL_DOUBLE_ARROW : TYPE_VERTICAL_DOUBLE_ARROW);
+ mSplitLayout.isLeftRightSplit() ? TYPE_HORIZONTAL_DOUBLE_ARROW
+ : TYPE_VERTICAL_DOUBLE_ARROW);
}
@Override
@@ -295,8 +329,8 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
// moving divider bar and calculating dragging velocity.
event.setLocation(event.getRawX(), event.getRawY());
final int action = event.getAction() & MotionEvent.ACTION_MASK;
- final boolean isLandscape = isLandscape();
- final int touchPos = (int) (isLandscape ? event.getX() : event.getY());
+ final boolean isLeftRightSplit = mSplitLayout.isLeftRightSplit();
+ final int touchPos = (int) (isLeftRightSplit ? event.getX() : event.getY());
switch (action) {
case MotionEvent.ACTION_DOWN:
mVelocityTracker = VelocityTracker.obtain();
@@ -328,7 +362,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
mVelocityTracker.addMovement(event);
mVelocityTracker.computeCurrentVelocity(1000 /* units */);
- final float velocity = isLandscape
+ final float velocity = isLeftRightSplit
? mVelocityTracker.getXVelocity()
: mVelocityTracker.getYVelocity();
final int position = mSplitLayout.getDividePosition() + touchPos - mStartPos;
@@ -410,6 +444,11 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
.start();
}
+ @Override
+ protected void onDraw(@NonNull Canvas canvas) {
+ canvas.drawRect(mBackgroundRect, mPaint);
+ }
+
@VisibleForTesting
void releaseHovering() {
mHandle.setHovering(false, true);
@@ -446,10 +485,6 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
mHandle.setVisibility(!mInteractive && hideHandle ? View.INVISIBLE : View.VISIBLE);
}
- private boolean isLandscape() {
- return getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE;
- }
-
private class DoubleTapListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
index 63cdb4f151ff..b699533374df 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
@@ -79,7 +79,7 @@ import java.util.function.Consumer;
* divide position changes.
*/
public final class SplitLayout implements DisplayInsetsController.OnInsetsChangedListener {
-
+ private static final String TAG = "SplitLayout";
public static final int PARALLAX_NONE = 0;
public static final int PARALLAX_DISMISSING = 1;
public static final int PARALLAX_ALIGN_CENTER = 2;
@@ -121,12 +121,15 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
private int mDividerPosition;
private boolean mInitialized = false;
private boolean mFreezeDividerWindow = false;
+ private boolean mIsLargeScreen = false;
private int mOrientation;
private int mRotation;
private int mDensity;
private int mUiMode;
private final boolean mDimNonImeSide;
+ private final boolean mAllowLeftRightSplitInPortrait;
+ private boolean mIsLeftRightSplit;
private ValueAnimator mDividerFlingAnimator;
public SplitLayout(String windowName, Context context, Configuration configuration,
@@ -138,6 +141,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
mOrientation = configuration.orientation;
mRotation = configuration.windowConfiguration.getRotation();
mDensity = configuration.densityDpi;
+ mIsLargeScreen = configuration.smallestScreenWidthDp >= 600;
mSplitLayoutHandler = splitLayoutHandler;
mDisplayController = displayController;
mDisplayImeController = displayImeController;
@@ -147,14 +151,17 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
mImePositionProcessor = new ImePositionProcessor(mContext.getDisplayId());
mSurfaceEffectPolicy = new ResizingEffectPolicy(parallaxType);
+ final Resources res = mContext.getResources();
+ mDimNonImeSide = res.getBoolean(R.bool.config_dimNonImeAttachedSide);
+ mAllowLeftRightSplitInPortrait = SplitScreenUtils.allowLeftRightSplitInPortrait(res);
+ mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
+ configuration);
+
updateDividerConfig(mContext);
mRootBounds.set(configuration.windowConfiguration.getBounds());
mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
resetDividerPosition();
-
- mDimNonImeSide = mContext.getResources().getBoolean(R.bool.config_dimNonImeAttachedSide);
-
updateInvisibleRect();
}
@@ -284,17 +291,17 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
* Returns the divider position as a fraction from 0 to 1.
*/
public float getDividerPositionAsFraction() {
- return Math.min(1f, Math.max(0f, isLandscape()
+ return Math.min(1f, Math.max(0f, mIsLeftRightSplit
? (float) ((mBounds1.right + mBounds2.left) / 2f) / mBounds2.right
: (float) ((mBounds1.bottom + mBounds2.top) / 2f) / mBounds2.bottom));
}
private void updateInvisibleRect() {
mInvisibleBounds.set(mRootBounds.left, mRootBounds.top,
- isLandscape() ? mRootBounds.right / 2 : mRootBounds.right,
- isLandscape() ? mRootBounds.bottom : mRootBounds.bottom / 2);
- mInvisibleBounds.offset(isLandscape() ? mRootBounds.right : 0,
- isLandscape() ? 0 : mRootBounds.bottom);
+ mIsLeftRightSplit ? mRootBounds.right / 2 : mRootBounds.right,
+ mIsLeftRightSplit ? mRootBounds.bottom : mRootBounds.bottom / 2);
+ mInvisibleBounds.offset(mIsLeftRightSplit ? mRootBounds.right : 0,
+ mIsLeftRightSplit ? 0 : mRootBounds.bottom);
}
/** Applies new configuration, returns {@code false} if there's no effect to the layout. */
@@ -309,6 +316,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
final int orientation = configuration.orientation;
final int density = configuration.densityDpi;
final int uiMode = configuration.uiMode;
+ final boolean wasLeftRightSplit = mIsLeftRightSplit;
if (mOrientation == orientation
&& mRotation == rotation
@@ -326,9 +334,12 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
mRotation = rotation;
mDensity = density;
mUiMode = uiMode;
+ mIsLargeScreen = configuration.smallestScreenWidthDp >= 600;
+ mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
+ configuration);
mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
updateDividerConfig(mContext);
- initDividerPosition(mTempRect);
+ initDividerPosition(mTempRect, wasLeftRightSplit);
updateInvisibleRect();
return true;
@@ -347,18 +358,27 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
}
// We only need new bounds here, other configuration should be update later.
+ final boolean wasLeftRightSplit = SplitScreenUtils.isLeftRightSplit(
+ mAllowLeftRightSplitInPortrait, mIsLargeScreen,
+ mRootBounds.width() >= mRootBounds.height());
mTempRect.set(mRootBounds);
mRootBounds.set(tmpRect);
+ mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
+ mIsLargeScreen, mRootBounds.width() >= mRootBounds.height());
mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
- initDividerPosition(mTempRect);
+ initDividerPosition(mTempRect, wasLeftRightSplit);
}
- private void initDividerPosition(Rect oldBounds) {
+ /**
+ * Updates the divider position to the position in the current orientation and bounds using the
+ * snap fraction calculated based on the previous orientation and bounds.
+ */
+ private void initDividerPosition(Rect oldBounds, boolean wasLeftRightSplit) {
final float snapRatio = (float) mDividerPosition
- / (float) (isLandscape(oldBounds) ? oldBounds.width() : oldBounds.height());
+ / (float) (wasLeftRightSplit ? oldBounds.width() : oldBounds.height());
// Estimate position by previous ratio.
final float length =
- (float) (isLandscape() ? mRootBounds.width() : mRootBounds.height());
+ (float) (mIsLeftRightSplit ? mRootBounds.width() : mRootBounds.height());
final int estimatePosition = (int) (length * snapRatio);
// Init divider position by estimated position using current bounds snap algorithm.
mDividerPosition = mDividerSnapAlgorithm.calculateNonDismissingSnapTarget(
@@ -376,8 +396,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
dividerBounds.set(mRootBounds);
bounds1.set(mRootBounds);
bounds2.set(mRootBounds);
- final boolean isLandscape = isLandscape(mRootBounds);
- if (isLandscape) {
+ if (mIsLeftRightSplit) {
position += mRootBounds.left;
dividerBounds.left = position - mDividerInsets;
dividerBounds.right = dividerBounds.left + mDividerWindowWidth;
@@ -393,7 +412,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
DockedDividerUtils.sanitizeStackBounds(bounds1, true /** topLeft */);
DockedDividerUtils.sanitizeStackBounds(bounds2, false /** topLeft */);
if (setEffectBounds) {
- mSurfaceEffectPolicy.applyDividerPosition(position, isLandscape);
+ mSurfaceEffectPolicy.applyDividerPosition(position, mIsLeftRightSplit);
}
}
@@ -563,13 +582,12 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
}
private DividerSnapAlgorithm getSnapAlgorithm(Context context, Rect rootBounds) {
- final boolean isLandscape = isLandscape(rootBounds);
final Rect insets = getDisplayStableInsets(context);
// Make split axis insets value same as the larger one to avoid bounds1 and bounds2
// have difference for avoiding size-compat mode when switching unresizable apps in
// landscape while they are letterboxed.
- if (!isLandscape) {
+ if (!mIsLeftRightSplit) {
final int largerInsets = Math.max(insets.top, insets.bottom);
insets.set(insets.left, largerInsets, insets.right, largerInsets);
}
@@ -579,9 +597,9 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
rootBounds.width(),
rootBounds.height(),
mDividerSize,
- !isLandscape,
+ !mIsLeftRightSplit,
insets,
- isLandscape ? DOCKED_LEFT : DOCKED_TOP /* dockSide */);
+ mIsLeftRightSplit ? DOCKED_LEFT : DOCKED_TOP /* dockSide */);
}
/** Fling divider from current position to end or start position then exit */
@@ -643,13 +661,12 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
/** Switch both surface position with animation. */
public void splitSwitching(SurfaceControl.Transaction t, SurfaceControl leash1,
SurfaceControl leash2, Consumer<Rect> finishCallback) {
- final boolean isLandscape = isLandscape();
final Rect insets = getDisplayStableInsets(mContext);
- insets.set(isLandscape ? insets.left : 0, isLandscape ? 0 : insets.top,
- isLandscape ? insets.right : 0, isLandscape ? 0 : insets.bottom);
+ insets.set(mIsLeftRightSplit ? insets.left : 0, mIsLeftRightSplit ? 0 : insets.top,
+ mIsLeftRightSplit ? insets.right : 0, mIsLeftRightSplit ? 0 : insets.bottom);
final int dividerPos = mDividerSnapAlgorithm.calculateNonDismissingSnapTarget(
- isLandscape ? mBounds2.width() : mBounds2.height()).position;
+ mIsLeftRightSplit ? mBounds2.width() : mBounds2.height()).position;
final Rect distBounds1 = new Rect();
final Rect distBounds2 = new Rect();
final Rect distDividerBounds = new Rect();
@@ -740,15 +757,12 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
.toRect();
}
- private static boolean isLandscape(Rect bounds) {
- return bounds.width() > bounds.height();
- }
-
/**
- * Return if this layout is landscape.
+ * @return {@code true} if we should create a left-right split, {@code false} if we should
+ * create a top-bottom split.
*/
- public boolean isLandscape() {
- return isLandscape(mRootBounds);
+ public boolean isLeftRightSplit() {
+ return mIsLeftRightSplit;
}
/** Apply recorded surface layout to the {@link SurfaceControl.Transaction}. */
@@ -850,9 +864,13 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
/** Dumps the current split bounds recorded in this layout. */
public void dump(@NonNull PrintWriter pw, String prefix) {
- pw.println(prefix + "bounds1=" + mBounds1.toShortString());
- pw.println(prefix + "dividerBounds=" + mDividerBounds.toShortString());
- pw.println(prefix + "bounds2=" + mBounds2.toShortString());
+ final String innerPrefix = prefix + "\t";
+ pw.println(prefix + TAG + ":");
+ pw.println(innerPrefix + "mAllowLeftRightSplitInPortrait=" + mAllowLeftRightSplitInPortrait);
+ pw.println(innerPrefix + "mIsLeftRightSplit=" + mIsLeftRightSplit);
+ pw.println(innerPrefix + "bounds1=" + mBounds1.toShortString());
+ pw.println(innerPrefix + "dividerBounds=" + mDividerBounds.toShortString());
+ pw.println(innerPrefix + "bounds2=" + mBounds2.toShortString());
}
/** Handles layout change event. */
@@ -937,32 +955,32 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
* Applies a parallax to the task to hint dismissing progress.
*
* @param position the split position to apply dismissing parallax effect
- * @param isLandscape indicates whether it's splitting horizontally or vertically
+ * @param isLeftRightSplit indicates whether it's splitting horizontally or vertically
*/
- void applyDividerPosition(int position, boolean isLandscape) {
+ void applyDividerPosition(int position, boolean isLeftRightSplit) {
mDismissingSide = DOCKED_INVALID;
mParallaxOffset.set(0, 0);
mDismissingDimValue = 0;
int totalDismissingDistance = 0;
if (position < mDividerSnapAlgorithm.getFirstSplitTarget().position) {
- mDismissingSide = isLandscape ? DOCKED_LEFT : DOCKED_TOP;
+ mDismissingSide = isLeftRightSplit ? DOCKED_LEFT : DOCKED_TOP;
totalDismissingDistance = mDividerSnapAlgorithm.getDismissStartTarget().position
- mDividerSnapAlgorithm.getFirstSplitTarget().position;
} else if (position > mDividerSnapAlgorithm.getLastSplitTarget().position) {
- mDismissingSide = isLandscape ? DOCKED_RIGHT : DOCKED_BOTTOM;
+ mDismissingSide = isLeftRightSplit ? DOCKED_RIGHT : DOCKED_BOTTOM;
totalDismissingDistance = mDividerSnapAlgorithm.getLastSplitTarget().position
- mDividerSnapAlgorithm.getDismissEndTarget().position;
}
- final boolean topLeftShrink = isLandscape
+ final boolean topLeftShrink = isLeftRightSplit
? position < mWinBounds1.right : position < mWinBounds1.bottom;
if (topLeftShrink) {
- mShrinkSide = isLandscape ? DOCKED_LEFT : DOCKED_TOP;
+ mShrinkSide = isLeftRightSplit ? DOCKED_LEFT : DOCKED_TOP;
mContentBounds.set(mWinBounds1);
mSurfaceBounds.set(mBounds1);
} else {
- mShrinkSide = isLandscape ? DOCKED_RIGHT : DOCKED_BOTTOM;
+ mShrinkSide = isLeftRightSplit ? DOCKED_RIGHT : DOCKED_BOTTOM;
mContentBounds.set(mWinBounds2);
mSurfaceBounds.set(mBounds2);
}
@@ -973,7 +991,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
mDismissingDimValue = DIM_INTERPOLATOR.getInterpolation(fraction);
if (mParallaxType == PARALLAX_DISMISSING) {
fraction = calculateParallaxDismissingFraction(fraction, mDismissingSide);
- if (isLandscape) {
+ if (isLeftRightSplit) {
mParallaxOffset.x = (int) (fraction * totalDismissingDistance);
} else {
mParallaxOffset.y = (int) (fraction * totalDismissingDistance);
@@ -982,7 +1000,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
}
if (mParallaxType == PARALLAX_ALIGN_CENTER) {
- if (isLandscape) {
+ if (isLeftRightSplit) {
mParallaxOffset.x =
(mSurfaceBounds.width() - mContentBounds.width()) / 2;
} else {
@@ -1129,7 +1147,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
// Calculate target bounds offset for IME
mLastYOffset = mYOffsetForIme;
final boolean needOffset = imeTargetPosition == SPLIT_POSITION_BOTTOM_OR_RIGHT
- && !isFloating && !isLandscape(mRootBounds) && mImeShown;
+ && !isFloating && !mIsLeftRightSplit && mImeShown;
mTargetYOffset = needOffset ? getTargetYOffset() : 0;
if (mTargetYOffset != mLastYOffset) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java
index d7ea1c0c620d..0693543515b4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java
@@ -16,6 +16,8 @@
package com.android.wm.shell.common.split;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
+
import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_ACTIVITY_TYPES;
import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_WINDOWING_MODES;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
@@ -25,9 +27,14 @@ import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSIT
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.PendingIntent;
+import android.content.Context;
import android.content.Intent;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Rect;
import com.android.internal.util.ArrayUtils;
+import com.android.wm.shell.Flags;
import com.android.wm.shell.ShellTaskOrganizer;
/** Helper utility class for split screen components to use. */
@@ -94,4 +101,38 @@ public class SplitScreenUtils {
public static String splitFailureMessage(String caller, String reason) {
return "(" + caller + ") Splitscreen aborted: " + reason;
}
+
+ /**
+ * Returns whether left/right split is allowed in portrait.
+ */
+ public static boolean allowLeftRightSplitInPortrait(Resources res) {
+ return Flags.enableLeftRightSplitInPortrait() && res.getBoolean(
+ com.android.internal.R.bool.config_leftRightSplitInPortrait);
+ }
+
+ /**
+ * Returns whether left/right split is supported in the given configuration.
+ */
+ public static boolean isLeftRightSplit(boolean allowLeftRightSplitInPortrait,
+ Configuration config) {
+ // Compare the max bounds sizes as on near-square devices, the insets may result in a
+ // configuration in the other orientation
+ final boolean isLargeScreen = config.smallestScreenWidthDp >= 600;
+ final Rect maxBounds = config.windowConfiguration.getMaxBounds();
+ final boolean isLandscape = maxBounds.width() >= maxBounds.height();
+ return isLeftRightSplit(allowLeftRightSplitInPortrait, isLargeScreen, isLandscape);
+ }
+
+ /**
+ * Returns whether left/right split is supported in the given configuration state. This method
+ * is useful for cases where we need to calculate this given last saved state.
+ */
+ public static boolean isLeftRightSplit(boolean allowLeftRightSplitInPortrait,
+ boolean isLargeScreen, boolean isLandscape) {
+ if (allowLeftRightSplitInPortrait && isLargeScreen) {
+ return !isLandscape;
+ } else {
+ return isLandscape;
+ }
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
index b158f88a68c3..3c6bc1754c5c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
@@ -324,13 +324,16 @@ public abstract class WMShellBaseModule {
@WMSingleton
@Provides
- static SystemPerformanceHinter provideSystemPerformanceHinter(Context context,
+ static Optional<SystemPerformanceHinter> provideSystemPerformanceHinter(Context context,
ShellInit shellInit,
ShellCommandHandler shellCommandHandler,
RootTaskDisplayAreaOrganizer rootTdaOrganizer) {
+ if (!com.android.window.flags.Flags.explicitRefreshRateHints()) {
+ return Optional.empty();
+ }
final PerfHintController perfHintController =
new PerfHintController(context, shellInit, shellCommandHandler, rootTdaOrganizer);
- return perfHintController.getHinter();
+ return Optional.of(perfHintController.getHinter());
}
//
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
index 0bf8ec32c6c0..fdfb6f3680b2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
@@ -94,6 +94,7 @@ public class DragAndDropController implements RemoteCallable<DragAndDropControll
private ShellExecutor mMainExecutor;
private ArrayList<DragAndDropListener> mListeners = new ArrayList<>();
+ // Map of displayId -> per-display info
private final SparseArray<PerDisplay> mDisplayDropTargets = new SparseArray<>();
/**
@@ -362,7 +363,7 @@ public class DragAndDropController implements RemoteCallable<DragAndDropControll
*/
private boolean isReadyToHandleDrag() {
for (int i = 0; i < mDisplayDropTargets.size(); i++) {
- if (mDisplayDropTargets.valueAt(i).mHasDrawn) {
+ if (mDisplayDropTargets.valueAt(i).hasDrawn) {
return true;
}
}
@@ -398,8 +399,13 @@ public class DragAndDropController implements RemoteCallable<DragAndDropControll
* Dumps information about this controller.
*/
public void dump(@NonNull PrintWriter pw, String prefix) {
+ final String innerPrefix = prefix + " ";
pw.println(prefix + TAG);
- pw.println(prefix + " listeners=" + mListeners.size());
+ pw.println(innerPrefix + "listeners=" + mListeners.size());
+ pw.println(innerPrefix + "Per display:");
+ for (int i = 0; i < mDisplayDropTargets.size(); i++) {
+ mDisplayDropTargets.valueAt(i).dump(pw, innerPrefix);
+ }
}
/**
@@ -440,7 +446,7 @@ public class DragAndDropController implements RemoteCallable<DragAndDropControll
final FrameLayout rootView;
final DragLayout dragLayout;
// Tracks whether the window has fully drawn since it was last made visible
- boolean mHasDrawn;
+ boolean hasDrawn;
boolean isHandlingDrag;
// A count of the number of active drags in progress to ensure that we only hide the window
@@ -464,17 +470,29 @@ public class DragAndDropController implements RemoteCallable<DragAndDropControll
rootView.setVisibility(visibility);
if (visibility == View.VISIBLE) {
rootView.requestApplyInsets();
- if (!mHasDrawn && rootView.getViewRootImpl() != null) {
+ if (!hasDrawn && rootView.getViewRootImpl() != null) {
rootView.getViewRootImpl().registerRtFrameCallback(this);
}
} else {
- mHasDrawn = false;
+ hasDrawn = false;
}
}
@Override
public void onFrameDraw(long frame) {
- mHasDrawn = true;
+ hasDrawn = true;
+ }
+
+ /**
+ * Dumps information about this display's shell drop target.
+ */
+ public void dump(@NonNull PrintWriter pw, String prefix) {
+ final String innerPrefix = prefix + " ";
+ pw.println(innerPrefix + "displayId=" + displayId);
+ pw.println(innerPrefix + "hasDrawn=" + hasDrawn);
+ pw.println(innerPrefix + "isHandlingDrag=" + isHandlingDrag);
+ pw.println(innerPrefix + "activeDragCount=" + activeDragCount);
+ dragLayout.dump(pw, innerPrefix);
}
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
index e70768b6b752..162ce19703ea 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
@@ -138,7 +138,7 @@ public class DragAndDropPolicy {
final Rect displayRegion = new Rect(l, t, l + iw, t + ih);
final Rect fullscreenDrawRegion = new Rect(displayRegion);
final Rect fullscreenHitRegion = new Rect(displayRegion);
- final boolean inLandscape = mSession.displayLayout.isLandscape();
+ final boolean isLeftRightSplit = mSplitScreen != null && mSplitScreen.isLeftRightSplit();
final boolean inSplitScreen = mSplitScreen != null && mSplitScreen.isSplitScreenVisible();
final float dividerWidth = mContext.getResources().getDimensionPixelSize(
R.dimen.split_divider_bar_width);
@@ -155,7 +155,7 @@ public class DragAndDropPolicy {
topOrLeftBounds.intersect(displayRegion);
bottomOrRightBounds.intersect(displayRegion);
- if (inLandscape) {
+ if (isLeftRightSplit) {
final Rect leftHitRegion = new Rect();
final Rect rightHitRegion = new Rect();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
index 205a455200bd..445ba897c173 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
@@ -20,6 +20,7 @@ import static android.app.StatusBarManager.DISABLE_NONE;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.content.pm.ActivityInfo.CONFIG_ASSETS_PATHS;
import static android.content.pm.ActivityInfo.CONFIG_UI_MODE;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
@@ -47,14 +48,18 @@ import android.view.WindowInsets;
import android.view.WindowInsets.Type;
import android.widget.LinearLayout;
+import androidx.annotation.NonNull;
+
import com.android.internal.logging.InstanceId;
import com.android.internal.protolog.common.ProtoLog;
import com.android.launcher3.icons.IconProvider;
import com.android.wm.shell.R;
import com.android.wm.shell.animation.Interpolators;
+import com.android.wm.shell.common.split.SplitScreenUtils;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.splitscreen.SplitScreenController;
+import java.io.PrintWriter;
import java.util.ArrayList;
/**
@@ -74,6 +79,11 @@ public class DragLayout extends LinearLayout {
private final StatusBarManager mStatusBarManager;
private final Configuration mLastConfiguration = new Configuration();
+ // Whether this device supports left/right split in portrait
+ private final boolean mAllowLeftRightSplitInPortrait;
+ // Whether the device is currently in left/right split mode
+ private boolean mIsLeftRightSplit;
+
private DragAndDropPolicy.Target mCurrentTarget = null;
private DropZoneView mDropZoneView1;
private DropZoneView mDropZoneView2;
@@ -106,17 +116,18 @@ public class DragLayout extends LinearLayout {
setLayoutDirection(LAYOUT_DIRECTION_LTR);
mDropZoneView1 = new DropZoneView(context);
mDropZoneView2 = new DropZoneView(context);
- addView(mDropZoneView1, new LinearLayout.LayoutParams(MATCH_PARENT,
- MATCH_PARENT));
- addView(mDropZoneView2, new LinearLayout.LayoutParams(MATCH_PARENT,
- MATCH_PARENT));
+ addView(mDropZoneView1, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
+ addView(mDropZoneView2, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
((LayoutParams) mDropZoneView1.getLayoutParams()).weight = 1;
((LayoutParams) mDropZoneView2.getLayoutParams()).weight = 1;
- int orientation = getResources().getConfiguration().orientation;
- setOrientation(orientation == Configuration.ORIENTATION_LANDSCAPE
- ? LinearLayout.HORIZONTAL
- : LinearLayout.VERTICAL);
- updateContainerMargins(getResources().getConfiguration().orientation);
+ // We don't use the configuration orientation here to determine landscape because
+ // near-square devices may report the same orietation with insets taken into account
+ mAllowLeftRightSplitInPortrait = SplitScreenUtils.allowLeftRightSplitInPortrait(
+ context.getResources());
+ mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
+ getResources().getConfiguration());
+ setOrientation(mIsLeftRightSplit ? LinearLayout.HORIZONTAL : LinearLayout.VERTICAL);
+ updateContainerMargins(mIsLeftRightSplit);
}
@Override
@@ -124,11 +135,12 @@ public class DragLayout extends LinearLayout {
mInsets = insets.getInsets(Type.tappableElement() | Type.displayCutout());
recomputeDropTargets();
- final int orientation = getResources().getConfiguration().orientation;
- if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
+ boolean isLeftRightSplit = mSplitScreenController != null
+ && mSplitScreenController.isLeftRightSplit();
+ if (isLeftRightSplit) {
mDropZoneView1.setBottomInset(mInsets.bottom);
mDropZoneView2.setBottomInset(mInsets.bottom);
- } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
+ } else {
mDropZoneView1.setBottomInset(0);
mDropZoneView2.setBottomInset(mInsets.bottom);
}
@@ -136,14 +148,12 @@ public class DragLayout extends LinearLayout {
}
public void onConfigChanged(Configuration newConfig) {
- if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE
- && getOrientation() != HORIZONTAL) {
- setOrientation(LinearLayout.HORIZONTAL);
- updateContainerMargins(newConfig.orientation);
- } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT
- && getOrientation() != VERTICAL) {
- setOrientation(LinearLayout.VERTICAL);
- updateContainerMargins(newConfig.orientation);
+ boolean isLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
+ newConfig);
+ if (isLeftRightSplit != mIsLeftRightSplit) {
+ mIsLeftRightSplit = isLeftRightSplit;
+ setOrientation(mIsLeftRightSplit ? LinearLayout.HORIZONTAL : LinearLayout.VERTICAL);
+ updateContainerMargins(mIsLeftRightSplit);
}
final int diff = newConfig.diff(mLastConfiguration);
@@ -162,14 +172,14 @@ public class DragLayout extends LinearLayout {
mDropZoneView2.setContainerMargin(0, 0, 0, 0);
}
- private void updateContainerMargins(int orientation) {
+ private void updateContainerMargins(boolean isLeftRightSplit) {
final float halfMargin = mDisplayMargin / 2f;
- if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
+ if (isLeftRightSplit) {
mDropZoneView1.setContainerMargin(
mDisplayMargin, mDisplayMargin, halfMargin, mDisplayMargin);
mDropZoneView2.setContainerMargin(
halfMargin, mDisplayMargin, mDisplayMargin, mDisplayMargin);
- } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
+ } else {
mDropZoneView1.setContainerMargin(
mDisplayMargin, mDisplayMargin, mDisplayMargin, halfMargin);
mDropZoneView2.setContainerMargin(
@@ -257,23 +267,21 @@ public class DragLayout extends LinearLayout {
* @param bounds2 bounds to apply to the second dropzone view, null if split in half.
*/
private void updateDropZoneSizes(Rect bounds1, Rect bounds2) {
- final int orientation = getResources().getConfiguration().orientation;
- final boolean isPortrait = orientation == Configuration.ORIENTATION_PORTRAIT;
final int halfDivider = mDividerSize / 2;
final LinearLayout.LayoutParams dropZoneView1 =
(LayoutParams) mDropZoneView1.getLayoutParams();
final LinearLayout.LayoutParams dropZoneView2 =
(LayoutParams) mDropZoneView2.getLayoutParams();
- if (isPortrait) {
- dropZoneView1.width = MATCH_PARENT;
- dropZoneView2.width = MATCH_PARENT;
- dropZoneView1.height = bounds1 != null ? bounds1.height() + halfDivider : MATCH_PARENT;
- dropZoneView2.height = bounds2 != null ? bounds2.height() + halfDivider : MATCH_PARENT;
- } else {
+ if (mIsLeftRightSplit) {
dropZoneView1.width = bounds1 != null ? bounds1.width() + halfDivider : MATCH_PARENT;
dropZoneView2.width = bounds2 != null ? bounds2.width() + halfDivider : MATCH_PARENT;
dropZoneView1.height = MATCH_PARENT;
dropZoneView2.height = MATCH_PARENT;
+ } else {
+ dropZoneView1.width = MATCH_PARENT;
+ dropZoneView2.width = MATCH_PARENT;
+ dropZoneView1.height = bounds1 != null ? bounds1.height() + halfDivider : MATCH_PARENT;
+ dropZoneView2.height = bounds2 != null ? bounds2.height() + halfDivider : MATCH_PARENT;
}
dropZoneView1.weight = bounds1 != null ? 0 : 1;
dropZoneView2.weight = bounds2 != null ? 0 : 1;
@@ -371,7 +379,7 @@ public class DragLayout extends LinearLayout {
// Reset the state if we previously force-ignore the bottom margin
mDropZoneView1.setForceIgnoreBottomMargin(false);
mDropZoneView2.setForceIgnoreBottomMargin(false);
- updateContainerMargins(getResources().getConfiguration().orientation);
+ updateContainerMargins(mIsLeftRightSplit);
mCurrentTarget = null;
}
@@ -481,4 +489,19 @@ public class DragLayout extends LinearLayout {
final int taskBgColor = taskInfo.taskDescription.getBackgroundColor();
return Color.valueOf(taskBgColor == -1 ? Color.WHITE : taskBgColor).toArgb();
}
+
+ /**
+ * Dumps information about this drag layout.
+ */
+ public void dump(@NonNull PrintWriter pw, String prefix) {
+ final String innerPrefix = prefix + " ";
+ pw.println(prefix + "DragLayout:");
+ pw.println(innerPrefix + "mIsLeftRightSplitInPortrait=" + mAllowLeftRightSplitInPortrait);
+ pw.println(innerPrefix + "mIsLeftRightSplit=" + mIsLeftRightSplit);
+ pw.println(innerPrefix + "mDisplayMargin=" + mDisplayMargin);
+ pw.println(innerPrefix + "mDividerSize=" + mDividerSize);
+ pw.println(innerPrefix + "mIsShowing=" + mIsShowing);
+ pw.println(innerPrefix + "mHasDropped=" + mHasDropped);
+ pw.println(innerPrefix + "mCurrentTarget=" + mCurrentTarget);
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java
index 478b6a9d95f6..353d702e5bc4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java
@@ -18,31 +18,17 @@ package com.android.wm.shell.draganddrop;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
-import static android.content.ClipDescription.EXTRA_PENDING_INTENT;
-import static android.content.ClipDescription.MIMETYPE_APPLICATION_ACTIVITY;
-import static android.content.ClipDescription.MIMETYPE_APPLICATION_SHORTCUT;
-import static android.content.ClipDescription.MIMETYPE_APPLICATION_TASK;
-import static android.content.Intent.EXTRA_USER;
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
-import android.app.PendingIntent;
import android.app.WindowConfiguration;
import android.content.ClipData;
-import android.content.ClipDescription;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
-import android.net.Uri;
-import android.os.UserHandle;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
import com.android.wm.shell.common.DisplayLayout;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import java.util.List;
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
index b4067d0db112..c1164fca22f2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
@@ -123,7 +123,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
private static final int EXTRA_CONTENT_OVERLAY_FADE_OUT_DELAY_MS =
SystemProperties.getInt(
- "persist.wm.debug.extra_content_overlay_fade_out_delay_ms", 0);
+ "persist.wm.debug.extra_content_overlay_fade_out_delay_ms", 400);
private final Context mContext;
private final SyncTransactionQueue mSyncTransactionQueue;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
index 271a3b26305d..79c20761abed 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
@@ -590,7 +590,7 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
cancel("transit_sleep");
return;
}
- if (mKeyguardLocked) {
+ if (mKeyguardLocked || (info.getFlags() & TRANSIT_FLAG_KEYGUARD_LOCKED) != 0) {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
"[%d] RecentsController.merge: keyguard is locked", mInstanceId);
// We will not accept new changes if we are swiping over the keyguard.
@@ -627,7 +627,8 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
&& mRecentsTask.equals(change.getContainer());
hasTaskChange = hasTaskChange || isRootTask;
final boolean isLeafTask = leafTaskFilter.test(change);
- if (TransitionUtil.isOpeningType(change.getMode())) {
+ if (TransitionUtil.isOpeningType(change.getMode())
+ || TransitionUtil.isOrderOnly(change)) {
if (isRecentsTask) {
recentsOpening = change;
} else if (isRootTask || isLeafTask) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
index 664d44910e72..37b24e505ade 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
@@ -366,6 +366,14 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
return mStageCoordinator.getStageOfTask(taskId);
}
+ /**
+ * @return {@code true} if we should create a left-right split, {@code false} if we should
+ * create a top-bottom split.
+ */
+ public boolean isLeftRightSplit() {
+ return mStageCoordinator.isLeftRightSplit();
+ }
+
/** Check split is foreground and task is under split or not by taskId. */
public boolean isTaskInSplitScreenForeground(int taskId) {
return isTaskInSplitScreen(taskId) && isSplitScreenVisible();
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 7a4834cb5adb..be685b57f779 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
@@ -1301,7 +1301,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Switch split position: %s", reason);
mLogger.logSwap(getMainStagePosition(), mMainStage.getTopChildTaskUid(),
getSideStagePosition(), mSideStage.getTopChildTaskUid(),
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
void setSideStagePosition(@SplitPosition int sideStagePosition,
@@ -1659,7 +1659,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
mLogger.logEnter(mSplitLayout.getDividerPositionAsFraction(),
getMainStagePosition(), mMainStage.getTopChildTaskUid(),
getSideStagePosition(), mSideStage.getTopChildTaskUid(),
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
}
@@ -1749,10 +1749,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
}
if (stage == STAGE_TYPE_MAIN) {
mLogger.logMainStageAppChange(getMainStagePosition(), mMainStage.getTopChildTaskUid(),
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
} else {
mLogger.logSideStageAppChange(getSideStagePosition(), mSideStage.getTopChildTaskUid(),
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
if (present) {
updateRecentTasksSplitPair();
@@ -2113,7 +2113,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
mLogger.logEnter(mSplitLayout.getDividerPositionAsFraction(),
getMainStagePosition(), mMainStage.getTopChildTaskUid(),
getSideStagePosition(), mSideStage.getTopChildTaskUid(),
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
}
}
@@ -2205,8 +2205,12 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
mLogger.logResize(mSplitLayout.getDividerPositionAsFraction());
}
- private boolean isLandscape() {
- return mSplitLayout.isLandscape();
+ /**
+ * @return {@code true} if we should create a left-right split, {@code false} if we should
+ * create a top-bottom split.
+ */
+ boolean isLeftRightSplit() {
+ return mSplitLayout != null && mSplitLayout.isLeftRightSplit();
}
/**
@@ -3177,6 +3181,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
pw.println(innerPrefix + "mDividerVisible=" + mDividerVisible);
pw.println(innerPrefix + "isSplitActive=" + isSplitActive());
pw.println(innerPrefix + "isSplitVisible=" + isSplitScreenVisible());
+ pw.println(innerPrefix + "isLeftRightSplit=" + mSplitLayout.isLeftRightSplit());
pw.println(innerPrefix + "MainStage");
pw.println(childPrefix + "stagePosition=" + splitPositionToString(getMainStagePosition()));
pw.println(childPrefix + "isActive=" + mMainStage.isActive());
@@ -3188,10 +3193,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
mSideStage.dump(pw, childPrefix);
pw.println(innerPrefix + "SideStageListener");
mSideStageListener.dump(pw, childPrefix);
- if (mMainStage.isActive()) {
- pw.println(innerPrefix + "SplitLayout");
- mSplitLayout.dump(pw, childPrefix);
- }
+ mSplitLayout.dump(pw, childPrefix);
if (!mPausingTasks.isEmpty()) {
pw.println(childPrefix + "mPausingTasks=" + mPausingTasks);
}
@@ -3243,7 +3245,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
mLogger.logExit(exitReason,
SPLIT_POSITION_UNDEFINED, 0 /* mainStageUid */,
SPLIT_POSITION_UNDEFINED, 0 /* sideStageUid */,
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
/**
@@ -3256,7 +3258,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
toMainStage ? mMainStage.getTopChildTaskUid() : 0 /* mainStageUid */,
!toMainStage ? getSideStagePosition() : SPLIT_POSITION_UNDEFINED,
!toMainStage ? mSideStage.getTopChildTaskUid() : 0 /* sideStageUid */,
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
class StageListenerImpl implements StageTaskListener.StageListenerCallbacks {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
index 8cbcde320795..53ec20192f2b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
@@ -49,7 +49,6 @@ import android.view.View;
import android.view.ViewConfiguration;
import android.view.WindowManagerGlobal;
-import com.android.internal.view.BaseIWindow;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayLayout;
@@ -70,7 +69,9 @@ class DragResizeInputListener implements AutoCloseable {
private final Supplier<SurfaceControl.Transaction> mSurfaceControlTransactionSupplier;
private final int mDisplayId;
- private final BaseIWindow mFakeWindow;
+
+ private final IBinder mClientToken;
+
private final IBinder mFocusGrantToken;
private final SurfaceControl mDecorationSurface;
private final InputChannel mInputChannel;
@@ -78,7 +79,7 @@ class DragResizeInputListener implements AutoCloseable {
private final DragPositioningCallback mCallback;
private final SurfaceControl mInputSinkSurface;
- private final BaseIWindow mFakeSinkWindow;
+ private final IBinder mSinkClientToken;
private final InputChannel mSinkInputChannel;
private final DisplayController mDisplayController;
@@ -116,17 +117,14 @@ class DragResizeInputListener implements AutoCloseable {
mTaskCornerRadius = taskCornerRadius;
mDecorationSurface = decorationSurface;
mDisplayController = displayController;
- // Use a fake window as the backing surface is a container layer, and we don't want to
- // create a buffer layer for it, so we can't use ViewRootImpl.
- mFakeWindow = new BaseIWindow();
- mFakeWindow.setSession(mWindowSession);
+ mClientToken = new Binder();
mFocusGrantToken = new Binder();
mInputChannel = new InputChannel();
try {
mWindowSession.grantInputChannel(
mDisplayId,
mDecorationSurface,
- mFakeWindow.asBinder(),
+ mClientToken,
null /* hostInputToken */,
FLAG_NOT_FOCUSABLE,
PRIVATE_FLAG_TRUSTED_OVERLAY,
@@ -155,13 +153,13 @@ class DragResizeInputListener implements AutoCloseable {
.setLayer(mInputSinkSurface, WindowDecoration.INPUT_SINK_Z_ORDER)
.show(mInputSinkSurface)
.apply();
- mFakeSinkWindow = new BaseIWindow();
+ mSinkClientToken = new Binder();
mSinkInputChannel = new InputChannel();
try {
mWindowSession.grantInputChannel(
mDisplayId,
mInputSinkSurface,
- mFakeSinkWindow.asBinder(),
+ mSinkClientToken,
null /* hostInputToken */,
FLAG_NOT_FOCUSABLE,
0 /* privateFlags */,
@@ -324,14 +322,14 @@ class DragResizeInputListener implements AutoCloseable {
mInputEventReceiver.dispose();
mInputChannel.dispose();
try {
- mWindowSession.remove(mFakeWindow.asBinder());
+ mWindowSession.remove(mClientToken);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
mSinkInputChannel.dispose();
try {
- mWindowSession.remove(mFakeSinkWindow.asBinder());
+ mWindowSession.remove(mSinkClientToken);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
index bf11c8bc4f79..3a1ea0e201b2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
@@ -87,7 +87,7 @@ class FluidResizeTaskPositioner implements DragPositioningCallback {
mDisplayController.getDisplayLayout(mWindowDecoration.mDisplay.getDisplayId())
.getStableBounds(mStableBounds);
}
- return mRepositionTaskBounds;
+ return new Rect(mRepositionTaskBounds);
}
@Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
index 79fec0978a12..4b55a0caaca5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
@@ -107,7 +107,7 @@ public class VeiledResizeTaskPositioner implements DragPositioningCallback,
mDisplayController.getDisplayLayout(mDesktopWindowDecoration.mDisplay.getDisplayId())
.getStableBounds(mStableBounds);
}
- return mRepositionTaskBounds;
+ return new Rect(mRepositionTaskBounds);
}
@Override
diff --git a/libs/WindowManager/Shell/tests/flicker/Android.bp b/libs/WindowManager/Shell/tests/flicker/Android.bp
index 366f7b1e678f..4abaf5bd4a38 100644
--- a/libs/WindowManager/Shell/tests/flicker/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/Android.bp
@@ -52,7 +52,7 @@ java_library {
}
java_defaults {
- name: "WMShellFlickerTestsDefaultWithoutTemplate",
+ name: "WMShellFlickerTestsDefault",
platform_apis: true,
certificate: "platform",
optimize: {
@@ -75,16 +75,9 @@ java_defaults {
],
data: [
":FlickerTestApp",
- "trace_config/*",
],
}
-java_defaults {
- name: "WMShellFlickerTestsDefault",
- defaults: ["WMShellFlickerTestsDefaultWithoutTemplate"],
- test_config_template: "AndroidTestTemplate.xml",
-}
-
java_library {
name: "WMShellFlickerTestsBase",
defaults: ["WMShellFlickerTestsDefault"],
diff --git a/libs/WindowManager/Shell/tests/flicker/AndroidTestTemplate.xml b/libs/WindowManager/Shell/tests/flicker/AndroidTestTemplate.xml
deleted file mode 100644
index b00d88e61e13..000000000000
--- a/libs/WindowManager/Shell/tests/flicker/AndroidTestTemplate.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ 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.
- -->
-<configuration description="Runs WindowManager Shell Flicker Tests {MODULE}">
- <option name="test-tag" value="FlickerTests"/>
- <!-- Needed for storing the perfetto trace files in the sdcard/test_results-->
- <option name="isolated-storage" value="false"/>
-
- <target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
- <!-- keeps the screen on during tests -->
- <option name="screen-always-on" value="on"/>
- <!-- prevents the phone from restarting -->
- <option name="force-skip-system-props" value="true"/>
- <!-- set WM tracing verbose level to all -->
- <option name="run-command" value="cmd window tracing level all"/>
- <!-- set WM tracing to frame (avoid incomplete states) -->
- <option name="run-command" value="cmd window tracing frame"/>
- <!-- disable betterbug as it's log collection dialogues cause flakes in e2e tests -->
- <option name="run-command" value="pm disable com.google.android.internal.betterbug"/>
- <!-- ensure lock screen mode is swipe -->
- <option name="run-command" value="locksettings set-disabled false"/>
- <!-- restart launcher to activate TAPL -->
- <option name="run-command"
- value="setprop ro.test_harness 1 ; am force-stop com.google.android.apps.nexuslauncher"/>
- <!-- Increase trace size: 20mb for WM and 80mb for SF -->
- <option name="run-command" value="cmd window tracing size 20480"/>
- <option name="run-command" value="su root service call SurfaceFlinger 1029 i32 81920"/>
- <!-- b/307664397 - Ensure camera has the correct permissions and doesn't show a dialog -->
- <option name="run-command"
- value="pm grant com.google.android.GoogleCamera android.permission.ACCESS_FINE_LOCATION"/>
- </target_preparer>
- <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
- <option name="test-user-token" value="%TEST_USER%"/>
- <option name="run-command" value="rm -rf /data/user/%TEST_USER%/files/*"/>
- <option name="run-command" value="settings put secure show_ime_with_hard_keyboard 1"/>
- <option name="run-command" value="settings put system show_touches 1"/>
- <option name="run-command" value="settings put system pointer_location 1"/>
- <option name="teardown-command"
- value="settings delete secure show_ime_with_hard_keyboard"/>
- <option name="teardown-command" value="settings delete system show_touches"/>
- <option name="teardown-command" value="settings delete system pointer_location"/>
- <option name="teardown-command"
- value="cmd overlay enable com.android.internal.systemui.navbar.gestural"/>
- </target_preparer>
- <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
- <option name="cleanup-apks" value="true"/>
- <option name="test-file-name" value="{MODULE}.apk"/>
- <option name="test-file-name" value="FlickerTestApp.apk"/>
- </target_preparer>
- <!-- Enable mocking GPS location by the test app -->
- <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
- <option name="run-command"
- value="appops set com.android.wm.shell.flicker.pip.apps android:mock_location allow"/>
- <option name="teardown-command"
- value="appops set com.android.wm.shell.flicker.pip.apps android:mock_location deny"/>
- </target_preparer>
-
- <!-- Needed for pushing the trace config file -->
- <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
- <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
- <option name="push-file"
- key="trace_config.textproto"
- value="/data/misc/perfetto-traces/trace_config.textproto"
- />
- <!--Install the content provider automatically when we push some file in sdcard folder.-->
- <!--Needed to avoid the installation during the test suite.-->
- <option name="push-file" key="trace_config.textproto" value="/sdcard/sample.textproto"/>
- </target_preparer>
- <test class="com.android.tradefed.testtype.AndroidJUnitTest">
- <option name="package" value="{PACKAGE}"/>
- <option name="shell-timeout" value="6600s"/>
- <option name="test-timeout" value="6000s"/>
- <option name="hidden-api-checks" value="false"/>
- <option name="device-listeners" value="android.device.collectors.PerfettoListener"/>
- <!-- PerfettoListener related arguments -->
- <option name="instrumentation-arg" key="perfetto_config_text_proto" value="true"/>
- <option name="instrumentation-arg"
- key="perfetto_config_file"
- value="trace_config.textproto"
- />
- <option name="instrumentation-arg" key="per_run" value="true"/>
- </test>
- <!-- Needed for pulling the collected trace config on to the host -->
- <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
- <option name="pull-pattern-keys" value="perfetto_file_path"/>
- <option name="directory-keys"
- value="/data/user/0/com.android.wm.shell.flicker/files"/>
- <option name="directory-keys"
- value="/data/user/0/com.android.wm.shell.flicker.bubbles/files"/>
- <option name="directory-keys"
- value="/data/user/0/com.android.wm.shell.flicker.pip/files"/>
- <option name="directory-keys"
- value="/data/user/0/com.android.wm.shell.flicker.splitscreen/files"/>
- <option name="directory-keys"
- value="/data/user/0/com.android.wm.shell.flicker.service/files"/>
- <option name="collect-on-run-ended-only" value="true"/>
- <option name="clean-up" value="true"/>
- </metrics_collector>
-</configuration>
diff --git a/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp b/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp
index bae701f2cbeb..e151ab2c5878 100644
--- a/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp
@@ -36,6 +36,8 @@ android_test {
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker",
instrumentation_target_package: "com.android.wm.shell.flicker",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [":WMShellFlickerTestsAppCompat-src"],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
diff --git a/libs/WindowManager/Shell/tests/flicker/bubble/Android.bp b/libs/WindowManager/Shell/tests/flicker/bubble/Android.bp
index c4e9a8479563..f0b4f1faad46 100644
--- a/libs/WindowManager/Shell/tests/flicker/bubble/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/bubble/Android.bp
@@ -29,6 +29,8 @@ android_test {
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.bubbles",
instrumentation_target_package: "com.android.wm.shell.flicker.bubbles",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: ["src/**/*.kt"],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/Android.bp b/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
index 386983ce6aae..e61f7629f4fd 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
@@ -62,11 +62,13 @@ android_test {
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.pip",
instrumentation_target_package: "com.android.wm.shell.flicker.pip",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsPip1-src",
":WMShellFlickerTestsPipCommon-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
@@ -75,11 +77,13 @@ android_test {
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.pip",
instrumentation_target_package: "com.android.wm.shell.flicker.pip",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsPip2-src",
":WMShellFlickerTestsPipCommon-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
@@ -88,6 +92,7 @@ android_test {
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.pip",
instrumentation_target_package: "com.android.wm.shell.flicker.pip",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsPip3-src",
":WMShellFlickerTestsPipCommon-src",
@@ -98,6 +103,7 @@ android_test {
":WMShellFlickerTestsPipApps-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
@@ -106,19 +112,22 @@ android_test {
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.pip.apps",
instrumentation_target_package: "com.android.wm.shell.flicker.pip.apps",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsPipApps-src",
":WMShellFlickerTestsPipCommon-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
name: "WMShellFlickerTestsPipAppsCSuite",
- defaults: ["WMShellFlickerTestsDefaultWithoutTemplate"],
+ defaults: ["WMShellFlickerTestsDefault"],
additional_manifests: ["AndroidManifest.xml"],
package_name: "com.android.wm.shell.flicker.pip.apps",
instrumentation_target_package: "com.android.wm.shell.flicker.pip.apps",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsPipApps-src",
":WMShellFlickerTestsPipCommon-src",
@@ -128,9 +137,11 @@ android_test {
"device-tests",
"csuite",
],
+ data: ["trace_config/*"],
}
csuite_test {
name: "csuite-1p3p-pip-flickers",
+ test_plan_include: "csuitePlan.xml",
test_config_template: "csuiteDefaultTemplate.xml",
}
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/csuiteDefaultTemplate.xml b/libs/WindowManager/Shell/tests/flicker/pip/csuiteDefaultTemplate.xml
index 6429b00a2a58..f5a8655b81f0 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/csuiteDefaultTemplate.xml
+++ b/libs/WindowManager/Shell/tests/flicker/pip/csuiteDefaultTemplate.xml
@@ -45,12 +45,15 @@
<option name="run-command" value="settings put secure show_ime_with_hard_keyboard 1"/>
<option name="run-command" value="settings put system show_touches 1"/>
<option name="run-command" value="settings put system pointer_location 1"/>
+ <option name="run-command" value="settings put global package_verifier_user_consent -1"/>
<option name="teardown-command"
value="settings delete secure show_ime_with_hard_keyboard"/>
<option name="teardown-command" value="settings delete system show_touches"/>
<option name="teardown-command" value="settings delete system pointer_location"/>
<option name="teardown-command"
value="cmd overlay enable com.android.internal.systemui.navbar.gestural"/>
+ <option name="teardown-command"
+ value="settings put global package_verifier_user_consent 1"/>
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true"/>
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/csuitePlan.xml b/libs/WindowManager/Shell/tests/flicker/pip/csuitePlan.xml
new file mode 100644
index 000000000000..a2fc6b45c2ad
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/pip/csuitePlan.xml
@@ -0,0 +1,3 @@
+<configuration description="Flicker tests C-Suite Crawler Test Plan">
+ <target_preparer class="com.android.csuite.core.AppCrawlTesterHostPreparer"/>
+</configuration> \ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/service/Android.bp b/libs/WindowManager/Shell/tests/flicker/service/Android.bp
index 9b8cd94d56b2..4f1a68a1a74e 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/service/Android.bp
@@ -52,8 +52,10 @@ android_test {
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.service",
instrumentation_target_package: "com.android.wm.shell.flicker.service",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: ["src/**/*.kt"],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
@@ -62,6 +64,8 @@ android_test {
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.service",
instrumentation_target_package: "com.android.wm.shell.flicker.service",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [":WMShellFlickerServicePlatinumTests-src"],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/CopyContentInSplit.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/CopyContentInSplit.kt
index 80ab24ddf9ef..824e45403d2a 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/CopyContentInSplit.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/CopyContentInSplit.kt
@@ -19,6 +19,7 @@ package com.android.wm.shell.flicker.service.splitscreen.scenarios
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@ import com.android.wm.shell.flicker.service.common.Utils
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -64,4 +66,8 @@ constructor(val rotation: Rotation = Rotation.ROTATION_0) {
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromNotification.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromNotification.kt
index cc982d1ba860..c52ada3b312f 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromNotification.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromNotification.kt
@@ -19,6 +19,7 @@ package com.android.wm.shell.flicker.service.splitscreen.scenarios
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.flicker.rules.ChangeDisplayOrientationRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
@@ -29,6 +30,7 @@ import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Assume
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -75,4 +77,8 @@ constructor(val rotation: Rotation = Rotation.ROTATION_0) {
secondaryApp.exit(wmHelper)
sendNotificationApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromShortcut.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromShortcut.kt
index fa12bb869467..8134fddd40e5 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromShortcut.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromShortcut.kt
@@ -19,6 +19,7 @@ package com.android.wm.shell.flicker.service.splitscreen.scenarios
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.flicker.rules.ChangeDisplayOrientationRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
@@ -29,6 +30,7 @@ import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Assume
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -82,4 +84,8 @@ constructor(val rotation: Rotation = Rotation.ROTATION_0) {
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromTaskbar.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromTaskbar.kt
index 2592fd40d902..3417744f13a5 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromTaskbar.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromTaskbar.kt
@@ -19,6 +19,7 @@ package com.android.wm.shell.flicker.service.splitscreen.scenarios
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -28,6 +29,7 @@ import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Assume
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -70,4 +72,8 @@ constructor(val rotation: Rotation = Rotation.ROTATION_0) {
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenFromOverview.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenFromOverview.kt
index 983653b9b5ca..f1a011c0d191 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenFromOverview.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenFromOverview.kt
@@ -19,6 +19,7 @@ package com.android.wm.shell.flicker.service.splitscreen.scenarios
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@ import com.android.wm.shell.flicker.service.common.Utils
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -70,4 +72,8 @@ constructor(val rotation: Rotation = Rotation.ROTATION_0) {
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchAppByDoubleTapDivider.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchAppByDoubleTapDivider.kt
index 068171d2e129..c9b1c916ff4b 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchAppByDoubleTapDivider.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchAppByDoubleTapDivider.kt
@@ -20,6 +20,7 @@ import android.app.Instrumentation
import android.graphics.Point
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.helpers.WindowUtils
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
@@ -29,6 +30,7 @@ import com.android.wm.shell.flicker.service.common.Utils
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -149,4 +151,8 @@ constructor(val rotation: Rotation = Rotation.ROTATION_0) {
val LARGE_SCREEN_DP_THRESHOLD = 600
return sizeDp.x >= LARGE_SCREEN_DP_THRESHOLD && sizeDp.y >= LARGE_SCREEN_DP_THRESHOLD
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromAnotherApp.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromAnotherApp.kt
index 64b75c5fd967..72f2db3380dd 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromAnotherApp.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromAnotherApp.kt
@@ -19,6 +19,7 @@ package com.android.wm.shell.flicker.service.splitscreen.scenarios
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@ import com.android.wm.shell.flicker.service.common.Utils
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -67,4 +69,8 @@ constructor(val rotation: Rotation = Rotation.ROTATION_0) {
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromHome.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromHome.kt
index 179501089168..511de4fd8b90 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromHome.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromHome.kt
@@ -19,6 +19,7 @@ package com.android.wm.shell.flicker.service.splitscreen.scenarios
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@ import com.android.wm.shell.flicker.service.common.Utils
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -66,4 +68,8 @@ constructor(val rotation: Rotation = Rotation.ROTATION_0) {
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromRecent.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromRecent.kt
index 7065846dc653..558d2bf1f349 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromRecent.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromRecent.kt
@@ -19,6 +19,7 @@ package com.android.wm.shell.flicker.service.splitscreen.scenarios
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@ import com.android.wm.shell.flicker.service.common.Utils
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -68,4 +70,8 @@ constructor(val rotation: Rotation = Rotation.ROTATION_0) {
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBetweenSplitPairs.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBetweenSplitPairs.kt
index 251cb50de017..ecd68295df9a 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBetweenSplitPairs.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBetweenSplitPairs.kt
@@ -19,6 +19,7 @@ package com.android.wm.shell.flicker.service.splitscreen.scenarios
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@ import com.android.wm.shell.flicker.service.common.Utils
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -69,4 +71,8 @@ constructor(val rotation: Rotation = Rotation.ROTATION_0) {
thirdApp.exit(wmHelper)
fourthApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/UnlockKeyguardToSplitScreen.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/UnlockKeyguardToSplitScreen.kt
index a9933bbe09fc..f50d5c7df8d7 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/UnlockKeyguardToSplitScreen.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/UnlockKeyguardToSplitScreen.kt
@@ -19,6 +19,7 @@ package com.android.wm.shell.flicker.service.splitscreen.scenarios
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@ import com.android.wm.shell.flicker.service.common.Utils
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -66,4 +68,8 @@ abstract class UnlockKeyguardToSplitScreen {
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/splitscreen/Android.bp b/libs/WindowManager/Shell/tests/flicker/splitscreen/Android.bp
index 4629c5318366..f813b0d3b0b7 100644
--- a/libs/WindowManager/Shell/tests/flicker/splitscreen/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/splitscreen/Android.bp
@@ -54,11 +54,13 @@ android_test {
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.splitscreen",
instrumentation_target_package: "com.android.wm.shell.flicker.splitscreen",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsSplitScreenBase-src",
":WMShellFlickerTestsSplitScreenGroup1-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
@@ -74,4 +76,5 @@ android_test {
":WMShellFlickerTestsSplitScreenGroup1-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
diff --git a/libs/WindowManager/Shell/tests/flicker/trace_config/trace_config.textproto b/libs/WindowManager/Shell/tests/flicker/trace_config/trace_config.textproto
deleted file mode 100644
index 406ada97a07d..000000000000
--- a/libs/WindowManager/Shell/tests/flicker/trace_config/trace_config.textproto
+++ /dev/null
@@ -1,75 +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.
-
-# proto-message: TraceConfig
-
-# Enable periodic flushing of the trace buffer into the output file.
-write_into_file: true
-
-# Writes the userspace buffer into the file every 1s.
-file_write_period_ms: 2500
-
-# See b/126487238 - we need to guarantee ordering of events.
-flush_period_ms: 30000
-
-# The trace buffers needs to be big enough to hold |file_write_period_ms| of
-# trace data. The trace buffer sizing depends on the number of trace categories
-# enabled and the device activity.
-
-# RSS events
-buffers: {
- size_kb: 63488
- fill_policy: RING_BUFFER
-}
-
-data_sources {
- config {
- name: "linux.process_stats"
- target_buffer: 0
- # polled per-process memory counters and process/thread names.
- # If you don't want the polled counters, remove the "process_stats_config"
- # section, but keep the data source itself as it still provides on-demand
- # thread/process naming for ftrace data below.
- process_stats_config {
- scan_all_processes_on_start: true
- }
- }
-}
-
-data_sources: {
- config {
- name: "linux.ftrace"
- ftrace_config {
- ftrace_events: "ftrace/print"
- ftrace_events: "task/task_newtask"
- ftrace_events: "task/task_rename"
- atrace_categories: "ss"
- atrace_categories: "wm"
- atrace_categories: "am"
- atrace_categories: "aidl"
- atrace_categories: "input"
- atrace_categories: "binder_driver"
- atrace_categories: "sched_process_exit"
- atrace_apps: "com.android.server.wm.flicker.testapp"
- atrace_apps: "com.android.systemui"
- atrace_apps: "com.android.wm.shell.flicker"
- atrace_apps: "com.android.wm.shell.flicker.other"
- atrace_apps: "com.android.wm.shell.flicker.bubbles"
- atrace_apps: "com.android.wm.shell.flicker.pip"
- atrace_apps: "com.android.wm.shell.flicker.splitscreen"
- atrace_apps: "com.google.android.apps.nexuslauncher"
- }
- }
-}
-
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubblePositionerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubblePositionerTest.java
index 835ebe2206ad..e5ae6e515566 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubblePositionerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubblePositionerTest.java
@@ -16,10 +16,15 @@
package com.android.wm.shell.bubbles;
+import static com.android.wm.shell.bubbles.BubblePositioner.MAX_HEIGHT;
+
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static org.mockito.Mockito.mock;
+
import android.content.Intent;
+import android.content.pm.ShortcutInfo;
import android.graphics.Insets;
import android.graphics.PointF;
import android.graphics.Rect;
@@ -226,7 +231,7 @@ public class BubblePositionerTest extends ShellTestCase {
}
@Test
- public void testExpandedViewHeight_onLargeTablet() {
+ public void testGetExpandedViewHeight_max() {
Insets insets = Insets.of(10, 20, 5, 15);
Rect screenBounds = new Rect(0, 0, 1800, 2600);
@@ -240,10 +245,91 @@ public class BubblePositionerTest extends ShellTestCase {
Intent intent = new Intent(Intent.ACTION_VIEW).setPackage(mContext.getPackageName());
Bubble bubble = Bubble.createAppBubble(intent, new UserHandle(1), null, directExecutor());
+ assertThat(mPositioner.getExpandedViewHeight(bubble)).isEqualTo(MAX_HEIGHT);
+ }
+
+ @Test
+ public void testGetExpandedViewHeight_customHeight_valid() {
+ Insets insets = Insets.of(10, 20, 5, 15);
+ Rect screenBounds = new Rect(0, 0, 1800, 2600);
+
+ DeviceConfig deviceConfig = new ConfigBuilder()
+ .setLargeScreen()
+ .setInsets(insets)
+ .setScreenBounds(screenBounds)
+ .build();
+ mPositioner.update(deviceConfig);
+
+ final int minHeight = mContext.getResources().getDimensionPixelSize(
+ R.dimen.bubble_expanded_default_height);
+ Bubble bubble = new Bubble("key",
+ mock(ShortcutInfo.class),
+ minHeight + 100 /* desiredHeight */,
+ 0 /* desiredHeightResId */,
+ "title",
+ 0 /* taskId */,
+ null /* locus */,
+ true /* isDismissable */,
+ directExecutor(),
+ mock(Bubbles.BubbleMetadataFlagListener.class));
+
+ // Ensure the height is the same as the desired value
+ assertThat(mPositioner.getExpandedViewHeight(bubble)).isEqualTo(
+ bubble.getDesiredHeight(mContext));
+ }
+
+
+ @Test
+ public void testGetExpandedViewHeight_customHeight_tooSmall() {
+ Insets insets = Insets.of(10, 20, 5, 15);
+ Rect screenBounds = new Rect(0, 0, 1800, 2600);
+
+ DeviceConfig deviceConfig = new ConfigBuilder()
+ .setLargeScreen()
+ .setInsets(insets)
+ .setScreenBounds(screenBounds)
+ .build();
+ mPositioner.update(deviceConfig);
+
+ Bubble bubble = new Bubble("key",
+ mock(ShortcutInfo.class),
+ 10 /* desiredHeight */,
+ 0 /* desiredHeightResId */,
+ "title",
+ 0 /* taskId */,
+ null /* locus */,
+ true /* isDismissable */,
+ directExecutor(),
+ mock(Bubbles.BubbleMetadataFlagListener.class));
+
+ // Ensure the height is the same as the minimum value
+ final int minHeight = mContext.getResources().getDimensionPixelSize(
+ R.dimen.bubble_expanded_default_height);
+ assertThat(mPositioner.getExpandedViewHeight(bubble)).isEqualTo(minHeight);
+ }
+
+ @Test
+ public void testGetMaxExpandedViewHeight_onLargeTablet() {
+ Insets insets = Insets.of(10, 20, 5, 15);
+ Rect screenBounds = new Rect(0, 0, 1800, 2600);
+
+ DeviceConfig deviceConfig = new ConfigBuilder()
+ .setLargeScreen()
+ .setInsets(insets)
+ .setScreenBounds(screenBounds)
+ .build();
+ mPositioner.update(deviceConfig);
+
int manageButtonHeight =
mContext.getResources().getDimensionPixelSize(R.dimen.bubble_manage_button_height);
- float expectedHeight = 1800 - 2 * 20 - manageButtonHeight;
- assertThat(mPositioner.getExpandedViewHeight(bubble)).isWithin(0.1f).of(expectedHeight);
+ int pointerWidth = mContext.getResources().getDimensionPixelSize(
+ R.dimen.bubble_pointer_width);
+ int expandedViewPadding = mContext.getResources().getDimensionPixelSize(R
+ .dimen.bubble_expanded_view_padding);
+ float expectedHeight = 1800 - 2 * 20 - manageButtonHeight - pointerWidth
+ - expandedViewPadding * 2;
+ assertThat(((float) mPositioner.getMaxExpandedViewHeight(false /* isOverflow */)))
+ .isWithin(0.1f).of(expectedHeight);
}
/**
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
index 527dc0149716..1b347e01888e 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
@@ -204,6 +204,7 @@ public class DragAndDropPolicyTest extends ShellTestCase {
@Test
public void testDragAppOverFullscreenHome_expectOnlyFullscreenTarget() {
+ doReturn(true).when(mSplitScreenStarter).isLeftRightSplit();
setRunningTask(mHomeTask);
DragSession dragSession = new DragSession(mContext, mActivityTaskManager,
mLandscapeDisplayLayout, mActivityClipData);
@@ -219,6 +220,7 @@ public class DragAndDropPolicyTest extends ShellTestCase {
@Test
public void testDragAppOverFullscreenApp_expectSplitScreenTargets() {
+ doReturn(true).when(mSplitScreenStarter).isLeftRightSplit();
setRunningTask(mFullscreenAppTask);
DragSession dragSession = new DragSession(mContext, mActivityTaskManager,
mLandscapeDisplayLayout, mActivityClipData);
@@ -239,6 +241,7 @@ public class DragAndDropPolicyTest extends ShellTestCase {
@Test
public void testDragAppOverFullscreenAppPhone_expectVerticalSplitScreenTargets() {
+ doReturn(false).when(mSplitScreenStarter).isLeftRightSplit();
setRunningTask(mFullscreenAppTask);
DragSession dragSession = new DragSession(mContext, mActivityTaskManager,
mPortraitDisplayLayout, mActivityClipData);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenUtilsTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenUtilsTests.java
new file mode 100644
index 000000000000..30847d3ac192
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenUtilsTests.java
@@ -0,0 +1,75 @@
+/*
+ * 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 com.android.wm.shell.splitscreen;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.content.res.Configuration;
+import android.graphics.Rect;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.wm.shell.ShellTestCase;
+import com.android.wm.shell.common.split.SplitScreenUtils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+/** Tests for {@link com.android.wm.shell.common.split.SplitScreenUtils} */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class SplitScreenUtilsTests extends ShellTestCase {
+
+ @Test
+ public void testIsLeftRightSplit() {
+ Configuration portraitTablet = new Configuration();
+ portraitTablet.smallestScreenWidthDp = 720;
+ portraitTablet.windowConfiguration.setMaxBounds(new Rect(0, 0, 500, 1000));
+ Configuration landscapeTablet = new Configuration();
+ landscapeTablet.smallestScreenWidthDp = 720;
+ landscapeTablet.windowConfiguration.setMaxBounds(new Rect(0, 0, 1000, 500));
+ Configuration portraitPhone = new Configuration();
+ portraitPhone.smallestScreenWidthDp = 420;
+ portraitPhone.windowConfiguration.setMaxBounds(new Rect(0, 0, 500, 1000));
+ Configuration landscapePhone = new Configuration();
+ landscapePhone.smallestScreenWidthDp = 420;
+ landscapePhone.windowConfiguration.setMaxBounds(new Rect(0, 0, 1000, 500));
+
+ // Allow L/R split in portrait = false
+ assertTrue(SplitScreenUtils.isLeftRightSplit(false /* allowLeftRightSplitInPortrait */,
+ landscapeTablet));
+ assertTrue(SplitScreenUtils.isLeftRightSplit(false /* allowLeftRightSplitInPortrait */,
+ landscapePhone));
+ assertFalse(SplitScreenUtils.isLeftRightSplit(false /* allowLeftRightSplitInPortrait */,
+ portraitTablet));
+ assertFalse(SplitScreenUtils.isLeftRightSplit(false /* allowLeftRightSplitInPortrait */,
+ portraitPhone));
+
+ // Allow L/R split in portrait = true, only affects large screens
+ assertFalse(SplitScreenUtils.isLeftRightSplit(true /* allowLeftRightSplitInPortrait */,
+ landscapeTablet));
+ assertTrue(SplitScreenUtils.isLeftRightSplit(true /* allowLeftRightSplitInPortrait */,
+ landscapePhone));
+ assertTrue(SplitScreenUtils.isLeftRightSplit(true /* allowLeftRightSplitInPortrait */,
+ portraitTablet));
+ assertFalse(SplitScreenUtils.isLeftRightSplit(true /* allowLeftRightSplitInPortrait */,
+ portraitPhone));
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
index fff65f364121..d819261ecba2 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
@@ -140,7 +140,7 @@ public class StageCoordinatorTests extends ShellTestCase {
when(mSplitLayout.getBounds1()).thenReturn(mBounds1);
when(mSplitLayout.getBounds2()).thenReturn(mBounds2);
when(mSplitLayout.getRootBounds()).thenReturn(mRootBounds);
- when(mSplitLayout.isLandscape()).thenReturn(false);
+ when(mSplitLayout.isLeftRightSplit()).thenReturn(false);
when(mSplitLayout.applyTaskChanges(any(), any(), any())).thenReturn(true);
when(mSplitLayout.getDividerLeash()).thenReturn(mDividerLeash);
diff --git a/libs/androidfw/Android.bp b/libs/androidfw/Android.bp
index 47a7f3579764..2f28363aedc7 100644
--- a/libs/androidfw/Android.bp
+++ b/libs/androidfw/Android.bp
@@ -63,15 +63,21 @@ cc_library {
"AssetsProvider.cpp",
"AttributeResolution.cpp",
"BigBuffer.cpp",
+ "BigBufferStream.cpp",
"ChunkIterator.cpp",
"ConfigDescription.cpp",
+ "FileStream.cpp",
"Idmap.cpp",
"LoadedArsc.cpp",
"Locale.cpp",
"LocaleData.cpp",
"misc.cpp",
+ "NinePatch.cpp",
"ObbFile.cpp",
"PosixUtils.cpp",
+ "Png.cpp",
+ "PngChunkFilter.cpp",
+ "PngCrunch.cpp",
"ResourceTimer.cpp",
"ResourceTypes.cpp",
"ResourceUtils.cpp",
@@ -84,7 +90,10 @@ cc_library {
],
export_include_dirs: ["include"],
export_shared_lib_headers: ["libz"],
- static_libs: ["libincfs-utils"],
+ static_libs: [
+ "libincfs-utils",
+ "libpng",
+ ],
whole_static_libs: [
"libandroidfw_pathutils",
"libincfs-utils",
@@ -198,9 +207,11 @@ cc_test {
"tests/ConfigDescription_test.cpp",
"tests/ConfigLocale_test.cpp",
"tests/DynamicRefTable_test.cpp",
+ "tests/FileStream_test.cpp",
"tests/Idmap_test.cpp",
"tests/LoadedArsc_test.cpp",
"tests/Locale_test.cpp",
+ "tests/NinePatch_test.cpp",
"tests/ResourceTimer_test.cpp",
"tests/ResourceUtils_test.cpp",
"tests/ResTable_test.cpp",
diff --git a/tools/aapt2/io/BigBufferStream.cpp b/libs/androidfw/BigBufferStream.cpp
index 9704caae4719..f18199cfa52b 100644
--- a/tools/aapt2/io/BigBufferStream.cpp
+++ b/libs/androidfw/BigBufferStream.cpp
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-#include "io/BigBufferStream.h"
+#include "androidfw/BigBufferStream.h"
-namespace aapt {
-namespace io {
+#include <algorithm>
+
+namespace android {
//
// BigBufferInputStream
@@ -76,6 +77,34 @@ size_t BigBufferInputStream::TotalSize() const {
return buffer_->size();
}
+bool BigBufferInputStream::ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) {
+ if (byte_count == 0) {
+ return true;
+ }
+ if (offset < 0) {
+ return false;
+ }
+ if (offset > std::numeric_limits<off64_t>::max() - byte_count) {
+ return false;
+ }
+ if (offset + byte_count > buffer_->size()) {
+ return false;
+ }
+ auto p = reinterpret_cast<uint8_t*>(data);
+ for (auto iter = buffer_->begin(); iter != buffer_->end() && byte_count > 0; ++iter) {
+ if (offset < iter->size) {
+ size_t to_read = std::min(byte_count, (size_t)(iter->size - offset));
+ memcpy(p, iter->buffer.get() + offset, to_read);
+ byte_count -= to_read;
+ p += to_read;
+ offset = 0;
+ } else {
+ offset -= iter->size;
+ }
+ }
+ return byte_count == 0;
+}
+
//
// BigBufferOutputStream
//
@@ -97,5 +126,4 @@ bool BigBufferOutputStream::HadError() const {
return false;
}
-} // namespace io
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/io/FileStream.cpp b/libs/androidfw/FileStream.cpp
index 27529bc08a16..b86c9cb729d4 100644
--- a/tools/aapt2/io/FileStream.cpp
+++ b/libs/androidfw/FileStream.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "io/FileStream.h"
+#include "androidfw/FileStream.h"
#include <errno.h> // for errno
#include <fcntl.h> // for O_RDONLY
@@ -34,8 +34,7 @@
using ::android::base::SystemErrorCodeToString;
using ::android::base::unique_fd;
-namespace aapt {
-namespace io {
+namespace android {
FileInputStream::FileInputStream(const std::string& path, size_t buffer_capacity)
: buffer_capacity_(buffer_capacity) {
@@ -108,6 +107,10 @@ std::string FileInputStream::GetError() const {
return error_;
}
+bool FileInputStream::ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) {
+ return base::ReadFullyAtOffset(fd_, data, byte_count, offset);
+}
+
FileOutputStream::FileOutputStream(const std::string& path, size_t buffer_capacity)
: buffer_capacity_(buffer_capacity) {
int mode = O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_BINARY;
@@ -199,5 +202,4 @@ std::string FileOutputStream::GetError() const {
return error_;
}
-} // namespace io
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/compile/NinePatch.cpp b/libs/androidfw/NinePatch.cpp
index 4538ecc56e4c..1fdbebfb6daa 100644
--- a/tools/aapt2/compile/NinePatch.cpp
+++ b/libs/androidfw/NinePatch.cpp
@@ -14,20 +14,17 @@
* limitations under the License.
*/
-#include "compile/Image.h"
-
#include <sstream>
#include <string>
#include <vector>
+#include "androidfw/Image.h"
#include "androidfw/ResourceTypes.h"
#include "androidfw/StringPiece.h"
-#include "util/Util.h"
-
using android::StringPiece;
-namespace aapt {
+namespace android {
// Colors in the format 0xAARRGGBB (the way 9-patch expects it).
constexpr static const uint32_t kColorOpaqueWhite = 0xffffffffu;
@@ -90,10 +87,8 @@ class ColorValidator {
// };
//
template <typename ImageLine>
-static bool FillRanges(const ImageLine* image_line,
- const ColorValidator* color_validator,
- std::vector<Range>* primary_ranges,
- std::vector<Range>* secondary_ranges,
+static bool FillRanges(const ImageLine* image_line, const ColorValidator* color_validator,
+ std::vector<Range>* primary_ranges, std::vector<Range>* secondary_ranges,
std::string* out_err) {
const int32_t length = image_line->GetLength();
@@ -133,11 +128,13 @@ static bool FillRanges(const ImageLine* image_line,
*/
class HorizontalImageLine {
public:
- explicit HorizontalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset,
- int32_t length)
- : rows_(rows), xoffset_(xoffset), yoffset_(yoffset), length_(length) {}
+ explicit HorizontalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset, int32_t length)
+ : rows_(rows), xoffset_(xoffset), yoffset_(yoffset), length_(length) {
+ }
- inline int32_t GetLength() const { return length_; }
+ inline int32_t GetLength() const {
+ return length_;
+ }
inline uint32_t GetColor(int32_t idx) const {
return NinePatch::PackRGBA(rows_[yoffset_] + (idx + xoffset_) * 4);
@@ -156,11 +153,13 @@ class HorizontalImageLine {
*/
class VerticalImageLine {
public:
- explicit VerticalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset,
- int32_t length)
- : rows_(rows), xoffset_(xoffset), yoffset_(yoffset), length_(length) {}
+ explicit VerticalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset, int32_t length)
+ : rows_(rows), xoffset_(xoffset), yoffset_(yoffset), length_(length) {
+ }
- inline int32_t GetLength() const { return length_; }
+ inline int32_t GetLength() const {
+ return length_;
+ }
inline uint32_t GetColor(int32_t idx) const {
return NinePatch::PackRGBA(rows_[yoffset_ + idx] + (xoffset_ * 4));
@@ -175,20 +174,22 @@ class VerticalImageLine {
class DiagonalImageLine {
public:
- explicit DiagonalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset,
- int32_t xstep, int32_t ystep, int32_t length)
+ explicit DiagonalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset, int32_t xstep,
+ int32_t ystep, int32_t length)
: rows_(rows),
xoffset_(xoffset),
yoffset_(yoffset),
xstep_(xstep),
ystep_(ystep),
- length_(length) {}
+ length_(length) {
+ }
- inline int32_t GetLength() const { return length_; }
+ inline int32_t GetLength() const {
+ return length_;
+ }
inline uint32_t GetColor(int32_t idx) const {
- return NinePatch::PackRGBA(rows_[yoffset_ + (idx * ystep_)] +
- ((idx + xoffset_) * xstep_) * 4);
+ return NinePatch::PackRGBA(rows_[yoffset_ + (idx * ystep_)] + ((idx + xoffset_) * xstep_) * 4);
}
private:
@@ -243,8 +244,7 @@ static bool PopulateBounds(const std::vector<Range>& padding,
if (layout_bounds.size() > 2) {
std::stringstream err_stream;
- err_stream << "too many layout bounds sections on " << edge_name
- << " border";
+ err_stream << "too many layout bounds sections on " << edge_name << " border";
*out_err = err_stream.str();
return false;
}
@@ -258,8 +258,7 @@ static bool PopulateBounds(const std::vector<Range>& padding,
// end at length.
if (range.start != 0 && range.end != length) {
std::stringstream err_stream;
- err_stream << "layout bounds on " << edge_name
- << " border must start at edge";
+ err_stream << "layout bounds on " << edge_name << " border must start at edge";
*out_err = err_stream.str();
return false;
}
@@ -269,8 +268,7 @@ static bool PopulateBounds(const std::vector<Range>& padding,
const Range& range = layout_bounds.back();
if (range.end != length) {
std::stringstream err_stream;
- err_stream << "layout bounds on " << edge_name
- << " border must start at edge";
+ err_stream << "layout bounds on " << edge_name << " border must start at edge";
*out_err = err_stream.str();
return false;
}
@@ -280,8 +278,7 @@ static bool PopulateBounds(const std::vector<Range>& padding,
return true;
}
-static int32_t CalculateSegmentCount(const std::vector<Range>& stretch_regions,
- int32_t length) {
+static int32_t CalculateSegmentCount(const std::vector<Range>& stretch_regions, int32_t length) {
if (stretch_regions.size() == 0) {
return 0;
}
@@ -299,8 +296,7 @@ static int32_t CalculateSegmentCount(const std::vector<Range>& stretch_regions,
static uint32_t GetRegionColor(uint8_t** rows, const Bounds& region) {
// Sample the first pixel to compare against.
- const uint32_t expected_color =
- NinePatch::PackRGBA(rows[region.top] + region.left * 4);
+ const uint32_t expected_color = NinePatch::PackRGBA(rows[region.top] + region.left * 4);
for (int32_t y = region.top; y < region.bottom; y++) {
const uint8_t* row = rows[y];
for (int32_t x = region.left; x < region.right; x++) {
@@ -336,10 +332,11 @@ static uint32_t GetRegionColor(uint8_t** rows, const Bounds& region) {
// the indices must be offset by 1.
//
// width and height also include the 9-patch 1px border.
-static void CalculateRegionColors(
- uint8_t** rows, const std::vector<Range>& horizontal_stretch_regions,
- const std::vector<Range>& vertical_stretch_regions, const int32_t width,
- const int32_t height, std::vector<uint32_t>* out_colors) {
+static void CalculateRegionColors(uint8_t** rows,
+ const std::vector<Range>& horizontal_stretch_regions,
+ const std::vector<Range>& vertical_stretch_regions,
+ const int32_t width, const int32_t height,
+ std::vector<uint32_t>* out_colors) {
int32_t next_top = 0;
Bounds bounds;
auto row_iter = vertical_stretch_regions.begin();
@@ -401,8 +398,7 @@ static void CalculateRegionColors(
// alpha value begins
// (on both sides).
template <typename ImageLine>
-static void FindOutlineInsets(const ImageLine* image_line, int32_t* out_start,
- int32_t* out_end) {
+static void FindOutlineInsets(const ImageLine* image_line, int32_t* out_start, int32_t* out_end) {
*out_start = 0;
*out_end = 0;
@@ -455,10 +451,8 @@ uint32_t NinePatch::PackRGBA(const uint8_t* pixel) {
return (pixel[3] << 24) | (pixel[0] << 16) | (pixel[1] << 8) | pixel[2];
}
-std::unique_ptr<NinePatch> NinePatch::Create(uint8_t** rows,
- const int32_t width,
- const int32_t height,
- std::string* out_err) {
+std::unique_ptr<NinePatch> NinePatch::Create(uint8_t** rows, const int32_t width,
+ const int32_t height, std::string* out_err) {
if (width < 3 || height < 3) {
*out_err = "image must be at least 3x3 (1x1 image with 1 pixel border)";
return {};
@@ -472,12 +466,11 @@ std::unique_ptr<NinePatch> NinePatch::Create(uint8_t** rows,
std::unique_ptr<ColorValidator> color_validator;
if (rows[0][3] == 0) {
- color_validator = util::make_unique<TransparentNeutralColorValidator>();
+ color_validator = std::make_unique<TransparentNeutralColorValidator>();
} else if (PackRGBA(rows[0]) == kColorOpaqueWhite) {
- color_validator = util::make_unique<WhiteNeutralColorValidator>();
+ color_validator = std::make_unique<WhiteNeutralColorValidator>();
} else {
- *out_err =
- "top-left corner pixel must be either opaque white or transparent";
+ *out_err = "top-left corner pixel must be either opaque white or transparent";
return {};
}
@@ -485,9 +478,8 @@ std::unique_ptr<NinePatch> NinePatch::Create(uint8_t** rows,
auto nine_patch = std::unique_ptr<NinePatch>(new NinePatch());
HorizontalImageLine top_row(rows, 0, 0, width);
- if (!FillRanges(&top_row, color_validator.get(),
- &nine_patch->horizontal_stretch_regions, &unexpected_ranges,
- out_err)) {
+ if (!FillRanges(&top_row, color_validator.get(), &nine_patch->horizontal_stretch_regions,
+ &unexpected_ranges, out_err)) {
return {};
}
@@ -501,9 +493,8 @@ std::unique_ptr<NinePatch> NinePatch::Create(uint8_t** rows,
}
VerticalImageLine left_col(rows, 0, 0, height);
- if (!FillRanges(&left_col, color_validator.get(),
- &nine_patch->vertical_stretch_regions, &unexpected_ranges,
- out_err)) {
+ if (!FillRanges(&left_col, color_validator.get(), &nine_patch->vertical_stretch_regions,
+ &unexpected_ranges, out_err)) {
return {};
}
@@ -522,32 +513,28 @@ std::unique_ptr<NinePatch> NinePatch::Create(uint8_t** rows,
}
if (!PopulateBounds(horizontal_padding, horizontal_layout_bounds,
- nine_patch->horizontal_stretch_regions, width - 2,
- &nine_patch->padding.left, &nine_patch->padding.right,
- &nine_patch->layout_bounds.left,
+ nine_patch->horizontal_stretch_regions, width - 2, &nine_patch->padding.left,
+ &nine_patch->padding.right, &nine_patch->layout_bounds.left,
&nine_patch->layout_bounds.right, "bottom", out_err)) {
return {};
}
VerticalImageLine right_col(rows, width - 1, 0, height);
- if (!FillRanges(&right_col, color_validator.get(), &vertical_padding,
- &vertical_layout_bounds, out_err)) {
+ if (!FillRanges(&right_col, color_validator.get(), &vertical_padding, &vertical_layout_bounds,
+ out_err)) {
return {};
}
if (!PopulateBounds(vertical_padding, vertical_layout_bounds,
- nine_patch->vertical_stretch_regions, height - 2,
- &nine_patch->padding.top, &nine_patch->padding.bottom,
- &nine_patch->layout_bounds.top,
+ nine_patch->vertical_stretch_regions, height - 2, &nine_patch->padding.top,
+ &nine_patch->padding.bottom, &nine_patch->layout_bounds.top,
&nine_patch->layout_bounds.bottom, "right", out_err)) {
return {};
}
// Fill the region colors of the 9-patch.
- const int32_t num_rows =
- CalculateSegmentCount(nine_patch->horizontal_stretch_regions, width - 2);
- const int32_t num_cols =
- CalculateSegmentCount(nine_patch->vertical_stretch_regions, height - 2);
+ const int32_t num_rows = CalculateSegmentCount(nine_patch->horizontal_stretch_regions, width - 2);
+ const int32_t num_cols = CalculateSegmentCount(nine_patch->vertical_stretch_regions, height - 2);
if ((int64_t)num_rows * (int64_t)num_cols > 0x7f) {
*out_err = "too many regions in 9-patch";
return {};
@@ -555,40 +542,35 @@ std::unique_ptr<NinePatch> NinePatch::Create(uint8_t** rows,
nine_patch->region_colors.reserve(num_rows * num_cols);
CalculateRegionColors(rows, nine_patch->horizontal_stretch_regions,
- nine_patch->vertical_stretch_regions, width - 2,
- height - 2, &nine_patch->region_colors);
+ nine_patch->vertical_stretch_regions, width - 2, height - 2,
+ &nine_patch->region_colors);
// Compute the outline based on opacity.
// Find left and right extent of 9-patch content on center row.
HorizontalImageLine mid_row(rows, 1, height / 2, width - 2);
- FindOutlineInsets(&mid_row, &nine_patch->outline.left,
- &nine_patch->outline.right);
+ FindOutlineInsets(&mid_row, &nine_patch->outline.left, &nine_patch->outline.right);
// Find top and bottom extent of 9-patch content on center column.
VerticalImageLine mid_col(rows, width / 2, 1, height - 2);
- FindOutlineInsets(&mid_col, &nine_patch->outline.top,
- &nine_patch->outline.bottom);
+ FindOutlineInsets(&mid_col, &nine_patch->outline.top, &nine_patch->outline.bottom);
- const int32_t outline_width =
- (width - 2) - nine_patch->outline.left - nine_patch->outline.right;
+ const int32_t outline_width = (width - 2) - nine_patch->outline.left - nine_patch->outline.right;
const int32_t outline_height =
(height - 2) - nine_patch->outline.top - nine_patch->outline.bottom;
// Find the largest alpha value within the outline area.
- HorizontalImageLine outline_mid_row(
- rows, 1 + nine_patch->outline.left,
- 1 + nine_patch->outline.top + (outline_height / 2), outline_width);
- VerticalImageLine outline_mid_col(
- rows, 1 + nine_patch->outline.left + (outline_width / 2),
- 1 + nine_patch->outline.top, outline_height);
+ HorizontalImageLine outline_mid_row(rows, 1 + nine_patch->outline.left,
+ 1 + nine_patch->outline.top + (outline_height / 2),
+ outline_width);
+ VerticalImageLine outline_mid_col(rows, 1 + nine_patch->outline.left + (outline_width / 2),
+ 1 + nine_patch->outline.top, outline_height);
nine_patch->outline_alpha =
std::max(FindMaxAlpha(&outline_mid_row), FindMaxAlpha(&outline_mid_col));
// Assuming the image is a round rect, compute the radius by marching
// diagonally from the top left corner towards the center.
- DiagonalImageLine diagonal(rows, 1 + nine_patch->outline.left,
- 1 + nine_patch->outline.top, 1, 1,
+ DiagonalImageLine diagonal(rows, 1 + nine_patch->outline.left, 1 + nine_patch->outline.top, 1, 1,
std::min(outline_width, outline_height));
int32_t top_left, bottom_right;
FindOutlineInsets(&diagonal, &top_left, &bottom_right);
@@ -614,10 +596,9 @@ std::unique_ptr<uint8_t[]> NinePatch::SerializeBase(size_t* outLen) const {
data.paddingBottom = padding.bottom;
auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[data.serializedSize()]);
- android::Res_png_9patch::serialize(
- data, (const int32_t*)horizontal_stretch_regions.data(),
- (const int32_t*)vertical_stretch_regions.data(), region_colors.data(),
- buffer.get());
+ android::Res_png_9patch::serialize(data, (const int32_t*)horizontal_stretch_regions.data(),
+ (const int32_t*)vertical_stretch_regions.data(),
+ region_colors.data(), buffer.get());
// Convert to file endianness.
reinterpret_cast<android::Res_png_9patch*>(buffer.get())->deviceToFile();
@@ -625,8 +606,7 @@ std::unique_ptr<uint8_t[]> NinePatch::SerializeBase(size_t* outLen) const {
return buffer;
}
-std::unique_ptr<uint8_t[]> NinePatch::SerializeLayoutBounds(
- size_t* out_len) const {
+std::unique_ptr<uint8_t[]> NinePatch::SerializeLayoutBounds(size_t* out_len) const {
size_t chunk_len = sizeof(uint32_t) * 4;
auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunk_len]);
uint8_t* cursor = buffer.get();
@@ -647,8 +627,7 @@ std::unique_ptr<uint8_t[]> NinePatch::SerializeLayoutBounds(
return buffer;
}
-std::unique_ptr<uint8_t[]> NinePatch::SerializeRoundedRectOutline(
- size_t* out_len) const {
+std::unique_ptr<uint8_t[]> NinePatch::SerializeRoundedRectOutline(size_t* out_len) const {
size_t chunk_len = sizeof(uint32_t) * 6;
auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunk_len]);
uint8_t* cursor = buffer.get();
@@ -679,20 +658,25 @@ std::unique_ptr<uint8_t[]> NinePatch::SerializeRoundedRectOutline(
}
::std::ostream& operator<<(::std::ostream& out, const Bounds& bounds) {
- return out << "l=" << bounds.left << " t=" << bounds.top
- << " r=" << bounds.right << " b=" << bounds.bottom;
+ return out << "l=" << bounds.left << " t=" << bounds.top << " r=" << bounds.right
+ << " b=" << bounds.bottom;
+}
+
+template <typename T>
+std::ostream& operator<<(std::ostream& os, const std::vector<T>& v) {
+ for (int i = 0; i < v.size(); ++i) {
+ os << v[i];
+ if (i != v.size() - 1) os << " ";
+ }
+ return os;
}
::std::ostream& operator<<(::std::ostream& out, const NinePatch& nine_patch) {
- return out << "horizontalStretch:"
- << util::Joiner(nine_patch.horizontal_stretch_regions, " ")
- << " verticalStretch:"
- << util::Joiner(nine_patch.vertical_stretch_regions, " ")
- << " padding: " << nine_patch.padding
- << ", bounds: " << nine_patch.layout_bounds
- << ", outline: " << nine_patch.outline
- << " rad=" << nine_patch.outline_radius
+ return out << "horizontalStretch:" << nine_patch.horizontal_stretch_regions
+ << " verticalStretch:" << nine_patch.vertical_stretch_regions
+ << " padding: " << nine_patch.padding << ", bounds: " << nine_patch.layout_bounds
+ << ", outline: " << nine_patch.outline << " rad=" << nine_patch.outline_radius
<< " alpha=" << nine_patch.outline_alpha;
}
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/compile/Png.cpp b/libs/androidfw/Png.cpp
index 76db815129dd..fb45cd9b49d0 100644
--- a/tools/aapt2/compile/Png.cpp
+++ b/libs/androidfw/Png.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "Png.h"
+#include "androidfw/Png.h"
#include <png.h>
#include <zlib.h>
@@ -24,13 +24,12 @@
#include <string>
#include <vector>
+#include "android-base/strings.h"
#include "androidfw/BigBuffer.h"
#include "androidfw/ResourceTypes.h"
#include "androidfw/Source.h"
-#include "trace/TraceBuffer.h"
-#include "util/Util.h"
-namespace aapt {
+namespace android {
constexpr bool kDebug = false;
@@ -47,9 +46,8 @@ struct PngInfo {
}
void* serialize9Patch() {
- void* serialized = android::Res_png_9patch::serialize(info9Patch, xDivs,
- yDivs, colors.data());
- reinterpret_cast<android::Res_png_9patch*>(serialized)->deviceToFile();
+ void* serialized = Res_png_9patch::serialize(info9Patch, xDivs, yDivs, colors.data());
+ reinterpret_cast<Res_png_9patch*>(serialized)->deviceToFile();
return serialized;
}
@@ -58,7 +56,7 @@ struct PngInfo {
std::vector<png_bytep> rows;
bool is9Patch = false;
- android::Res_png_9patch info9Patch;
+ Res_png_9patch info9Patch;
int32_t* xDivs = nullptr;
int32_t* yDivs = nullptr;
std::vector<uint32_t> colors;
@@ -79,34 +77,30 @@ struct PngInfo {
uint8_t outlineAlpha;
};
-static void readDataFromStream(png_structp readPtr, png_bytep data,
- png_size_t length) {
- std::istream* input =
- reinterpret_cast<std::istream*>(png_get_io_ptr(readPtr));
+static void readDataFromStream(png_structp readPtr, png_bytep data, png_size_t length) {
+ std::istream* input = reinterpret_cast<std::istream*>(png_get_io_ptr(readPtr));
if (!input->read(reinterpret_cast<char*>(data), length)) {
png_error(readPtr, strerror(errno));
}
}
-static void writeDataToStream(png_structp writePtr, png_bytep data,
- png_size_t length) {
- android::BigBuffer* outBuffer = reinterpret_cast<android::BigBuffer*>(png_get_io_ptr(writePtr));
+static void writeDataToStream(png_structp writePtr, png_bytep data, png_size_t length) {
+ BigBuffer* outBuffer = reinterpret_cast<BigBuffer*>(png_get_io_ptr(writePtr));
png_bytep buf = outBuffer->NextBlock<png_byte>(length);
memcpy(buf, data, length);
}
-static void flushDataToStream(png_structp /*writePtr*/) {}
+static void flushDataToStream(png_structp /*writePtr*/) {
+}
static void logWarning(png_structp readPtr, png_const_charp warningMessage) {
- android::IDiagnostics* diag =
- reinterpret_cast<android::IDiagnostics*>(png_get_error_ptr(readPtr));
- diag->Warn(android::DiagMessage() << warningMessage);
+ IDiagnostics* diag = reinterpret_cast<IDiagnostics*>(png_get_error_ptr(readPtr));
+ diag->Warn(DiagMessage() << warningMessage);
}
-static bool readPng(android::IDiagnostics* diag, png_structp readPtr, png_infop infoPtr,
- PngInfo* outInfo) {
+static bool readPng(IDiagnostics* diag, png_structp readPtr, png_infop infoPtr, PngInfo* outInfo) {
if (setjmp(png_jmpbuf(readPtr))) {
- diag->Error(android::DiagMessage() << "failed reading png");
+ diag->Error(DiagMessage() << "failed reading png");
return false;
}
@@ -114,8 +108,8 @@ static bool readPng(android::IDiagnostics* diag, png_structp readPtr, png_infop
png_read_info(readPtr, infoPtr);
int colorType, bitDepth, interlaceType, compressionType;
- png_get_IHDR(readPtr, infoPtr, &outInfo->width, &outInfo->height, &bitDepth,
- &colorType, &interlaceType, &compressionType, nullptr);
+ png_get_IHDR(readPtr, infoPtr, &outInfo->width, &outInfo->height, &bitDepth, &colorType,
+ &interlaceType, &compressionType, nullptr);
if (colorType == PNG_COLOR_TYPE_PALETTE) {
png_set_palette_to_rgb(readPtr);
@@ -137,8 +131,7 @@ static bool readPng(android::IDiagnostics* diag, png_structp readPtr, png_infop
png_set_add_alpha(readPtr, 0xFF, PNG_FILLER_AFTER);
}
- if (colorType == PNG_COLOR_TYPE_GRAY ||
- colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+ if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
png_set_gray_to_rgb(readPtr);
}
@@ -156,12 +149,11 @@ static bool readPng(android::IDiagnostics* diag, png_structp readPtr, png_infop
return true;
}
-static void checkNinePatchSerialization(android::Res_png_9patch* inPatch,
- void* data) {
+static void checkNinePatchSerialization(Res_png_9patch* inPatch, void* data) {
size_t patchSize = inPatch->serializedSize();
void* newData = malloc(patchSize);
memcpy(newData, data, patchSize);
- android::Res_png_9patch* outPatch = inPatch->deserialize(newData);
+ Res_png_9patch* outPatch = inPatch->deserialize(newData);
outPatch->fileToDevice();
// deserialization is done in place, so outPatch == newData
assert(outPatch == newData);
@@ -244,10 +236,9 @@ PNG_COLOR_TYPE_RGB_ALPHA) {
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define ABS(a) ((a) < 0 ? -(a) : (a))
-static void analyze_image(android::IDiagnostics* diag, const PngInfo& imageInfo,
- int grayscaleTolerance, png_colorp rgbPalette, png_bytep alphaPalette,
- int* paletteEntries, bool* hasTransparency, int* colorType,
- png_bytepp outRows) {
+static void analyze_image(IDiagnostics* diag, const PngInfo& imageInfo, int grayscaleTolerance,
+ png_colorp rgbPalette, png_bytep alphaPalette, int* paletteEntries,
+ bool* hasTransparency, int* colorType, png_bytepp outRows) {
int w = imageInfo.width;
int h = imageInfo.height;
int i, j, rr, gg, bb, aa, idx;
@@ -284,8 +275,8 @@ static void analyze_image(android::IDiagnostics* diag, const PngInfo& imageInfo,
maxGrayDeviation = MAX(ABS(bb - rr), maxGrayDeviation);
if (maxGrayDeviation > odev) {
if (kDebug) {
- printf("New max dev. = %d at pixel (%d, %d) = (%d %d %d %d)\n",
- maxGrayDeviation, i, j, rr, gg, bb, aa);
+ printf("New max dev. = %d at pixel (%d, %d) = (%d %d %d %d)\n", maxGrayDeviation, i, j,
+ rr, gg, bb, aa);
}
}
@@ -293,8 +284,7 @@ static void analyze_image(android::IDiagnostics* diag, const PngInfo& imageInfo,
if (isGrayscale) {
if (rr != gg || rr != bb) {
if (kDebug) {
- printf("Found a non-gray pixel at %d, %d = (%d %d %d %d)\n", i, j,
- rr, gg, bb, aa);
+ printf("Found a non-gray pixel at %d, %d = (%d %d %d %d)\n", i, j, rr, gg, bb, aa);
}
isGrayscale = false;
}
@@ -304,8 +294,7 @@ static void analyze_image(android::IDiagnostics* diag, const PngInfo& imageInfo,
if (isOpaque) {
if (aa != 0xff) {
if (kDebug) {
- printf("Found a non-opaque pixel at %d, %d = (%d %d %d %d)\n", i, j,
- rr, gg, bb, aa);
+ printf("Found a non-opaque pixel at %d, %d = (%d %d %d %d)\n", i, j, rr, gg, bb, aa);
}
isOpaque = false;
}
@@ -349,10 +338,9 @@ static void analyze_image(android::IDiagnostics* diag, const PngInfo& imageInfo,
printf("isGrayscale = %s\n", isGrayscale ? "true" : "false");
printf("isOpaque = %s\n", isOpaque ? "true" : "false");
printf("isPalette = %s\n", isPalette ? "true" : "false");
- printf("Size w/ palette = %d, gray+alpha = %d, rgb(a) = %d\n", paletteSize,
- 2 * w * h, bpp * w * h);
- printf("Max gray deviation = %d, tolerance = %d\n", maxGrayDeviation,
- grayscaleTolerance);
+ printf("Size w/ palette = %d, gray+alpha = %d, rgb(a) = %d\n", paletteSize, 2 * w * h,
+ bpp * w * h);
+ printf("Max gray deviation = %d, tolerance = %d\n", maxGrayDeviation, grayscaleTolerance);
}
// Choose the best color type for the image.
@@ -381,8 +369,8 @@ static void analyze_image(android::IDiagnostics* diag, const PngInfo& imageInfo,
*colorType = PNG_COLOR_TYPE_PALETTE;
} else {
if (maxGrayDeviation <= grayscaleTolerance) {
- diag->Note(android::DiagMessage()
- << "forcing image to gray (max deviation = " << maxGrayDeviation << ")");
+ diag->Note(DiagMessage() << "forcing image to gray (max deviation = " << maxGrayDeviation
+ << ")");
*colorType = isOpaque ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_GRAY_ALPHA;
} else {
*colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA;
@@ -404,8 +392,7 @@ static void analyze_image(android::IDiagnostics* diag, const PngInfo& imageInfo,
rgbPalette[idx].blue = (png_byte)((col >> 8) & 0xff);
alphaPalette[idx] = (png_byte)(col & 0xff);
}
- } else if (*colorType == PNG_COLOR_TYPE_GRAY ||
- *colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+ } else if (*colorType == PNG_COLOR_TYPE_GRAY || *colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
// If the image is gray or gray + alpha, compact the pixels into outRows
for (j = 0; j < h; j++) {
const png_byte* row = imageInfo.rows[j];
@@ -429,10 +416,10 @@ static void analyze_image(android::IDiagnostics* diag, const PngInfo& imageInfo,
}
}
-static bool writePng(android::IDiagnostics* diag, png_structp writePtr, png_infop infoPtr,
- PngInfo* info, int grayScaleTolerance) {
+static bool writePng(IDiagnostics* diag, png_structp writePtr, png_infop infoPtr, PngInfo* info,
+ int grayScaleTolerance) {
if (setjmp(png_jmpbuf(writePtr))) {
- diag->Error(android::DiagMessage() << "failed to write png");
+ diag->Error(DiagMessage() << "failed to write png");
return false;
}
@@ -444,8 +431,7 @@ static bool writePng(android::IDiagnostics* diag, png_structp writePtr, png_info
unknowns[1].data = nullptr;
unknowns[2].data = nullptr;
- png_bytepp outRows =
- (png_bytepp)malloc((int)info->height * sizeof(png_bytep));
+ png_bytepp outRows = (png_bytepp)malloc((int)info->height * sizeof(png_bytep));
if (outRows == (png_bytepp)0) {
printf("Can't allocate output buffer!\n");
exit(1);
@@ -461,8 +447,7 @@ static bool writePng(android::IDiagnostics* diag, png_structp writePtr, png_info
png_set_compression_level(writePtr, Z_BEST_COMPRESSION);
if (kDebug) {
- diag->Note(android::DiagMessage()
- << "writing image: w = " << info->width << ", h = " << info->height);
+ diag->Note(DiagMessage() << "writing image: w = " << info->width << ", h = " << info->height);
}
png_color rgbPalette[256];
@@ -470,48 +455,45 @@ static bool writePng(android::IDiagnostics* diag, png_structp writePtr, png_info
bool hasTransparency;
int paletteEntries;
- analyze_image(diag, *info, grayScaleTolerance, rgbPalette, alphaPalette,
- &paletteEntries, &hasTransparency, &colorType, outRows);
+ analyze_image(diag, *info, grayScaleTolerance, rgbPalette, alphaPalette, &paletteEntries,
+ &hasTransparency, &colorType, outRows);
// If the image is a 9-patch, we need to preserve it as a ARGB file to make
// sure the pixels will not be pre-dithered/clamped until we decide they are
- if (info->is9Patch &&
- (colorType == PNG_COLOR_TYPE_RGB || colorType == PNG_COLOR_TYPE_GRAY ||
- colorType == PNG_COLOR_TYPE_PALETTE)) {
+ if (info->is9Patch && (colorType == PNG_COLOR_TYPE_RGB || colorType == PNG_COLOR_TYPE_GRAY ||
+ colorType == PNG_COLOR_TYPE_PALETTE)) {
colorType = PNG_COLOR_TYPE_RGB_ALPHA;
}
if (kDebug) {
switch (colorType) {
case PNG_COLOR_TYPE_PALETTE:
- diag->Note(android::DiagMessage() << "has " << paletteEntries << " colors"
- << (hasTransparency ? " (with alpha)" : "")
- << ", using PNG_COLOR_TYPE_PALLETTE");
+ diag->Note(DiagMessage() << "has " << paletteEntries << " colors"
+ << (hasTransparency ? " (with alpha)" : "")
+ << ", using PNG_COLOR_TYPE_PALLETTE");
break;
case PNG_COLOR_TYPE_GRAY:
- diag->Note(android::DiagMessage() << "is opaque gray, using PNG_COLOR_TYPE_GRAY");
+ diag->Note(DiagMessage() << "is opaque gray, using PNG_COLOR_TYPE_GRAY");
break;
case PNG_COLOR_TYPE_GRAY_ALPHA:
- diag->Note(android::DiagMessage() << "is gray + alpha, using PNG_COLOR_TYPE_GRAY_ALPHA");
+ diag->Note(DiagMessage() << "is gray + alpha, using PNG_COLOR_TYPE_GRAY_ALPHA");
break;
case PNG_COLOR_TYPE_RGB:
- diag->Note(android::DiagMessage() << "is opaque RGB, using PNG_COLOR_TYPE_RGB");
+ diag->Note(DiagMessage() << "is opaque RGB, using PNG_COLOR_TYPE_RGB");
break;
case PNG_COLOR_TYPE_RGB_ALPHA:
- diag->Note(android::DiagMessage() << "is RGB + alpha, using PNG_COLOR_TYPE_RGB_ALPHA");
+ diag->Note(DiagMessage() << "is RGB + alpha, using PNG_COLOR_TYPE_RGB_ALPHA");
break;
}
}
- png_set_IHDR(writePtr, infoPtr, info->width, info->height, 8, colorType,
- PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT);
+ png_set_IHDR(writePtr, infoPtr, info->width, info->height, 8, colorType, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
if (colorType == PNG_COLOR_TYPE_PALETTE) {
png_set_PLTE(writePtr, infoPtr, rgbPalette, paletteEntries);
if (hasTransparency) {
- png_set_tRNS(writePtr, infoPtr, alphaPalette, paletteEntries,
- (png_color_16p)0);
+ png_set_tRNS(writePtr, infoPtr, alphaPalette, paletteEntries, (png_color_16p)0);
}
png_set_filter(writePtr, 0, PNG_NO_FILTERS);
} else {
@@ -526,13 +508,12 @@ static bool writePng(android::IDiagnostics* diag, png_structp writePtr, png_info
// Chunks ordered thusly because older platforms depend on the base 9 patch
// data being last
- png_bytep chunkNames = info->haveLayoutBounds
- ? (png_bytep) "npOl\0npLb\0npTc\0"
- : (png_bytep) "npOl\0npTc";
+ png_bytep chunkNames =
+ info->haveLayoutBounds ? (png_bytep) "npOl\0npLb\0npTc\0" : (png_bytep) "npOl\0npTc";
// base 9 patch data
if (kDebug) {
- diag->Note(android::DiagMessage() << "adding 9-patch info..");
+ diag->Note(DiagMessage() << "adding 9-patch info..");
}
memcpy((char*)unknowns[pIndex].name, "npTc", 5);
unknowns[pIndex].data = (png_byte*)info->serialize9Patch();
@@ -563,8 +544,7 @@ static bool writePng(android::IDiagnostics* diag, png_structp writePtr, png_info
for (int i = 0; i < chunkCount; i++) {
unknowns[i].location = PNG_HAVE_PLTE;
}
- png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS, chunkNames,
- chunkCount);
+ png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS, chunkNames, chunkCount);
png_set_unknown_chunks(writePtr, infoPtr, unknowns, chunkCount);
#if PNG_LIBPNG_VER < 10600
@@ -579,8 +559,7 @@ static bool writePng(android::IDiagnostics* diag, png_structp writePtr, png_info
png_write_info(writePtr, infoPtr);
png_bytepp rows;
- if (colorType == PNG_COLOR_TYPE_RGB ||
- colorType == PNG_COLOR_TYPE_RGB_ALPHA) {
+ if (colorType == PNG_COLOR_TYPE_RGB || colorType == PNG_COLOR_TYPE_RGB_ALPHA) {
if (colorType == PNG_COLOR_TYPE_RGB) {
png_set_filler(writePtr, 0, PNG_FILLER_AFTER);
}
@@ -605,14 +584,13 @@ static bool writePng(android::IDiagnostics* diag, png_structp writePtr, png_info
free(unknowns[1].data);
free(unknowns[2].data);
- png_get_IHDR(writePtr, infoPtr, &width, &height, &bitDepth, &colorType,
- &interlaceType, &compressionType, nullptr);
+ png_get_IHDR(writePtr, infoPtr, &width, &height, &bitDepth, &colorType, &interlaceType,
+ &compressionType, nullptr);
if (kDebug) {
- diag->Note(android::DiagMessage()
- << "image written: w = " << width << ", h = " << height << ", d = " << bitDepth
- << ", colors = " << colorType << ", inter = " << interlaceType
- << ", comp = " << compressionType);
+ diag->Note(DiagMessage() << "image written: w = " << width << ", h = " << height
+ << ", d = " << bitDepth << ", colors = " << colorType
+ << ", inter = " << interlaceType << ", comp = " << compressionType);
}
return true;
}
@@ -673,9 +651,8 @@ static TickType tickType(png_bytep p, bool transparent, const char** outError) {
enum class TickState { kStart, kInside1, kOutside1 };
-static bool getHorizontalTicks(png_bytep row, int width, bool transparent,
- bool required, int32_t* outLeft,
- int32_t* outRight, const char** outError,
+static bool getHorizontalTicks(png_bytep row, int width, bool transparent, bool required,
+ int32_t* outLeft, int32_t* outRight, const char** outError,
uint8_t* outDivs, bool multipleAllowed) {
*outLeft = *outRight = -1;
TickState state = TickState::kStart;
@@ -683,8 +660,7 @@ static bool getHorizontalTicks(png_bytep row, int width, bool transparent,
for (int i = 1; i < width - 1; i++) {
if (tickType(row + i * 4, transparent, outError) == TickType::kTick) {
- if (state == TickState::kStart ||
- (state == TickState::kOutside1 && multipleAllowed)) {
+ if (state == TickState::kStart || (state == TickState::kOutside1 && multipleAllowed)) {
*outLeft = i - 1;
*outRight = width - 2;
found = true;
@@ -719,18 +695,16 @@ static bool getHorizontalTicks(png_bytep row, int width, bool transparent,
return true;
}
-static bool getVerticalTicks(png_bytepp rows, int offset, int height,
- bool transparent, bool required, int32_t* outTop,
- int32_t* outBottom, const char** outError,
- uint8_t* outDivs, bool multipleAllowed) {
+static bool getVerticalTicks(png_bytepp rows, int offset, int height, bool transparent,
+ bool required, int32_t* outTop, int32_t* outBottom,
+ const char** outError, uint8_t* outDivs, bool multipleAllowed) {
*outTop = *outBottom = -1;
TickState state = TickState::kStart;
bool found = false;
for (int i = 1; i < height - 1; i++) {
if (tickType(rows[i] + offset, transparent, outError) == TickType::kTick) {
- if (state == TickState::kStart ||
- (state == TickState::kOutside1 && multipleAllowed)) {
+ if (state == TickState::kStart || (state == TickState::kOutside1 && multipleAllowed)) {
*outTop = i - 1;
*outBottom = height - 2;
found = true;
@@ -765,10 +739,8 @@ static bool getVerticalTicks(png_bytepp rows, int offset, int height,
return true;
}
-static bool getHorizontalLayoutBoundsTicks(png_bytep row, int width,
- bool transparent,
- bool /* required */,
- int32_t* outLeft, int32_t* outRight,
+static bool getHorizontalLayoutBoundsTicks(png_bytep row, int width, bool transparent,
+ bool /* required */, int32_t* outLeft, int32_t* outRight,
const char** outError) {
*outLeft = *outRight = 0;
@@ -779,23 +751,20 @@ static bool getHorizontalLayoutBoundsTicks(png_bytep row, int width,
while (i < width - 1) {
(*outLeft)++;
i++;
- if (tickType(row + i * 4, transparent, outError) !=
- TickType::kLayoutBounds) {
+ if (tickType(row + i * 4, transparent, outError) != TickType::kLayoutBounds) {
break;
}
}
}
// Look for right tick
- if (tickType(row + (width - 2) * 4, transparent, outError) ==
- TickType::kLayoutBounds) {
+ if (tickType(row + (width - 2) * 4, transparent, outError) == TickType::kLayoutBounds) {
// Ending with a layout padding tick
int i = width - 2;
while (i > 1) {
(*outRight)++;
i--;
- if (tickType(row + i * 4, transparent, outError) !=
- TickType::kLayoutBounds) {
+ if (tickType(row + i * 4, transparent, outError) != TickType::kLayoutBounds) {
break;
}
}
@@ -803,38 +772,32 @@ static bool getHorizontalLayoutBoundsTicks(png_bytep row, int width,
return true;
}
-static bool getVerticalLayoutBoundsTicks(png_bytepp rows, int offset,
- int height, bool transparent,
- bool /* required */, int32_t* outTop,
- int32_t* outBottom,
+static bool getVerticalLayoutBoundsTicks(png_bytepp rows, int offset, int height, bool transparent,
+ bool /* required */, int32_t* outTop, int32_t* outBottom,
const char** outError) {
*outTop = *outBottom = 0;
// Look for top tick
- if (tickType(rows[1] + offset, transparent, outError) ==
- TickType::kLayoutBounds) {
+ if (tickType(rows[1] + offset, transparent, outError) == TickType::kLayoutBounds) {
// Starting with a layout padding tick
int i = 1;
while (i < height - 1) {
(*outTop)++;
i++;
- if (tickType(rows[i] + offset, transparent, outError) !=
- TickType::kLayoutBounds) {
+ if (tickType(rows[i] + offset, transparent, outError) != TickType::kLayoutBounds) {
break;
}
}
}
// Look for bottom tick
- if (tickType(rows[height - 2] + offset, transparent, outError) ==
- TickType::kLayoutBounds) {
+ if (tickType(rows[height - 2] + offset, transparent, outError) == TickType::kLayoutBounds) {
// Ending with a layout padding tick
int i = height - 2;
while (i > 1) {
(*outBottom)++;
i--;
- if (tickType(rows[i] + offset, transparent, outError) !=
- TickType::kLayoutBounds) {
+ if (tickType(rows[i] + offset, transparent, outError) != TickType::kLayoutBounds) {
break;
}
}
@@ -842,13 +805,12 @@ static bool getVerticalLayoutBoundsTicks(png_bytepp rows, int offset,
return true;
}
-static void findMaxOpacity(png_bytepp rows, int startX, int startY, int endX,
- int endY, int dX, int dY, int* outInset) {
+static void findMaxOpacity(png_bytepp rows, int startX, int startY, int endX, int endY, int dX,
+ int dY, int* outInset) {
uint8_t maxOpacity = 0;
int inset = 0;
*outInset = 0;
- for (int x = startX, y = startY; x != endX && y != endY;
- x += dX, y += dY, inset++) {
+ for (int x = startX, y = startY; x != endX && y != endY; x += dX, y += dY, inset++) {
png_byte* color = rows[y] + x * 4;
uint8_t opacity = color[3];
if (opacity > maxOpacity) {
@@ -868,8 +830,7 @@ static uint8_t maxAlphaOverRow(png_bytep row, int startX, int endX) {
return maxAlpha;
}
-static uint8_t maxAlphaOverCol(png_bytepp rows, int offsetX, int startY,
- int endY) {
+static uint8_t maxAlphaOverCol(png_bytepp rows, int offsetX, int startY, int endY) {
uint8_t maxAlpha = 0;
for (int y = startY; y < endY; y++) {
uint8_t alpha = (rows[y] + offsetX * 4)[3];
@@ -886,10 +847,8 @@ static void getOutline(PngInfo* image) {
// find left and right extent of nine patch content on center row
if (image->width > 4) {
- findMaxOpacity(image->rows.data(), 1, midY, midX, -1, 1, 0,
- &image->outlineInsetsLeft);
- findMaxOpacity(image->rows.data(), endX, midY, midX, -1, -1, 0,
- &image->outlineInsetsRight);
+ findMaxOpacity(image->rows.data(), 1, midY, midX, -1, 1, 0, &image->outlineInsetsLeft);
+ findMaxOpacity(image->rows.data(), endX, midY, midX, -1, -1, 0, &image->outlineInsetsRight);
} else {
image->outlineInsetsLeft = 0;
image->outlineInsetsRight = 0;
@@ -897,10 +856,8 @@ static void getOutline(PngInfo* image) {
// find top and bottom extent of nine patch content on center column
if (image->height > 4) {
- findMaxOpacity(image->rows.data(), midX, 1, -1, midY, 0, 1,
- &image->outlineInsetsTop);
- findMaxOpacity(image->rows.data(), midX, endY, -1, midY, 0, -1,
- &image->outlineInsetsBottom);
+ findMaxOpacity(image->rows.data(), midX, 1, -1, midY, 0, 1, &image->outlineInsetsTop);
+ findMaxOpacity(image->rows.data(), midX, endY, -1, midY, 0, -1, &image->outlineInsetsBottom);
} else {
image->outlineInsetsTop = 0;
image->outlineInsetsBottom = 0;
@@ -915,13 +872,13 @@ static void getOutline(PngInfo* image) {
// assuming the image is a round rect, compute the radius by marching
// diagonally from the top left corner towards the center
- image->outlineAlpha = std::max(
- maxAlphaOverRow(image->rows[innerMidY], innerStartX, innerEndX),
- maxAlphaOverCol(image->rows.data(), innerMidX, innerStartY, innerStartY));
+ image->outlineAlpha =
+ std::max(maxAlphaOverRow(image->rows[innerMidY], innerStartX, innerEndX),
+ maxAlphaOverCol(image->rows.data(), innerMidX, innerStartY, innerStartY));
int diagonalInset = 0;
- findMaxOpacity(image->rows.data(), innerStartX, innerStartY, innerMidX,
- innerMidY, 1, 1, &diagonalInset);
+ findMaxOpacity(image->rows.data(), innerStartX, innerStartY, innerMidX, innerMidY, 1, 1,
+ &diagonalInset);
/* Determine source radius based upon inset:
* sqrt(r^2 + r^2) = sqrt(i^2 + i^2) + r
@@ -932,19 +889,17 @@ static void getOutline(PngInfo* image) {
image->outlineRadius = 3.4142f * diagonalInset;
if (kDebug) {
- printf("outline insets %d %d %d %d, rad %f, alpha %x\n",
- image->outlineInsetsLeft, image->outlineInsetsTop,
- image->outlineInsetsRight, image->outlineInsetsBottom,
+ printf("outline insets %d %d %d %d, rad %f, alpha %x\n", image->outlineInsetsLeft,
+ image->outlineInsetsTop, image->outlineInsetsRight, image->outlineInsetsBottom,
image->outlineRadius, image->outlineAlpha);
}
}
-static uint32_t getColor(png_bytepp rows, int left, int top, int right,
- int bottom) {
+static uint32_t getColor(png_bytepp rows, int left, int top, int right, int bottom) {
png_bytep color = rows[top] + left * 4;
if (left > right || top > bottom) {
- return android::Res_png_9patch::TRANSPARENT_COLOR;
+ return Res_png_9patch::TRANSPARENT_COLOR;
}
while (top <= bottom) {
@@ -952,18 +907,17 @@ static uint32_t getColor(png_bytepp rows, int left, int top, int right,
png_bytep p = rows[top] + i * 4;
if (color[3] == 0) {
if (p[3] != 0) {
- return android::Res_png_9patch::NO_COLOR;
+ return Res_png_9patch::NO_COLOR;
}
- } else if (p[0] != color[0] || p[1] != color[1] || p[2] != color[2] ||
- p[3] != color[3]) {
- return android::Res_png_9patch::NO_COLOR;
+ } else if (p[0] != color[0] || p[1] != color[1] || p[2] != color[2] || p[3] != color[3]) {
+ return Res_png_9patch::NO_COLOR;
}
}
top++;
}
if (color[3] == 0) {
- return android::Res_png_9patch::TRANSPARENT_COLOR;
+ return Res_png_9patch::TRANSPARENT_COLOR;
}
return (color[3] << 24) | (color[0] << 16) | (color[1] << 8) | color[2];
}
@@ -1014,23 +968,22 @@ static bool do9Patch(PngInfo* image, std::string* outError) {
}
// Validate frame...
- if (!transparent &&
- (p[0] != 0xFF || p[1] != 0xFF || p[2] != 0xFF || p[3] != 0xFF)) {
+ if (!transparent && (p[0] != 0xFF || p[1] != 0xFF || p[2] != 0xFF || p[3] != 0xFF)) {
errorMsg = "Must have one-pixel frame that is either transparent or white";
goto getout;
}
// Find left and right of sizing areas...
- if (!getHorizontalTicks(p, W, transparent, true, &xDivs[0], &xDivs[1],
- &errorMsg, &numXDivs, true)) {
+ if (!getHorizontalTicks(p, W, transparent, true, &xDivs[0], &xDivs[1], &errorMsg, &numXDivs,
+ true)) {
errorPixel = xDivs[0];
errorEdge = "top";
goto getout;
}
// Find top and bottom of sizing areas...
- if (!getVerticalTicks(image->rows.data(), 0, H, transparent, true, &yDivs[0],
- &yDivs[1], &errorMsg, &numYDivs, true)) {
+ if (!getVerticalTicks(image->rows.data(), 0, H, transparent, true, &yDivs[0], &yDivs[1],
+ &errorMsg, &numYDivs, true)) {
errorPixel = yDivs[0];
errorEdge = "left";
goto getout;
@@ -1041,10 +994,8 @@ static bool do9Patch(PngInfo* image, std::string* outError) {
image->info9Patch.numYDivs = numYDivs;
// Find left and right of padding area...
- if (!getHorizontalTicks(image->rows[H - 1], W, transparent, false,
- &image->info9Patch.paddingLeft,
- &image->info9Patch.paddingRight, &errorMsg, nullptr,
- false)) {
+ if (!getHorizontalTicks(image->rows[H - 1], W, transparent, false, &image->info9Patch.paddingLeft,
+ &image->info9Patch.paddingRight, &errorMsg, nullptr, false)) {
errorPixel = image->info9Patch.paddingLeft;
errorEdge = "bottom";
goto getout;
@@ -1052,9 +1003,8 @@ static bool do9Patch(PngInfo* image, std::string* outError) {
// Find top and bottom of padding area...
if (!getVerticalTicks(image->rows.data(), (W - 1) * 4, H, transparent, false,
- &image->info9Patch.paddingTop,
- &image->info9Patch.paddingBottom, &errorMsg, nullptr,
- false)) {
+ &image->info9Patch.paddingTop, &image->info9Patch.paddingBottom, &errorMsg,
+ nullptr, false)) {
errorPixel = image->info9Patch.paddingTop;
errorEdge = "right";
goto getout;
@@ -1062,22 +1012,18 @@ static bool do9Patch(PngInfo* image, std::string* outError) {
// Find left and right of layout padding...
getHorizontalLayoutBoundsTicks(image->rows[H - 1], W, transparent, false,
- &image->layoutBoundsLeft,
- &image->layoutBoundsRight, &errorMsg);
+ &image->layoutBoundsLeft, &image->layoutBoundsRight, &errorMsg);
- getVerticalLayoutBoundsTicks(image->rows.data(), (W - 1) * 4, H, transparent,
- false, &image->layoutBoundsTop,
- &image->layoutBoundsBottom, &errorMsg);
+ getVerticalLayoutBoundsTicks(image->rows.data(), (W - 1) * 4, H, transparent, false,
+ &image->layoutBoundsTop, &image->layoutBoundsBottom, &errorMsg);
- image->haveLayoutBounds =
- image->layoutBoundsLeft != 0 || image->layoutBoundsRight != 0 ||
- image->layoutBoundsTop != 0 || image->layoutBoundsBottom != 0;
+ image->haveLayoutBounds = image->layoutBoundsLeft != 0 || image->layoutBoundsRight != 0 ||
+ image->layoutBoundsTop != 0 || image->layoutBoundsBottom != 0;
if (image->haveLayoutBounds) {
if (kDebug) {
- printf("layoutBounds=%d %d %d %d\n", image->layoutBoundsLeft,
- image->layoutBoundsTop, image->layoutBoundsRight,
- image->layoutBoundsBottom);
+ printf("layoutBounds=%d %d %d %d\n", image->layoutBoundsLeft, image->layoutBoundsTop,
+ image->layoutBoundsRight, image->layoutBoundsBottom);
}
}
@@ -1189,7 +1135,7 @@ static bool do9Patch(PngInfo* image, std::string* outError) {
c = getColor(image->rows.data(), left, top, right - 1, bottom - 1);
image->colors[colorIndex++] = c;
if (kDebug) {
- if (c != android::Res_png_9patch::NO_COLOR) {
+ if (c != Res_png_9patch::NO_COLOR) {
hasColor = true;
}
}
@@ -1214,8 +1160,7 @@ getout:
if (errorEdge) {
err << "." << std::endl;
if (errorPixel >= 0) {
- err << "Found at pixel #" << errorPixel << " along " << errorEdge
- << " edge";
+ err << "Found at pixel #" << errorPixel << " along " << errorEdge << " edge";
} else {
err << "Found along " << errorEdge << " edge";
}
@@ -1226,20 +1171,19 @@ getout:
return true;
}
-bool Png::process(const android::Source& source, std::istream* input, android::BigBuffer* outBuffer,
+bool Png::process(const Source& source, std::istream* input, BigBuffer* outBuffer,
const PngOptions& options) {
- TRACE_CALL();
png_byte signature[kPngSignatureSize];
// Read the PNG signature first.
if (!input->read(reinterpret_cast<char*>(signature), kPngSignatureSize)) {
- mDiag->Error(android::DiagMessage() << strerror(errno));
+ mDiag->Error(DiagMessage() << strerror(errno));
return false;
}
// If the PNG signature doesn't match, bail early.
if (png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
- mDiag->Error(android::DiagMessage() << "not a valid png file");
+ mDiag->Error(DiagMessage() << "not a valid png file");
return false;
}
@@ -1252,18 +1196,17 @@ bool Png::process(const android::Source& source, std::istream* input, android::B
readPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
if (!readPtr) {
- mDiag->Error(android::DiagMessage() << "failed to allocate read ptr");
+ mDiag->Error(DiagMessage() << "failed to allocate read ptr");
goto bail;
}
infoPtr = png_create_info_struct(readPtr);
if (!infoPtr) {
- mDiag->Error(android::DiagMessage() << "failed to allocate info ptr");
+ mDiag->Error(DiagMessage() << "failed to allocate info ptr");
goto bail;
}
- png_set_error_fn(readPtr, reinterpret_cast<png_voidp>(mDiag), nullptr,
- logWarning);
+ png_set_error_fn(readPtr, reinterpret_cast<png_voidp>(mDiag), nullptr, logWarning);
// Set the read function to read from std::istream.
png_set_read_fn(readPtr, (png_voidp)input, readDataFromStream);
@@ -1272,35 +1215,32 @@ bool Png::process(const android::Source& source, std::istream* input, android::B
goto bail;
}
- if (util::EndsWith(source.path, ".9.png")) {
+ if (android::base::EndsWith(source.path, ".9.png")) {
std::string errorMsg;
if (!do9Patch(&pngInfo, &errorMsg)) {
- mDiag->Error(android::DiagMessage() << errorMsg);
+ mDiag->Error(DiagMessage() << errorMsg);
goto bail;
}
}
- writePtr =
- png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
+ writePtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
if (!writePtr) {
- mDiag->Error(android::DiagMessage() << "failed to allocate write ptr");
+ mDiag->Error(DiagMessage() << "failed to allocate write ptr");
goto bail;
}
writeInfoPtr = png_create_info_struct(writePtr);
if (!writeInfoPtr) {
- mDiag->Error(android::DiagMessage() << "failed to allocate write info ptr");
+ mDiag->Error(DiagMessage() << "failed to allocate write info ptr");
goto bail;
}
png_set_error_fn(writePtr, nullptr, nullptr, logWarning);
// Set the write function to write to std::ostream.
- png_set_write_fn(writePtr, (png_voidp)outBuffer, writeDataToStream,
- flushDataToStream);
+ png_set_write_fn(writePtr, (png_voidp)outBuffer, writeDataToStream, flushDataToStream);
- if (!writePng(mDiag, writePtr, writeInfoPtr, &pngInfo,
- options.grayscale_tolerance)) {
+ if (!writePng(mDiag, writePtr, writeInfoPtr, &pngInfo, options.grayscale_tolerance)) {
goto bail;
}
@@ -1316,4 +1256,4 @@ bail:
return result;
}
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/compile/PngChunkFilter.cpp b/libs/androidfw/PngChunkFilter.cpp
index 2e55d0c82b7b..331b94803e93 100644
--- a/tools/aapt2/compile/PngChunkFilter.cpp
+++ b/libs/androidfw/PngChunkFilter.cpp
@@ -14,25 +14,22 @@
* limitations under the License.
*/
-#include "compile/Png.h"
-
#include "android-base/stringprintf.h"
+#include "android-base/strings.h"
+#include "androidfw/Png.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
-#include "io/Io.h"
-
-using ::android::StringPiece;
using ::android::base::StringPrintf;
-namespace aapt {
+namespace android {
static constexpr const char* kPngSignature = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a";
// Useful helper function that encodes individual bytes into a uint32
// at compile time.
constexpr uint32_t u32(uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
- return (((uint32_t)a) << 24) | (((uint32_t)b) << 16) | (((uint32_t)c) << 8) |
- ((uint32_t)d);
+ return (((uint32_t)a) << 24) | (((uint32_t)b) << 16) | (((uint32_t)c) << 8) | ((uint32_t)d);
}
// Allow list of PNG chunk types that we want to keep in the resulting PNG.
@@ -71,7 +68,7 @@ static bool IsPngChunkAllowed(uint32_t type) {
}
PngChunkFilter::PngChunkFilter(StringPiece data) : data_(data) {
- if (util::StartsWith(data_, kPngSignature)) {
+ if (android::base::StartsWith(data_, kPngSignature)) {
window_start_ = 0;
window_end_ = kPngSignatureSize;
} else {
@@ -176,5 +173,4 @@ bool PngChunkFilter::Rewind() {
window_end_ = kPngSignatureSize;
return true;
}
-
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/compile/PngCrunch.cpp b/libs/androidfw/PngCrunch.cpp
index 4ef87ba3671b..cf3c0eeff402 100644
--- a/tools/aapt2/compile/PngCrunch.cpp
+++ b/libs/androidfw/PngCrunch.cpp
@@ -14,8 +14,6 @@
* limitations under the License.
*/
-#include "compile/Png.h"
-
#include <png.h>
#include <zlib.h>
@@ -26,16 +24,16 @@
#include "android-base/errors.h"
#include "android-base/logging.h"
#include "android-base/macros.h"
+#include "androidfw/Png.h"
-#include "trace/TraceBuffer.h"
-
-namespace aapt {
+namespace android {
// Custom deleter that destroys libpng read and info structs.
class PngReadStructDeleter {
public:
PngReadStructDeleter(png_structp read_ptr, png_infop info_ptr)
- : read_ptr_(read_ptr), info_ptr_(info_ptr) {}
+ : read_ptr_(read_ptr), info_ptr_(info_ptr) {
+ }
~PngReadStructDeleter() {
png_destroy_read_struct(&read_ptr_, &info_ptr_, nullptr);
@@ -52,7 +50,8 @@ class PngReadStructDeleter {
class PngWriteStructDeleter {
public:
PngWriteStructDeleter(png_structp write_ptr, png_infop info_ptr)
- : write_ptr_(write_ptr), info_ptr_(info_ptr) {}
+ : write_ptr_(write_ptr), info_ptr_(info_ptr) {
+ }
~PngWriteStructDeleter() {
png_destroy_write_struct(&write_ptr_, &info_ptr_);
@@ -83,7 +82,7 @@ static void LogError(png_structp png_ptr, png_const_charp error_msg) {
}
static void ReadDataFromStream(png_structp png_ptr, png_bytep buffer, png_size_t len) {
- io::InputStream* in = (io::InputStream*)png_get_io_ptr(png_ptr);
+ InputStream* in = (InputStream*)png_get_io_ptr(png_ptr);
const void* in_buffer;
size_t in_len;
@@ -108,7 +107,7 @@ static void ReadDataFromStream(png_structp png_ptr, png_bytep buffer, png_size_t
}
static void WriteDataToStream(png_structp png_ptr, png_bytep buffer, png_size_t len) {
- io::OutputStream* out = (io::OutputStream*)png_get_io_ptr(png_ptr);
+ OutputStream* out = (OutputStream*)png_get_io_ptr(png_ptr);
void* out_buffer;
size_t out_len;
@@ -143,28 +142,22 @@ static void WriteDataToStream(png_structp png_ptr, png_bytep buffer, png_size_t
}
}
-std::unique_ptr<Image> ReadPng(IAaptContext* context, const android::Source& source,
- io::InputStream* in) {
- TRACE_CALL();
- // Create a diagnostics that has the source information encoded.
- android::SourcePathDiagnostics source_diag(source, context->GetDiagnostics());
-
+std::unique_ptr<Image> ReadPng(InputStream* in, IDiagnostics* diag) {
// Read the first 8 bytes of the file looking for the PNG signature.
// Bail early if it does not match.
const png_byte* signature;
size_t buffer_size;
if (!in->Next((const void**)&signature, &buffer_size)) {
if (in->HadError()) {
- source_diag.Error(android::DiagMessage()
- << "failed to read PNG signature: " << in->GetError());
+ diag->Error(android::DiagMessage() << "failed to read PNG signature: " << in->GetError());
} else {
- source_diag.Error(android::DiagMessage() << "not enough data for PNG signature");
+ diag->Error(android::DiagMessage() << "not enough data for PNG signature");
}
return {};
}
if (buffer_size < kPngSignatureSize || png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
- source_diag.Error(android::DiagMessage() << "file signature does not match PNG signature");
+ diag->Error(android::DiagMessage() << "file signature does not match PNG signature");
return {};
}
@@ -176,14 +169,14 @@ std::unique_ptr<Image> ReadPng(IAaptContext* context, const android::Source& sou
// version of libpng.
png_structp read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
if (read_ptr == nullptr) {
- source_diag.Error(android::DiagMessage() << "failed to create libpng read png_struct");
+ diag->Error(android::DiagMessage() << "failed to create libpng read png_struct");
return {};
}
// Create and initialize the memory for image header and data.
png_infop info_ptr = png_create_info_struct(read_ptr);
if (info_ptr == nullptr) {
- source_diag.Error(android::DiagMessage() << "failed to create libpng read png_info");
+ diag->Error(android::DiagMessage() << "failed to create libpng read png_info");
png_destroy_read_struct(&read_ptr, nullptr, nullptr);
return {};
}
@@ -199,7 +192,7 @@ std::unique_ptr<Image> ReadPng(IAaptContext* context, const android::Source& sou
}
// Handle warnings ourselves via IDiagnostics.
- png_set_error_fn(read_ptr, (png_voidp)&source_diag, LogError, LogWarning);
+ png_set_error_fn(read_ptr, (png_voidp)&diag, LogError, LogWarning);
// Set up the read functions which read from our custom data sources.
png_set_read_fn(read_ptr, (png_voidp)in, ReadDataFromStream);
@@ -213,8 +206,8 @@ std::unique_ptr<Image> ReadPng(IAaptContext* context, const android::Source& sou
// Extract image meta-data from the various chunk headers.
uint32_t width, height;
int bit_depth, color_type, interlace_method, compression_method, filter_method;
- png_get_IHDR(read_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
- &interlace_method, &compression_method, &filter_method);
+ png_get_IHDR(read_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_method,
+ &compression_method, &filter_method);
// When the image is read, expand it so that it is in RGBA 8888 format
// so that image handling is uniform.
@@ -239,8 +232,7 @@ std::unique_ptr<Image> ReadPng(IAaptContext* context, const android::Source& sou
png_set_add_alpha(read_ptr, 0xFF, PNG_FILLER_AFTER);
}
- if (color_type == PNG_COLOR_TYPE_GRAY ||
- color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
+ if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
png_set_gray_to_rgb(read_ptr);
}
@@ -256,12 +248,12 @@ std::unique_ptr<Image> ReadPng(IAaptContext* context, const android::Source& sou
// something
// that can always be represented by 9-patch.
if (width > std::numeric_limits<int32_t>::max() || height > std::numeric_limits<int32_t>::max()) {
- source_diag.Error(android::DiagMessage()
- << "PNG image dimensions are too large: " << width << "x" << height);
+ diag->Error(android::DiagMessage()
+ << "PNG image dimensions are too large: " << width << "x" << height);
return {};
}
- std::unique_ptr<Image> output_image = util::make_unique<Image>();
+ std::unique_ptr<Image> output_image = std::make_unique<Image>();
output_image->width = static_cast<int32_t>(width);
output_image->height = static_cast<int32_t>(height);
@@ -272,7 +264,7 @@ std::unique_ptr<Image> ReadPng(IAaptContext* context, const android::Source& sou
output_image->data = std::unique_ptr<uint8_t[]>(new uint8_t[height * row_bytes]);
// Create an array of rows that index into the data block.
- output_image->rows = std::unique_ptr<uint8_t* []>(new uint8_t*[height]);
+ output_image->rows = std::unique_ptr<uint8_t*[]>(new uint8_t*[height]);
for (uint32_t h = 0; h < height; h++) {
output_image->rows[h] = output_image->data.get() + (h * row_bytes);
}
@@ -332,8 +324,7 @@ static int PickColorType(int32_t width, int32_t height, bool grayscale,
// This grayscale has alpha and can fit within a palette.
// See if it is worth fitting into a palette.
const size_t palette_threshold = palette_chunk_size + alpha_chunk_size +
- palette_data_chunk_size +
- kPaletteOverheadConstant;
+ palette_data_chunk_size + kPaletteOverheadConstant;
if (grayscale_alpha_data_chunk_size > palette_threshold) {
return PNG_COLOR_TYPE_PALETTE;
}
@@ -343,16 +334,14 @@ static int PickColorType(int32_t width, int32_t height, bool grayscale,
if (color_palette_size <= 256 && !has_nine_patch) {
// This image can fit inside a palette. Let's see if it is worth it.
- size_t total_size_with_palette =
- palette_data_chunk_size + palette_chunk_size;
+ size_t total_size_with_palette = palette_data_chunk_size + palette_chunk_size;
size_t total_size_without_palette = color_data_chunk_size;
if (alpha_palette_size > 0) {
total_size_with_palette += alpha_palette_size;
total_size_without_palette = color_alpha_data_chunk_size;
}
- if (total_size_without_palette >
- total_size_with_palette + kPaletteOverheadConstant) {
+ if (total_size_without_palette > total_size_with_palette + kPaletteOverheadConstant) {
return PNG_COLOR_TYPE_PALETTE;
}
}
@@ -482,26 +471,22 @@ static void WriteNinePatch(png_structp write_ptr, png_infop write_info_ptr,
png_set_unknown_chunks(write_ptr, write_info_ptr, unknown_chunks, index);
}
-bool WritePng(IAaptContext* context, const Image* image,
- const NinePatch* nine_patch, io::OutputStream* out,
- const PngOptions& options) {
- TRACE_CALL();
+bool WritePng(const Image* image, const NinePatch* nine_patch, OutputStream* out,
+ const PngOptions& options, IDiagnostics* diag, bool verbose) {
// Create and initialize the write png_struct with the default error and
// warning handlers.
// The header version is also passed in to ensure that this was built against the same
// version of libpng.
png_structp write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
if (write_ptr == nullptr) {
- context->GetDiagnostics()->Error(android::DiagMessage()
- << "failed to create libpng write png_struct");
+ diag->Error(android::DiagMessage() << "failed to create libpng write png_struct");
return false;
}
// Allocate memory to store image header data.
png_infop write_info_ptr = png_create_info_struct(write_ptr);
if (write_info_ptr == nullptr) {
- context->GetDiagnostics()->Error(android::DiagMessage()
- << "failed to create libpng write png_info");
+ diag->Error(android::DiagMessage() << "failed to create libpng write png_info");
png_destroy_write_struct(&write_ptr, nullptr);
return false;
}
@@ -516,7 +501,7 @@ bool WritePng(IAaptContext* context, const Image* image,
}
// Handle warnings with our IDiagnostics.
- png_set_error_fn(write_ptr, (png_voidp)context->GetDiagnostics(), LogError, LogWarning);
+ png_set_error_fn(write_ptr, (png_voidp)&diag, LogError, LogWarning);
// Set up the write functions which write to our custom data sources.
png_set_write_fn(write_ptr, (png_voidp)out, WriteDataToStream, nullptr);
@@ -578,22 +563,21 @@ bool WritePng(IAaptContext* context, const Image* image,
}
}
- if (context->IsVerbose()) {
+ if (verbose) {
android::DiagMessage msg;
- msg << " paletteSize=" << color_palette.size()
- << " alphaPaletteSize=" << alpha_palette.size()
+ msg << " paletteSize=" << color_palette.size() << " alphaPaletteSize=" << alpha_palette.size()
<< " maxGrayDeviation=" << max_gray_deviation
<< " grayScale=" << (grayscale ? "true" : "false");
- context->GetDiagnostics()->Note(msg);
+ diag->Note(msg);
}
const bool convertible_to_grayscale = max_gray_deviation <= options.grayscale_tolerance;
- const int new_color_type = PickColorType(
- image->width, image->height, grayscale, convertible_to_grayscale,
- nine_patch != nullptr, color_palette.size(), alpha_palette.size());
+ const int new_color_type =
+ PickColorType(image->width, image->height, grayscale, convertible_to_grayscale,
+ nine_patch != nullptr, color_palette.size(), alpha_palette.size());
- if (context->IsVerbose()) {
+ if (verbose) {
android::DiagMessage msg;
msg << "encoding PNG ";
if (nine_patch) {
@@ -619,12 +603,11 @@ bool WritePng(IAaptContext* context, const Image* image,
msg << "unknown type " << new_color_type;
break;
}
- context->GetDiagnostics()->Note(msg);
+ diag->Note(msg);
}
- png_set_IHDR(write_ptr, write_info_ptr, image->width, image->height, 8,
- new_color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT);
+ png_set_IHDR(write_ptr, write_info_ptr, image->width, image->height, 8, new_color_type,
+ PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
if (new_color_type & PNG_COLOR_MASK_PALETTE) {
// Assigns indices to the palette, and writes the encoded palette to the
@@ -666,11 +649,9 @@ bool WritePng(IAaptContext* context, const Image* image,
}
png_write_row(write_ptr, out_row.get());
}
- } else if (new_color_type == PNG_COLOR_TYPE_GRAY ||
- new_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
+ } else if (new_color_type == PNG_COLOR_TYPE_GRAY || new_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
const size_t bpp = new_color_type == PNG_COLOR_TYPE_GRAY ? 1 : 2;
- auto out_row =
- std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
+ auto out_row = std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
for (int32_t y = 0; y < image->height; y++) {
png_const_bytep in_row = image->rows[y];
@@ -691,8 +672,7 @@ bool WritePng(IAaptContext* context, const Image* image,
// The image is convertible to grayscale, use linear-luminance of
// sRGB colorspace:
// https://en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscale
- out_row[x * bpp] =
- (png_byte)(rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
+ out_row[x * bpp] = (png_byte)(rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
}
if (bpp == 2) {
@@ -747,4 +727,4 @@ bool WritePng(IAaptContext* context, const Image* image,
return true;
}
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/io/BigBufferStream.h b/libs/androidfw/include/androidfw/BigBufferStream.h
index 63a5e5756ed4..e55fe0d653cc 100644
--- a/tools/aapt2/io/BigBufferStream.h
+++ b/libs/androidfw/include/androidfw/BigBufferStream.h
@@ -14,18 +14,16 @@
* limitations under the License.
*/
-#ifndef AAPT_IO_BIGBUFFERSTREAM_H
-#define AAPT_IO_BIGBUFFERSTREAM_H
+#pragma once
-#include "androidfw/BigBuffer.h"
-#include "io/Io.h"
+#include "BigBuffer.h"
+#include "Streams.h"
-namespace aapt {
-namespace io {
+namespace android {
class BigBufferInputStream : public KnownSizeInputStream {
public:
- inline explicit BigBufferInputStream(const android::BigBuffer* buffer)
+ inline explicit BigBufferInputStream(const BigBuffer* buffer)
: buffer_(buffer), iter_(buffer->begin()) {
}
virtual ~BigBufferInputStream() = default;
@@ -44,18 +42,20 @@ class BigBufferInputStream : public KnownSizeInputStream {
size_t TotalSize() const override;
+ bool ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) override;
+
private:
DISALLOW_COPY_AND_ASSIGN(BigBufferInputStream);
- const android::BigBuffer* buffer_;
- android::BigBuffer::const_iterator iter_;
+ const BigBuffer* buffer_;
+ BigBuffer::const_iterator iter_;
size_t offset_ = 0;
size_t bytes_read_ = 0;
};
class BigBufferOutputStream : public OutputStream {
public:
- inline explicit BigBufferOutputStream(android::BigBuffer* buffer) : buffer_(buffer) {
+ inline explicit BigBufferOutputStream(BigBuffer* buffer) : buffer_(buffer) {
}
virtual ~BigBufferOutputStream() = default;
@@ -70,10 +70,7 @@ class BigBufferOutputStream : public OutputStream {
private:
DISALLOW_COPY_AND_ASSIGN(BigBufferOutputStream);
- android::BigBuffer* buffer_;
+ BigBuffer* buffer_;
};
-} // namespace io
-} // namespace aapt
-
-#endif // AAPT_IO_BIGBUFFERSTREAM_H
+} // namespace android \ No newline at end of file
diff --git a/tools/aapt2/io/FileStream.h b/libs/androidfw/include/androidfw/FileStream.h
index 62d910f0b06a..fb84a91a00de 100644
--- a/tools/aapt2/io/FileStream.h
+++ b/libs/androidfw/include/androidfw/FileStream.h
@@ -14,19 +14,16 @@
* limitations under the License.
*/
-#ifndef AAPT_IO_FILESTREAM_H
-#define AAPT_IO_FILESTREAM_H
-
-#include "io/Io.h"
+#pragma once
#include <memory>
#include <string>
+#include "Streams.h"
#include "android-base/macros.h"
#include "android-base/unique_fd.h"
-namespace aapt {
-namespace io {
+namespace android {
constexpr size_t kDefaultBufferCapacity = 4096u;
@@ -48,6 +45,8 @@ class FileInputStream : public InputStream {
std::string GetError() const override;
+ bool ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) override;
+
private:
DISALLOW_COPY_AND_ASSIGN(FileInputStream);
@@ -101,7 +100,4 @@ class FileOutputStream : public OutputStream {
size_t total_byte_count_ = 0u;
};
-} // namespace io
-} // namespace aapt
-
-#endif // AAPT_IO_FILESTREAM_H
+} // namespace android \ No newline at end of file
diff --git a/tools/aapt2/compile/Image.h b/libs/androidfw/include/androidfw/Image.h
index db0b945e1f18..c18c34c25bf9 100644
--- a/tools/aapt2/compile/Image.h
+++ b/libs/androidfw/include/androidfw/Image.h
@@ -14,8 +14,7 @@
* limitations under the License.
*/
-#ifndef AAPT_COMPILE_IMAGE_H
-#define AAPT_COMPILE_IMAGE_H
+#pragma once
#include <cstdint>
#include <memory>
@@ -24,7 +23,7 @@
#include "android-base/macros.h"
-namespace aapt {
+namespace android {
/**
* An in-memory image, loaded from disk, with pixels in RGBA_8888 format.
@@ -37,7 +36,7 @@ class Image {
* A `height` sized array of pointers, where each element points to a
* `width` sized row of RGBA_8888 pixels.
*/
- std::unique_ptr<uint8_t* []> rows;
+ std::unique_ptr<uint8_t*[]> rows;
/**
* The width of the image in RGBA_8888 pixels. This is int32_t because of
@@ -72,7 +71,8 @@ struct Range {
int32_t end = 0;
explicit Range() = default;
- inline explicit Range(int32_t s, int32_t e) : start(s), end(e) {}
+ inline explicit Range(int32_t s, int32_t e) : start(s), end(e) {
+ }
};
inline bool operator==(const Range& left, const Range& right) {
@@ -93,7 +93,8 @@ struct Bounds {
explicit Bounds() = default;
inline explicit Bounds(int32_t l, int32_t t, int32_t r, int32_t b)
- : left(l), top(t), right(r), bottom(b) {}
+ : left(l), top(t), right(r), bottom(b) {
+ }
bool nonZero() const;
};
@@ -103,8 +104,8 @@ inline bool Bounds::nonZero() const {
}
inline bool operator==(const Bounds& left, const Bounds& right) {
- return left.left == right.left && left.top == right.top &&
- left.right == right.right && left.bottom == right.bottom;
+ return left.left == right.left && left.top == right.top && left.right == right.right &&
+ left.bottom == right.bottom;
}
/**
@@ -115,8 +116,7 @@ inline bool operator==(const Bounds& left, const Bounds& right) {
class NinePatch {
public:
static std::unique_ptr<NinePatch> Create(uint8_t** rows, const int32_t width,
- const int32_t height,
- std::string* err_out);
+ const int32_t height, std::string* err_out);
/**
* Packs the RGBA_8888 data pointed to by pixel into a uint32_t
@@ -204,6 +204,4 @@ class NinePatch {
::std::ostream& operator<<(::std::ostream& out, const Bounds& bounds);
::std::ostream& operator<<(::std::ostream& out, const NinePatch& nine_patch);
-} // namespace aapt
-
-#endif /* AAPT_COMPILE_IMAGE_H */
+} // namespace android \ No newline at end of file
diff --git a/tools/aapt2/compile/Png.h b/libs/androidfw/include/androidfw/Png.h
index a8b7dd18f12f..2ece43e08110 100644
--- a/tools/aapt2/compile/Png.h
+++ b/libs/androidfw/include/androidfw/Png.h
@@ -14,22 +14,18 @@
* limitations under the License.
*/
-#ifndef AAPT_PNG_H
-#define AAPT_PNG_H
+#pragma once
-#include <iostream>
#include <string>
+#include "BigBuffer.h"
+#include "IDiagnostics.h"
+#include "Image.h"
+#include "Source.h"
+#include "Streams.h"
#include "android-base/macros.h"
-#include "androidfw/BigBuffer.h"
-#include "androidfw/IDiagnostics.h"
-#include "androidfw/Source.h"
-#include "compile/Image.h"
-#include "io/Io.h"
-#include "process/IResourceTableConsumer.h"
-
-namespace aapt {
+namespace android {
// Size in bytes of the PNG signature.
constexpr size_t kPngSignatureSize = 8u;
@@ -42,32 +38,36 @@ struct PngOptions {
*/
class Png {
public:
- explicit Png(android::IDiagnostics* diag) : mDiag(diag) {
+ explicit Png(IDiagnostics* diag) : mDiag(diag) {
}
- bool process(const android::Source& source, std::istream* input, android::BigBuffer* outBuffer,
+ bool process(const Source& source, std::istream* input, BigBuffer* outBuffer,
const PngOptions& options);
private:
DISALLOW_COPY_AND_ASSIGN(Png);
- android::IDiagnostics* mDiag;
+ IDiagnostics* mDiag;
};
/**
* An InputStream that filters out unimportant PNG chunks.
*/
-class PngChunkFilter : public io::InputStream {
+class PngChunkFilter : public InputStream {
public:
- explicit PngChunkFilter(android::StringPiece data);
+ explicit PngChunkFilter(StringPiece data);
virtual ~PngChunkFilter() = default;
bool Next(const void** buffer, size_t* len) override;
void BackUp(size_t count) override;
- bool CanRewind() const override { return true; }
+ bool CanRewind() const override {
+ return true;
+ }
bool Rewind() override;
- size_t ByteCount() const override { return window_start_; }
+ size_t ByteCount() const override {
+ return window_start_;
+ }
bool HadError() const override {
return !error_msg_.empty();
@@ -81,26 +81,20 @@ class PngChunkFilter : public io::InputStream {
bool ConsumeWindow(const void** buffer, size_t* len);
- android::StringPiece data_;
+ StringPiece data_;
size_t window_start_ = 0;
size_t window_end_ = 0;
std::string error_msg_;
};
-
/**
* Reads a PNG from the InputStream into memory as an RGBA Image.
*/
-std::unique_ptr<Image> ReadPng(IAaptContext* context, const android::Source& source,
- io::InputStream* in);
+std::unique_ptr<Image> ReadPng(InputStream* in, IDiagnostics* diag);
/**
* Writes the RGBA Image, with optional 9-patch meta-data, into the OutputStream
* as a PNG.
*/
-bool WritePng(IAaptContext* context, const Image* image,
- const NinePatch* nine_patch, io::OutputStream* out,
- const PngOptions& options);
-
-} // namespace aapt
-
-#endif // AAPT_PNG_H
+bool WritePng(const Image* image, const NinePatch* nine_patch, OutputStream* out,
+ const PngOptions& options, IDiagnostics* diag, bool verbose);
+} // namespace android \ No newline at end of file
diff --git a/tools/aapt2/io/Io.h b/libs/androidfw/include/androidfw/Streams.h
index e1df23a698f5..2daf0e2fb06d 100644
--- a/tools/aapt2/io/Io.h
+++ b/libs/androidfw/include/androidfw/Streams.h
@@ -14,13 +14,12 @@
* limitations under the License.
*/
-#ifndef AAPT_IO_IO_H
-#define AAPT_IO_IO_H
+#pragma once
#include <string>
+#include "android-base/off64_t.h"
-namespace aapt {
-namespace io {
+namespace android {
// InputStream interface that mimics protobuf's ZeroCopyInputStream,
// with added error handling methods to better report issues.
@@ -41,21 +40,34 @@ class InputStream {
virtual void BackUp(size_t count) = 0;
// Returns true if this InputStream can rewind. If so, Rewind() can be called.
- virtual bool CanRewind() const { return false; };
+ virtual bool CanRewind() const {
+ return false;
+ };
// Rewinds the stream to the beginning so it can be read again.
// Returns true if the rewind succeeded.
// This does nothing if CanRewind() returns false.
- virtual bool Rewind() { return false; }
+ virtual bool Rewind() {
+ return false;
+ }
// Returns the number of bytes that have been read from the stream.
virtual size_t ByteCount() const = 0;
// Returns an error message if HadError() returned true.
- virtual std::string GetError() const { return {}; }
+ virtual std::string GetError() const {
+ return {};
+ }
// Returns true if an error occurred. Errors are permanent.
virtual bool HadError() const = 0;
+
+ virtual bool ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) {
+ (void)data;
+ (void)byte_count;
+ (void)offset;
+ return false;
+ }
};
// A sub-InputStream interface that knows the total size of its stream.
@@ -87,13 +99,12 @@ class OutputStream {
virtual size_t ByteCount() const = 0;
// Returns an error message if HadError() returned true.
- virtual std::string GetError() const { return {}; }
+ virtual std::string GetError() const {
+ return {};
+ }
// Returns true if an error occurred. Errors are permanent.
virtual bool HadError() const = 0;
};
-} // namespace io
-} // namespace aapt
-
-#endif /* AAPT_IO_IO_H */
+} // namespace android \ No newline at end of file
diff --git a/tools/aapt2/io/FileStream_test.cpp b/libs/androidfw/tests/FileStream_test.cpp
index cc9cd2808a0c..978597507a6d 100644
--- a/tools/aapt2/io/FileStream_test.cpp
+++ b/libs/androidfw/tests/FileStream_test.cpp
@@ -14,20 +14,21 @@
* limitations under the License.
*/
-#include "io/FileStream.h"
+#include "androidfw/FileStream.h"
+#include "androidfw/StringPiece.h"
#include "android-base/file.h"
#include "android-base/macros.h"
-#include "test/Test.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
using ::android::StringPiece;
using ::testing::Eq;
using ::testing::NotNull;
using ::testing::StrEq;
-namespace aapt {
-namespace io {
+namespace android {
TEST(FileInputStreamTest, NextAndBackup) {
std::string input = "this is a cool string";
@@ -123,5 +124,4 @@ TEST(FileOutputStreamTest, NextAndBackup) {
EXPECT_THAT(actual, StrEq(input));
}
-} // namespace io
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/compile/NinePatch_test.cpp b/libs/androidfw/tests/NinePatch_test.cpp
index f54bb2e62842..7ee8e9ebd624 100644
--- a/tools/aapt2/compile/NinePatch_test.cpp
+++ b/libs/androidfw/tests/NinePatch_test.cpp
@@ -14,11 +14,11 @@
* limitations under the License.
*/
-#include "compile/Image.h"
+#include "androidfw/Image.h"
+#include "androidfw/ResourceTypes.h"
+#include "gtest/gtest.h"
-#include "test/Test.h"
-
-namespace aapt {
+namespace android {
// Pixels are in RGBA_8888 packing.
@@ -33,16 +33,19 @@ namespace aapt {
#define TRANS "\x00\x00\x00\x00"
static uint8_t* k2x2[] = {
- (uint8_t*)WHITE WHITE, (uint8_t*)WHITE WHITE,
+ (uint8_t*)WHITE WHITE,
+ (uint8_t*)WHITE WHITE,
};
static uint8_t* kMixedNeutralColor3x3[] = {
- (uint8_t*)WHITE BLACK TRANS, (uint8_t*)TRANS RED TRANS,
+ (uint8_t*)WHITE BLACK TRANS,
+ (uint8_t*)TRANS RED TRANS,
(uint8_t*)WHITE WHITE WHITE,
};
static uint8_t* kTransparentNeutralColor3x3[] = {
- (uint8_t*)TRANS BLACK TRANS, (uint8_t*)BLACK RED BLACK,
+ (uint8_t*)TRANS BLACK TRANS,
+ (uint8_t*)BLACK RED BLACK,
(uint8_t*)TRANS BLACK TRANS,
};
@@ -66,55 +69,44 @@ static uint8_t* kMultipleStretch10x7[] = {
};
static uint8_t* kPadding6x5[] = {
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE BLACK,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE BLACK, (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
(uint8_t*)WHITE WHITE BLACK BLACK WHITE WHITE,
};
static uint8_t* kLayoutBoundsWrongEdge3x3[] = {
- (uint8_t*)WHITE RED WHITE, (uint8_t*)RED WHITE WHITE,
+ (uint8_t*)WHITE RED WHITE,
+ (uint8_t*)RED WHITE WHITE,
(uint8_t*)WHITE WHITE WHITE,
};
static uint8_t* kLayoutBoundsNotEdgeAligned5x5[] = {
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE RED, (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
(uint8_t*)WHITE WHITE RED WHITE WHITE,
};
static uint8_t* kLayoutBounds5x5[] = {
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE RED,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE RED,
(uint8_t*)WHITE RED WHITE RED WHITE,
};
static uint8_t* kAsymmetricLayoutBounds5x5[] = {
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE RED,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
(uint8_t*)WHITE RED WHITE WHITE WHITE,
};
static uint8_t* kPaddingAndLayoutBounds5x5[] = {
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
- (uint8_t*)WHITE WHITE WHITE WHITE BLACK,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE RED,
+ (uint8_t*)WHITE WHITE WHITE WHITE BLACK, (uint8_t*)WHITE WHITE WHITE WHITE RED,
(uint8_t*)WHITE RED BLACK RED WHITE,
};
static uint8_t* kColorfulImage5x5[] = {
- (uint8_t*)WHITE BLACK WHITE BLACK WHITE,
- (uint8_t*)BLACK RED BLUE GREEN WHITE,
- (uint8_t*)BLACK RED GREEN GREEN WHITE,
- (uint8_t*)WHITE TRANS BLUE GREEN WHITE,
+ (uint8_t*)WHITE BLACK WHITE BLACK WHITE, (uint8_t*)BLACK RED BLUE GREEN WHITE,
+ (uint8_t*)BLACK RED GREEN GREEN WHITE, (uint8_t*)WHITE TRANS BLUE GREEN WHITE,
(uint8_t*)WHITE WHITE WHITE WHITE WHITE,
};
@@ -145,33 +137,21 @@ static uint8_t* kOutlineTranslucent10x10[] = {
};
static uint8_t* kOutlineOffsetTranslucent12x10[] = {
- (uint8_t*)
- WHITE WHITE WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
- (uint8_t*)
- WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
};
static uint8_t* kOutlineRadius5x5[] = {
- (uint8_t*)WHITE BLACK BLACK BLACK WHITE,
- (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
- (uint8_t*)BLACK GREEN GREEN GREEN WHITE,
- (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
+ (uint8_t*)WHITE BLACK BLACK BLACK WHITE, (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
+ (uint8_t*)BLACK GREEN GREEN GREEN WHITE, (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
(uint8_t*)WHITE WHITE WHITE WHITE WHITE,
};
@@ -195,14 +175,12 @@ TEST(NinePatchTest, MixedNeutralColors) {
TEST(NinePatchTest, TransparentNeutralColor) {
std::string err;
- EXPECT_NE(nullptr,
- NinePatch::Create(kTransparentNeutralColor3x3, 3, 3, &err));
+ EXPECT_NE(nullptr, NinePatch::Create(kTransparentNeutralColor3x3, 3, 3, &err));
}
TEST(NinePatchTest, SingleStretchRegion) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kSingleStretch7x6, 7, 6, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kSingleStretch7x6, 7, 6, &err);
ASSERT_NE(nullptr, nine_patch);
ASSERT_EQ(1u, nine_patch->horizontal_stretch_regions.size());
@@ -214,8 +192,7 @@ TEST(NinePatchTest, SingleStretchRegion) {
TEST(NinePatchTest, MultipleStretchRegions) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kMultipleStretch10x7, 10, 7, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kMultipleStretch10x7, 10, 7, &err);
ASSERT_NE(nullptr, nine_patch);
ASSERT_EQ(3u, nine_patch->horizontal_stretch_regions.size());
@@ -231,16 +208,14 @@ TEST(NinePatchTest, MultipleStretchRegions) {
TEST(NinePatchTest, InferPaddingFromStretchRegions) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kMultipleStretch10x7, 10, 7, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kMultipleStretch10x7, 10, 7, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(1, 0, 1, 0), nine_patch->padding);
}
TEST(NinePatchTest, Padding) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kPadding6x5, 6, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kPadding6x5, 6, 5, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(1, 1, 1, 1), nine_patch->padding);
}
@@ -253,15 +228,13 @@ TEST(NinePatchTest, LayoutBoundsAreOnWrongEdge) {
TEST(NinePatchTest, LayoutBoundsMustTouchEdges) {
std::string err;
- EXPECT_EQ(nullptr,
- NinePatch::Create(kLayoutBoundsNotEdgeAligned5x5, 5, 5, &err));
+ EXPECT_EQ(nullptr, NinePatch::Create(kLayoutBoundsNotEdgeAligned5x5, 5, 5, &err));
EXPECT_FALSE(err.empty());
}
TEST(NinePatchTest, LayoutBounds) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kLayoutBounds5x5, 5, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kLayoutBounds5x5, 5, 5, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(1, 1, 1, 1), nine_patch->layout_bounds);
@@ -272,8 +245,7 @@ TEST(NinePatchTest, LayoutBounds) {
TEST(NinePatchTest, PaddingAndLayoutBounds) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kPaddingAndLayoutBounds5x5, 5, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kPaddingAndLayoutBounds5x5, 5, 5, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(1, 1, 1, 1), nine_patch->padding);
EXPECT_EQ(Bounds(1, 1, 1, 1), nine_patch->layout_bounds);
@@ -281,25 +253,20 @@ TEST(NinePatchTest, PaddingAndLayoutBounds) {
TEST(NinePatchTest, RegionColorsAreCorrect) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kColorfulImage5x5, 5, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kColorfulImage5x5, 5, 5, &err);
ASSERT_NE(nullptr, nine_patch);
std::vector<uint32_t> expected_colors = {
- NinePatch::PackRGBA((uint8_t*)RED),
- (uint32_t)android::Res_png_9patch::NO_COLOR,
- NinePatch::PackRGBA((uint8_t*)GREEN),
- (uint32_t)android::Res_png_9patch::TRANSPARENT_COLOR,
- NinePatch::PackRGBA((uint8_t*)BLUE),
- NinePatch::PackRGBA((uint8_t*)GREEN),
+ NinePatch::PackRGBA((uint8_t*)RED), (uint32_t)android::Res_png_9patch::NO_COLOR,
+ NinePatch::PackRGBA((uint8_t*)GREEN), (uint32_t)android::Res_png_9patch::TRANSPARENT_COLOR,
+ NinePatch::PackRGBA((uint8_t*)BLUE), NinePatch::PackRGBA((uint8_t*)GREEN),
};
EXPECT_EQ(expected_colors, nine_patch->region_colors);
}
TEST(NinePatchTest, OutlineFromOpaqueImage) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kOutlineOpaque10x10, 10, 10, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kOutlineOpaque10x10, 10, 10, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(2, 2, 2, 2), nine_patch->outline);
EXPECT_EQ(0x000000ffu, nine_patch->outline_alpha);
@@ -308,8 +275,7 @@ TEST(NinePatchTest, OutlineFromOpaqueImage) {
TEST(NinePatchTest, OutlineFromTranslucentImage) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kOutlineTranslucent10x10, 10, 10, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kOutlineTranslucent10x10, 10, 10, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(3, 3, 3, 3), nine_patch->outline);
EXPECT_EQ(0x000000b3u, nine_patch->outline_alpha);
@@ -337,8 +303,7 @@ TEST(NinePatchTest, OutlineFromOffCenterImage) {
TEST(NinePatchTest, OutlineRadius) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kOutlineRadius5x5, 5, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kOutlineRadius5x5, 5, 5, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(0, 0, 0, 0), nine_patch->outline);
EXPECT_EQ(3.4142f, nine_patch->outline_radius);
@@ -353,8 +318,7 @@ TEST(NinePatchTest, OutlineRadius) {
TEST(NinePatchTest, SerializePngEndianness) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kStretchAndPadding5x5, 5, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kStretchAndPadding5x5, 5, 5, &err);
ASSERT_NE(nullptr, nine_patch);
size_t len;
@@ -374,4 +338,4 @@ TEST(NinePatchTest, SerializePngEndianness) {
EXPECT_TRUE(BigEndianOne(cursor + 12));
}
-} // namespace aapt
+} // namespace android
diff --git a/libs/hwui/Mesh.cpp b/libs/hwui/Mesh.cpp
index e59bc9565a59..37a7d74330e9 100644
--- a/libs/hwui/Mesh.cpp
+++ b/libs/hwui/Mesh.cpp
@@ -90,8 +90,8 @@ std::tuple<bool, SkString> Mesh::validate() {
FAIL_MESH_VALIDATE("%s mode requires at least %zu vertices but vertex count is %zu.",
modeToStr(meshMode), min_vcount_for_mode(meshMode), mVertexCount);
}
- SkASSERT(!fICount);
- SkASSERT(!fIOffset);
+ LOG_ALWAYS_FATAL_IF(mIndexCount != 0);
+ LOG_ALWAYS_FATAL_IF(mIndexOffset != 0);
}
if (!sm.ok()) {
diff --git a/libs/hwui/jni/YuvToJpegEncoder.cpp b/libs/hwui/jni/YuvToJpegEncoder.cpp
index c55066af3612..0275e4f13b3b 100644
--- a/libs/hwui/jni/YuvToJpegEncoder.cpp
+++ b/libs/hwui/jni/YuvToJpegEncoder.cpp
@@ -2,6 +2,7 @@
#include "SkStream.h"
#include "YuvToJpegEncoder.h"
#include <ui/PixelFormat.h>
+#include <utils/Errors.h>
#include <hardware/hardware.h>
#include "graphics_jni_helpers.h"
@@ -295,7 +296,7 @@ void Yuv422IToJpegEncoder::configSamplingFactors(jpeg_compress_struct* cinfo) {
}
///////////////////////////////////////////////////////////////////////////////
-using namespace android::ultrahdr;
+using namespace ultrahdr;
ultrahdr_color_gamut P010Yuv420ToJpegREncoder::findColorGamut(JNIEnv* env, int aDataSpace) {
switch (aDataSpace & ADataSpace::STANDARD_MASK) {
diff --git a/libs/hwui/jni/YuvToJpegEncoder.h b/libs/hwui/jni/YuvToJpegEncoder.h
index a3a322453be7..629f1e64726b 100644
--- a/libs/hwui/jni/YuvToJpegEncoder.h
+++ b/libs/hwui/jni/YuvToJpegEncoder.h
@@ -108,7 +108,7 @@ public:
* @param aDataSpace data space defined in data_space.h.
* @return color gamut for JPEG/R.
*/
- static android::ultrahdr::ultrahdr_color_gamut findColorGamut(JNIEnv* env, int aDataSpace);
+ static ultrahdr::ultrahdr_color_gamut findColorGamut(JNIEnv* env, int aDataSpace);
/** Map data space (defined in DataSpace.java and data_space.h) to the transfer function
* used in JPEG/R
@@ -117,8 +117,8 @@ public:
* @param aDataSpace data space defined in data_space.h.
* @return color gamut for JPEG/R.
*/
- static android::ultrahdr::ultrahdr_transfer_function findHdrTransferFunction(
- JNIEnv* env, int aDataSpace);
+ static ultrahdr::ultrahdr_transfer_function findHdrTransferFunction(JNIEnv* env,
+ int aDataSpace);
};
#endif // _ANDROID_GRAPHICS_YUV_TO_JPEG_ENCODER_H_
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
index 12cb69da772b..d74748936d15 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
@@ -105,7 +105,7 @@ IRenderPipeline::DrawResult SkiaVulkanPipeline::draw(
ProfileType::None != Properties::getProfileType())) {
SkCanvas* profileCanvas = backBuffer->getCanvas();
SkAutoCanvasRestore saver(profileCanvas, true);
- profileCanvas->concat(mVkSurface->getCurrentPreTransform());
+ profileCanvas->concat(preTransform);
SkiaProfileRenderer profileRenderer(profileCanvas, frame.width(), frame.height());
profiler->draw(profileRenderer);
}
diff --git a/location/api/system-current.txt b/location/api/system-current.txt
index a1d6ab5798e1..b1cf96d41497 100644
--- a/location/api/system-current.txt
+++ b/location/api/system-current.txt
@@ -113,13 +113,13 @@ package android.location {
}
public final class GnssMeasurementRequest implements android.os.Parcelable {
- method @NonNull public android.os.WorkSource getWorkSource();
+ method @FlaggedApi(Flags.FLAG_GNSS_API_MEASUREMENT_REQUEST_WORK_SOURCE) @NonNull public android.os.WorkSource getWorkSource();
method public boolean isCorrelationVectorOutputsEnabled();
}
public static final class GnssMeasurementRequest.Builder {
method @NonNull public android.location.GnssMeasurementRequest.Builder setCorrelationVectorOutputsEnabled(boolean);
- method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.location.GnssMeasurementRequest.Builder setWorkSource(@Nullable android.os.WorkSource);
+ method @FlaggedApi(Flags.FLAG_GNSS_API_MEASUREMENT_REQUEST_WORK_SOURCE) @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.location.GnssMeasurementRequest.Builder setWorkSource(@Nullable android.os.WorkSource);
}
public final class GnssReflectingPlane implements android.os.Parcelable {
diff --git a/location/java/android/location/GnssMeasurementRequest.java b/location/java/android/location/GnssMeasurementRequest.java
index 65af3928bd02..2f0835ab8af5 100644
--- a/location/java/android/location/GnssMeasurementRequest.java
+++ b/location/java/android/location/GnssMeasurementRequest.java
@@ -17,11 +17,13 @@
package android.location;
import android.Manifest;
+import android.annotation.FlaggedApi;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
+import android.location.flags.Flags;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.WorkSource;
@@ -121,6 +123,7 @@ public final class GnssMeasurementRequest implements Parcelable {
*
* @hide
*/
+ @FlaggedApi(Flags.FLAG_GNSS_API_MEASUREMENT_REQUEST_WORK_SOURCE)
@SystemApi
public @NonNull WorkSource getWorkSource() {
return mWorkSource;
@@ -298,6 +301,7 @@ public final class GnssMeasurementRequest implements Parcelable {
*
* @hide
*/
+ @FlaggedApi(Flags.FLAG_GNSS_API_MEASUREMENT_REQUEST_WORK_SOURCE)
@SystemApi
@RequiresPermission(Manifest.permission.UPDATE_DEVICE_STATS)
public @NonNull Builder setWorkSource(@Nullable WorkSource workSource) {
diff --git a/location/java/android/location/flags/gnss.aconfig b/location/java/android/location/flags/gnss.aconfig
index c471a2749617..b6055e818f8c 100644
--- a/location/java/android/location/flags/gnss.aconfig
+++ b/location/java/android/location/flags/gnss.aconfig
@@ -5,4 +5,18 @@ flag {
namespace: "location"
description: "Flag for GNSS API for NavIC L1"
bug: "302199306"
-} \ No newline at end of file
+}
+
+flag {
+ name: "gnss_call_stop_before_set_position_mode"
+ namespace: "location"
+ description: "Flag for calling stop() before setPositionMode()"
+ bug: "306874828"
+}
+
+flag {
+ name: "gnss_api_measurement_request_work_source"
+ namespace: "location"
+ description: "Flag for GnssMeasurementRequest WorkSource API"
+ bug: "295235160"
+}
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index d14775fa9ad9..5c8758a6aa73 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -739,7 +739,7 @@ interface IAudioService {
oneway void stopLoudnessCodecUpdates(int piid);
- oneway void addLoudnessCodecInfo(int piid, in LoudnessCodecInfo codecInfo);
+ oneway void addLoudnessCodecInfo(int piid, int mediaCodecHash, in LoudnessCodecInfo codecInfo);
oneway void removeLoudnessCodecInfo(int piid, in LoudnessCodecInfo codecInfo);
diff --git a/media/java/android/media/LoudnessCodecConfigurator.java b/media/java/android/media/LoudnessCodecConfigurator.java
index 92f337244daf..de9d87c0b28c 100644
--- a/media/java/android/media/LoudnessCodecConfigurator.java
+++ b/media/java/android/media/LoudnessCodecConfigurator.java
@@ -30,10 +30,10 @@ import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;
@@ -47,9 +47,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
* parameter updates are defined by the CTA-2075 standard.
* <p>A new object should be instantiated for each {@link AudioTrack} with the help
* of {@link #create()} or {@link #create(Executor, OnLoudnessCodecUpdateListener)}.
- *
- * TODO: remove hide once API is final
- * @hide
*/
@FlaggedApi(FLAG_LOUDNESS_CONFIGURATOR_API)
public class LoudnessCodecConfigurator {
@@ -57,9 +54,6 @@ public class LoudnessCodecConfigurator {
/**
* Listener used for receiving asynchronous loudness metadata updates.
- *
- * TODO: remove hide once API is final
- * @hide
*/
@FlaggedApi(FLAG_LOUDNESS_CONFIGURATOR_API)
public interface OnLoudnessCodecUpdateListener {
@@ -76,9 +70,6 @@ public class LoudnessCodecConfigurator {
* @return a Bundle which contains the original computed codecValues
* aggregated with user edits. The platform will configure the associated
* MediaCodecs with the returned Bundle params.
- *
- * TODO: remove hide once API is final
- * @hide
*/
@FlaggedApi(FLAG_LOUDNESS_CONFIGURATOR_API)
@NonNull
@@ -112,9 +103,6 @@ public class LoudnessCodecConfigurator {
* Otherwise, use {@link #create(Executor, OnLoudnessCodecUpdateListener)}.
*
* @return the {@link LoudnessCodecConfigurator} instance
- *
- * TODO: remove hide once API is final
- * @hide
*/
@FlaggedApi(FLAG_LOUDNESS_CONFIGURATOR_API)
public static @NonNull LoudnessCodecConfigurator create() {
@@ -133,9 +121,6 @@ public class LoudnessCodecConfigurator {
* @param listener used for receiving updates
*
* @return the {@link LoudnessCodecConfigurator} instance
- *
- * TODO: remove hide once API is final
- * @hide
*/
@FlaggedApi(FLAG_LOUDNESS_CONFIGURATOR_API)
public static @NonNull LoudnessCodecConfigurator create(
@@ -200,12 +185,9 @@ public class LoudnessCodecConfigurator {
* method will have the effect of clearing the existing set
* {@link AudioTrack} and will stop receiving asynchronous
* loudness updates
- *
- * TODO: remove hide once API is final
- * @hide
*/
@FlaggedApi(FLAG_LOUDNESS_CONFIGURATOR_API)
- public void setAudioTrack(AudioTrack audioTrack) {
+ public void setAudioTrack(@Nullable AudioTrack audioTrack) {
List<LoudnessCodecInfo> codecInfos;
int piid = PLAYER_PIID_INVALID;
int oldPiid = PLAYER_PIID_INVALID;
@@ -250,10 +232,11 @@ public class LoudnessCodecConfigurator {
* previously added.
*
* @param mediaCodec the codec to start receiving asynchronous loudness
- * updates
- *
- * TODO: remove hide once API is final
- * @hide
+ * updates. The codec has to be in a configured or started
+ * state in order to add it for loudness updates.
+ * @throws IllegalArgumentException if the {@code mediaCodec} was not configured,
+ * does not contain loudness metadata or if it
+ * was already added before
*/
@FlaggedApi(FLAG_LOUDNESS_CONFIGURATOR_API)
public void addMediaCodec(@NonNull MediaCodec mediaCodec) {
@@ -262,31 +245,32 @@ public class LoudnessCodecConfigurator {
int piid = PLAYER_PIID_INVALID;
final LoudnessCodecInfo mcInfo = getCodecInfo(mc);
- if (mcInfo != null) {
- synchronized (mConfiguratorLock) {
- final AtomicBoolean containsCodec = new AtomicBoolean(false);
- Set<MediaCodec> newSet = mMediaCodecs.computeIfPresent(mcInfo, (info, codecSet) -> {
- containsCodec.set(!codecSet.add(mc));
- return codecSet;
- });
- if (newSet == null) {
- newSet = new HashSet<>();
- newSet.add(mc);
- mMediaCodecs.put(mcInfo, newSet);
- }
- if (containsCodec.get()) {
- Log.v(TAG, "Loudness configurator already added media codec " + mediaCodec);
- return;
- }
- if (mAudioTrack != null) {
- piid = mAudioTrack.getPlayerIId();
- }
+ if (mcInfo == null) {
+ throw new IllegalArgumentException("Could not extract codec loudness information");
+ }
+ synchronized (mConfiguratorLock) {
+ final AtomicBoolean containsCodec = new AtomicBoolean(false);
+ Set<MediaCodec> newSet = mMediaCodecs.computeIfPresent(mcInfo, (info, codecSet) -> {
+ containsCodec.set(!codecSet.add(mc));
+ return codecSet;
+ });
+ if (newSet == null) {
+ newSet = new HashSet<>();
+ newSet.add(mc);
+ mMediaCodecs.put(mcInfo, newSet);
}
-
- if (piid != PLAYER_PIID_INVALID) {
- mLcDispatcher.addLoudnessCodecInfo(piid, mcInfo);
+ if (containsCodec.get()) {
+ throw new IllegalArgumentException(
+ "Loudness configurator already added " + mediaCodec);
+ }
+ if (mAudioTrack != null) {
+ piid = mAudioTrack.getPlayerIId();
}
}
+
+ if (piid != PLAYER_PIID_INVALID) {
+ mLcDispatcher.addLoudnessCodecInfo(piid, mediaCodec.hashCode(), mcInfo);
+ }
}
/**
@@ -297,37 +281,44 @@ public class LoudnessCodecConfigurator {
* <p>No elements will be removed if the passed mediaCodec was not added before.
*
* @param mediaCodec the element to remove for receiving asynchronous updates
- *
- * TODO: remove hide once API is final
- * @hide
+ * @throws IllegalArgumentException if the {@code mediaCodec} was not configured,
+ * does not contain loudness metadata or if it
+ * was not added before
*/
@FlaggedApi(FLAG_LOUDNESS_CONFIGURATOR_API)
public void removeMediaCodec(@NonNull MediaCodec mediaCodec) {
int piid = PLAYER_PIID_INVALID;
LoudnessCodecInfo mcInfo;
- AtomicBoolean removed = new AtomicBoolean(false);
+ AtomicBoolean removedMc = new AtomicBoolean(false);
+ AtomicBoolean removeInfo = new AtomicBoolean(false);
mcInfo = getCodecInfo(Objects.requireNonNull(mediaCodec,
"MediaCodec for removeMediaCodec cannot be null"));
- if (mcInfo != null) {
- synchronized (mConfiguratorLock) {
- if (mAudioTrack != null) {
- piid = mAudioTrack.getPlayerIId();
+ if (mcInfo == null) {
+ throw new IllegalArgumentException("Could not extract codec loudness information");
+ }
+ synchronized (mConfiguratorLock) {
+ if (mAudioTrack != null) {
+ piid = mAudioTrack.getPlayerIId();
+ }
+ mMediaCodecs.computeIfPresent(mcInfo, (format, mcs) -> {
+ removedMc.set(mcs.remove(mediaCodec));
+ if (mcs.isEmpty()) {
+ // remove the entry
+ removeInfo.set(true);
+ return null;
}
- mMediaCodecs.computeIfPresent(mcInfo, (format, mcs) -> {
- removed.set(mcs.remove(mediaCodec));
- if (mcs.isEmpty()) {
- // remove the entry
- return null;
- }
- return mcs;
- });
+ return mcs;
+ });
+ if (!removedMc.get()) {
+ throw new IllegalArgumentException(
+ "Loudness configurator does not contain " + mediaCodec);
}
+ }
- if (piid != PLAYER_PIID_INVALID && removed.get()) {
- mLcDispatcher.removeLoudnessCodecInfo(piid, mcInfo);
- }
+ if (piid != PLAYER_PIID_INVALID && removeInfo.get()) {
+ mLcDispatcher.removeLoudnessCodecInfo(piid, mcInfo);
}
}
@@ -342,9 +333,6 @@ public class LoudnessCodecConfigurator {
*
* @return the {@link Bundle} containing the current loudness parameters. Caller is
* responsible to update the {@link MediaCodec}
- *
- * TODO: remove hide once API is final
- * @hide
*/
@FlaggedApi(FLAG_LOUDNESS_CONFIGURATOR_API)
@NonNull
@@ -375,9 +363,9 @@ public class LoudnessCodecConfigurator {
}
/** @hide */
- /*package*/ List<MediaCodec> getRegisteredMediaCodecList() {
+ /*package*/ Map<LoudnessCodecInfo, Set<MediaCodec>> getRegisteredMediaCodecs() {
synchronized (mConfiguratorLock) {
- return mMediaCodecs.values().stream().flatMap(Collection::stream).toList();
+ return mMediaCodecs;
}
}
@@ -397,40 +385,43 @@ public class LoudnessCodecConfigurator {
return null;
}
- final MediaFormat inputFormat = mediaCodec.getInputFormat();
- final String mimeType = inputFormat.getString(MediaFormat.KEY_MIME);
- if (MediaFormat.MIMETYPE_AUDIO_AAC.equalsIgnoreCase(mimeType)) {
- // check both KEY_AAC_PROFILE and KEY_PROFILE as some codecs may only recognize one of
- // these two keys
- int aacProfile = -1;
- int profile = -1;
- try {
- aacProfile = inputFormat.getInteger(MediaFormat.KEY_AAC_PROFILE);
- } catch (NullPointerException e) {
- // does not contain KEY_AAC_PROFILE. do nothing
- }
- try {
- profile = inputFormat.getInteger(MediaFormat.KEY_PROFILE);
- } catch (NullPointerException e) {
- // does not contain KEY_PROFILE. do nothing
- }
- if (aacProfile == MediaCodecInfo.CodecProfileLevel.AACObjectXHE
- || profile == MediaCodecInfo.CodecProfileLevel.AACObjectXHE) {
- lci.metadataType = CODEC_METADATA_TYPE_MPEG_D;
+ try {
+ final MediaFormat inputFormat = mediaCodec.getInputFormat();
+ final String mimeType = inputFormat.getString(MediaFormat.KEY_MIME);
+ if (MediaFormat.MIMETYPE_AUDIO_AAC.equalsIgnoreCase(mimeType)) {
+ // check both KEY_AAC_PROFILE and KEY_PROFILE as some codecs may only recognize
+ // one of these two keys
+ int aacProfile = -1;
+ int profile = -1;
+ try {
+ aacProfile = inputFormat.getInteger(MediaFormat.KEY_AAC_PROFILE);
+ } catch (NullPointerException e) {
+ // does not contain KEY_AAC_PROFILE. do nothing
+ }
+ try {
+ profile = inputFormat.getInteger(MediaFormat.KEY_PROFILE);
+ } catch (NullPointerException e) {
+ // does not contain KEY_PROFILE. do nothing
+ }
+ if (aacProfile == MediaCodecInfo.CodecProfileLevel.AACObjectXHE
+ || profile == MediaCodecInfo.CodecProfileLevel.AACObjectXHE) {
+ lci.metadataType = CODEC_METADATA_TYPE_MPEG_D;
+ } else {
+ lci.metadataType = CODEC_METADATA_TYPE_MPEG_4;
+ }
} else {
- lci.metadataType = CODEC_METADATA_TYPE_MPEG_4;
+ Log.w(TAG, "MediaCodec mime type not supported for loudness annotation");
+ return null;
}
- } else {
- Log.w(TAG, "MediaCodec mime type not supported for loudness annotation");
+
+ final MediaFormat outputFormat = mediaCodec.getOutputFormat();
+ lci.isDownmixing = outputFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT)
+ < inputFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "MediaCodec is not configured", e);
return null;
}
- final MediaFormat outputFormat = mediaCodec.getOutputFormat();
- lci.isDownmixing = outputFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT)
- < inputFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
-
- lci.mediaCodecHashCode = mediaCodec.hashCode();
-
return lci;
}
}
diff --git a/media/java/android/media/LoudnessCodecDispatcher.java b/media/java/android/media/LoudnessCodecDispatcher.java
index be881b11e545..b546a81b0498 100644
--- a/media/java/android/media/LoudnessCodecDispatcher.java
+++ b/media/java/android/media/LoudnessCodecDispatcher.java
@@ -27,12 +27,16 @@ import android.os.PersistableBundle;
import android.os.RemoteException;
import android.util.Log;
+import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.Executor;
/**
@@ -52,6 +56,9 @@ public class LoudnessCodecDispatcher implements CallbackUtil.DispatcherStub {
private final CallbackUtil.LazyListenerManager<OnLoudnessCodecUpdateListener>
mLoudnessListenerMgr = new CallbackUtil.LazyListenerManager<>();
+ private final Object mLock = new Object();
+
+ @GuardedBy("mLock")
private final HashMap<OnLoudnessCodecUpdateListener, LoudnessCodecConfigurator>
mConfiguratorListener = new HashMap<>();
@@ -66,38 +73,56 @@ public class LoudnessCodecDispatcher implements CallbackUtil.DispatcherStub {
@Override
public void dispatchLoudnessCodecParameterChange(int piid, PersistableBundle params) {
- mLoudnessListenerMgr.callListeners(listener ->
+ if (DEBUG) {
+ Log.d(TAG, "dispatchLoudnessCodecParameterChange for piid " + piid
+ + " persistable bundle: " + params);
+ }
+ mLoudnessListenerMgr.callListeners(listener -> {
+ synchronized (mLock) {
mConfiguratorListener.computeIfPresent(listener, (l, lcConfig) -> {
// send the appropriate bundle for the user to update
if (lcConfig.getAssignedTrackPiid() == piid) {
- final List<MediaCodec> mediaCodecs =
- lcConfig.getRegisteredMediaCodecList();
- for (MediaCodec mediaCodec : mediaCodecs) {
- final String infoKey = Integer.toString(mediaCodec.hashCode());
+ final Map<LoudnessCodecInfo, Set<MediaCodec>> mediaCodecsMap =
+ lcConfig.getRegisteredMediaCodecs();
+ for (LoudnessCodecInfo codecInfo : mediaCodecsMap.keySet()) {
+ final String infoKey = Integer.toString(codecInfo.hashCode());
+ Bundle bundle = null;
if (params.containsKey(infoKey)) {
- Bundle bundle = new Bundle(
- params.getPersistableBundle(infoKey));
- if (DEBUG) {
- Log.d(TAG,
- "Received for piid " + piid + " bundle: " + bundle);
+ bundle = new Bundle(params.getPersistableBundle(infoKey));
+ }
+
+ final Set<MediaCodec> mediaCodecs = mediaCodecsMap.get(codecInfo);
+ for (MediaCodec mediaCodec : mediaCodecs) {
+ final String mediaCodecKey = Integer.toString(
+ mediaCodec.hashCode());
+ if (bundle == null && !params.containsKey(mediaCodecKey)) {
+ continue;
+ }
+ boolean canBreak = false;
+ if (bundle == null) {
+ // key was set by media codec hash to update single codec
+ bundle = new Bundle(
+ params.getPersistableBundle(mediaCodecKey));
+ canBreak = true;
}
bundle =
LoudnessCodecUpdatesDispatcherStub.filterLoudnessParams(
- l.onLoudnessCodecUpdate(mediaCodec, bundle));
- if (DEBUG) {
- Log.d(TAG, "User changed for piid " + piid
- + " to filtered bundle: " + bundle);
- }
+ l.onLoudnessCodecUpdate(mediaCodec,
+ bundle));
if (!bundle.isDefinitelyEmpty()) {
mediaCodec.setParameters(bundle);
}
+ if (canBreak) {
+ break;
+ }
}
}
}
-
return lcConfig;
- }));
+ });
+ }
+ });
}
private static Bundle filterLoudnessParams(Bundle bundle) {
@@ -130,21 +155,33 @@ public class LoudnessCodecDispatcher implements CallbackUtil.DispatcherStub {
mLoudnessListenerMgr.addListener(
executor, listener, "addLoudnessCodecListener",
() -> dispatcher);
- mConfiguratorListener.put(listener, configurator);
+ synchronized (mLock) {
+ mConfiguratorListener.put(listener, configurator);
+ }
}
void removeLoudnessCodecListener(@NonNull LoudnessCodecConfigurator configurator) {
Objects.requireNonNull(configurator);
- for (Entry<OnLoudnessCodecUpdateListener, LoudnessCodecConfigurator> e :
- mConfiguratorListener.entrySet()) {
- if (e.getValue() == configurator) {
- final OnLoudnessCodecUpdateListener listener = e.getKey();
- mConfiguratorListener.remove(listener);
- mLoudnessListenerMgr.removeListener(listener, "removeLoudnessCodecListener");
- break;
+ OnLoudnessCodecUpdateListener listenerToRemove = null;
+ synchronized (mLock) {
+ Iterator<Entry<OnLoudnessCodecUpdateListener, LoudnessCodecConfigurator>> iterator =
+ mConfiguratorListener.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Entry<OnLoudnessCodecUpdateListener, LoudnessCodecConfigurator> e =
+ iterator.next();
+ if (e.getValue() == configurator) {
+ final OnLoudnessCodecUpdateListener listener = e.getKey();
+ iterator.remove();
+ listenerToRemove = listener;
+ break;
+ }
}
}
+ if (listenerToRemove != null) {
+ mLoudnessListenerMgr.removeListener(listenerToRemove,
+ "removeLoudnessCodecListener");
+ }
}
}
@@ -202,9 +239,10 @@ public class LoudnessCodecDispatcher implements CallbackUtil.DispatcherStub {
}
/** @hide */
- public void addLoudnessCodecInfo(int piid, @NonNull LoudnessCodecInfo mcInfo) {
+ public void addLoudnessCodecInfo(int piid, int mediaCodecHash,
+ @NonNull LoudnessCodecInfo mcInfo) {
try {
- mAudioService.addLoudnessCodecInfo(piid, mcInfo);
+ mAudioService.addLoudnessCodecInfo(piid, mediaCodecHash, mcInfo);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
diff --git a/media/java/android/media/LoudnessCodecInfo.aidl b/media/java/android/media/LoudnessCodecInfo.aidl
index fd695179057d..0ac5646a3047 100644
--- a/media/java/android/media/LoudnessCodecInfo.aidl
+++ b/media/java/android/media/LoudnessCodecInfo.aidl
@@ -23,7 +23,7 @@ package android.media;
*
* {@hide}
*/
-@JavaDerive(equals = true)
+@JavaDerive(equals = true, toString = true)
parcelable LoudnessCodecInfo {
/** Supported codec metadata types for loudness updates. */
@Backing(type="int")
@@ -37,7 +37,6 @@ parcelable LoudnessCodecInfo {
CODEC_METADATA_TYPE_DTS_UHD = 6
}
- int mediaCodecHashCode;
CodecMetadataType metadataType;
boolean isDownmixing;
} \ No newline at end of file
diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java
index 0a0a6263686a..ab7c27f70e05 100644
--- a/media/java/android/media/MediaCas.java
+++ b/media/java/android/media/MediaCas.java
@@ -272,7 +272,7 @@ public final class MediaCas implements AutoCloseable {
Log.d(TAG, "Trying to get AIDL service");
IMediaCasService serviceAidl =
IMediaCasService.Stub.asInterface(
- ServiceManager.getService(
+ ServiceManager.waitForDeclaredService(
IMediaCasService.DESCRIPTOR + "/default"));
if (serviceAidl != null) {
return serviceAidl;
diff --git a/media/java/android/media/tv/ad/TvAdManager.java b/media/java/android/media/tv/ad/TvAdManager.java
index aa5a290346b0..2b52c4b107b6 100644
--- a/media/java/android/media/tv/ad/TvAdManager.java
+++ b/media/java/android/media/tv/ad/TvAdManager.java
@@ -16,6 +16,10 @@
package android.media.tv.ad;
+import android.annotation.FlaggedApi;
+import android.annotation.SystemService;
+import android.content.Context;
+import android.media.tv.flags.Flags;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
@@ -23,14 +27,17 @@ import android.util.Log;
/**
* Central system API to the overall client-side TV AD architecture, which arbitrates interaction
* between applications and AD services.
- * @hide
*/
+@FlaggedApi(Flags.FLAG_ENABLE_AD_SERVICE_FW)
+@SystemService(Context.TV_AD_SERVICE)
public class TvAdManager {
+ // TODO: implement more methods and unhide APIs.
private static final String TAG = "TvAdManager";
private final ITvAdManager mService;
private final int mUserId;
+ /** @hide */
public TvAdManager(ITvAdManager service, int userId) {
mService = service;
mUserId = userId;
@@ -38,6 +45,7 @@ public class TvAdManager {
/**
* The Session provides the per-session functionality of AD service.
+ * @hide
*/
public static final class Session {
private final IBinder mToken;
diff --git a/media/java/android/media/tv/flags/media_tv.aconfig b/media/java/android/media/tv/flags/media_tv.aconfig
index a73d1ff72a17..018eaf6dc32f 100644
--- a/media/java/android/media/tv/flags/media_tv.aconfig
+++ b/media/java/android/media/tv/flags/media_tv.aconfig
@@ -5,4 +5,11 @@ flag {
namespace: "media_tv"
description: "Constants for standardizing broadcast visibility types."
bug: "222402395"
+}
+
+flag {
+ name: "enable_ad_service_fw"
+ namespace: "media_tv"
+ description: "Enable the TV client-side AD framework."
+ bug: "303506816"
} \ No newline at end of file
diff --git a/media/tests/LoudnessCodecApiTest/src/com/android/loudnesscodecapitest/LoudnessCodecConfiguratorTest.java b/media/tests/LoudnessCodecApiTest/src/com/android/loudnesscodecapitest/LoudnessCodecConfiguratorTest.java
index 65a9799431e7..c9e36b7f10bd 100644
--- a/media/tests/LoudnessCodecApiTest/src/com/android/loudnesscodecapitest/LoudnessCodecConfiguratorTest.java
+++ b/media/tests/LoudnessCodecApiTest/src/com/android/loudnesscodecapitest/LoudnessCodecConfiguratorTest.java
@@ -208,7 +208,7 @@ public class LoudnessCodecConfiguratorTest {
verify(mAudioService).startLoudnessCodecUpdates(eq(track.getPlayerIId()), anyList());
mLcc.addMediaCodec(createAndConfigureMediaCodec());
- verify(mAudioService).addLoudnessCodecInfo(eq(track.getPlayerIId()), any());
+ verify(mAudioService).addLoudnessCodecInfo(eq(track.getPlayerIId()), anyInt(), any());
}
@Test
diff --git a/media/tests/ringtone/res/raw/test_haptic_file.ahv b/media/tests/ringtone/res/raw/test_haptic_file.ahv
index 18c99c79814f..d6eba1a4d7ba 100644
--- a/media/tests/ringtone/res/raw/test_haptic_file.ahv
+++ b/media/tests/ringtone/res/raw/test_haptic_file.ahv
@@ -1,4 +1,4 @@
-<vibration>
+<vibration-effect>
<waveform-effect>
<waveform-entry durationMs="63" amplitude="255"/>
<waveform-entry durationMs="63" amplitude="231"/>
@@ -14,4 +14,4 @@
<waveform-entry durationMs="63" amplitude="0"/>
<waveform-entry durationMs="1250" amplitude="0"/>
</waveform-effect>
-</vibration>
+</vibration-effect>
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index fea6c5f95358..9f2a9ac4798d 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -336,6 +336,13 @@ LIBANDROID {
APerformanceHint_closeSession; # introduced=Tiramisu
APerformanceHint_setThreads; # introduced=UpsideDownCake
APerformanceHint_setPreferPowerEfficiency; # introduced=VanillaIceCream
+ APerformanceHint_reportActualWorkDuration2; # introduced=VanillaIceCream
+ AWorkDuration_create; # introduced=VanillaIceCream
+ AWorkDuration_release; # introduced=VanillaIceCream
+ AWorkDuration_setWorkPeriodStartTimestampNanos; # introduced=VanillaIceCream
+ AWorkDuration_setActualTotalDurationNanos; # introduced=VanillaIceCream
+ AWorkDuration_setActualCpuDurationNanos; # introduced=VanillaIceCream
+ AWorkDuration_setActualGpuDurationNanos; # introduced=VanillaIceCream
local:
*;
};
diff --git a/native/android/performance_hint.cpp b/native/android/performance_hint.cpp
index c25df6e08fd0..c4c81284780e 100644
--- a/native/android/performance_hint.cpp
+++ b/native/android/performance_hint.cpp
@@ -18,12 +18,14 @@
#include <aidl/android/hardware/power/SessionHint.h>
#include <aidl/android/hardware/power/SessionMode.h>
+#include <android/WorkDuration.h>
#include <android/os/IHintManager.h>
#include <android/os/IHintSession.h>
#include <android/performance_hint.h>
#include <binder/Binder.h>
#include <binder/IBinder.h>
#include <binder/IServiceManager.h>
+#include <inttypes.h>
#include <performance_hint_private.h>
#include <utils/SystemClock.h>
@@ -75,10 +77,13 @@ public:
int setThreads(const int32_t* threadIds, size_t size);
int getThreadIds(int32_t* const threadIds, size_t* size);
int setPreferPowerEfficiency(bool enabled);
+ int reportActualWorkDuration(AWorkDuration* workDuration);
private:
friend struct APerformanceHintManager;
+ int reportActualWorkDurationInternal(WorkDuration* workDuration);
+
sp<IHintManager> mHintManager;
sp<IHintSession> mHintSession;
// HAL preferred update rate
@@ -92,8 +97,7 @@ private:
// Last hint reported from sendHint indexed by hint value
std::vector<int64_t> mLastHintSentTimestamp;
// Cached samples
- std::vector<int64_t> mActualDurationsNanos;
- std::vector<int64_t> mTimestampsNanos;
+ std::vector<WorkDuration> mActualWorkDurations;
};
static IHintManager* gIHintManagerForTesting = nullptr;
@@ -195,8 +199,7 @@ int APerformanceHintSession::updateTargetWorkDuration(int64_t targetDurationNano
* Most of the workload is target_duration dependent, so now clear the cached samples
* as they are most likely obsolete.
*/
- mActualDurationsNanos.clear();
- mTimestampsNanos.clear();
+ mActualWorkDurations.clear();
mFirstTargetMetTimestamp = 0;
mLastTargetMetTimestamp = 0;
return 0;
@@ -207,43 +210,10 @@ int APerformanceHintSession::reportActualWorkDuration(int64_t actualDurationNano
ALOGE("%s: actualDurationNanos must be positive", __FUNCTION__);
return EINVAL;
}
- int64_t now = elapsedRealtimeNano();
- mActualDurationsNanos.push_back(actualDurationNanos);
- mTimestampsNanos.push_back(now);
- if (actualDurationNanos >= mTargetDurationNanos) {
- // Reset timestamps if we are equal or over the target.
- mFirstTargetMetTimestamp = 0;
- } else {
- // Set mFirstTargetMetTimestamp for first time meeting target.
- if (!mFirstTargetMetTimestamp || !mLastTargetMetTimestamp ||
- (now - mLastTargetMetTimestamp > 2 * mPreferredRateNanos)) {
- mFirstTargetMetTimestamp = now;
- }
- /**
- * Rate limit the change if the update is over mPreferredRateNanos since first
- * meeting target and less than mPreferredRateNanos since last meeting target.
- */
- if (now - mFirstTargetMetTimestamp > mPreferredRateNanos &&
- now - mLastTargetMetTimestamp <= mPreferredRateNanos) {
- return 0;
- }
- mLastTargetMetTimestamp = now;
- }
+ WorkDuration workDuration(0, actualDurationNanos, actualDurationNanos, 0);
- binder::Status ret =
- mHintSession->reportActualWorkDuration(mActualDurationsNanos, mTimestampsNanos);
- if (!ret.isOk()) {
- ALOGE("%s: HintSession reportActualWorkDuration failed: %s", __FUNCTION__,
- ret.exceptionMessage().c_str());
- mFirstTargetMetTimestamp = 0;
- mLastTargetMetTimestamp = 0;
- return EPIPE;
- }
- mActualDurationsNanos.clear();
- mTimestampsNanos.clear();
-
- return 0;
+ return reportActualWorkDurationInternal(&workDuration);
}
int APerformanceHintSession::sendHint(SessionHint hint) {
@@ -322,6 +292,67 @@ int APerformanceHintSession::setPreferPowerEfficiency(bool enabled) {
return OK;
}
+int APerformanceHintSession::reportActualWorkDuration(AWorkDuration* aWorkDuration) {
+ WorkDuration* workDuration = static_cast<WorkDuration*>(aWorkDuration);
+ if (workDuration->workPeriodStartTimestampNanos <= 0) {
+ ALOGE("%s: workPeriodStartTimestampNanos must be positive", __FUNCTION__);
+ return EINVAL;
+ }
+ if (workDuration->actualTotalDurationNanos <= 0) {
+ ALOGE("%s: actualDurationNanos must be positive", __FUNCTION__);
+ return EINVAL;
+ }
+ if (workDuration->actualCpuDurationNanos <= 0) {
+ ALOGE("%s: cpuDurationNanos must be positive", __FUNCTION__);
+ return EINVAL;
+ }
+ if (workDuration->actualGpuDurationNanos < 0) {
+ ALOGE("%s: gpuDurationNanos must be non negative", __FUNCTION__);
+ return EINVAL;
+ }
+
+ return reportActualWorkDurationInternal(workDuration);
+}
+
+int APerformanceHintSession::reportActualWorkDurationInternal(WorkDuration* workDuration) {
+ int64_t actualTotalDurationNanos = workDuration->actualTotalDurationNanos;
+ int64_t now = uptimeNanos();
+ workDuration->timestampNanos = now;
+ mActualWorkDurations.push_back(std::move(*workDuration));
+
+ if (actualTotalDurationNanos >= mTargetDurationNanos) {
+ // Reset timestamps if we are equal or over the target.
+ mFirstTargetMetTimestamp = 0;
+ } else {
+ // Set mFirstTargetMetTimestamp for first time meeting target.
+ if (!mFirstTargetMetTimestamp || !mLastTargetMetTimestamp ||
+ (now - mLastTargetMetTimestamp > 2 * mPreferredRateNanos)) {
+ mFirstTargetMetTimestamp = now;
+ }
+ /**
+ * Rate limit the change if the update is over mPreferredRateNanos since first
+ * meeting target and less than mPreferredRateNanos since last meeting target.
+ */
+ if (now - mFirstTargetMetTimestamp > mPreferredRateNanos &&
+ now - mLastTargetMetTimestamp <= mPreferredRateNanos) {
+ return 0;
+ }
+ mLastTargetMetTimestamp = now;
+ }
+
+ binder::Status ret = mHintSession->reportActualWorkDuration2(mActualWorkDurations);
+ if (!ret.isOk()) {
+ ALOGE("%s: HintSession reportActualWorkDuration failed: %s", __FUNCTION__,
+ ret.exceptionMessage().c_str());
+ mFirstTargetMetTimestamp = 0;
+ mLastTargetMetTimestamp = 0;
+ return ret.exceptionCode() == binder::Status::EX_ILLEGAL_ARGUMENT ? EINVAL : EPIPE;
+ }
+ mActualWorkDurations.clear();
+
+ return 0;
+}
+
// ===================================== C API
APerformanceHintManager* APerformanceHint_getManager() {
return APerformanceHintManager::getInstance();
@@ -376,6 +407,64 @@ int APerformanceHint_setPreferPowerEfficiency(APerformanceHintSession* session,
return session->setPreferPowerEfficiency(enabled);
}
+int APerformanceHint_reportActualWorkDuration2(APerformanceHintSession* session,
+ AWorkDuration* workDuration) {
+ if (session == nullptr || workDuration == nullptr) {
+ ALOGE("Invalid value: (session %p, workDuration %p)", session, workDuration);
+ return EINVAL;
+ }
+ return session->reportActualWorkDuration(workDuration);
+}
+
+AWorkDuration* AWorkDuration_create() {
+ WorkDuration* workDuration = new WorkDuration();
+ return static_cast<AWorkDuration*>(workDuration);
+}
+
+void AWorkDuration_release(AWorkDuration* aWorkDuration) {
+ if (aWorkDuration == nullptr) {
+ ALOGE("%s: aWorkDuration is nullptr", __FUNCTION__);
+ }
+ delete aWorkDuration;
+}
+
+void AWorkDuration_setWorkPeriodStartTimestampNanos(AWorkDuration* aWorkDuration,
+ int64_t workPeriodStartTimestampNanos) {
+ if (aWorkDuration == nullptr || workPeriodStartTimestampNanos <= 0) {
+ ALOGE("%s: Invalid value. (AWorkDuration: %p, workPeriodStartTimestampNanos: %" PRIi64 ")",
+ __FUNCTION__, aWorkDuration, workPeriodStartTimestampNanos);
+ }
+ static_cast<WorkDuration*>(aWorkDuration)->workPeriodStartTimestampNanos =
+ workPeriodStartTimestampNanos;
+}
+
+void AWorkDuration_setActualTotalDurationNanos(AWorkDuration* aWorkDuration,
+ int64_t actualTotalDurationNanos) {
+ if (aWorkDuration == nullptr || actualTotalDurationNanos <= 0) {
+ ALOGE("%s: Invalid value. (AWorkDuration: %p, actualTotalDurationNanos: %" PRIi64 ")",
+ __FUNCTION__, aWorkDuration, actualTotalDurationNanos);
+ }
+ static_cast<WorkDuration*>(aWorkDuration)->actualTotalDurationNanos = actualTotalDurationNanos;
+}
+
+void AWorkDuration_setActualCpuDurationNanos(AWorkDuration* aWorkDuration,
+ int64_t actualCpuDurationNanos) {
+ if (aWorkDuration == nullptr || actualCpuDurationNanos <= 0) {
+ ALOGE("%s: Invalid value. (AWorkDuration: %p, actualCpuDurationNanos: %" PRIi64 ")",
+ __FUNCTION__, aWorkDuration, actualCpuDurationNanos);
+ }
+ static_cast<WorkDuration*>(aWorkDuration)->actualCpuDurationNanos = actualCpuDurationNanos;
+}
+
+void AWorkDuration_setActualGpuDurationNanos(AWorkDuration* aWorkDuration,
+ int64_t actualGpuDurationNanos) {
+ if (aWorkDuration == nullptr || actualGpuDurationNanos < 0) {
+ ALOGE("%s: Invalid value. (AWorkDuration: %p, actualGpuDurationNanos: %" PRIi64 ")",
+ __FUNCTION__, aWorkDuration, actualGpuDurationNanos);
+ }
+ static_cast<WorkDuration*>(aWorkDuration)->actualGpuDurationNanos = actualGpuDurationNanos;
+}
+
void APerformanceHint_setIHintManagerForTesting(void* iManager) {
delete gHintManagerForTesting;
gHintManagerForTesting = nullptr;
diff --git a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
index 22d33b139ccf..4553b4919d2d 100644
--- a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
+++ b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
@@ -16,6 +16,7 @@
#define LOG_TAG "PerformanceHintNativeTest"
+#include <android/WorkDuration.h>
#include <android/os/IHintManager.h>
#include <android/os/IHintSession.h>
#include <android/performance_hint.h>
@@ -60,6 +61,8 @@ public:
MOCK_METHOD(Status, setMode, (int32_t mode, bool enabled), (override));
MOCK_METHOD(Status, close, (), (override));
MOCK_METHOD(IBinder*, onAsBinder, (), (override));
+ MOCK_METHOD(Status, reportActualWorkDuration2,
+ (const ::std::vector<android::os::WorkDuration>& workDurations), (override));
};
class PerformanceHintTest : public Test {
@@ -120,6 +123,7 @@ TEST_F(PerformanceHintTest, TestSession) {
std::vector<int64_t> actualDurations;
actualDurations.push_back(20);
EXPECT_CALL(*iSession, reportActualWorkDuration(Eq(actualDurations), _)).Times(Exactly(1));
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(_)).Times(Exactly(1));
result = APerformanceHint_reportActualWorkDuration(session, actualDurationNanos);
EXPECT_EQ(0, result);
@@ -238,4 +242,125 @@ TEST_F(PerformanceHintTest, CreateZeroTargetDurationSession) {
APerformanceHintSession* session =
APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration);
ASSERT_TRUE(session);
-} \ No newline at end of file
+}
+
+MATCHER_P(WorkDurationEq, expected, "") {
+ if (arg.size() != expected.size()) {
+ *result_listener << "WorkDuration vectors are different sizes. Expected: "
+ << expected.size() << ", Actual: " << arg.size();
+ return false;
+ }
+ for (int i = 0; i < expected.size(); ++i) {
+ android::os::WorkDuration expectedWorkDuration = expected[i];
+ android::os::WorkDuration actualWorkDuration = arg[i];
+ if (!expectedWorkDuration.equalsWithoutTimestamp(actualWorkDuration)) {
+ *result_listener << "WorkDuration at [" << i << "] is different: "
+ << "Expected: " << expectedWorkDuration
+ << ", Actual: " << actualWorkDuration;
+ return false;
+ }
+ }
+ return true;
+}
+
+TEST_F(PerformanceHintTest, TestAPerformanceHint_reportActualWorkDuration2) {
+ APerformanceHintManager* manager = createManager();
+
+ std::vector<int32_t> tids;
+ tids.push_back(1);
+ tids.push_back(2);
+ int64_t targetDuration = 56789L;
+
+ StrictMock<MockIHintSession>* iSession = new StrictMock<MockIHintSession>();
+ sp<IHintSession> session_sp(iSession);
+
+ EXPECT_CALL(*mMockIHintManager, createHintSession(_, Eq(tids), Eq(targetDuration), _))
+ .Times(Exactly(1))
+ .WillRepeatedly(DoAll(SetArgPointee<3>(std::move(session_sp)), Return(Status())));
+
+ APerformanceHintSession* session =
+ APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration);
+ ASSERT_TRUE(session);
+
+ int64_t targetDurationNanos = 10;
+ EXPECT_CALL(*iSession, updateTargetWorkDuration(Eq(targetDurationNanos))).Times(Exactly(1));
+ int result = APerformanceHint_updateTargetWorkDuration(session, targetDurationNanos);
+ EXPECT_EQ(0, result);
+
+ usleep(2); // Sleep for longer than preferredUpdateRateNanos.
+ {
+ std::vector<android::os::WorkDuration> actualWorkDurations;
+ android::os::WorkDuration workDuration(1, 20, 13, 8);
+ actualWorkDurations.push_back(workDuration);
+
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations)))
+ .Times(Exactly(1));
+ result = APerformanceHint_reportActualWorkDuration2(session,
+ static_cast<AWorkDuration*>(
+ &workDuration));
+ EXPECT_EQ(0, result);
+ }
+
+ {
+ std::vector<android::os::WorkDuration> actualWorkDurations;
+ android::os::WorkDuration workDuration(-1, 20, 13, 8);
+ actualWorkDurations.push_back(workDuration);
+
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations)))
+ .Times(Exactly(1));
+ result = APerformanceHint_reportActualWorkDuration2(session,
+ static_cast<AWorkDuration*>(
+ &workDuration));
+ EXPECT_EQ(22, result);
+ }
+ {
+ std::vector<android::os::WorkDuration> actualWorkDurations;
+ android::os::WorkDuration workDuration(1, -20, 13, 8);
+ actualWorkDurations.push_back(workDuration);
+
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations)))
+ .Times(Exactly(1));
+ result = APerformanceHint_reportActualWorkDuration2(session,
+ static_cast<AWorkDuration*>(
+ &workDuration));
+ EXPECT_EQ(22, result);
+ }
+ {
+ std::vector<android::os::WorkDuration> actualWorkDurations;
+ android::os::WorkDuration workDuration(1, 20, -13, 8);
+ actualWorkDurations.push_back(workDuration);
+
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations)))
+ .Times(Exactly(1));
+ result = APerformanceHint_reportActualWorkDuration2(session,
+ static_cast<AWorkDuration*>(
+ &workDuration));
+ EXPECT_EQ(EINVAL, result);
+ }
+ {
+ std::vector<android::os::WorkDuration> actualWorkDurations;
+ android::os::WorkDuration workDuration(1, 20, 13, -8);
+ actualWorkDurations.push_back(workDuration);
+
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations)))
+ .Times(Exactly(1));
+ result = APerformanceHint_reportActualWorkDuration2(session,
+ static_cast<AWorkDuration*>(
+ &workDuration));
+ EXPECT_EQ(EINVAL, result);
+ }
+
+ EXPECT_CALL(*iSession, close()).Times(Exactly(1));
+ APerformanceHint_closeSession(session);
+}
+
+TEST_F(PerformanceHintTest, TestAWorkDuration) {
+ AWorkDuration* aWorkDuration = AWorkDuration_create();
+ ASSERT_NE(aWorkDuration, nullptr);
+
+ AWorkDuration_setWorkPeriodStartTimestampNanos(aWorkDuration, 1);
+ AWorkDuration_setActualTotalDurationNanos(aWorkDuration, 20);
+ AWorkDuration_setActualCpuDurationNanos(aWorkDuration, 13);
+ AWorkDuration_setActualGpuDurationNanos(aWorkDuration, 8);
+ AWorkDuration_release(aWorkDuration);
+}
diff --git a/packages/CredentialManager/Android.bp b/packages/CredentialManager/Android.bp
index fe26dc3d7feb..991fe41bb7f3 100644
--- a/packages/CredentialManager/Android.bp
+++ b/packages/CredentialManager/Android.bp
@@ -16,10 +16,12 @@ android_app {
dex_preopt: {
profile_guided: true,
+ //TODO: b/312357299 - Update baseline profile
profile: "profile.txt.prof",
},
static_libs: [
+ "CredentialManagerShared",
"PlatformComposeCore",
"androidx.activity_activity-compose",
"androidx.appcompat_appcompat",
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/IntentParser.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/IntentParser.kt
index 42f1207c69cb..325d3f819f14 100644
--- a/packages/CredentialManager/shared/src/com/android/credentialmanager/IntentParser.kt
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/IntentParser.kt
@@ -16,6 +16,7 @@
package com.android.credentialmanager
+import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.credentials.ui.RequestInfo
@@ -27,10 +28,10 @@ import com.android.credentialmanager.mapper.toGet
import com.android.credentialmanager.model.Request
fun Intent.parse(
- packageManager: PackageManager,
+ context: Context,
): Request {
- return parseCancelUiRequest(packageManager)
- ?: parseRequestInfo()
+ return parseCancelUiRequest(context.packageManager)
+ ?: parseRequestInfo(context)
}
fun Intent.parseCancelUiRequest(packageManager: PackageManager): Request? =
@@ -51,11 +52,11 @@ fun Intent.parseCancelUiRequest(packageManager: PackageManager): Request? =
}
}
-fun Intent.parseRequestInfo(): Request =
+fun Intent.parseRequestInfo(context: Context): Request =
requestInfo.let{ info ->
when (info?.type) {
RequestInfo.TYPE_CREATE -> Request.Create(info.token)
- RequestInfo.TYPE_GET -> toGet()
+ RequestInfo.TYPE_GET -> toGet(context)
else -> {
throw IllegalStateException("Unrecognized request type: ${info?.type}")
}
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/client/impl/CredentialManagerClientImpl.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/client/impl/CredentialManagerClientImpl.kt
index 83183b5f58eb..3ef65b052560 100644
--- a/packages/CredentialManager/shared/src/com/android/credentialmanager/client/impl/CredentialManagerClientImpl.kt
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/client/impl/CredentialManagerClientImpl.kt
@@ -16,8 +16,8 @@
package com.android.credentialmanager.client.impl
+import android.content.Context
import android.content.Intent
-import android.content.pm.PackageManager
import android.credentials.ui.BaseDialogResult
import android.credentials.ui.UserSelectionDialogResult
import android.os.Bundle
@@ -26,12 +26,13 @@ import com.android.credentialmanager.TAG
import com.android.credentialmanager.model.Request
import com.android.credentialmanager.parse
import com.android.credentialmanager.client.CredentialManagerClient
+import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import javax.inject.Inject
class CredentialManagerClientImpl @Inject constructor(
- private val packageManager: PackageManager,
+ @ApplicationContext private val context: Context,
) : CredentialManagerClient {
private val _requests = MutableStateFlow<Request?>(null)
@@ -40,7 +41,7 @@ class CredentialManagerClientImpl @Inject constructor(
override fun updateRequest(intent: Intent) {
val request = intent.parse(
- packageManager = packageManager,
+ context = context,
)
Log.d(TAG, "Request parsed: $request, client instance: $this")
if (request is Request.Cancel || request is Request.Close) {
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt
new file mode 100644
index 000000000000..f063074b39b4
--- /dev/null
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/CredentialKtx.kt
@@ -0,0 +1,369 @@
+/*
+ * 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 com.android.credentialmanager.ktx
+
+import android.app.slice.Slice
+import android.content.ComponentName
+import android.content.Context
+import android.content.pm.PackageInfo
+import android.content.pm.PackageManager
+import android.credentials.Credential
+import android.credentials.flags.Flags
+import android.credentials.ui.AuthenticationEntry
+import android.credentials.ui.Entry
+import android.credentials.ui.GetCredentialProviderData
+import android.graphics.drawable.Drawable
+import android.text.TextUtils
+import android.util.Log
+import androidx.activity.result.IntentSenderRequest
+import androidx.credentials.PublicKeyCredential
+import androidx.credentials.provider.Action
+import androidx.credentials.provider.AuthenticationAction
+import androidx.credentials.provider.CredentialEntry
+import androidx.credentials.provider.CustomCredentialEntry
+import androidx.credentials.provider.PasswordCredentialEntry
+import androidx.credentials.provider.PublicKeyCredentialEntry
+import androidx.credentials.provider.RemoteEntry
+import com.android.credentialmanager.IS_AUTO_SELECTED_KEY
+import com.android.credentialmanager.model.get.ActionEntryInfo
+import com.android.credentialmanager.model.get.AuthenticationEntryInfo
+import com.android.credentialmanager.model.get.CredentialEntryInfo
+import com.android.credentialmanager.model.CredentialType
+import com.android.credentialmanager.model.get.ProviderInfo
+import com.android.credentialmanager.model.get.RemoteEntryInfo
+import com.android.credentialmanager.TAG
+
+fun CredentialEntryInfo.getIntentSenderRequest(
+ isAutoSelected: Boolean = false
+): IntentSenderRequest? {
+ val entryIntent = fillInIntent?.putExtra(IS_AUTO_SELECTED_KEY, isAutoSelected)
+
+ return pendingIntent?.let{
+ IntentSenderRequest
+ .Builder(pendingIntent = it)
+ .setFillInIntent(entryIntent)
+ .build()
+ }
+}
+
+// Returns the list (potentially empty) of enabled provider.
+fun List<GetCredentialProviderData>.toProviderList(
+ context: Context,
+): List<ProviderInfo> {
+ val providerList: MutableList<ProviderInfo> = mutableListOf()
+ this.forEach {
+ val providerLabelAndIcon = getServiceLabelAndIcon(
+ context.packageManager,
+ it.providerFlattenedComponentName
+ ) ?: return@forEach
+ val (providerLabel, providerIcon) = providerLabelAndIcon
+ providerList.add(
+ ProviderInfo(
+ id = it.providerFlattenedComponentName,
+ icon = providerIcon,
+ displayName = providerLabel,
+ credentialEntryList = getCredentialOptionInfoList(
+ providerId = it.providerFlattenedComponentName,
+ providerLabel = providerLabel,
+ credentialEntries = it.credentialEntries,
+ context = context
+ ),
+ authenticationEntryList = getAuthenticationEntryList(
+ it.providerFlattenedComponentName,
+ providerLabel,
+ providerIcon,
+ it.authenticationEntries),
+ remoteEntry = getRemoteEntry(
+ it.providerFlattenedComponentName,
+ it.remoteEntry
+ ),
+ actionEntryList = getActionEntryList(
+ it.providerFlattenedComponentName, it.actionChips, providerIcon
+ ),
+ )
+ )
+ }
+ return providerList
+}
+
+/**
+ * Note: caller required handle empty list due to parsing error.
+ */
+private fun getCredentialOptionInfoList(
+ providerId: String,
+ providerLabel: String,
+ credentialEntries: List<Entry>,
+ context: Context,
+): List<CredentialEntryInfo> {
+ val result: MutableList<CredentialEntryInfo> = mutableListOf()
+ credentialEntries.forEach {
+ val credentialEntry = it.slice.credentialEntry
+ when (credentialEntry) {
+ is PasswordCredentialEntry -> {
+ result.add(
+ CredentialEntryInfo(
+ providerId = providerId,
+ providerDisplayName = providerLabel,
+ entryKey = it.key,
+ entrySubkey = it.subkey,
+ pendingIntent = credentialEntry.pendingIntent,
+ fillInIntent = it.frameworkExtrasIntent,
+ credentialType = CredentialType.PASSWORD,
+ credentialTypeDisplayName = credentialEntry.typeDisplayName.toString(),
+ userName = credentialEntry.username.toString(),
+ displayName = credentialEntry.displayName?.toString(),
+ icon = credentialEntry.icon.loadDrawable(context),
+ shouldTintIcon = credentialEntry.isDefaultIcon,
+ lastUsedTimeMillis = credentialEntry.lastUsedTime,
+ isAutoSelectable = credentialEntry.isAutoSelectAllowed &&
+ credentialEntry.autoSelectAllowedFromOption,
+ )
+ )
+ }
+ is PublicKeyCredentialEntry -> {
+ result.add(
+ CredentialEntryInfo(
+ providerId = providerId,
+ providerDisplayName = providerLabel,
+ entryKey = it.key,
+ entrySubkey = it.subkey,
+ pendingIntent = credentialEntry.pendingIntent,
+ fillInIntent = it.frameworkExtrasIntent,
+ credentialType = CredentialType.PASSKEY,
+ credentialTypeDisplayName = credentialEntry.typeDisplayName.toString(),
+ userName = credentialEntry.username.toString(),
+ displayName = credentialEntry.displayName?.toString(),
+ icon = credentialEntry.icon.loadDrawable(context),
+ shouldTintIcon = credentialEntry.isDefaultIcon,
+ lastUsedTimeMillis = credentialEntry.lastUsedTime,
+ isAutoSelectable = credentialEntry.isAutoSelectAllowed &&
+ credentialEntry.autoSelectAllowedFromOption,
+ )
+ )
+ }
+ is CustomCredentialEntry -> {
+ result.add(
+ CredentialEntryInfo(
+ providerId = providerId,
+ providerDisplayName = providerLabel,
+ entryKey = it.key,
+ entrySubkey = it.subkey,
+ pendingIntent = credentialEntry.pendingIntent,
+ fillInIntent = it.frameworkExtrasIntent,
+ credentialType = CredentialType.UNKNOWN,
+ credentialTypeDisplayName =
+ credentialEntry.typeDisplayName?.toString().orEmpty(),
+ userName = credentialEntry.title.toString(),
+ displayName = credentialEntry.subtitle?.toString(),
+ icon = credentialEntry.icon.loadDrawable(context),
+ shouldTintIcon = credentialEntry.isDefaultIcon,
+ lastUsedTimeMillis = credentialEntry.lastUsedTime,
+ isAutoSelectable = credentialEntry.isAutoSelectAllowed &&
+ credentialEntry.autoSelectAllowedFromOption,
+ )
+ )
+ }
+ else -> Log.d(
+ TAG,
+ "Encountered unrecognized credential entry ${it.slice.spec?.type}"
+ )
+ }
+ }
+ return result
+}
+val Slice.credentialEntry: CredentialEntry?
+ get() =
+ try {
+ when (spec?.type) {
+ Credential.TYPE_PASSWORD_CREDENTIAL -> PasswordCredentialEntry.fromSlice(this)!!
+ PublicKeyCredential.TYPE_PUBLIC_KEY_CREDENTIAL ->
+ PublicKeyCredentialEntry.fromSlice(this)!!
+
+ else -> CustomCredentialEntry.fromSlice(this)!!
+ }
+ } catch (e: Exception) {
+ // Try CustomCredentialEntry.fromSlice one last time in case the cause was a failed
+ // password / passkey parsing attempt.
+ CustomCredentialEntry.fromSlice(this)
+ }
+
+
+/**
+ * Note: caller required handle empty list due to parsing error.
+ */
+private fun getAuthenticationEntryList(
+ providerId: String,
+ providerDisplayName: String,
+ providerIcon: Drawable,
+ authEntryList: List<AuthenticationEntry>,
+): List<AuthenticationEntryInfo> {
+ val result: MutableList<AuthenticationEntryInfo> = mutableListOf()
+ authEntryList.forEach { entry ->
+ val structuredAuthEntry =
+ AuthenticationAction.fromSlice(entry.slice) ?: return@forEach
+
+ val title: String =
+ structuredAuthEntry.title.toString().ifEmpty { providerDisplayName }
+
+ result.add(
+ AuthenticationEntryInfo(
+ providerId = providerId,
+ entryKey = entry.key,
+ entrySubkey = entry.subkey,
+ pendingIntent = structuredAuthEntry.pendingIntent,
+ fillInIntent = entry.frameworkExtrasIntent,
+ title = title,
+ providerDisplayName = providerDisplayName,
+ icon = providerIcon,
+ isUnlockedAndEmpty = entry.status != AuthenticationEntry.STATUS_LOCKED,
+ isLastUnlocked =
+ entry.status == AuthenticationEntry.STATUS_UNLOCKED_BUT_EMPTY_MOST_RECENT
+ )
+ )
+ }
+ return result
+}
+
+private fun getRemoteEntry(providerId: String, remoteEntry: Entry?): RemoteEntryInfo? {
+ if (remoteEntry == null) {
+ return null
+ }
+ val structuredRemoteEntry = RemoteEntry.fromSlice(remoteEntry.slice)
+ ?: return null
+ return RemoteEntryInfo(
+ providerId = providerId,
+ entryKey = remoteEntry.key,
+ entrySubkey = remoteEntry.subkey,
+ pendingIntent = structuredRemoteEntry.pendingIntent,
+ fillInIntent = remoteEntry.frameworkExtrasIntent,
+ )
+}
+
+/**
+ * Note: caller required handle empty list due to parsing error.
+ */
+private fun getActionEntryList(
+ providerId: String,
+ actionEntries: List<Entry>,
+ providerIcon: Drawable,
+): List<ActionEntryInfo> {
+ val result: MutableList<ActionEntryInfo> = mutableListOf()
+ actionEntries.forEach {
+ val actionEntryUi = Action.fromSlice(it.slice) ?: return@forEach
+ result.add(
+ ActionEntryInfo(
+ providerId = providerId,
+ entryKey = it.key,
+ entrySubkey = it.subkey,
+ pendingIntent = actionEntryUi.pendingIntent,
+ fillInIntent = it.frameworkExtrasIntent,
+ title = actionEntryUi.title.toString(),
+ icon = providerIcon,
+ subTitle = actionEntryUi.subtitle?.toString(),
+ )
+ )
+ }
+ return result
+}
+
+
+
+private fun getServiceLabelAndIcon(
+ pm: PackageManager,
+ providerFlattenedComponentName: String
+): Pair<String, Drawable>? {
+ var providerLabel: String? = null
+ var providerIcon: Drawable? = null
+ val component = ComponentName.unflattenFromString(providerFlattenedComponentName)
+ if (component == null) {
+ // Test data has only package name not component name.
+ // For test data usage only.
+ try {
+ val pkgInfo = if (Flags.instantAppsEnabled()) {
+ getPackageInfo(pm, providerFlattenedComponentName)
+ } else {
+ pm.getPackageInfo(
+ providerFlattenedComponentName,
+ PackageManager.PackageInfoFlags.of(0)
+ )
+ }
+ val applicationInfo = checkNotNull(pkgInfo.applicationInfo)
+ providerLabel =
+ applicationInfo.loadSafeLabel(
+ pm, 0f,
+ TextUtils.SAFE_STRING_FLAG_FIRST_LINE or TextUtils.SAFE_STRING_FLAG_TRIM
+ ).toString()
+ providerIcon = applicationInfo.loadIcon(pm)
+ } catch (e: Exception) {
+ Log.e(TAG, "Provider package info not found", e)
+ }
+ } else {
+ try {
+ val si = pm.getServiceInfo(component, PackageManager.ComponentInfoFlags.of(0))
+ providerLabel = si.loadSafeLabel(
+ pm, 0f,
+ TextUtils.SAFE_STRING_FLAG_FIRST_LINE or TextUtils.SAFE_STRING_FLAG_TRIM
+ ).toString()
+ providerIcon = si.loadIcon(pm)
+ } catch (e: PackageManager.NameNotFoundException) {
+ Log.e(TAG, "Provider service info not found", e)
+ // Added for mdoc use case where the provider may not need to register a service and
+ // instead only relies on the registration api.
+ try {
+ val pkgInfo = if (Flags.instantAppsEnabled()) {
+ getPackageInfo(pm, providerFlattenedComponentName)
+ } else {
+ pm.getPackageInfo(
+ component.packageName,
+ PackageManager.PackageInfoFlags.of(0)
+ )
+ }
+ val applicationInfo = checkNotNull(pkgInfo.applicationInfo)
+ providerLabel =
+ applicationInfo.loadSafeLabel(
+ pm, 0f,
+ TextUtils.SAFE_STRING_FLAG_FIRST_LINE or TextUtils.SAFE_STRING_FLAG_TRIM
+ ).toString()
+ providerIcon = applicationInfo.loadIcon(pm)
+ } catch (e: Exception) {
+ Log.e(TAG, "Provider package info not found", e)
+ }
+ }
+ }
+ return if (providerLabel == null || providerIcon == null) {
+ Log.d(
+ TAG,
+ "Failed to load provider label/icon for provider $providerFlattenedComponentName"
+ )
+ null
+ } else {
+ Pair(providerLabel, providerIcon)
+ }
+}
+
+private fun getPackageInfo(
+ pm: PackageManager,
+ packageName: String
+): PackageInfo {
+ val packageManagerFlags = PackageManager.MATCH_INSTANT
+
+ return pm.getPackageInfo(
+ packageName,
+ PackageManager.PackageInfoFlags.of(
+ (packageManagerFlags).toLong())
+ )
+} \ No newline at end of file
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/PasswordKtx.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/PasswordKtx.kt
deleted file mode 100644
index 34710704facb..000000000000
--- a/packages/CredentialManager/shared/src/com/android/credentialmanager/ktx/PasswordKtx.kt
+++ /dev/null
@@ -1,32 +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.0N
- *
- * 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.credentialmanager.ktx
-
-import androidx.activity.result.IntentSenderRequest
-import com.android.credentialmanager.IS_AUTO_SELECTED_KEY
-import com.android.credentialmanager.model.Password
-
-fun Password.getIntentSenderRequest(
- isAutoSelected: Boolean = false
-): IntentSenderRequest {
- val entryIntent = entry.frameworkExtrasIntent
- entryIntent?.putExtra(IS_AUTO_SELECTED_KEY, isAutoSelected)
-
- return IntentSenderRequest.Builder(
- pendingIntent = passwordCredentialEntry.pendingIntent
- ).setFillInIntent(entryIntent).build()
-}
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/mapper/RequestGetMapper.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/mapper/RequestGetMapper.kt
index d4bca2add6cb..f1f1f7ca842e 100644
--- a/packages/CredentialManager/shared/src/com/android/credentialmanager/mapper/RequestGetMapper.kt
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/mapper/RequestGetMapper.kt
@@ -16,48 +16,18 @@
package com.android.credentialmanager.mapper
+import android.content.Context
import android.content.Intent
-import android.credentials.ui.Entry
-import androidx.credentials.provider.PasswordCredentialEntry
-import com.android.credentialmanager.factory.fromSlice
import com.android.credentialmanager.ktx.getCredentialProviderDataList
import com.android.credentialmanager.ktx.requestInfo
import com.android.credentialmanager.ktx.resultReceiver
-import com.android.credentialmanager.model.Password
+import com.android.credentialmanager.ktx.toProviderList
import com.android.credentialmanager.model.Request
-import com.google.common.collect.ImmutableList
-import com.google.common.collect.ImmutableMap
-
-fun Intent.toGet(): Request.Get {
- val credentialEntries = mutableListOf<Pair<String, Entry>>()
- for (providerData in getCredentialProviderDataList) {
- for (credentialEntry in providerData.credentialEntries) {
- credentialEntries.add(
- Pair(providerData.providerFlattenedComponentName, credentialEntry)
- )
- }
- }
-
- val passwordEntries = mutableListOf<Password>()
- for ((providerId, entry) in credentialEntries) {
- val slice = fromSlice(entry.slice)
- if (slice is PasswordCredentialEntry) {
- passwordEntries.add(
- Password(
- providerId = providerId,
- entry = entry,
- passwordCredentialEntry = slice
- )
- )
- }
- }
+fun Intent.toGet(context: Context): Request.Get {
return Request.Get(
token = requestInfo?.token,
- resultReceiver = this.resultReceiver,
- providers = ImmutableMap.copyOf(
- getCredentialProviderDataList.associateBy { it.providerFlattenedComponentName }
- ),
- passwordEntries = ImmutableList.copyOf(passwordEntries)
+ resultReceiver = resultReceiver,
+ providerInfos = getCredentialProviderDataList.toProviderList(context)
)
}
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/CredentialType.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/CredentialType.kt
index cc92f60de048..3f85192d937f 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/common/CredentialType.kt
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/CredentialType.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.credentialmanager.common
+package com.android.credentialmanager.model
enum class CredentialType {
UNKNOWN, PASSKEY, PASSWORD,
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/BaseEntry.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/EntryInfo.kt
index ee36989b3da0..6d59f11d5643 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/common/BaseEntry.kt
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/EntryInfo.kt
@@ -14,12 +14,12 @@
* limitations under the License.
*/
-package com.android.credentialmanager.common
+package com.android.credentialmanager.model
import android.app.PendingIntent
import android.content.Intent
-open class BaseEntry (
+open class EntryInfo (
val providerId: String,
val entryKey: String,
val entrySubkey: String,
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/Request.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/Request.kt
index 2289ed7320ca..763646233324 100644
--- a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/Request.kt
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/Request.kt
@@ -16,11 +16,9 @@
package com.android.credentialmanager.model
-import android.credentials.ui.ProviderData
import android.os.IBinder
import android.os.ResultReceiver
-import com.google.common.collect.ImmutableList
-import com.google.common.collect.ImmutableMap
+import com.android.credentialmanager.model.get.ProviderInfo
/**
* Represents the request made by the CredentialManager API.
@@ -51,8 +49,7 @@ sealed class Request private constructor(
data class Get(
override val token: IBinder?,
val resultReceiver: ResultReceiver?,
- val providers: ImmutableMap<String, ProviderData>,
- val passwordEntries: ImmutableList<Password>,
+ val providerInfos: List<ProviderInfo>,
) : Request(token)
/**
* Request to start the create credentials flow.
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/creation/CreateOptionInfo.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/creation/CreateOptionInfo.kt
new file mode 100644
index 000000000000..d6189eb15ff3
--- /dev/null
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/creation/CreateOptionInfo.kt
@@ -0,0 +1,46 @@
+/*
+ * 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 com.android.credentialmanager.model.creation
+
+import android.app.PendingIntent
+import android.content.Intent
+import android.graphics.drawable.Drawable
+import com.android.credentialmanager.model.EntryInfo
+import java.time.Instant
+
+class CreateOptionInfo(
+ providerId: String,
+ entryKey: String,
+ entrySubkey: String,
+ pendingIntent: PendingIntent?,
+ fillInIntent: Intent?,
+ val userProviderDisplayName: String,
+ val profileIcon: Drawable?,
+ val passwordCount: Int?,
+ val passkeyCount: Int?,
+ val totalCredentialCount: Int?,
+ val lastUsedTime: Instant,
+ val footerDescription: String?,
+ val allowAutoSelect: Boolean,
+) : EntryInfo(
+ providerId,
+ entryKey,
+ entrySubkey,
+ pendingIntent,
+ fillInIntent,
+ shouldTerminateUiUponSuccessfulProviderResult = true,
+) \ No newline at end of file
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/creation/RemoteInfo.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/creation/RemoteInfo.kt
new file mode 100644
index 000000000000..7ee50d7c4e73
--- /dev/null
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/creation/RemoteInfo.kt
@@ -0,0 +1,36 @@
+/*
+ * 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 com.android.credentialmanager.model.creation
+
+import android.app.PendingIntent
+import android.content.Intent
+import com.android.credentialmanager.model.EntryInfo
+
+class RemoteInfo(
+ providerId: String,
+ entryKey: String,
+ entrySubkey: String,
+ pendingIntent: PendingIntent?,
+ fillInIntent: Intent?,
+) : EntryInfo(
+ providerId,
+ entryKey,
+ entrySubkey,
+ pendingIntent,
+ fillInIntent,
+ shouldTerminateUiUponSuccessfulProviderResult = true,
+) \ No newline at end of file
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/ActionEntryInfo.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/ActionEntryInfo.kt
new file mode 100644
index 000000000000..d9eee868c17f
--- /dev/null
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/ActionEntryInfo.kt
@@ -0,0 +1,40 @@
+/*
+ * 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 com.android.credentialmanager.model.get
+
+import android.app.PendingIntent
+import android.content.Intent
+import android.graphics.drawable.Drawable
+import com.android.credentialmanager.model.EntryInfo
+
+class ActionEntryInfo(
+ providerId: String,
+ entryKey: String,
+ entrySubkey: String,
+ pendingIntent: PendingIntent?,
+ fillInIntent: Intent?,
+ val title: String,
+ val icon: Drawable,
+ val subTitle: String?,
+) : EntryInfo(
+ providerId,
+ entryKey,
+ entrySubkey,
+ pendingIntent,
+ fillInIntent,
+ shouldTerminateUiUponSuccessfulProviderResult = true,
+) \ No newline at end of file
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/AuthenticationEntryInfo.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/AuthenticationEntryInfo.kt
new file mode 100644
index 000000000000..01c394fc0d74
--- /dev/null
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/AuthenticationEntryInfo.kt
@@ -0,0 +1,44 @@
+/*
+ * 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 com.android.credentialmanager.model.get
+
+import android.app.PendingIntent
+import android.content.Intent
+import android.graphics.drawable.Drawable
+import com.android.credentialmanager.model.EntryInfo
+
+class AuthenticationEntryInfo(
+ providerId: String,
+ entryKey: String,
+ entrySubkey: String,
+ pendingIntent: PendingIntent?,
+ fillInIntent: Intent?,
+ val title: String,
+ val providerDisplayName: String,
+ val icon: Drawable,
+ // The entry had been unlocked and turned out to be empty. Used to determine whether to
+ // show "Tap to unlock" or "No sign-in info" for this entry.
+ val isUnlockedAndEmpty: Boolean,
+ // True if the entry was the last one unlocked. Used to show the no sign-in info snackbar.
+ val isLastUnlocked: Boolean,
+) : EntryInfo(
+ providerId,
+ entryKey, entrySubkey,
+ pendingIntent,
+ fillInIntent,
+ shouldTerminateUiUponSuccessfulProviderResult = false,
+) \ No newline at end of file
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/CredentialEntryInfo.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/CredentialEntryInfo.kt
new file mode 100644
index 000000000000..9725881e1c97
--- /dev/null
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/CredentialEntryInfo.kt
@@ -0,0 +1,50 @@
+/*
+ * 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 com.android.credentialmanager.model.get
+
+import android.app.PendingIntent
+import android.content.Intent
+import android.graphics.drawable.Drawable
+import com.android.credentialmanager.model.CredentialType
+import com.android.credentialmanager.model.EntryInfo
+import java.time.Instant
+
+class CredentialEntryInfo(
+ providerId: String,
+ entryKey: String,
+ entrySubkey: String,
+ pendingIntent: PendingIntent?,
+ fillInIntent: Intent?,
+ /** Type of this credential used for sorting. Not localized so must not be directly displayed. */
+ val credentialType: CredentialType,
+ /** Localized type value of this credential used for display purpose. */
+ val credentialTypeDisplayName: String,
+ val providerDisplayName: String,
+ val userName: String,
+ val displayName: String?,
+ val icon: Drawable?,
+ val shouldTintIcon: Boolean,
+ val lastUsedTimeMillis: Instant?,
+ val isAutoSelectable: Boolean,
+) : EntryInfo(
+ providerId,
+ entryKey,
+ entrySubkey,
+ pendingIntent,
+ fillInIntent,
+ shouldTerminateUiUponSuccessfulProviderResult = true,
+) \ No newline at end of file
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/ProviderInfo.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/ProviderInfo.kt
new file mode 100644
index 000000000000..6da414617752
--- /dev/null
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/ProviderInfo.kt
@@ -0,0 +1,33 @@
+/*
+ * 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 com.android.credentialmanager.model.get
+
+import android.graphics.drawable.Drawable
+
+data class ProviderInfo(
+ /**
+ * Unique id (component name) of this provider.
+ * Not for display purpose - [displayName] should be used for ui rendering.
+ */
+ val id: String,
+ val icon: Drawable,
+ val displayName: String,
+ val credentialEntryList: List<CredentialEntryInfo>,
+ val authenticationEntryList: List<AuthenticationEntryInfo>,
+ val remoteEntry: RemoteEntryInfo?,
+ val actionEntryList: List<ActionEntryInfo>,
+) \ No newline at end of file
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/RemoteEntryInfo.kt b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/RemoteEntryInfo.kt
new file mode 100644
index 000000000000..a68bf7413b25
--- /dev/null
+++ b/packages/CredentialManager/shared/src/com/android/credentialmanager/model/get/RemoteEntryInfo.kt
@@ -0,0 +1,36 @@
+/*
+ * 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 com.android.credentialmanager.model.get
+
+import android.app.PendingIntent
+import android.content.Intent
+import com.android.credentialmanager.model.EntryInfo
+
+class RemoteEntryInfo(
+ providerId: String,
+ entryKey: String,
+ entrySubkey: String,
+ pendingIntent: PendingIntent?,
+ fillInIntent: Intent?,
+) : EntryInfo(
+ providerId,
+ entryKey,
+ entrySubkey,
+ pendingIntent,
+ fillInIntent,
+ shouldTerminateUiUponSuccessfulProviderResult = true,
+) \ No newline at end of file
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
index bce86c477e77..6c5a984f20f7 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
@@ -28,7 +28,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
-import com.android.credentialmanager.common.BaseEntry
+import com.android.credentialmanager.model.EntryInfo
import com.android.credentialmanager.common.Constants
import com.android.credentialmanager.common.DialogState
import com.android.credentialmanager.common.ProviderActivityResult
@@ -47,7 +47,7 @@ import com.android.internal.logging.UiEventLogger.UiEventEnum
data class UiState(
val createCredentialUiState: CreateCredentialUiState?,
val getCredentialUiState: GetCredentialUiState?,
- val selectedEntry: BaseEntry? = null,
+ val selectedEntry: EntryInfo? = null,
val providerActivityState: ProviderActivityState = ProviderActivityState.NOT_APPLICABLE,
val dialogState: DialogState = DialogState.ACTIVE,
// True if the UI has one and only one auto selectable entry. Its provider activity will be
@@ -115,12 +115,13 @@ class CredentialSelectorViewModel(
launcher: ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>
) {
val entry = uiState.selectedEntry
- if (entry != null && entry.pendingIntent != null) {
+ val pendingIntent = entry?.pendingIntent
+ if (pendingIntent != null) {
Log.d(Constants.LOG_TAG, "Launching provider activity")
uiState = uiState.copy(providerActivityState = ProviderActivityState.PENDING)
val entryIntent = entry.fillInIntent
entryIntent?.putExtra(Constants.IS_AUTO_SELECTED_KEY, uiState.isAutoSelectFlow)
- val intentSenderRequest = IntentSenderRequest.Builder(entry.pendingIntent)
+ val intentSenderRequest = IntentSenderRequest.Builder(pendingIntent)
.setFillInIntent(entryIntent).build()
try {
launcher.launch(intentSenderRequest)
@@ -201,7 +202,7 @@ class CredentialSelectorViewModel(
/**************************************************************************/
/***** Get Flow Callbacks *****/
/**************************************************************************/
- fun getFlowOnEntrySelected(entry: BaseEntry) {
+ fun getFlowOnEntrySelected(entry: EntryInfo) {
Log.d(Constants.LOG_TAG, "credential selected: {provider=${entry.providerId}" +
", key=${entry.entryKey}, subkey=${entry.entrySubkey}}")
uiState = if (entry.pendingIntent != null) {
@@ -363,7 +364,7 @@ class CredentialSelectorViewModel(
)
}
- fun createFlowOnEntrySelected(selectedEntry: BaseEntry) {
+ fun createFlowOnEntrySelected(selectedEntry: EntryInfo) {
val providerId = selectedEntry.providerId
val entryKey = selectedEntry.entryKey
val entrySubkey = selectedEntry.entrySubkey
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
index f0fa6c5c4dd2..fc3970de2cee 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt
@@ -16,13 +16,10 @@
package com.android.credentialmanager
-import android.app.slice.Slice
import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
-import android.credentials.Credential.TYPE_PASSWORD_CREDENTIAL
-import android.credentials.ui.AuthenticationEntry
import android.credentials.ui.CreateCredentialProviderData
import android.credentials.ui.DisabledProviderData
import android.credentials.ui.Entry
@@ -32,36 +29,26 @@ import android.graphics.drawable.Drawable
import android.text.TextUtils
import android.util.Log
import com.android.credentialmanager.common.Constants
-import com.android.credentialmanager.common.CredentialType
+import com.android.credentialmanager.model.CredentialType
import com.android.credentialmanager.createflow.ActiveEntry
import com.android.credentialmanager.createflow.CreateCredentialUiState
-import com.android.credentialmanager.createflow.CreateOptionInfo
+import com.android.credentialmanager.model.creation.CreateOptionInfo
import com.android.credentialmanager.createflow.CreateScreenState
import com.android.credentialmanager.createflow.DisabledProviderInfo
import com.android.credentialmanager.createflow.EnabledProviderInfo
-import com.android.credentialmanager.createflow.RemoteInfo
+import com.android.credentialmanager.model.creation.RemoteInfo
import com.android.credentialmanager.createflow.RequestDisplayInfo
-import com.android.credentialmanager.getflow.ActionEntryInfo
-import com.android.credentialmanager.getflow.AuthenticationEntryInfo
-import com.android.credentialmanager.getflow.CredentialEntryInfo
-import com.android.credentialmanager.getflow.ProviderInfo
-import com.android.credentialmanager.getflow.RemoteEntryInfo
-import com.android.credentialmanager.getflow.TopBrandingContent
+import com.android.credentialmanager.model.get.ProviderInfo
+import com.android.credentialmanager.ktx.toProviderList
import androidx.credentials.CreateCredentialRequest
import androidx.credentials.CreateCustomCredentialRequest
import androidx.credentials.CreatePasswordRequest
import androidx.credentials.CreatePublicKeyCredentialRequest
-import androidx.credentials.PublicKeyCredential.Companion.TYPE_PUBLIC_KEY_CREDENTIAL
-import androidx.credentials.provider.Action
-import androidx.credentials.provider.AuthenticationAction
import androidx.credentials.provider.CreateEntry
-import androidx.credentials.provider.CredentialEntry
-import androidx.credentials.provider.CustomCredentialEntry
-import androidx.credentials.provider.PasswordCredentialEntry
-import androidx.credentials.provider.PublicKeyCredentialEntry
import androidx.credentials.provider.RemoteEntry
import org.json.JSONObject
import android.credentials.flags.Flags
+import com.android.credentialmanager.getflow.TopBrandingContent
import java.time.Instant
@@ -179,43 +166,7 @@ class GetFlowUtils {
fun toProviderList(
providerDataList: List<GetCredentialProviderData>,
context: Context,
- ): List<ProviderInfo> {
- val providerList: MutableList<ProviderInfo> = mutableListOf()
- providerDataList.forEach {
- val providerLabelAndIcon = getServiceLabelAndIcon(
- context.packageManager,
- it.providerFlattenedComponentName
- ) ?: return@forEach
- val (providerLabel, providerIcon) = providerLabelAndIcon
- providerList.add(
- ProviderInfo(
- id = it.providerFlattenedComponentName,
- icon = providerIcon,
- displayName = providerLabel,
- credentialEntryList = getCredentialOptionInfoList(
- providerId = it.providerFlattenedComponentName,
- providerLabel = providerLabel,
- credentialEntries = it.credentialEntries,
- context = context
- ),
- authenticationEntryList = getAuthenticationEntryList(
- it.providerFlattenedComponentName,
- providerLabel,
- providerIcon,
- it.authenticationEntries),
- remoteEntry = getRemoteEntry(
- it.providerFlattenedComponentName,
- it.remoteEntry
- ),
- actionEntryList = getActionEntryList(
- it.providerFlattenedComponentName, it.actionChips, providerIcon
- ),
- )
- )
- }
- return providerList
- }
-
+ ): List<ProviderInfo> = providerDataList.toProviderList(context)
fun toRequestDisplayInfo(
requestInfo: RequestInfo?,
context: Context,
@@ -254,178 +205,6 @@ class GetFlowUtils {
preferTopBrandingContent = preferTopBrandingContent,
)
}
-
-
- /**
- * Note: caller required handle empty list due to parsing error.
- */
- private fun getCredentialOptionInfoList(
- providerId: String,
- providerLabel: String,
- credentialEntries: List<Entry>,
- context: Context,
- ): List<CredentialEntryInfo> {
- val result: MutableList<CredentialEntryInfo> = mutableListOf()
- credentialEntries.forEach {
- val credentialEntry = parseCredentialEntryFromSlice(it.slice)
- when (credentialEntry) {
- is PasswordCredentialEntry -> {
- result.add(CredentialEntryInfo(
- providerId = providerId,
- providerDisplayName = providerLabel,
- entryKey = it.key,
- entrySubkey = it.subkey,
- pendingIntent = credentialEntry.pendingIntent,
- fillInIntent = it.frameworkExtrasIntent,
- credentialType = CredentialType.PASSWORD,
- credentialTypeDisplayName = credentialEntry.typeDisplayName.toString(),
- userName = credentialEntry.username.toString(),
- displayName = credentialEntry.displayName?.toString(),
- icon = credentialEntry.icon.loadDrawable(context),
- shouldTintIcon = credentialEntry.isDefaultIcon,
- lastUsedTimeMillis = credentialEntry.lastUsedTime,
- isAutoSelectable = credentialEntry.isAutoSelectAllowed &&
- credentialEntry.autoSelectAllowedFromOption,
- ))
- }
- is PublicKeyCredentialEntry -> {
- result.add(CredentialEntryInfo(
- providerId = providerId,
- providerDisplayName = providerLabel,
- entryKey = it.key,
- entrySubkey = it.subkey,
- pendingIntent = credentialEntry.pendingIntent,
- fillInIntent = it.frameworkExtrasIntent,
- credentialType = CredentialType.PASSKEY,
- credentialTypeDisplayName = credentialEntry.typeDisplayName.toString(),
- userName = credentialEntry.username.toString(),
- displayName = credentialEntry.displayName?.toString(),
- icon = credentialEntry.icon.loadDrawable(context),
- shouldTintIcon = credentialEntry.isDefaultIcon,
- lastUsedTimeMillis = credentialEntry.lastUsedTime,
- isAutoSelectable = credentialEntry.isAutoSelectAllowed &&
- credentialEntry.autoSelectAllowedFromOption,
- ))
- }
- is CustomCredentialEntry -> {
- result.add(CredentialEntryInfo(
- providerId = providerId,
- providerDisplayName = providerLabel,
- entryKey = it.key,
- entrySubkey = it.subkey,
- pendingIntent = credentialEntry.pendingIntent,
- fillInIntent = it.frameworkExtrasIntent,
- credentialType = CredentialType.UNKNOWN,
- credentialTypeDisplayName =
- credentialEntry.typeDisplayName?.toString().orEmpty(),
- userName = credentialEntry.title.toString(),
- displayName = credentialEntry.subtitle?.toString(),
- icon = credentialEntry.icon.loadDrawable(context),
- shouldTintIcon = credentialEntry.isDefaultIcon,
- lastUsedTimeMillis = credentialEntry.lastUsedTime,
- isAutoSelectable = credentialEntry.isAutoSelectAllowed &&
- credentialEntry.autoSelectAllowedFromOption,
- ))
- }
- else -> Log.d(
- Constants.LOG_TAG,
- "Encountered unrecognized credential entry ${it.slice.spec?.type}"
- )
- }
- }
- return result
- }
-
- /**
- * @hide
- */
- fun parseCredentialEntryFromSlice(slice: Slice): CredentialEntry? {
- try {
- when (slice.spec?.type) {
- TYPE_PASSWORD_CREDENTIAL -> return PasswordCredentialEntry.fromSlice(slice)!!
- TYPE_PUBLIC_KEY_CREDENTIAL -> return PublicKeyCredentialEntry.fromSlice(slice)!!
- else -> return CustomCredentialEntry.fromSlice(slice)!!
- }
- } catch (e: Exception) {
- // Try CustomCredentialEntry.fromSlice one last time in case the cause was a failed
- // password / passkey parsing attempt.
- return CustomCredentialEntry.fromSlice(slice)
- }
- }
-
- /**
- * Note: caller required handle empty list due to parsing error.
- */
- private fun getAuthenticationEntryList(
- providerId: String,
- providerDisplayName: String,
- providerIcon: Drawable,
- authEntryList: List<AuthenticationEntry>,
- ): List<AuthenticationEntryInfo> {
- val result: MutableList<AuthenticationEntryInfo> = mutableListOf()
- authEntryList.forEach { entry ->
- val structuredAuthEntry =
- AuthenticationAction.fromSlice(entry.slice) ?: return@forEach
-
- val title: String =
- structuredAuthEntry.title.toString().ifEmpty { providerDisplayName }
-
- result.add(AuthenticationEntryInfo(
- providerId = providerId,
- entryKey = entry.key,
- entrySubkey = entry.subkey,
- pendingIntent = structuredAuthEntry.pendingIntent,
- fillInIntent = entry.frameworkExtrasIntent,
- title = title,
- providerDisplayName = providerDisplayName,
- icon = providerIcon,
- isUnlockedAndEmpty = entry.status != AuthenticationEntry.STATUS_LOCKED,
- isLastUnlocked =
- entry.status == AuthenticationEntry.STATUS_UNLOCKED_BUT_EMPTY_MOST_RECENT
- ))
- }
- return result
- }
-
- private fun getRemoteEntry(providerId: String, remoteEntry: Entry?): RemoteEntryInfo? {
- if (remoteEntry == null) {
- return null
- }
- val structuredRemoteEntry = RemoteEntry.fromSlice(remoteEntry.slice)
- ?: return null
- return RemoteEntryInfo(
- providerId = providerId,
- entryKey = remoteEntry.key,
- entrySubkey = remoteEntry.subkey,
- pendingIntent = structuredRemoteEntry.pendingIntent,
- fillInIntent = remoteEntry.frameworkExtrasIntent,
- )
- }
-
- /**
- * Note: caller required handle empty list due to parsing error.
- */
- private fun getActionEntryList(
- providerId: String,
- actionEntries: List<Entry>,
- providerIcon: Drawable,
- ): List<ActionEntryInfo> {
- val result: MutableList<ActionEntryInfo> = mutableListOf()
- actionEntries.forEach {
- val actionEntryUi = Action.fromSlice(it.slice) ?: return@forEach
- result.add(ActionEntryInfo(
- providerId = providerId,
- entryKey = it.key,
- entrySubkey = it.subkey,
- pendingIntent = actionEntryUi.pendingIntent,
- fillInIntent = it.frameworkExtrasIntent,
- title = actionEntryUi.title.toString(),
- icon = providerIcon,
- subTitle = actionEntryUi.subtitle?.toString(),
- ))
- }
- return result
- }
}
}
@@ -686,7 +465,8 @@ class CreateFlowUtils {
val result: MutableList<CreateOptionInfo> = mutableListOf()
creationEntries.forEach {
val createEntry = CreateEntry.fromSlice(it.slice) ?: return@forEach
- result.add(CreateOptionInfo(
+ result.add(
+ CreateOptionInfo(
providerId = providerId,
entryKey = it.key,
entrySubkey = it.subkey,
@@ -705,7 +485,8 @@ class CreateFlowUtils {
it.hasHint("androidx.credentials.provider.createEntry.SLICE_HINT_AUTO_" +
"SELECT_ALLOWED")
}?.text == "true",
- ))
+ )
+ )
}
return result.sortedWith(
compareByDescending { it.lastUsedTime }
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
index 281696dec717..20d2f09ced8f 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
@@ -48,10 +48,11 @@ import androidx.credentials.provider.CustomCredentialEntry
import androidx.credentials.provider.PasswordCredentialEntry
import androidx.credentials.provider.PublicKeyCredentialEntry
import com.android.credentialmanager.GetFlowUtils
-import com.android.credentialmanager.getflow.CredentialEntryInfo
+import com.android.credentialmanager.model.get.CredentialEntryInfo
import com.android.credentialmanager.getflow.ProviderDisplayInfo
-import com.android.credentialmanager.getflow.ProviderInfo
+import com.android.credentialmanager.model.get.ProviderInfo
import com.android.credentialmanager.getflow.toProviderDisplayInfo
+import com.android.credentialmanager.ktx.credentialEntry
import org.json.JSONObject
import java.util.concurrent.Executors
@@ -122,8 +123,7 @@ class CredentialAutofillService : AutofillService() {
val entryIconMap: MutableMap<String, Icon> = mutableMapOf()
candidateProviderDataList.forEach { provider ->
provider.credentialEntries.forEach { entry ->
- val credentialEntry = GetFlowUtils.parseCredentialEntryFromSlice(entry.slice)
- when (credentialEntry) {
+ when (val credentialEntry = entry.slice.credentialEntry) {
is PasswordCredentialEntry -> {
entryIconMap[entry.key + entry.subkey] = credentialEntry.icon
}
@@ -172,11 +172,11 @@ class CredentialAutofillService : AutofillService() {
}
private fun processProvidersForAutofillId(
- filLRequest: FillRequest,
- autofillId: AutofillId,
- providerList: List<ProviderInfo>,
- entryIconMap: Map<String, Icon>,
- fillResponseBuilder: FillResponse.Builder
+ filLRequest: FillRequest,
+ autofillId: AutofillId,
+ providerList: List<ProviderInfo>,
+ entryIconMap: Map<String, Icon>,
+ fillResponseBuilder: FillResponse.Builder
): Boolean {
if (providerList.isEmpty()) {
return false
@@ -200,7 +200,8 @@ class CredentialAutofillService : AutofillService() {
providerDisplayInfo.sortedUserNameToCredentialEntryList.forEach usernameLoop@ {
val primaryEntry = it.sortedCredentialEntryList.first()
val pendingIntent = primaryEntry.pendingIntent
- if (pendingIntent == null || primaryEntry.fillInIntent == null) {
+ val fillInIntent = primaryEntry.fillInIntent
+ if (pendingIntent == null || fillInIntent == null) {
// FillInIntent will not be null because autofillId was retrieved from it.
Log.e(TAG, "PendingIntent was missing from the entry.")
return@usernameLoop
@@ -245,7 +246,7 @@ class CredentialAutofillService : AutofillService() {
presentationBuilder.build())
.build())
.setAuthentication(pendingIntent.intentSender)
- .setAuthenticationExtras(primaryEntry.fillInIntent.extras)
+ .setAuthenticationExtras(fillInIntent.extras)
.build())
datasetAdded = true
}
@@ -322,8 +323,8 @@ class CredentialAutofillService : AutofillService() {
}
private fun copyProviderInfo(
- providerInfo: ProviderInfo,
- credentialList: List<CredentialEntryInfo>
+ providerInfo: ProviderInfo,
+ credentialList: List<CredentialEntryInfo>
): ProviderInfo {
return ProviderInfo(
providerInfo.id,
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt
index d45b6f687193..14a91651753b 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt
@@ -48,8 +48,8 @@ import androidx.compose.ui.unit.dp
import androidx.core.graphics.drawable.toBitmap
import com.android.credentialmanager.CredentialSelectorViewModel
import com.android.credentialmanager.R
-import com.android.credentialmanager.common.BaseEntry
-import com.android.credentialmanager.common.CredentialType
+import com.android.credentialmanager.model.EntryInfo
+import com.android.credentialmanager.model.CredentialType
import com.android.credentialmanager.common.ProviderActivityState
import com.android.credentialmanager.common.material.ModalBottomSheetDefaults
import com.android.credentialmanager.common.ui.ActionButton
@@ -68,6 +68,8 @@ import com.android.credentialmanager.common.ui.SheetContainerCard
import com.android.credentialmanager.common.ui.PasskeyBenefitRow
import com.android.credentialmanager.common.ui.HeadlineText
import com.android.credentialmanager.logging.CreateCredentialEvent
+import com.android.credentialmanager.model.creation.CreateOptionInfo
+import com.android.credentialmanager.model.creation.RemoteInfo
import com.android.credentialmanager.ui.theme.LocalAndroidColorScheme
import com.android.internal.logging.UiEventLogger.UiEventEnum
@@ -259,15 +261,15 @@ fun PasskeyIntroCard(
@Composable
fun MoreOptionsSelectionCard(
- requestDisplayInfo: RequestDisplayInfo,
- enabledProviderList: List<EnabledProviderInfo>,
- disabledProviderList: List<DisabledProviderInfo>?,
- sortedCreateOptionsPairs: List<Pair<CreateOptionInfo, EnabledProviderInfo>>,
- onBackCreationSelectionButtonSelected: () -> Unit,
- onOptionSelected: (ActiveEntry) -> Unit,
- onDisabledProvidersSelected: () -> Unit,
- onRemoteEntrySelected: (BaseEntry) -> Unit,
- onLog: @Composable (UiEventEnum) -> Unit,
+ requestDisplayInfo: RequestDisplayInfo,
+ enabledProviderList: List<EnabledProviderInfo>,
+ disabledProviderList: List<DisabledProviderInfo>?,
+ sortedCreateOptionsPairs: List<Pair<CreateOptionInfo, EnabledProviderInfo>>,
+ onBackCreationSelectionButtonSelected: () -> Unit,
+ onOptionSelected: (ActiveEntry) -> Unit,
+ onDisabledProvidersSelected: () -> Unit,
+ onRemoteEntrySelected: (EntryInfo) -> Unit,
+ onLog: @Composable (UiEventEnum) -> Unit,
) {
SheetContainerCard(topAppBar = {
MoreOptionTopAppBar(
@@ -378,14 +380,14 @@ fun NonDefaultUsageConfirmationCard(
@Composable
fun CreationSelectionCard(
- requestDisplayInfo: RequestDisplayInfo,
- enabledProviderList: List<EnabledProviderInfo>,
- providerInfo: EnabledProviderInfo,
- createOptionInfo: CreateOptionInfo,
- onOptionSelected: (BaseEntry) -> Unit,
- onConfirm: () -> Unit,
- onMoreOptionsSelected: () -> Unit,
- onLog: @Composable (UiEventEnum) -> Unit,
+ requestDisplayInfo: RequestDisplayInfo,
+ enabledProviderList: List<EnabledProviderInfo>,
+ providerInfo: EnabledProviderInfo,
+ createOptionInfo: CreateOptionInfo,
+ onOptionSelected: (EntryInfo) -> Unit,
+ onConfirm: () -> Unit,
+ onMoreOptionsSelected: () -> Unit,
+ onLog: @Composable (UiEventEnum) -> Unit,
) {
SheetContainerCard {
item {
@@ -474,11 +476,11 @@ fun CreationSelectionCard(
@Composable
fun ExternalOnlySelectionCard(
- requestDisplayInfo: RequestDisplayInfo,
- activeRemoteEntry: BaseEntry,
- onOptionSelected: (BaseEntry) -> Unit,
- onConfirm: () -> Unit,
- onLog: @Composable (UiEventEnum) -> Unit,
+ requestDisplayInfo: RequestDisplayInfo,
+ activeRemoteEntry: EntryInfo,
+ onOptionSelected: (EntryInfo) -> Unit,
+ onConfirm: () -> Unit,
+ onLog: @Composable (UiEventEnum) -> Unit,
) {
SheetContainerCard {
item { HeadlineIcon(imageVector = Icons.Outlined.QrCodeScanner) }
@@ -575,17 +577,14 @@ fun MoreAboutPasskeysIntroCard(
@Composable
fun PrimaryCreateOptionRow(
requestDisplayInfo: RequestDisplayInfo,
- entryInfo: BaseEntry,
- onOptionSelected: (BaseEntry) -> Unit
+ entryInfo: EntryInfo,
+ onOptionSelected: (EntryInfo) -> Unit
) {
Entry(
onClick = { onOptionSelected(entryInfo) },
- iconImageBitmap =
- if (entryInfo is CreateOptionInfo && entryInfo.profileIcon != null) {
- entryInfo.profileIcon.toBitmap().asImageBitmap()
- } else {
- requestDisplayInfo.typeIcon.toBitmap().asImageBitmap()
- },
+ iconImageBitmap = ((entryInfo as? CreateOptionInfo)?.profileIcon
+ ?: requestDisplayInfo.typeIcon)
+ .toBitmap().asImageBitmap(),
shouldApplyIconImageBitmapTint = !(entryInfo is CreateOptionInfo &&
entryInfo.profileIcon != null),
entryHeadlineText = requestDisplayInfo.title,
@@ -627,32 +626,33 @@ fun MoreOptionsInfoRow(
entryThirdLineText =
if (requestDisplayInfo.type == CredentialType.PASSKEY ||
requestDisplayInfo.type == CredentialType.PASSWORD) {
- if (createOptionInfo.passwordCount != null &&
- createOptionInfo.passkeyCount != null
- ) {
+ val passwordCount = createOptionInfo.passwordCount
+ val passkeyCount = createOptionInfo.passkeyCount
+ if (passwordCount != null && passkeyCount != null) {
stringResource(
R.string.more_options_usage_passwords_passkeys,
- createOptionInfo.passwordCount,
- createOptionInfo.passkeyCount
+ passwordCount,
+ passkeyCount
)
- } else if (createOptionInfo.passwordCount != null) {
+ } else if (passwordCount != null) {
stringResource(
R.string.more_options_usage_passwords,
- createOptionInfo.passwordCount
+ passwordCount
)
- } else if (createOptionInfo.passkeyCount != null) {
+ } else if (passkeyCount != null) {
stringResource(
R.string.more_options_usage_passkeys,
- createOptionInfo.passkeyCount
+ passkeyCount
)
} else {
null
}
} else {
- if (createOptionInfo.totalCredentialCount != null) {
+ val totalCredentialCount = createOptionInfo.totalCredentialCount
+ if (totalCredentialCount != null) {
stringResource(
R.string.more_options_usage_credentials,
- createOptionInfo.totalCredentialCount
+ totalCredentialCount
)
} else {
null
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt
index e9e8c2e0ccbf..8b0ba87fa9be 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt
@@ -16,22 +16,21 @@
package com.android.credentialmanager.createflow
-import android.app.PendingIntent
-import android.content.Intent
import android.graphics.drawable.Drawable
-import com.android.credentialmanager.common.BaseEntry
-import com.android.credentialmanager.common.CredentialType
-import java.time.Instant
+import com.android.credentialmanager.model.EntryInfo
+import com.android.credentialmanager.model.CredentialType
+import com.android.credentialmanager.model.creation.CreateOptionInfo
+import com.android.credentialmanager.model.creation.RemoteInfo
data class CreateCredentialUiState(
- val enabledProviders: List<EnabledProviderInfo>,
- val disabledProviders: List<DisabledProviderInfo>? = null,
- val currentScreenState: CreateScreenState,
- val requestDisplayInfo: RequestDisplayInfo,
- val sortedCreateOptionsPairs: List<Pair<CreateOptionInfo, EnabledProviderInfo>>,
- val activeEntry: ActiveEntry? = null,
- val remoteEntry: RemoteInfo? = null,
- val foundCandidateFromUserDefaultProvider: Boolean,
+ val enabledProviders: List<EnabledProviderInfo>,
+ val disabledProviders: List<DisabledProviderInfo>? = null,
+ val currentScreenState: CreateScreenState,
+ val requestDisplayInfo: RequestDisplayInfo,
+ val sortedCreateOptionsPairs: List<Pair<CreateOptionInfo, EnabledProviderInfo>>,
+ val activeEntry: ActiveEntry? = null,
+ val remoteEntry: RemoteInfo? = null,
+ val foundCandidateFromUserDefaultProvider: Boolean,
)
internal fun isFlowAutoSelectable(
@@ -75,44 +74,6 @@ class DisabledProviderInfo(
displayName: String,
) : ProviderInfo(icon, id, displayName)
-class CreateOptionInfo(
- providerId: String,
- entryKey: String,
- entrySubkey: String,
- pendingIntent: PendingIntent?,
- fillInIntent: Intent?,
- val userProviderDisplayName: String,
- val profileIcon: Drawable?,
- val passwordCount: Int?,
- val passkeyCount: Int?,
- val totalCredentialCount: Int?,
- val lastUsedTime: Instant,
- val footerDescription: String?,
- val allowAutoSelect: Boolean,
-) : BaseEntry(
- providerId,
- entryKey,
- entrySubkey,
- pendingIntent,
- fillInIntent,
- shouldTerminateUiUponSuccessfulProviderResult = true,
-)
-
-class RemoteInfo(
- providerId: String,
- entryKey: String,
- entrySubkey: String,
- pendingIntent: PendingIntent?,
- fillInIntent: Intent?,
-) : BaseEntry(
- providerId,
- entryKey,
- entrySubkey,
- pendingIntent,
- fillInIntent,
- shouldTerminateUiUponSuccessfulProviderResult = true,
-)
-
data class RequestDisplayInfo(
val title: String,
val subtitle: String?,
@@ -131,8 +92,8 @@ data class RequestDisplayInfo(
* user selects a different entry on the more option page.
*/
data class ActiveEntry (
- val activeProvider: EnabledProviderInfo,
- val activeEntryInfo: BaseEntry,
+ val activeProvider: EnabledProviderInfo,
+ val activeEntryInfo: EntryInfo,
)
/** The name of the current screen. */
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
index 72d030b3e657..4ed84b908865 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt
@@ -48,8 +48,9 @@ import androidx.compose.ui.unit.dp
import androidx.core.graphics.drawable.toBitmap
import com.android.credentialmanager.CredentialSelectorViewModel
import com.android.credentialmanager.R
-import com.android.credentialmanager.common.BaseEntry
-import com.android.credentialmanager.common.CredentialType
+import com.android.credentialmanager.model.EntryInfo
+import com.android.credentialmanager.model.CredentialType
+import com.android.credentialmanager.model.get.ProviderInfo
import com.android.credentialmanager.common.ProviderActivityState
import com.android.credentialmanager.common.material.ModalBottomSheetDefaults
import com.android.credentialmanager.common.ui.ActionButton
@@ -68,6 +69,10 @@ import com.android.credentialmanager.common.ui.HeadlineIcon
import com.android.credentialmanager.common.ui.LargeLabelTextOnSurfaceVariant
import com.android.credentialmanager.common.ui.Snackbar
import com.android.credentialmanager.logging.GetCredentialEvent
+import com.android.credentialmanager.model.get.ActionEntryInfo
+import com.android.credentialmanager.model.get.AuthenticationEntryInfo
+import com.android.credentialmanager.model.get.CredentialEntryInfo
+import com.android.credentialmanager.model.get.RemoteEntryInfo
import com.android.credentialmanager.userAndDisplayNameForPasskey
import com.android.internal.logging.UiEventLogger.UiEventEnum
@@ -175,8 +180,8 @@ fun PrimarySelectionCard(
requestDisplayInfo: RequestDisplayInfo,
providerDisplayInfo: ProviderDisplayInfo,
providerInfoList: List<ProviderInfo>,
- activeEntry: BaseEntry?,
- onEntrySelected: (BaseEntry) -> Unit,
+ activeEntry: EntryInfo?,
+ onEntrySelected: (EntryInfo) -> Unit,
onConfirm: () -> Unit,
onMoreOptionSelected: () -> Unit,
onLog: @Composable (UiEventEnum) -> Unit,
@@ -358,7 +363,7 @@ fun PrimarySelectionCard(
fun AllSignInOptionCard(
providerInfoList: List<ProviderInfo>,
providerDisplayInfo: ProviderDisplayInfo,
- onEntrySelected: (BaseEntry) -> Unit,
+ onEntrySelected: (EntryInfo) -> Unit,
onBackButtonClicked: () -> Unit,
onCancel: () -> Unit,
onLog: @Composable (UiEventEnum) -> Unit,
@@ -436,7 +441,7 @@ fun HeadlineProviderIconAndName(
@Composable
fun ActionChips(
providerInfoList: List<ProviderInfo>,
- onEntrySelected: (BaseEntry) -> Unit,
+ onEntrySelected: (EntryInfo) -> Unit,
isFirstSection: Boolean,
) {
val actionChips = providerInfoList.flatMap { it.actionEntryList }
@@ -460,7 +465,7 @@ fun ActionChips(
@Composable
fun RemoteEntryCard(
remoteEntry: RemoteEntryInfo,
- onEntrySelected: (BaseEntry) -> Unit,
+ onEntrySelected: (EntryInfo) -> Unit,
isFirstSection: Boolean,
) {
CredentialListSectionHeader(
@@ -486,7 +491,7 @@ fun RemoteEntryCard(
@Composable
fun LockedCredentials(
authenticationEntryList: List<AuthenticationEntryInfo>,
- onEntrySelected: (BaseEntry) -> Unit,
+ onEntrySelected: (EntryInfo) -> Unit,
isFirstSection: Boolean,
) {
CredentialListSectionHeader(
@@ -508,7 +513,7 @@ fun LockedCredentials(
@Composable
fun PerUserNameCredentials(
perUserNameCredentialEntryList: PerUserNameCredentialEntryList,
- onEntrySelected: (BaseEntry) -> Unit,
+ onEntrySelected: (EntryInfo) -> Unit,
isFirstSection: Boolean,
) {
CredentialListSectionHeader(
@@ -532,7 +537,7 @@ fun PerUserNameCredentials(
@Composable
fun CredentialEntryRow(
credentialEntryInfo: CredentialEntryInfo,
- onEntrySelected: (BaseEntry) -> Unit,
+ onEntrySelected: (EntryInfo) -> Unit,
enforceOneLine: Boolean = false,
onTextLayout: (TextLayoutResult) -> Unit = {},
) {
@@ -571,7 +576,7 @@ fun CredentialEntryRow(
@Composable
fun AuthenticationEntryRow(
authenticationEntryInfo: AuthenticationEntryInfo,
- onEntrySelected: (BaseEntry) -> Unit,
+ onEntrySelected: (EntryInfo) -> Unit,
enforceOneLine: Boolean = false,
) {
Entry(
@@ -596,7 +601,7 @@ fun AuthenticationEntryRow(
@Composable
fun ActionEntryRow(
actionEntryInfo: ActionEntryInfo,
- onEntrySelected: (BaseEntry) -> Unit,
+ onEntrySelected: (EntryInfo) -> Unit,
) {
ActionEntry(
iconImageBitmap = actionEntryInfo.icon.toBitmap().asImageBitmap(),
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt
index 447a9d2aaa8d..46bebc4073ab 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt
@@ -16,21 +16,21 @@
package com.android.credentialmanager.getflow
-import android.app.PendingIntent
-import android.content.Intent
import android.graphics.drawable.Drawable
-import com.android.credentialmanager.common.BaseEntry
-import com.android.credentialmanager.common.CredentialType
+import com.android.credentialmanager.model.get.ProviderInfo
+import com.android.credentialmanager.model.EntryInfo
+import com.android.credentialmanager.model.CredentialType
+import com.android.credentialmanager.model.get.AuthenticationEntryInfo
+import com.android.credentialmanager.model.get.CredentialEntryInfo
+import com.android.credentialmanager.model.get.RemoteEntryInfo
import com.android.internal.util.Preconditions
-import java.time.Instant
-
data class GetCredentialUiState(
val providerInfoList: List<ProviderInfo>,
val requestDisplayInfo: RequestDisplayInfo,
val providerDisplayInfo: ProviderDisplayInfo = toProviderDisplayInfo(providerInfoList),
val currentScreenState: GetScreenState = toGetScreenState(providerDisplayInfo),
- val activeEntry: BaseEntry? = toActiveEntry(providerDisplayInfo),
+ val activeEntry: EntryInfo? = toActiveEntry(providerDisplayInfo),
val isNoAccount: Boolean = false,
)
@@ -58,20 +58,6 @@ internal fun findAutoSelectEntry(providerDisplayInfo: ProviderDisplayInfo): Cred
return null
}
-data class ProviderInfo(
- /**
- * Unique id (component name) of this provider.
- * Not for display purpose - [displayName] should be used for ui rendering.
- */
- val id: String,
- val icon: Drawable,
- val displayName: String,
- val credentialEntryList: List<CredentialEntryInfo>,
- val authenticationEntryList: List<AuthenticationEntryInfo>,
- val remoteEntry: RemoteEntryInfo?,
- val actionEntryList: List<ActionEntryInfo>,
-)
-
/** Display-centric data structure derived from the [ProviderInfo]. This abstraction is not grouping
* by the provider id but instead focuses on structures convenient for display purposes. */
data class ProviderDisplayInfo(
@@ -84,87 +70,6 @@ data class ProviderDisplayInfo(
val remoteEntry: RemoteEntryInfo?
)
-class CredentialEntryInfo(
- providerId: String,
- entryKey: String,
- entrySubkey: String,
- pendingIntent: PendingIntent?,
- fillInIntent: Intent?,
- /** Type of this credential used for sorting. Not localized so must not be directly displayed. */
- val credentialType: CredentialType,
- /** Localized type value of this credential used for display purpose. */
- val credentialTypeDisplayName: String,
- val providerDisplayName: String,
- val userName: String,
- val displayName: String?,
- val icon: Drawable?,
- val shouldTintIcon: Boolean,
- val lastUsedTimeMillis: Instant?,
- val isAutoSelectable: Boolean,
-) : BaseEntry(
- providerId,
- entryKey,
- entrySubkey,
- pendingIntent,
- fillInIntent,
- shouldTerminateUiUponSuccessfulProviderResult = true,
-)
-
-class AuthenticationEntryInfo(
- providerId: String,
- entryKey: String,
- entrySubkey: String,
- pendingIntent: PendingIntent?,
- fillInIntent: Intent?,
- val title: String,
- val providerDisplayName: String,
- val icon: Drawable,
- // The entry had been unlocked and turned out to be empty. Used to determine whether to
- // show "Tap to unlock" or "No sign-in info" for this entry.
- val isUnlockedAndEmpty: Boolean,
- // True if the entry was the last one unlocked. Used to show the no sign-in info snackbar.
- val isLastUnlocked: Boolean,
-) : BaseEntry(
- providerId,
- entryKey, entrySubkey,
- pendingIntent,
- fillInIntent,
- shouldTerminateUiUponSuccessfulProviderResult = false,
-)
-
-class RemoteEntryInfo(
- providerId: String,
- entryKey: String,
- entrySubkey: String,
- pendingIntent: PendingIntent?,
- fillInIntent: Intent?,
-) : BaseEntry(
- providerId,
- entryKey,
- entrySubkey,
- pendingIntent,
- fillInIntent,
- shouldTerminateUiUponSuccessfulProviderResult = true,
-)
-
-class ActionEntryInfo(
- providerId: String,
- entryKey: String,
- entrySubkey: String,
- pendingIntent: PendingIntent?,
- fillInIntent: Intent?,
- val title: String,
- val icon: Drawable,
- val subTitle: String?,
-) : BaseEntry(
- providerId,
- entryKey,
- entrySubkey,
- pendingIntent,
- fillInIntent,
- shouldTerminateUiUponSuccessfulProviderResult = true,
-)
-
data class RequestDisplayInfo(
val appName: String,
val preferImmediatelyAvailableCredentials: Boolean,
@@ -218,8 +123,8 @@ fun toProviderDisplayInfo(
val remoteEntryList = mutableListOf<RemoteEntryInfo>()
providerInfoList.forEach { providerInfo ->
authenticationEntryList.addAll(providerInfo.authenticationEntryList)
- if (providerInfo.remoteEntry != null) {
- remoteEntryList.add(providerInfo.remoteEntry)
+ providerInfo.remoteEntry?.let {
+ remoteEntryList.add(it)
}
// There can only be at most one remote entry
Preconditions.checkState(remoteEntryList.size <= 1)
@@ -260,11 +165,11 @@ fun toProviderDisplayInfo(
private fun toActiveEntry(
providerDisplayInfo: ProviderDisplayInfo,
-): BaseEntry? {
+): EntryInfo? {
val sortedUserNameToCredentialEntryList =
providerDisplayInfo.sortedUserNameToCredentialEntryList
val authenticationEntryList = providerDisplayInfo.authenticationEntryList
- var activeEntry: BaseEntry? = null
+ var activeEntry: EntryInfo? = null
if (sortedUserNameToCredentialEntryList
.size == 1 && authenticationEntryList.isEmpty()
) {
@@ -302,17 +207,18 @@ internal class CredentialEntryInfoComparatorByTypeThenTimestamp : Comparator<Cre
return 1
}
}
-
+ val p0LastUsedTimeMillis = p0.lastUsedTimeMillis
+ val p1LastUsedTimeMillis = p1.lastUsedTimeMillis
// Then order by last used timestamp
- if (p0.lastUsedTimeMillis != null && p1.lastUsedTimeMillis != null) {
- if (p0.lastUsedTimeMillis < p1.lastUsedTimeMillis) {
+ if (p0LastUsedTimeMillis != null && p1LastUsedTimeMillis != null) {
+ if (p0LastUsedTimeMillis < p1LastUsedTimeMillis) {
return 1
- } else if (p0.lastUsedTimeMillis > p1.lastUsedTimeMillis) {
+ } else if (p0LastUsedTimeMillis > p1LastUsedTimeMillis) {
return -1
}
- } else if (p0.lastUsedTimeMillis != null) {
+ } else if (p0LastUsedTimeMillis != null) {
return -1
- } else if (p1.lastUsedTimeMillis != null) {
+ } else if (p1LastUsedTimeMillis != null) {
return 1
}
return 0
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/di/AppModule.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/di/AppModule.kt
index 6ededf3411bf..d8a6019b68a2 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/di/AppModule.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/di/AppModule.kt
@@ -1,29 +1,20 @@
package com.android.credentialmanager.di
-import android.content.Context
-import android.content.pm.PackageManager
import com.android.credentialmanager.client.CredentialManagerClient
import com.android.credentialmanager.client.impl.CredentialManagerClientImpl
+import dagger.Binds
import dagger.Module
-import dagger.Provides
import dagger.hilt.InstallIn
-import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
-internal object AppModule {
- @Provides
+abstract class AppModule {
+ @Binds
@Singleton
- @JvmStatic
- fun providePackageManager(@ApplicationContext context: Context): PackageManager =
- context.packageManager
-
- @Provides
- @Singleton
- @JvmStatic
- fun provideCredentialManagerClient(packageManager: PackageManager): CredentialManagerClient =
- CredentialManagerClientImpl(packageManager)
+ abstract fun provideCredentialManagerClient(
+ client: CredentialManagerClientImpl
+ ): CredentialManagerClient
}
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt
index f2f878e8ac2f..14b992a0d0e9 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt
@@ -23,8 +23,8 @@ fun Request.Get.toGet(): CredentialSelectorUiState.Get {
// TODO: b/301206470 returning a hard coded state for MVP
if (true) return CredentialSelectorUiState.Get.SingleProviderSinglePassword
- return if (providers.size == 1) {
- if (passwordEntries.size == 1) {
+ return if (providerInfos.size == 1) {
+ if (providerInfos.first().credentialEntryList.size == 1) {
CredentialSelectorUiState.Get.SingleProviderSinglePassword
} else {
TODO() // b/301206470 - Implement other get flows
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreen.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreen.kt
index c28df3e8895a..b64f58192d23 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreen.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreen.kt
@@ -76,7 +76,9 @@ fun SinglePasswordScreen(
}
SideEffect {
- launcher.launch(state.intentSenderRequest)
+ state.intentSenderRequest?.let {
+ launcher.launch(it)
+ }
}
}
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreenViewModel.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreenViewModel.kt
index fb72c544c978..26bee1f8d191 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreenViewModel.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreenViewModel.kt
@@ -26,9 +26,9 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.android.credentialmanager.TAG
import com.android.credentialmanager.ktx.getIntentSenderRequest
-import com.android.credentialmanager.model.Password
import com.android.credentialmanager.model.Request
import com.android.credentialmanager.client.CredentialManagerClient
+import com.android.credentialmanager.model.get.CredentialEntryInfo
import com.android.credentialmanager.ui.model.PasswordUiModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
@@ -44,7 +44,7 @@ class SinglePasswordScreenViewModel @Inject constructor(
private var initializeCalled = false
private lateinit var requestGet: Request.Get
- private lateinit var password: Password
+ private lateinit var entryInfo: CredentialEntryInfo
private val _uiState =
MutableStateFlow<SinglePasswordScreenUiState>(SinglePasswordScreenUiState.Idle)
@@ -63,14 +63,15 @@ class SinglePasswordScreenViewModel @Inject constructor(
_uiState.value = SinglePasswordScreenUiState.Error
} else {
requestGet = request
- if (requestGet.passwordEntries.isEmpty()) {
+
+ if (requestGet.providerInfos.all { it.credentialEntryList.isEmpty() }) {
Log.d(TAG, "Empty passwordEntries")
_uiState.value = SinglePasswordScreenUiState.Error
} else {
- password = requestGet.passwordEntries.first()
+ entryInfo = requestGet.providerInfos.first().credentialEntryList.first()
_uiState.value = SinglePasswordScreenUiState.Loaded(
PasswordUiModel(
- email = password.passwordCredentialEntry.username.toString(),
+ email = entryInfo.userName,
)
)
}
@@ -84,7 +85,7 @@ class SinglePasswordScreenViewModel @Inject constructor(
fun onOKClick() {
_uiState.value = SinglePasswordScreenUiState.PasswordSelected(
- intentSenderRequest = password.getIntentSenderRequest()
+ intentSenderRequest = entryInfo.getIntentSenderRequest()
)
}
@@ -94,9 +95,9 @@ class SinglePasswordScreenViewModel @Inject constructor(
) {
val userSelectionDialogResult = UserSelectionDialogResult(
requestGet.token,
- password.providerId,
- password.entry.key,
- password.entry.subkey,
+ entryInfo.providerId,
+ entryInfo.entryKey,
+ entryInfo.entrySubkey,
if (resultCode != null) ProviderPendingIntentResponse(resultCode, resultData) else null
)
credentialManagerClient.sendResult(userSelectionDialogResult)
@@ -108,7 +109,7 @@ sealed class SinglePasswordScreenUiState {
data object Idle : SinglePasswordScreenUiState()
data class Loaded(val passwordUiModel: PasswordUiModel) : SinglePasswordScreenUiState()
data class PasswordSelected(
- val intentSenderRequest: IntentSenderRequest
+ val intentSenderRequest: IntentSenderRequest?
) : SinglePasswordScreenUiState()
data object Cancel : SinglePasswordScreenUiState()
diff --git a/packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm b/packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm
index 90041da529c0..24b4d2fd6487 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm
@@ -14,8 +14,8 @@
#
# Ukrainian keyboard layout.
-# This is a typical Ukrainian PC keyboard layout.
-# As an added convenience, English characters are accessible using ralt (Alt Gr).
+# Based on PC enhanced Ukrainian layout with added Unicode keys based on
+# the Linux one.
#
type OVERLAY
@@ -25,32 +25,34 @@ map key 86 PLUS
### ROW 1
key GRAVE {
- label: '\u0401'
- base: '\u0451'
- shift, capslock: '\u0401'
- shift+capslock: '\u0451'
- ralt: '`'
+ label: '\''
+ base: '\''
+ shift: '\u02bc'
+ ralt: '\u0301'
ralt+shift: '~'
}
key 1 {
label: '1'
base: '1'
- shift, ralt: '!'
+ shift: '!'
+ ralt: '\u00b9'
}
key 2 {
label: '2'
base: '2'
shift: '"'
- ralt: '@'
+ ralt: '\u00b2'
+ ralt+shift: '\u2019'
}
key 3 {
label: '3'
base: '3'
shift: '\u2116'
- ralt: '#'
+ ralt: '\u00a7'
+ ralt+shift: '\u20b4'
}
key 4 {
@@ -58,60 +60,67 @@ key 4 {
base: '4'
shift: ';'
ralt: '$'
+ ralt+shift: '\u20ac'
}
key 5 {
label: '5'
base: '5'
- shift, ralt: '%'
+ shift: '%'
+ ralt: '\u00b0'
}
key 6 {
label: '6'
base: '6'
shift: ':'
- ralt: '^'
+ ralt: '<'
}
key 7 {
label: '7'
base: '7'
shift: '?'
- ralt: '&'
+ ralt: '>'
}
key 8 {
label: '8'
base: '8'
- shift, ralt: '*'
+ shift: '*'
+ ralt: '\u2022'
}
key 9 {
label: '9'
base: '9'
- shift, ralt: '('
+ shift: '('
+ ralt: '['
+ ralt+shift: '{'
}
key 0 {
label: '0'
base: '0'
- shift, ralt: ')'
+ shift: ')'
+ ralt: ']'
+ ralt+shift: '}'
}
key MINUS {
label: '-'
base: '-'
shift: '_'
- ralt: '-'
- shift+ralt: '_'
+ ralt: '\u2014'
+ shift+ralt: '\u2013'
}
key EQUALS {
label: '='
base: '='
shift: '+'
- ralt: '='
- shift+ralt: '+'
+ ralt: '\u2260'
+ shift+ralt: '\u00b1'
}
### ROW 2
@@ -121,6 +130,9 @@ key Q {
base: '\u0439'
shift, capslock: '\u0419'
shift+capslock: '\u0439'
+ ralt: '\u0458'
+ ralt+shift, ralt+capslock: '\u0408'
+ ralt+shift+capslock: '\u0458'
}
key W {
@@ -128,6 +140,9 @@ key W {
base: '\u0446'
shift, capslock: '\u0426'
shift+capslock: '\u0446'
+ ralt: '\u045f'
+ ralt+shift, ralt+capslock: '\u040f'
+ ralt+shift+capslock: '\u045f'
}
key E {
@@ -135,6 +150,9 @@ key E {
base: '\u0443'
shift, capslock: '\u0423'
shift+capslock: '\u0443'
+ ralt: '\u045e'
+ ralt+shift, ralt+capslock: '\u040e'
+ ralt+shift+capslock: '\u045e'
}
key R {
@@ -142,6 +160,7 @@ key R {
base: '\u043a'
shift, capslock: '\u041a'
shift+capslock: '\u043a'
+ ralt: '\u00ae'
}
key T {
@@ -149,6 +168,9 @@ key T {
base: '\u0435'
shift, capslock: '\u0415'
shift+capslock: '\u0435'
+ ralt: '\u0451'
+ ralt+shift, ralt+capslock: '\u0401'
+ ralt+shift+capslock: '\u0451'
}
key Y {
@@ -156,6 +178,9 @@ key Y {
base: '\u043d'
shift, capslock: '\u041d'
shift+capslock: '\u043d'
+ ralt: '\u045a'
+ ralt+shift, ralt+capslock: '\u040a'
+ ralt+shift+capslock: '\u045a'
}
key U {
@@ -164,8 +189,8 @@ key U {
shift, capslock: '\u0413'
shift+capslock: '\u0433'
ralt: '\u0491'
- shift+ralt, capslock+ralt: '\u0490'
- shift+capslock+ralt: '\u0491'
+ ralt+shift, ralt+capslock: '\u0490'
+ ralt+shift+capslock: '\u0491'
}
key I {
@@ -201,6 +226,9 @@ key RIGHT_BRACKET {
base: '\u0457'
shift, capslock: '\u0407'
shift+capslock: '\u0457'
+ ralt: '\u044a'
+ ralt+shift, ralt+capslock: '\u042a'
+ ralt+shift+capslock: '\u044a'
}
### ROW 3
@@ -217,6 +245,9 @@ key S {
base: '\u0456'
shift, capslock: '\u0406'
shift+capslock: '\u0456'
+ ralt: '\u044b'
+ ralt+shift, ralt+capslock: '\u042b'
+ ralt+shift+capslock: '\u044b'
}
key D {
@@ -259,6 +290,9 @@ key K {
base: '\u043b'
shift, capslock: '\u041b'
shift+capslock: '\u043b'
+ ralt: '\u0459'
+ ralt+shift, ralt+capslock: '\u0409'
+ ralt+shift+capslock: '\u0459'
}
key L {
@@ -266,6 +300,9 @@ key L {
base: '\u0434'
shift, capslock: '\u0414'
shift+capslock: '\u0434'
+ ralt: '\u0452'
+ ralt+shift, ralt+capslock: '\u0402'
+ ralt+shift+capslock: '\u0452'
}
key SEMICOLON {
@@ -282,15 +319,18 @@ key APOSTROPHE {
base: '\u0454'
shift, capslock: '\u0404'
shift+capslock: '\u0454'
- ralt: '\''
- ralt+shift: '"'
+ ralt: '\u044d'
+ ralt+shift, ralt+capslock: '\u042d'
+ ralt+shift+capslock: '\u044d'
}
key BACKSLASH {
label: '\\'
base: '\\'
shift: '/'
- ralt: '|'
+ ralt: '\u0491'
+ ralt+shift, ralt+capslock: '\u0490'
+ ralt+shift+capslock: '\u0491'
}
### ROW 4
@@ -316,6 +356,9 @@ key X {
base: '\u0447'
shift, capslock: '\u0427'
shift+capslock: '\u0447'
+ ralt: '\u045b'
+ ralt+shift, ralt+capslock: '\u040b'
+ ralt+shift+capslock: '\u045b'
}
key C {
@@ -323,6 +366,7 @@ key C {
base: '\u0441'
shift, capslock: '\u0421'
shift+capslock: '\u0441'
+ ralt: '\u00a9'
}
key V {
@@ -344,6 +388,7 @@ key N {
base: '\u0442'
shift, capslock: '\u0422'
shift+capslock: '\u0442'
+ ralt: '\u2122'
}
key M {
@@ -358,8 +403,8 @@ key COMMA {
base: '\u0431'
shift, capslock: '\u0411'
shift+capslock: '\u0431'
- ralt: ','
- ralt+shift: '<'
+ ralt: '\u00ab'
+ ralt+shift: '\u201e'
}
key PERIOD {
@@ -367,8 +412,8 @@ key PERIOD {
base: '\u044e'
shift, capslock: '\u042e'
shift+capslock: '\u044e'
- ralt: '.'
- ralt+shift: '>'
+ ralt: '\u00bb'
+ ralt+shift: '\u201c'
}
key SLASH {
@@ -376,5 +421,5 @@ key SLASH {
base: '.'
shift: ','
ralt: '/'
- ralt+shift: '?'
+ ralt+shift: '\u2026'
}
diff --git a/packages/PackageInstaller/Android.bp b/packages/PackageInstaller/Android.bp
index 38bd7d5f3944..25ad9b82189c 100644
--- a/packages/PackageInstaller/Android.bp
+++ b/packages/PackageInstaller/Android.bp
@@ -49,6 +49,8 @@ android_app {
"androidx.fragment_fragment",
"androidx.lifecycle_lifecycle-livedata",
"androidx.lifecycle_lifecycle-extensions",
+ "android.content.pm.flags-aconfig-java",
+ "android.os.flags-aconfig-java",
],
lint: {
@@ -75,6 +77,8 @@ android_app {
"androidx.fragment_fragment",
"androidx.lifecycle_lifecycle-livedata",
"androidx.lifecycle_lifecycle-extensions",
+ "android.content.pm.flags-aconfig-java",
+ "android.os.flags-aconfig-java",
],
aaptflags: ["--product tablet"],
@@ -103,6 +107,8 @@ android_app {
"androidx.fragment_fragment",
"androidx.lifecycle_lifecycle-livedata",
"androidx.lifecycle_lifecycle-extensions",
+ "android.content.pm.flags-aconfig-java",
+ "android.os.flags-aconfig-java",
],
aaptflags: ["--product tv"],
diff --git a/packages/PackageInstaller/AndroidManifest.xml b/packages/PackageInstaller/AndroidManifest.xml
index ef218fdd38f3..2e4fd9b61c35 100644
--- a/packages/PackageInstaller/AndroidManifest.xml
+++ b/packages/PackageInstaller/AndroidManifest.xml
@@ -206,7 +206,19 @@
android:noHistory="true"
android:exported="true">
<intent-filter android:priority="1">
- <action android:name="android.intent.action.UNARCHIVE_DIALOG" />
+ <action android:name="com.android.intent.action.UNARCHIVE_DIALOG" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".UnarchiveErrorActivity"
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:theme="@style/Theme.AlertDialogActivity.NoActionBar"
+ android:excludeFromRecents="true"
+ android:noHistory="true"
+ android:exported="true">
+ <intent-filter android:priority="1">
+ <action android:name="com.android.intent.action.UNARCHIVE_ERROR_DIALOG" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
diff --git a/packages/PackageInstaller/TEST_MAPPING b/packages/PackageInstaller/TEST_MAPPING
index cef9014ec229..76d7ab13adad 100644
--- a/packages/PackageInstaller/TEST_MAPPING
+++ b/packages/PackageInstaller/TEST_MAPPING
@@ -22,6 +22,9 @@
},
{
"name": "PackageInstallerTests"
+ },
+ {
+ "name": "CtsIntentSignatureTestCases"
}
]
}
diff --git a/packages/PackageInstaller/res/values-af/strings.xml b/packages/PackageInstaller/res/values-af/strings.xml
index 38a781ac4ec0..a3496caddd6d 100644
--- a/packages/PackageInstaller/res/values-af/strings.xml
+++ b/packages/PackageInstaller/res/values-af/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Kennisgewing dat program geïnstalleer is"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Suksesvol geïnstalleer"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” is suksesvol geïnstalleer"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Stel <xliff:g id="APPNAME">%1$s</xliff:g> terug vanaf <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Hierdie app sal in die agtergrond begin aflaai"</string>
+ <string name="restore" msgid="8460854736328970444">"Stel terug"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-am/strings.xml b/packages/PackageInstaller/res/values-am/strings.xml
index 7b664bc4d60f..9d0fd5328177 100644
--- a/packages/PackageInstaller/res/values-am/strings.xml
+++ b/packages/PackageInstaller/res/values-am/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"የመተግበሪያ ተጭኗል ማሳወቂያ"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"በተሳካ ሁኔታ ተጭኗል"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"«<xliff:g id="APPNAME">%1$s</xliff:g>» በተሳካ ሁኔታ ተጭኗል"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"ከ <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ወደነበረበት <xliff:g id="APPNAME">%1$s</xliff:g> መልስ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ይህ መተግበሪያ በዳራ ማውረድ ይጀምራል።"</string>
+ <string name="restore" msgid="8460854736328970444">"ወደነበረበት መልስ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml
index 9a4d7ea535a1..f4c9581893f1 100644
--- a/packages/PackageInstaller/res/values-ar/strings.xml
+++ b/packages/PackageInstaller/res/values-ar/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"إشعار \"تم تثبيت التطبيق\""</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"تم التثبيت بنجاح."</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"تم تثبيت \"<xliff:g id="APPNAME">%1$s</xliff:g>\" بنجاح."</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"هل تريد استعادة التطبيق \"<xliff:g id="APPNAME">%1$s</xliff:g>\" من \"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>\"؟"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"سيبدأ تنزيل هذا التطبيق في الخلفية."</string>
+ <string name="restore" msgid="8460854736328970444">"استعادة"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml
index 65f6641ce038..4d264c6b06c8 100644
--- a/packages/PackageInstaller/res/values-as/strings.xml
+++ b/packages/PackageInstaller/res/values-as/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"এপ্ ইনষ্টল কৰাৰ জাননী"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"সফলতাৰে ইনষ্টল কৰা হ’ল"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” সফলতাৰে ইনষ্টল কৰা হ’ল"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>ৰ পৰা <xliff:g id="APPNAME">%1$s</xliff:g> পুনঃস্থাপন কৰিবনে?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"এই এপ্‌টোৱে নেপথ্যত ডাউনল’ড কৰিবলৈ আৰম্ভ কৰিব"</string>
+ <string name="restore" msgid="8460854736328970444">"পুনঃস্থাপন কৰক"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-az/strings.xml b/packages/PackageInstaller/res/values-az/strings.xml
index cf3ea842ec1a..0807ef7dcb6c 100644
--- a/packages/PackageInstaller/res/values-az/strings.xml
+++ b/packages/PackageInstaller/res/values-az/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Tətbiq quraşdırma bildirişi"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Quraşdırıldı"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" quraşdırıldı"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ünvanından bərpa edilsin?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Bu tətbiq arxa fonda endirilməyə başlayacaq"</string>
+ <string name="restore" msgid="8460854736328970444">"Bərpa edin"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
index 77fe3bafdc3e..6b9cd047c11c 100644
--- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
+++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obaveštenje o instaliranju aplikacije"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Instalirana je"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikacija „<xliff:g id="APPNAME">%1$s</xliff:g>“ je instalirana"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Želite da vratite <xliff:g id="APPNAME">%1$s</xliff:g> iz <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Aplikacija će započeti preuzimanje u pozadini."</string>
+ <string name="restore" msgid="8460854736328970444">"Vrati"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-be/strings.xml b/packages/PackageInstaller/res/values-be/strings.xml
index b10a9e094bae..9e6e6fd32f61 100644
--- a/packages/PackageInstaller/res/values-be/strings.xml
+++ b/packages/PackageInstaller/res/values-be/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Апавяшчэнне пра завяршэнне ўсталявання"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Усталявана"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Усталявана праграма \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Аднавіць праграму \"<xliff:g id="APPNAME">%1$s</xliff:g>\" адсюль: <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Праграма пачне спампоўвацца ў фонавым рэжыме"</string>
+ <string name="restore" msgid="8460854736328970444">"Аднавіць"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-bg/strings.xml b/packages/PackageInstaller/res/values-bg/strings.xml
index 8d4739cbec0c..1c9187404a58 100644
--- a/packages/PackageInstaller/res/values-bg/strings.xml
+++ b/packages/PackageInstaller/res/values-bg/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Известие, че приложението е инсталирано"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Инсталирането бе успешно"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Приложението <xliff:g id="APPNAME">%1$s</xliff:g> бе инсталирано успешно"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Да се възстанови ли <xliff:g id="APPNAME">%1$s</xliff:g> от <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Това приложение ще започне да се изтегля на заден план"</string>
+ <string name="restore" msgid="8460854736328970444">"Възстановяване"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-bn/strings.xml b/packages/PackageInstaller/res/values-bn/strings.xml
index d3c8ad77f125..5a78f37751e4 100644
--- a/packages/PackageInstaller/res/values-bn/strings.xml
+++ b/packages/PackageInstaller/res/values-bn/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"\'অ্যাপ ইনস্টল করা হয়েছে\' বিজ্ঞপ্তি"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ইনস্টল করা হয়েছে"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ইনস্টল করা হয়েছে"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> থেকে <xliff:g id="APPNAME">%1$s</xliff:g> ফিরিয়ে আনবেন?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"এই অ্যাপটি ব্যাকগ্রাউন্ডে ডাউনলোড হওয়া শুরু হবে"</string>
+ <string name="restore" msgid="8460854736328970444">"ফিরিয়ে আনুন"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-bs/strings.xml b/packages/PackageInstaller/res/values-bs/strings.xml
index f93263f04239..aed2d22a9211 100644
--- a/packages/PackageInstaller/res/values-bs/strings.xml
+++ b/packages/PackageInstaller/res/values-bs/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obavještenje o instaliranoj aplikaciji"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Uspješno instalirano"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikacija \"<xliff:g id="APPNAME">%1$s</xliff:g>\" je uspješno instalirana"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vratiti aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g> s usluge <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Preuzimanje aplikacije će započeti u pozadini"</string>
+ <string name="restore" msgid="8460854736328970444">"Vrati"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml
index 7a60d46ef5ba..85e5110d4405 100644
--- a/packages/PackageInstaller/res/values-ca/strings.xml
+++ b/packages/PackageInstaller/res/values-ca/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificació d\'aplicació instal·lada"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"S\'ha instal·lat correctament"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"S\'ha instal·lat <xliff:g id="APPNAME">%1$s</xliff:g> correctament"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vols restaurar <xliff:g id="APPNAME">%1$s</xliff:g> des de <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Aquesta aplicació començarà a baixar-se en segon pla"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaura"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-cs/strings.xml b/packages/PackageInstaller/res/values-cs/strings.xml
index 0874214f5fd3..fc85bca3bcc5 100644
--- a/packages/PackageInstaller/res/values-cs/strings.xml
+++ b/packages/PackageInstaller/res/values-cs/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Oznámení o nainstalované aplikaci"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Úspěšně nainstalováno"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikace <xliff:g id="APPNAME">%1$s</xliff:g> byla úspěšně nainstalována"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Obnovit aplikaci <xliff:g id="APPNAME">%1$s</xliff:g> z aplikace <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Aplikace se začne stahovat na pozadí"</string>
+ <string name="restore" msgid="8460854736328970444">"Obnovit"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-da/strings.xml b/packages/PackageInstaller/res/values-da/strings.xml
index 85032c9d1842..aa6fe8f8baa0 100644
--- a/packages/PackageInstaller/res/values-da/strings.xml
+++ b/packages/PackageInstaller/res/values-da/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notifikation om appinstallation"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Appen er installeret"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" er installeret"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vil du gendanne <xliff:g id="APPNAME">%1$s</xliff:g> fra <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Download af denne app startes i baggrunden"</string>
+ <string name="restore" msgid="8460854736328970444">"Gendan"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-de/strings.xml b/packages/PackageInstaller/res/values-de/strings.xml
index b638040bbf4d..dc2369610cf7 100644
--- a/packages/PackageInstaller/res/values-de/strings.xml
+++ b/packages/PackageInstaller/res/values-de/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Installationsbenachrichtigung für App"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Erfolgreich installiert"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" wurde erfolgreich installiert"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> von <xliff:g id="INSTALLERNAME">%1$s</xliff:g> wiederherstellen?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Diese App beginnt im Hintergrund mit dem Herunterladen"</string>
+ <string name="restore" msgid="8460854736328970444">"Wiederherstellen"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-el/strings.xml b/packages/PackageInstaller/res/values-el/strings.xml
index 96b582bf60c4..ea4eeb68d2c1 100644
--- a/packages/PackageInstaller/res/values-el/strings.xml
+++ b/packages/PackageInstaller/res/values-el/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Ειδοποίηση εγκατάστασης εφαρμογής"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Εγκαταστάθηκε επιτυχώς"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Η εφαρμογή \"<xliff:g id="APPNAME">%1$s</xliff:g>\" εγκαταστάθηκε επιτυχώς"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Επαναφορά <xliff:g id="APPNAME">%1$s</xliff:g> από <xliff:g id="INSTALLERNAME">%1$s</xliff:g>;"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Η λήψη της εφαρμογής θα ξεκινήσει στο παρασκήνιο"</string>
+ <string name="restore" msgid="8460854736328970444">"Επαναφορά"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rAU/strings.xml b/packages/PackageInstaller/res/values-en-rAU/strings.xml
index 08b8bf1a6b8a..01871720605e 100644
--- a/packages/PackageInstaller/res/values-en-rAU/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rAU/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed \'<xliff:g id="APPNAME">%1$s</xliff:g>\'"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restore <xliff:g id="APPNAME">%1$s</xliff:g> from <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"This app will start downloading in the background"</string>
+ <string name="restore" msgid="8460854736328970444">"Restore"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rCA/strings.xml b/packages/PackageInstaller/res/values-en-rCA/strings.xml
index da4a8a0f0453..9b31f27bcd4a 100644
--- a/packages/PackageInstaller/res/values-en-rCA/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rCA/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restore <xliff:g id="APPNAME">%1$s</xliff:g> from <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"This app will begin to download in the background"</string>
+ <string name="restore" msgid="8460854736328970444">"Restore"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rGB/strings.xml b/packages/PackageInstaller/res/values-en-rGB/strings.xml
index 08b8bf1a6b8a..01871720605e 100644
--- a/packages/PackageInstaller/res/values-en-rGB/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rGB/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed \'<xliff:g id="APPNAME">%1$s</xliff:g>\'"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restore <xliff:g id="APPNAME">%1$s</xliff:g> from <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"This app will start downloading in the background"</string>
+ <string name="restore" msgid="8460854736328970444">"Restore"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rIN/strings.xml b/packages/PackageInstaller/res/values-en-rIN/strings.xml
index 08b8bf1a6b8a..01871720605e 100644
--- a/packages/PackageInstaller/res/values-en-rIN/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rIN/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed \'<xliff:g id="APPNAME">%1$s</xliff:g>\'"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restore <xliff:g id="APPNAME">%1$s</xliff:g> from <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"This app will start downloading in the background"</string>
+ <string name="restore" msgid="8460854736328970444">"Restore"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rXC/strings.xml b/packages/PackageInstaller/res/values-en-rXC/strings.xml
index 0749a2726e5a..67ffce594557 100644
--- a/packages/PackageInstaller/res/values-en-rXC/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rXC/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎App installed notification‎‏‎‎‏‎"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‎‏‎‎Successfully installed‎‏‎‎‏‎"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎Successfully installed “‎‏‎‎‏‏‎<xliff:g id="APPNAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎”‎‏‎‎‏‎"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎‏‎Restore ‎‏‎‎‏‏‎<xliff:g id="APPNAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ from ‎‏‎‎‏‏‎<xliff:g id="INSTALLERNAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‎‎‎‎‎‎‏‏‎‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‎‎‏‎‎‎This app will begin to download in the background‎‏‎‎‏‎"</string>
+ <string name="restore" msgid="8460854736328970444">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‎‎‏‏‎‎‎Restore‎‏‎‎‏‎"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-es-rUS/strings.xml b/packages/PackageInstaller/res/values-es-rUS/strings.xml
index 3330e5fa6bf1..2a8559a605ba 100644
--- a/packages/PackageInstaller/res/values-es-rUS/strings.xml
+++ b/packages/PackageInstaller/res/values-es-rUS/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificación de app instalada"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Se instaló correctamente"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Se instaló correctamente \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"¿Quieres restablecer <xliff:g id="APPNAME">%1$s</xliff:g> desde <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Esta app comenzará la descarga en segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restablecer"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml
index c351f15b7879..5e1022bf4c5a 100644
--- a/packages/PackageInstaller/res/values-es/strings.xml
+++ b/packages/PackageInstaller/res/values-es/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificación de aplicación instalada"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Se ha instalado correctamente"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> se ha instalado correctamente"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"¿Restaurar <xliff:g id="APPNAME">%1$s</xliff:g> de <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Esta aplicación comenzará a descargarse en segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurar"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-et/strings.xml b/packages/PackageInstaller/res/values-et/strings.xml
index 5ecfbf4c427a..2bd2c04574da 100644
--- a/packages/PackageInstaller/res/values-et/strings.xml
+++ b/packages/PackageInstaller/res/values-et/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Rakenduse installimise märguanne"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Installimine õnnestus"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Rakenduse „<xliff:g id="APPNAME">%1$s</xliff:g>” installimine õnnestus"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Kas taastada rakendus <xliff:g id="APPNAME">%1$s</xliff:g> rakenduse <xliff:g id="INSTALLERNAME">%1$s</xliff:g> kaudu?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Selle rakenduse allalaadimine algab taustal"</string>
+ <string name="restore" msgid="8460854736328970444">"Taasta"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml
index ec720ac831a7..574d4ab69374 100644
--- a/packages/PackageInstaller/res/values-eu/strings.xml
+++ b/packages/PackageInstaller/res/values-eu/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Aplikazioa instalatu izanaren jakinarazpena"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Instalatu da"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Instalatu da \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> aplikaziotik leheneratu nahi duzu <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Atzeko planoan deskargatuko da aplikazioa"</string>
+ <string name="restore" msgid="8460854736328970444">"Leheneratu"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fa/strings.xml b/packages/PackageInstaller/res/values-fa/strings.xml
index 7a8b57921292..1869cb622d35 100644
--- a/packages/PackageInstaller/res/values-fa/strings.xml
+++ b/packages/PackageInstaller/res/values-fa/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"اعلان نصب برنامه"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"نصب موفقیت‌آمیز بود"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> باموفقیت نصب شد"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> از <xliff:g id="INSTALLERNAME">%1$s</xliff:g> بازیابی شود؟"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"این برنامه در پس‌زمینه شروع به بارگیری می‌کند"</string>
+ <string name="restore" msgid="8460854736328970444">"بازیابی"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fi/strings.xml b/packages/PackageInstaller/res/values-fi/strings.xml
index a9b6984a1e1a..8f960ea50166 100644
--- a/packages/PackageInstaller/res/values-fi/strings.xml
+++ b/packages/PackageInstaller/res/values-fi/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Sovellus asennettu ‑ilmoitus"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Asennus onnistui"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g>: asennus onnistui"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Palautetaanko <xliff:g id="APPNAME">%1$s</xliff:g> sovelluksella <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Sovelluksen lataus aloitetaan taustalla"</string>
+ <string name="restore" msgid="8460854736328970444">"Palauta"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fr-rCA/strings.xml b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
index 0ef53b930084..647a7b5a6141 100644
--- a/packages/PackageInstaller/res/values-fr-rCA/strings.xml
+++ b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notification d\'application installée"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Installation réussie"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Installation de « <xliff:g id="APPNAME">%1$s</xliff:g> » réussie"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restaurer <xliff:g id="APPNAME">%1$s</xliff:g> à partir de <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Le téléchargement de cette application commencera en arrière-plan"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurer"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fr/strings.xml b/packages/PackageInstaller/res/values-fr/strings.xml
index 5065a22429e1..3cf043b9c353 100644
--- a/packages/PackageInstaller/res/values-fr/strings.xml
+++ b/packages/PackageInstaller/res/values-fr/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notification d\'application installée"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"L\'application a été installée"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"L\'application <xliff:g id="APPNAME">%1$s</xliff:g> a bien été installée"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restaurer <xliff:g id="APPNAME">%1$s</xliff:g> depuis <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Cette application commencera à se télécharger en arrière-plan"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurer"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-gl/strings.xml b/packages/PackageInstaller/res/values-gl/strings.xml
index 694218dcf8c6..eeb1f953a8a9 100644
--- a/packages/PackageInstaller/res/values-gl/strings.xml
+++ b/packages/PackageInstaller/res/values-gl/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificación da aplicación instalada"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Instalouse correctamente"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Instalouse correctamente a aplicación <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Queres restaurar <xliff:g id="APPNAME">%1$s</xliff:g> desde <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Esta aplicación comezará a descargarse en segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurar"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-gu/strings.xml b/packages/PackageInstaller/res/values-gu/strings.xml
index 8f5976c1c552..e1f188724b16 100644
--- a/packages/PackageInstaller/res/values-gu/strings.xml
+++ b/packages/PackageInstaller/res/values-gu/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ઍપ ઇન્સ્ટૉલ થવાનું નોટિફિકેશન"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"સફળતાપૂર્વક ઇન્સ્ટૉલ કરેલ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” સફળતાપૂર્વક ઇન્સ્ટૉલ કરેલ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>માંથી <xliff:g id="APPNAME">%1$s</xliff:g> રિસ્ટોર કરીએ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"બૅકગ્રાઉન્ડમાં આ ઍપ ડાઉનલોડ થવાનું શરૂ થશે"</string>
+ <string name="restore" msgid="8460854736328970444">"રિસ્ટોર કરો"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hi/strings.xml b/packages/PackageInstaller/res/values-hi/strings.xml
index ddb16ddfb036..642bbd9baff3 100644
--- a/packages/PackageInstaller/res/values-hi/strings.xml
+++ b/packages/PackageInstaller/res/values-hi/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ऐप्लिकेशन इंस्टॉल होने की सूचना"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"पूरी तरह से इंस्टॉल हो गया है"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” पूरी तरह से इंस्टॉल हो गया है"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> को <xliff:g id="INSTALLERNAME">%1$s</xliff:g> से वापस लाएं?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"यह ऐप्लिकेशन, बैकग्राउंड में डाउनलोड होना शुरू हो जाएगा"</string>
+ <string name="restore" msgid="8460854736328970444">"वापस लाएं"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hr/strings.xml b/packages/PackageInstaller/res/values-hr/strings.xml
index c758f4f30272..69ce3f13fec8 100644
--- a/packages/PackageInstaller/res/values-hr/strings.xml
+++ b/packages/PackageInstaller/res/values-hr/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obavijest o instaliranoj aplikaciji"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Uspješno instalirano"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikacija \"<xliff:g id="APPNAME">%1$s</xliff:g>\" uspješno je instalirana"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Želite li vratiti aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g> putem aplikacije <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Ova aplikacija počet će se preuzimati u pozadini"</string>
+ <string name="restore" msgid="8460854736328970444">"Vrati"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hu/strings.xml b/packages/PackageInstaller/res/values-hu/strings.xml
index 4fd866dda60e..ea8cfc782f72 100644
--- a/packages/PackageInstaller/res/values-hu/strings.xml
+++ b/packages/PackageInstaller/res/values-hu/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Alkalmazás telepítve értesítés"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Sikeresen telepítve"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"A(z) <xliff:g id="APPNAME">%1$s</xliff:g> alkalmazás sikeresen telepítve"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Visszaállítja a(z) <xliff:g id="APPNAME">%1$s</xliff:g> appot innen: <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"A háttérben megkezdődik az app letöltése"</string>
+ <string name="restore" msgid="8460854736328970444">"Visszaállítás"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hy/strings.xml b/packages/PackageInstaller/res/values-hy/strings.xml
index e5e7cecad509..a447371c8ca4 100644
--- a/packages/PackageInstaller/res/values-hy/strings.xml
+++ b/packages/PackageInstaller/res/values-hy/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Ծանուցում հավելվածի տեղադրման մասին"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Տեղադրվեց"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> հավելվածը տեղադրվեց"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Վերականգնե՞լ <xliff:g id="APPNAME">%1$s</xliff:g> հավելվածը <xliff:g id="INSTALLERNAME">%1$s</xliff:g>-ից"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Այս հավելվածը կներբեռնվի ֆոնային ռեժիմում"</string>
+ <string name="restore" msgid="8460854736328970444">"Վերականգնել"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-in/strings.xml b/packages/PackageInstaller/res/values-in/strings.xml
index a52b63c20151..9e24424d9360 100644
--- a/packages/PackageInstaller/res/values-in/strings.xml
+++ b/packages/PackageInstaller/res/values-in/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notifikasi penginstalan aplikasi"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Berhasil diinstal"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Berhasil menginstal “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Pulihkan <xliff:g id="APPNAME">%1$s</xliff:g> dari <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Aplikasi ini akan mulai didownload di latar belakang"</string>
+ <string name="restore" msgid="8460854736328970444">"Pulihkan"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-is/strings.xml b/packages/PackageInstaller/res/values-is/strings.xml
index b125da165688..c24f2844a77a 100644
--- a/packages/PackageInstaller/res/values-is/strings.xml
+++ b/packages/PackageInstaller/res/values-is/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Tilkynning um uppsett forrit"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Uppsetning tókst"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>“ sett upp"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Endurheimta <xliff:g id="APPNAME">%1$s</xliff:g> úr <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Forritið verður sótt í bakgrunni"</string>
+ <string name="restore" msgid="8460854736328970444">"Endurheimta"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml
index 9ee0882028a7..604d88ac4e1d 100644
--- a/packages/PackageInstaller/res/values-it/strings.xml
+++ b/packages/PackageInstaller/res/values-it/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notifica relativa alle app installate"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Installata"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"App \"<xliff:g id="APPNAME">%1$s</xliff:g>\" installata"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Ripristinare <xliff:g id="APPNAME">%1$s</xliff:g> da <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Il download di quest\'app inizierà in background"</string>
+ <string name="restore" msgid="8460854736328970444">"Ripristina"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml
index 6684ec050968..0e37b2ebd39c 100644
--- a/packages/PackageInstaller/res/values-iw/strings.xml
+++ b/packages/PackageInstaller/res/values-iw/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"התראה על התקנת האפליקציה"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"הותקנה בהצלחה"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"האפליקציה \"<xliff:g id="APPNAME">%1$s</xliff:g>\" הותקנה"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"לשחזר את <xliff:g id="APPNAME">%1$s</xliff:g> מ-<xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"תהליך ההורדה של האפליקציה יתחיל ברקע"</string>
+ <string name="restore" msgid="8460854736328970444">"שחזור"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml
index 600b6b7bd906..58e46a61f872 100644
--- a/packages/PackageInstaller/res/values-ja/strings.xml
+++ b/packages/PackageInstaller/res/values-ja/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"アプリのインストールに関する通知"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"インストールしました"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"「<xliff:g id="APPNAME">%1$s</xliff:g>」をインストールしました"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> から <xliff:g id="APPNAME">%1$s</xliff:g> を復元しますか?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"このアプリのダウンロードをバックグラウンドで開始します"</string>
+ <string name="restore" msgid="8460854736328970444">"復元する"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ka/strings.xml b/packages/PackageInstaller/res/values-ka/strings.xml
index c8bf93bbf579..bbd63d168072 100644
--- a/packages/PackageInstaller/res/values-ka/strings.xml
+++ b/packages/PackageInstaller/res/values-ka/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"შეტყობინება აპის ინსტალაციის შესახებ"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"წარმატებით დაინსტალირდა"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>“ წარმატებით დაინსტალირდა"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"აღვადგინოთ <xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="INSTALLERNAME">%1$s</xliff:g>-დან?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ამ აპის ჩამოტვირთვა ფონურ რეჟიმში დაიწყება"</string>
+ <string name="restore" msgid="8460854736328970444">"აღდგენა"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-kk/strings.xml b/packages/PackageInstaller/res/values-kk/strings.xml
index 1ccac10fbb1d..02843b8b2f3d 100644
--- a/packages/PackageInstaller/res/values-kk/strings.xml
+++ b/packages/PackageInstaller/res/values-kk/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Қолданба орнатылғаны туралы хабарландыру"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Орнатылды"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" орнатылды"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> қолданбасын <xliff:g id="INSTALLERNAME">%1$s</xliff:g> арқылы қалпына келтіру керек пе?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Бұл қолданба фондық режимде жүктеп алына бастайды."</string>
+ <string name="restore" msgid="8460854736328970444">"Қалпына келтіру"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-km/strings.xml b/packages/PackageInstaller/res/values-km/strings.xml
index 3e3ef990efa1..bb849762d52f 100644
--- a/packages/PackageInstaller/res/values-km/strings.xml
+++ b/packages/PackageInstaller/res/values-km/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ការជូនដំណឹង​អំពីកម្មវិធីដែល​បានដំឡើង"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"បាន​ដំឡើង​ដោយ​ជោគជ័យ​ហើយ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"បាន​ដំឡើង \"<xliff:g id="APPNAME">%1$s</xliff:g>\" ដោយ​ជោគជ័យ​ហើយ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"ស្ដារ <xliff:g id="APPNAME">%1$s</xliff:g> ពី <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ឬ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"កម្មវិធីនេះនឹងចាប់ផ្ដើមទាញយកនៅផ្ទៃខាងក្រោយ"</string>
+ <string name="restore" msgid="8460854736328970444">"ស្ដារ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-kn/strings.xml b/packages/PackageInstaller/res/values-kn/strings.xml
index 9cfe389a8b29..476b45d57261 100644
--- a/packages/PackageInstaller/res/values-kn/strings.xml
+++ b/packages/PackageInstaller/res/values-kn/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ಆ್ಯಪ್ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿರುವ ಕುರಿತು ನೋಟಿಫಿಕೇಶನ್"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ಯಶಸ್ವಿಯಾಗಿ ಇನ್‌ಸ್ಟಾಲ್ ಆಗಿದೆ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ಆ್ಯಪ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> ನಿಂದ <xliff:g id="APPNAME">%1$s</xliff:g> ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಬೇಕೆ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೌನ್‌ಲೋಡ್ ಆಗಲು ಈ ಆ್ಯಪ್ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ"</string>
+ <string name="restore" msgid="8460854736328970444">"ಮರುಸ್ಥಾಪಿಸಿ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml
index 271ec90f4178..7ae19ac37cce 100644
--- a/packages/PackageInstaller/res/values-ko/strings.xml
+++ b/packages/PackageInstaller/res/values-ko/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"앱 설치 완료 알림"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"설치 완료"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\'<xliff:g id="APPNAME">%1$s</xliff:g>\' 설치 완료"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>에서 <xliff:g id="APPNAME">%1$s</xliff:g> 앱을 복원하시겠습니까?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"백그라운드에서 앱이 다운로드되기 시작합니다"</string>
+ <string name="restore" msgid="8460854736328970444">"복원"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ky/strings.xml b/packages/PackageInstaller/res/values-ky/strings.xml
index 5e9948dbfdb9..faf3df24e8e4 100644
--- a/packages/PackageInstaller/res/values-ky/strings.xml
+++ b/packages/PackageInstaller/res/values-ky/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Колдонмолорду орноткучтун билдирмелери"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Ийгиликтүү орнотулду"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" орнотулду"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="INSTALLERNAME">%1$s</xliff:g> платформасынан калыбына келтирилсинби?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Бул колдонмо фондо жүктөлүп алына баштайт"</string>
+ <string name="restore" msgid="8460854736328970444">"Калыбына келтирүү"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-lo/strings.xml b/packages/PackageInstaller/res/values-lo/strings.xml
index d12bb4b77b3b..e9b3e8e3bcbb 100644
--- a/packages/PackageInstaller/res/values-lo/strings.xml
+++ b/packages/PackageInstaller/res/values-lo/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ການແຈ້ງເຕືອນແອັບທີ່ຕິດຕັ້ງແລ້ວ"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ຕິດຕັ້ງສຳເລັດແລ້ວ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"ຕິດຕັ້ງ \"<xliff:g id="APPNAME">%1$s</xliff:g>\" ສຳເລັດແລ້ວ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"ກູ້ຄືນ <xliff:g id="APPNAME">%1$s</xliff:g> ຈາກ <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ບໍ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ແອັບນີ້ຈະເລີ່ມດາວໂຫຼດໃນພື້ນຫຼັງ"</string>
+ <string name="restore" msgid="8460854736328970444">"ກູ້ຄືນ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-lt/strings.xml b/packages/PackageInstaller/res/values-lt/strings.xml
index 91ae9d16fb5e..654dee06f895 100644
--- a/packages/PackageInstaller/res/values-lt/strings.xml
+++ b/packages/PackageInstaller/res/values-lt/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Pranešimas apie įdiegtą programą"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Sėkmingai įdiegta"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>“ sėkmingai įdiegta"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Atkurti „<xliff:g id="APPNAME">%1$s</xliff:g>“ iš „<xliff:g id="INSTALLERNAME">%1$s</xliff:g>“?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Šios programos atsisiuntimas bus pradėtas fone"</string>
+ <string name="restore" msgid="8460854736328970444">"Atkurti"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-lv/strings.xml b/packages/PackageInstaller/res/values-lv/strings.xml
index c6f9eb4f623b..2d319fcc68b7 100644
--- a/packages/PackageInstaller/res/values-lv/strings.xml
+++ b/packages/PackageInstaller/res/values-lv/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Paziņojums par instalētu lietotni"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Sekmīgi instalēta"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Lietotne “<xliff:g id="APPNAME">%1$s</xliff:g>” sekmīgi instalēta"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vai atjaunot lietotni <xliff:g id="APPNAME">%1$s</xliff:g> no <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Fonā tiks sākta šīs lietotnes lejupielāde."</string>
+ <string name="restore" msgid="8460854736328970444">"Atjaunot"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml
index bc5cb9021d70..e02c3c53b6db 100644
--- a/packages/PackageInstaller/res/values-mk/strings.xml
+++ b/packages/PackageInstaller/res/values-mk/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Известување за инсталирана апликација"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Успешно инсталирана"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> е успешно инсталирана"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Да се врати <xliff:g id="APPNAME">%1$s</xliff:g> од <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Апликацијава ќе почне да се презема во заднина"</string>
+ <string name="restore" msgid="8460854736328970444">"Враќање"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ml/strings.xml b/packages/PackageInstaller/res/values-ml/strings.xml
index a64f87f76081..2e5dcfb7bb4b 100644
--- a/packages/PackageInstaller/res/values-ml/strings.xml
+++ b/packages/PackageInstaller/res/values-ml/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ആപ്പ് ഇൻസ്‌റ്റാൾ ചെയ്‌ത അറിയിപ്പ്"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ഇൻസ്‌റ്റാൾ ചെയ്‌തു"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ഇൻസ്‌റ്റാൾ ചെയ്‌തു"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> എന്നതിൽ നിന്ന് <xliff:g id="APPNAME">%1$s</xliff:g> പുനഃസ്ഥാപിക്കണോ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"പശ്ചാത്തലത്തിൽ ഈ ആപ്പ് ഡൗൺലോഡ് ചെയ്ത് തുടങ്ങും"</string>
+ <string name="restore" msgid="8460854736328970444">"പുനഃസ്ഥാപിക്കുക"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-mn/strings.xml b/packages/PackageInstaller/res/values-mn/strings.xml
index a9365b6d176a..5deda94ced32 100644
--- a/packages/PackageInstaller/res/values-mn/strings.xml
+++ b/packages/PackageInstaller/res/values-mn/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Апп суулгасны мэдэгдэл"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Амжилттай суулгасан"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>”-г амжилттай суулгасан"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g>-г <xliff:g id="INSTALLERNAME">%1$s</xliff:g>-с сэргээх үү?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Энэ аппыг дэвсгэрт татаж эхэлнэ"</string>
+ <string name="restore" msgid="8460854736328970444">"Сэргээх"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml
index d6f04b42317e..53ca4039d93c 100644
--- a/packages/PackageInstaller/res/values-mr/strings.xml
+++ b/packages/PackageInstaller/res/values-mr/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"अ‍ॅप इंस्टॉल सूचना"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"यशस्वीरित्या इंस्टॉल केले"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" यशस्वीरित्या इंस्टॉल झाले"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> मधून <xliff:g id="APPNAME">%1$s</xliff:g> रिस्टोअर करायचे आहे का?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"हे ॲप बॅकग्राउंडमध्ये डाउनलोड होण्यास सुरुवात होईल"</string>
+ <string name="restore" msgid="8460854736328970444">"रिस्टोअर करा"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ms/strings.xml b/packages/PackageInstaller/res/values-ms/strings.xml
index 80f4be3e6d73..4b0b560be73d 100644
--- a/packages/PackageInstaller/res/values-ms/strings.xml
+++ b/packages/PackageInstaller/res/values-ms/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Pemberitahuan apl dipasang"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Berjaya dipasang"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Berjaya memasang \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Pulihkan <xliff:g id="APPNAME">%1$s</xliff:g> daripada <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Apl ini akan mula dimuat turun dalam latar"</string>
+ <string name="restore" msgid="8460854736328970444">"Pulihkan"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml
index 77a45899ab9d..302c2c3a1178 100644
--- a/packages/PackageInstaller/res/values-my/strings.xml
+++ b/packages/PackageInstaller/res/values-my/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"အက်ပ်ထည့်သွင်းခြင်း အကြောင်းကြားချက်"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ထည့်သွင်းပြီးပြီ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ကို ထည့်သွင်းပြီးပြီ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> မှ <xliff:g id="APPNAME">%1$s</xliff:g> ကို ပြန်ယူမလား။"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ဤအက်ပ်ကို နောက်ခံတွင် စတင်ဒေါင်းလုဒ်လုပ်ပါမည်"</string>
+ <string name="restore" msgid="8460854736328970444">"ပြန်ယူရန်"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-nb/strings.xml b/packages/PackageInstaller/res/values-nb/strings.xml
index 89d9762f703e..65c0cb800a71 100644
--- a/packages/PackageInstaller/res/values-nb/strings.xml
+++ b/packages/PackageInstaller/res/values-nb/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Varsel om at appen er installert"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Installert"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"«<xliff:g id="APPNAME">%1$s</xliff:g>» er installert"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vil du gjenopprette <xliff:g id="APPNAME">%1$s</xliff:g> fra <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Denne appen begynner å laste ned i bakgrunnen"</string>
+ <string name="restore" msgid="8460854736328970444">"Gjenopprett"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml
index 23a689f94d75..b72218c53af7 100644
--- a/packages/PackageInstaller/res/values-ne/strings.xml
+++ b/packages/PackageInstaller/res/values-ne/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"एपको स्थापना गरिएको सूचना"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"सफलतापूर्वक स्थापना गरियो"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” सफलतापूर्वक स्थापना गरियो"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> बाट <xliff:g id="APPNAME">%1$s</xliff:g> रिस्टोर गर्ने हो?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"यो एप ब्याकग्राउन्डमा डाउनलोड हुन थाल्ने छ"</string>
+ <string name="restore" msgid="8460854736328970444">"रिस्टोर गर्नुहोस्"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml
index 731dc480176e..a1eb7083ab57 100644
--- a/packages/PackageInstaller/res/values-nl/strings.xml
+++ b/packages/PackageInstaller/res/values-nl/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Melding dat app is geïnstalleerd"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Installatie voltooid"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\'<xliff:g id="APPNAME">%1$s</xliff:g>\' is geïnstalleerd"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> herstellen via <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Deze app wordt gedownload op de achtergrond"</string>
+ <string name="restore" msgid="8460854736328970444">"Herstellen"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml
index 331852e1b310..a1c685c61122 100644
--- a/packages/PackageInstaller/res/values-or/strings.xml
+++ b/packages/PackageInstaller/res/values-or/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ଆପ୍ ଇନ୍‌ଷ୍ଟଲ୍‌ କରାଯାଇଥିବା ବିଜ୍ଞପ୍ତି"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ସଫଳତାପୂର୍ବକ ଇନ୍‌ଷ୍ଟଲ୍‌ କରାଗଲା"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” ସଫଳତାପୂର୍ବକ ଇନ୍‌ଷ୍ଚଲ୍ କରାଗଲା"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>ରୁ <xliff:g id="APPNAME">%1$s</xliff:g>କୁ ରିଷ୍ଟୋର କରିବେ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ଏହି ଆପ ପୃଷ୍ଠପଟରେ ଡାଉନଲୋଡ ହେବା ଆରମ୍ଭ କରିବ"</string>
+ <string name="restore" msgid="8460854736328970444">"ରିଷ୍ଟୋର କରନ୍ତୁ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml
index 5bc46245f3ae..1c7fb862f7bd 100644
--- a/packages/PackageInstaller/res/values-pa/strings.xml
+++ b/packages/PackageInstaller/res/values-pa/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ਐਪ ਸਥਾਪਨਾ ਦੀ ਸੂਚਨਾ"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ਸਫਲਤਾਪੂਰਵਕ ਸਥਾਪਤ ਕੀਤੀ ਗਈ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ਨੂੰ ਸਫਲਤਾਪੂਰਵਕ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"ਕੀ <xliff:g id="APPNAME">%1$s</xliff:g> ਨੂੰ <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ਤੋਂ ਮੁੜ-ਬਹਾਲ ਕਰਨਾ ਹੈ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ਇਹ ਐਪ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਊਨਲੋਡ ਹੋਣੀ ਸ਼ੁਰੂ ਹੋ ਜਾਵੇਗੀ"</string>
+ <string name="restore" msgid="8460854736328970444">"ਮੁੜ-ਬਹਾਲ ਕਰੋ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pl/strings.xml b/packages/PackageInstaller/res/values-pl/strings.xml
index 4aa96f76deb0..8fa11ed2bcf4 100644
--- a/packages/PackageInstaller/res/values-pl/strings.xml
+++ b/packages/PackageInstaller/res/values-pl/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Powiadomienie o zainstalowaniu aplikacji"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Zainstalowano"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Zainstalowano aplikację „<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Przywrócić aplikację <xliff:g id="APPNAME">%1$s</xliff:g> z aplikacji <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Ta aplikacja zacznie pobieranie w tle"</string>
+ <string name="restore" msgid="8460854736328970444">"Przywróć"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
index d8713db1957d..71ecb2b391fc 100644
--- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificação de app instalado"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Instalação concluída"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” instalado"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restaurar <xliff:g id="APPNAME">%1$s</xliff:g> usando o app <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"O download desse app será feito em segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurar"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
index fb2240ef6324..1d5c1a21b140 100644
--- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificação de app instalada"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"App instalada com êxito"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplicação \"<xliff:g id="APPNAME">%1$s</xliff:g>\" instalada com êxito"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restaurar <xliff:g id="APPNAME">%1$s</xliff:g> a partir da <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Esta app vai começar a ser transferida em segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurar"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml
index d8713db1957d..71ecb2b391fc 100644
--- a/packages/PackageInstaller/res/values-pt/strings.xml
+++ b/packages/PackageInstaller/res/values-pt/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificação de app instalado"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Instalação concluída"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” instalado"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restaurar <xliff:g id="APPNAME">%1$s</xliff:g> usando o app <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"O download desse app será feito em segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurar"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml
index fab0c332fd22..810f5449b052 100644
--- a/packages/PackageInstaller/res/values-ro/strings.xml
+++ b/packages/PackageInstaller/res/values-ro/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificare de aplicație instalată"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Aplicația a fost instalată"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>” a fost instalată"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restabilești <xliff:g id="APPNAME">%1$s</xliff:g> din <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Descărcarea aplicației va începe în fundal"</string>
+ <string name="restore" msgid="8460854736328970444">"Restabilește"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ru/strings.xml b/packages/PackageInstaller/res/values-ru/strings.xml
index 094a19adf1ad..e368f12db0f0 100644
--- a/packages/PackageInstaller/res/values-ru/strings.xml
+++ b/packages/PackageInstaller/res/values-ru/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Уведомление об установке приложения"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Установлено"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Приложение \"<xliff:g id="APPNAME">%1$s</xliff:g>\" установлено"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Восстановить приложение \"<xliff:g id="APPNAME">%1$s</xliff:g>\" из <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Приложение начнет скачиваться в фоновом режиме."</string>
+ <string name="restore" msgid="8460854736328970444">"Восстановить"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-si/strings.xml b/packages/PackageInstaller/res/values-si/strings.xml
index afc2195e15ef..cea50a608624 100644
--- a/packages/PackageInstaller/res/values-si/strings.xml
+++ b/packages/PackageInstaller/res/values-si/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"යෙදුම් ස්ථාපනය කළ දැනුම්දීම"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"සාර්ථකව ස්ථාපනය කරන ලදී"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" සාර්ථකව ස්ථාපනය කරන ලදි"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> වෙතින් <xliff:g id="APPNAME">%1$s</xliff:g> ප්‍රතිසාධනය කරන්න ද?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"මෙම යෙදුම පසුබිමේ බාගැනීම ආරම්භ කරනු ඇත"</string>
+ <string name="restore" msgid="8460854736328970444">"ප්‍රතිසාධනය කරන්න"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml
index 7a1e70ccce5d..34117c364a29 100644
--- a/packages/PackageInstaller/res/values-sk/strings.xml
+++ b/packages/PackageInstaller/res/values-sk/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Upozornenie na inštaláciu aplikácie"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Úspešne nainštalovaná"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikácia <xliff:g id="APPNAME">%1$s</xliff:g> bola nainštalovaná"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Chcete obnoviť <xliff:g id="APPNAME">%1$s</xliff:g> z inštalátora <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Táto aplikácia sa začne sťahovať na pozadí"</string>
+ <string name="restore" msgid="8460854736328970444">"Obnoviť"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sl/strings.xml b/packages/PackageInstaller/res/values-sl/strings.xml
index 91bcbdad9f46..a3037599523f 100644
--- a/packages/PackageInstaller/res/values-sl/strings.xml
+++ b/packages/PackageInstaller/res/values-sl/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obvestilo o namestitvi aplikacije"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Uspešno nameščeno"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Uspešno nameščeno: »<xliff:g id="APPNAME">%1$s</xliff:g>«"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Želite obnoviti aplikacijo <xliff:g id="APPNAME">%1$s</xliff:g> iz aplikacije <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Aplikacija bo začela prenos v ozadju"</string>
+ <string name="restore" msgid="8460854736328970444">"Obnovi"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sq/strings.xml b/packages/PackageInstaller/res/values-sq/strings.xml
index 566054edc983..7f68c8b9106e 100644
--- a/packages/PackageInstaller/res/values-sq/strings.xml
+++ b/packages/PackageInstaller/res/values-sq/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Njoftimi për aplikacionin e instaluar"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"U instalua me sukses"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” u instalua me sukses"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Të restaurohet <xliff:g id="APPNAME">%1$s</xliff:g> nga <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Ky aplikacion do të fillojë të shkarkohet në sfond"</string>
+ <string name="restore" msgid="8460854736328970444">"Restauro"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml
index 9e1771675e96..196e78473eca 100644
--- a/packages/PackageInstaller/res/values-sr/strings.xml
+++ b/packages/PackageInstaller/res/values-sr/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Обавештење о инсталирању апликације"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Инсталирана је"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Апликација „<xliff:g id="APPNAME">%1$s</xliff:g>“ је инсталирана"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Желите да вратите <xliff:g id="APPNAME">%1$s</xliff:g> из <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Апликација ће започети преузимање у позадини."</string>
+ <string name="restore" msgid="8460854736328970444">"Врати"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml
index 79e57383bea8..0ce696ed45f9 100644
--- a/packages/PackageInstaller/res/values-sv/strings.xml
+++ b/packages/PackageInstaller/res/values-sv/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Avisering om installerad app"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Appen har installerats"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> har installerats"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vill du återställa <xliff:g id="APPNAME">%1$s</xliff:g> från <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Appen börjar ladda ned i bakgrunden"</string>
+ <string name="restore" msgid="8460854736328970444">"Återställ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sw/strings.xml b/packages/PackageInstaller/res/values-sw/strings.xml
index f69d6120e75c..0a34d8156443 100644
--- a/packages/PackageInstaller/res/values-sw/strings.xml
+++ b/packages/PackageInstaller/res/values-sw/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Arifa ya kusakinishwa kwa programu"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Imesakinishwa"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> imesakinishwa"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Je, ungependa kurejesha <xliff:g id="APPNAME">%1$s</xliff:g> kutoka kwenye <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Itaanza kupakua programu hii chinichini"</string>
+ <string name="restore" msgid="8460854736328970444">"Rejesha"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ta/strings.xml b/packages/PackageInstaller/res/values-ta/strings.xml
index f2d54638c64b..322ce5c2a3d2 100644
--- a/packages/PackageInstaller/res/values-ta/strings.xml
+++ b/packages/PackageInstaller/res/values-ta/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ஆப்ஸ் நிறுவப்பட்டது குறித்த அறிவிப்பு"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"வெற்றிகரமாக நிறுவப்பட்டது"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" வெற்றிகரமாக நிறுவப்பட்டது"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>ல் இருந்து <xliff:g id="APPNAME">%1$s</xliff:g> ஐ மீட்டெடுக்கவா?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"இந்த ஆப்ஸ் பின்னணியில் பதிவிறக்கத் தொடங்கும்"</string>
+ <string name="restore" msgid="8460854736328970444">"மீட்டெடு"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml
index 1013e3dc1c1a..9abc87e81de2 100644
--- a/packages/PackageInstaller/res/values-te/strings.xml
+++ b/packages/PackageInstaller/res/values-te/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"యాప్ ఇన్‌స్టాల్ చేయబడిందనే నోటిఫికేషన్"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"విజయవంతంగా ఇన్‌స్టాల్ చేయబడింది"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” విజయవంతంగా ఇన్‌స్టాల్ చేయబడింది"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> నుండి <xliff:g id="APPNAME">%1$s</xliff:g>‌ను రీస్టోర్ చేయాలా?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ఈ యాప్ బ్యాక్‌గ్రౌండ్‌లో డౌన్‌లోడ్ అవ్వడం ప్రారంభమవుతుంది"</string>
+ <string name="restore" msgid="8460854736328970444">"రీస్టోర్ చేయండి"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-th/strings.xml b/packages/PackageInstaller/res/values-th/strings.xml
index 35a761166ad6..b1faa1c35d67 100644
--- a/packages/PackageInstaller/res/values-th/strings.xml
+++ b/packages/PackageInstaller/res/values-th/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"การแจ้งเตือนว่าติดตั้งแอปแล้ว"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ติดตั้งเรียบร้อยแล้ว"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"ติดตั้ง “<xliff:g id="APPNAME">%1$s</xliff:g>” สำเร็จแล้ว"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"กู้คืน <xliff:g id="APPNAME">%1$s</xliff:g> จาก <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ใช่ไหม"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"แอปนี้จะเริ่มดาวน์โหลดในเบื้องหลัง"</string>
+ <string name="restore" msgid="8460854736328970444">"กู้คืน"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-tl/strings.xml b/packages/PackageInstaller/res/values-tl/strings.xml
index 78a1b2bfbc9f..8e6e2517e473 100644
--- a/packages/PackageInstaller/res/values-tl/strings.xml
+++ b/packages/PackageInstaller/res/values-tl/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notification na na-install ang app"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Matagumpay na na-install"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Matagumpay na na-install ang “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"I-restore ang <xliff:g id="APPNAME">%1$s</xliff:g> mula sa <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Magsisimulang mag-download ang app na ito sa background"</string>
+ <string name="restore" msgid="8460854736328970444">"I-restore"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-tr/strings.xml b/packages/PackageInstaller/res/values-tr/strings.xml
index a34765cab72d..dc840306e091 100644
--- a/packages/PackageInstaller/res/values-tr/strings.xml
+++ b/packages/PackageInstaller/res/values-tr/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Uygulama yükleme bildirimi"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Başarıyla yüklendi"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" başarıyla yüklendi"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> uygulaması <xliff:g id="INSTALLERNAME">%1$s</xliff:g> üzerinden geri yüklensin mi?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Bu uygulama arka planda indirilmeye başlanacak"</string>
+ <string name="restore" msgid="8460854736328970444">"Geri yükle"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-uk/strings.xml b/packages/PackageInstaller/res/values-uk/strings.xml
index 76f33729bbaf..3d7083f9f1f8 100644
--- a/packages/PackageInstaller/res/values-uk/strings.xml
+++ b/packages/PackageInstaller/res/values-uk/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Сповіщення: додаток установлено"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Установлено"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Додаток <xliff:g id="APPNAME">%1$s</xliff:g> установлено"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Відновити додаток <xliff:g id="APPNAME">%1$s</xliff:g> з <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Цей додаток почне завантажуватись у фоновому режимі"</string>
+ <string name="restore" msgid="8460854736328970444">"Відновити"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ur/strings.xml b/packages/PackageInstaller/res/values-ur/strings.xml
index e621d7150fde..08a8315d5caf 100644
--- a/packages/PackageInstaller/res/values-ur/strings.xml
+++ b/packages/PackageInstaller/res/values-ur/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ایپ انسٹال ہونے کی اطلاع"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"کامیابی کے ساتھ انسٹال ہو گئی"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" کامیابی کے ساتھ انسٹال ہو گئی"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> کو <xliff:g id="INSTALLERNAME">%1$s</xliff:g> سے بحال کریں"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"یہ ایپ پس منظر میں ڈاؤن لوڈ ہونا شروع ہو جائے گی"</string>
+ <string name="restore" msgid="8460854736328970444">"بحال کریں"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-uz/strings.xml b/packages/PackageInstaller/res/values-uz/strings.xml
index 7597fb23063e..894e8676f8d4 100644
--- a/packages/PackageInstaller/res/values-uz/strings.xml
+++ b/packages/PackageInstaller/res/values-uz/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Ilova oʻrnatilgani haqida bildirishnoma"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"O‘rnatildi"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” o‘rnatildi"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> ilovasi <xliff:g id="INSTALLERNAME">%1$s</xliff:g> orqali tiklansinmi?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Bu ilova orqa fonda yuklab olinishi boshlanadi"</string>
+ <string name="restore" msgid="8460854736328970444">"Tiklash"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-vi/strings.xml b/packages/PackageInstaller/res/values-vi/strings.xml
index 53b2a780c973..14959da4d147 100644
--- a/packages/PackageInstaller/res/values-vi/strings.xml
+++ b/packages/PackageInstaller/res/values-vi/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Thông báo đã cài đặt ứng dụng"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Đã cài đặt thành công"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Đã cài đặt thành công “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Khôi phục <xliff:g id="APPNAME">%1$s</xliff:g> từ <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Ứng dụng này sẽ bắt đầu tải xuống ở chế độ nền"</string>
+ <string name="restore" msgid="8460854736328970444">"Khôi phục"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zh-rCN/strings.xml b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
index eb6d0f22b226..ae125593ab6e 100644
--- a/packages/PackageInstaller/res/values-zh-rCN/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"“应用已安装”通知"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"已成功安装"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>”安装成功"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"要从 <xliff:g id="INSTALLERNAME">%1$s</xliff:g> 中恢复 <xliff:g id="APPNAME">%1$s</xliff:g> 吗?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"系统将开始在后台下载此应用"</string>
+ <string name="restore" msgid="8460854736328970444">"恢复"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zh-rHK/strings.xml b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
index 883a6b130012..5a79817b7e6e 100644
--- a/packages/PackageInstaller/res/values-zh-rHK/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"「應用程式已安裝」通知"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"已成功安裝"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"「<xliff:g id="APPNAME">%1$s</xliff:g>」已成功安裝"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"要從「<xliff:g id="INSTALLERNAME">%1$s</xliff:g>」還原「<xliff:g id="APPNAME">%1$s</xliff:g>」嗎?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"此應用程式將開始在背景下載"</string>
+ <string name="restore" msgid="8460854736328970444">"還原"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zh-rTW/strings.xml b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
index 0d9e266118d4..873392bf240c 100644
--- a/packages/PackageInstaller/res/values-zh-rTW/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"「應用程式已安裝」通知"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"安裝成功"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"已成功安裝「<xliff:g id="APPNAME">%1$s</xliff:g>」"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"要從「<xliff:g id="INSTALLERNAME">%1$s</xliff:g>」還原「<xliff:g id="APPNAME">%1$s</xliff:g>」嗎?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"系統將開始在背景下載這個應用程式"</string>
+ <string name="restore" msgid="8460854736328970444">"還原"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zu/strings.xml b/packages/PackageInstaller/res/values-zu/strings.xml
index 98c75e88eacf..8ff1e38bc7a3 100644
--- a/packages/PackageInstaller/res/values-zu/strings.xml
+++ b/packages/PackageInstaller/res/values-zu/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Isaziso sokufakwa kohlelo lokusebenza"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Ifakwe ngempumelelo"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Kufakwe ngempumelelo i-\"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Buyisela i-<xliff:g id="APPNAME">%1$s</xliff:g> ukusuka ku-<xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Le app izoqala ukudawuniloda ingemuva"</string>
+ <string name="restore" msgid="8460854736328970444">"Buyisela"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values/strings.xml b/packages/PackageInstaller/res/values/strings.xml
index 0a2e8809a17c..8f60c97c8c4d 100644
--- a/packages/PackageInstaller/res/values/strings.xml
+++ b/packages/PackageInstaller/res/values/strings.xml
@@ -131,6 +131,8 @@
<string name="uninstall_application_text_current_user_clone_profile">Do you want to delete this app?</string>
<!-- [CHAR LIMIT=none] -->
<string name="uninstall_application_text_with_clone_instance">Do you want to uninstall this app? <xliff:g id="package_label">%1$s</xliff:g> clone will also be deleted.</string>
+ <!-- [CHAR LIMIT=none] -->
+ <string name="uninstall_application_text_current_user_private_profile">Do you want to uninstall this app from your private space?</string>
<!-- Label for the notification channel containing notifications for current uninstall operations [CHAR LIMIT=40] -->
<string name="uninstalling_notification_channel">Running uninstalls</string>
@@ -267,4 +269,86 @@
<!-- The action to restore (i.e. re-install, re-download) an app after parts of the app have been previously moved
into the cloud for temporary storage. [CHAR LIMIT=15] -->
<string name="restore">Restore</string>
+
+ <!-- Dialog title shown when the user is trying to restore an app but the associated download
+ cannot happen immediately because the device is offline (has no internet connection.
+ [CHAR LIMIT=50] -->
+ <string name="unarchive_error_offline_title">You\'re offline</string>
+
+ <!-- Dialog body test shown when the user is trying to restore an app but the associated download
+ cannot happen immediately because the device is offline (has no internet connection.
+ [CHAR LIMIT=none] -->
+ <string name="unarchive_error_offline_body">
+ This app will automatically restore when you\'re connected to the internet
+ </string>
+
+ <!-- Dialog title shown when the user is trying to restore an app but a generic error happened.
+ [CHAR LIMIT=50] -->
+ <string name="unarchive_error_generic_title">Something went wrong</string>
+
+ <!-- Dialog body shown when the user is trying to restore an app but a generic error happened.
+ [CHAR LIMIT=none] -->
+ <string name="unarchive_error_generic_body">
+ There was a problem trying to restore this app
+ </string>
+
+ <!-- Dialog title shown when the user is trying to restore an app but the device is out of
+ storage. [CHAR LIMIT=50] -->
+ <string name="unarchive_error_storage_title">Not enough storage</string>
+
+ <!-- Dialog body shown when the user is trying to restore an app but the device is out of
+ storage. [CHAR LIMIT=none] -->
+ <string name="unarchive_error_storage_body">
+ To restore this app, you can free up space on this device. Storage
+ required: <xliff:g id="bytes" example="100 MB">%1$s</xliff:g>
+ </string>
+
+ <!-- Dialog title shown when the user is trying to restore an app but the installer needs to
+ perform an additional action. [CHAR LIMIT=50] -->
+ <string name="unarchive_action_required_title">Action required</string>
+
+ <!-- Dialog body shown when the user is trying to restore an app but the installer needs to
+ perform an additional action. [CHAR LIMIT=none] -->
+ <string name="unarchive_action_required_body">
+ Follow the next steps to restore this app
+ </string>
+ <!-- Dialog title shown when the user is trying to restore an app but the installer responsible
+ for the action is in a disabled state. [CHAR LIMIT=50] -->
+ <string name="unarchive_error_installer_disabled_title">
+ <xliff:g id="installername" example="App Store">%1$s</xliff:g> is disabled
+ </string>
+
+ <!-- Dialog body shown when the user is trying to restore an app but the installer responsible
+ for the action is in a disabled state. [CHAR LIMIT=none] -->
+ <string name="unarchive_error_installer_disabled_body">
+ To restore this app, enable the
+ <xliff:g id="installername" example="App Store">%1$s</xliff:g> in Settings
+ </string>
+
+ <!-- Dialog title shown when the user is trying to restore an app but the installer responsible
+ for the action is uninstalled. [CHAR LIMIT=50] -->
+ <string name="unarchive_error_installer_uninstalled_title">
+ <xliff:g id="installername" example="App Store">%1$s</xliff:g> is uninstalled
+ </string>
+
+ <!-- Dialog body shown when the user is trying to restore an app but the installer responsible
+ for the action is uninstalled. [CHAR LIMIT=none] -->
+ <string name="unarchive_error_installer_uninstalled_body">
+ To restore this app, you\'ll need to install
+ <xliff:g id="installername" example="App Store">%1$s</xliff:g>
+ </string>
+
+ <!-- Dialog action to continue with the next action. [CHAR LIMIT=30] -->
+ <string name="unarchive_action_required_continue">Continue</string>
+
+ <!-- Dialog action to clear device storage, as in deleting some apps or photos to free up bytes
+ [CHAR LIMIT=30] -->
+ <string name="unarchive_clear_storage_button">Clear storage</string>
+
+ <!-- Dialog action to open the Settings app. [CHAR LIMIT=30] -->
+ <string name="unarchive_settings_button">Settings</string>
+
+ <!-- Dialog action to close a dialog. [CHAR LIMIT=30] -->
+ <string name="close">Close</string>
+
</resources>
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java
index daedb1aac298..8d8254ad4058 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java
@@ -298,7 +298,14 @@ public class InstallInstalling extends Activity {
broadcastIntent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
- session.commit(pendingIntent.getIntentSender());
+ try {
+ session.commit(pendingIntent.getIntentSender());
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "Cannot install package: ", e);
+ launchFailure(PackageInstaller.STATUS_FAILURE,
+ PackageManager.INSTALL_FAILED_INTERNAL_ERROR, null);
+ return;
+ }
mCancelButton.setEnabled(false);
setFinishOnTouchOutside(false);
} else {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
index e2107ebe2525..418705845065 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
@@ -16,12 +16,14 @@
package com.android.packageinstaller;
+import static android.content.pm.Flags.usePiaV2;
import static com.android.packageinstaller.PackageUtil.getMaxTargetSdkVersionForUid;
import android.Manifest;
import android.app.Activity;
import android.app.DialogFragment;
import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
@@ -57,14 +59,21 @@ public class InstallStart extends Activity {
private final boolean mLocalLOGV = false;
- // TODO (sumedhsen): Replace with an Android Feature Flag once implemented
- private static final boolean USE_PIA_V2 = false;
-
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (USE_PIA_V2) {
+ mPackageManager = getPackageManager();
+ if (usePiaV2()) {
+ Log.i(TAG, "Using Pia V2");
+
+ mPackageManager.setComponentEnabledSetting(new ComponentName(this,
+ com.android.packageinstaller.InstallEventReceiver.class),
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
+ mPackageManager.setComponentEnabledSetting(new ComponentName(this,
+ com.android.packageinstaller.v2.model.InstallEventReceiver.class),
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
+
Intent piaV2 = new Intent(getIntent());
piaV2.putExtra(InstallLaunch.EXTRA_CALLING_PKG_NAME, getCallingPackage());
piaV2.putExtra(InstallLaunch.EXTRA_CALLING_PKG_UID, getLaunchedFromUid());
@@ -74,7 +83,6 @@ public class InstallStart extends Activity {
finish();
return;
}
- mPackageManager = getPackageManager();
mUserManager = getSystemService(UserManager.class);
Intent intent = getIntent();
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorActivity.java
new file mode 100644
index 000000000000..78d2f889f181
--- /dev/null
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorActivity.java
@@ -0,0 +1,79 @@
+/*
+ * 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 com.android.packageinstaller;
+
+import android.app.Activity;
+import android.app.DialogFragment;
+import android.app.Fragment;
+import android.app.FragmentTransaction;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.content.pm.PackageInstaller;
+import android.os.Bundle;
+
+import java.util.Objects;
+
+public class UnarchiveErrorActivity extends Activity {
+
+ static final String EXTRA_REQUIRED_BYTES =
+ "com.android.content.pm.extra.UNARCHIVE_EXTRA_REQUIRED_BYTES";
+ static final String EXTRA_INSTALLER_PACKAGE_NAME =
+ "com.android.content.pm.extra.UNARCHIVE_INSTALLER_PACKAGE_NAME";
+ static final String EXTRA_INSTALLER_TITLE =
+ "com.android.content.pm.extra.UNARCHIVE_INSTALLER_TITLE";
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(null);
+
+ Bundle extras = getIntent().getExtras();
+ int unarchivalStatus = extras.getInt(PackageInstaller.EXTRA_UNARCHIVE_STATUS);
+ long requiredBytes = extras.getLong(EXTRA_REQUIRED_BYTES);
+ PendingIntent intent = extras.getParcelable(Intent.EXTRA_INTENT, PendingIntent.class);
+ String installerPackageName = extras.getString(EXTRA_INSTALLER_PACKAGE_NAME);
+ // We cannot derive this from the package name because the installer might not be installed
+ // anymore.
+ String installerAppTitle = extras.getString(EXTRA_INSTALLER_TITLE);
+
+ if (unarchivalStatus == PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED) {
+ Objects.requireNonNull(intent);
+ }
+
+ FragmentTransaction ft = getFragmentManager().beginTransaction();
+ Fragment prev = getFragmentManager().findFragmentByTag("dialog");
+ if (prev != null) {
+ ft.remove(prev);
+ }
+
+ Bundle args = new Bundle();
+ args.putInt(PackageInstaller.EXTRA_UNARCHIVE_STATUS, unarchivalStatus);
+ args.putLong(EXTRA_REQUIRED_BYTES, requiredBytes);
+ if (intent != null) {
+ args.putParcelable(Intent.EXTRA_INTENT, intent);
+ }
+ if (installerPackageName != null) {
+ args.putString(EXTRA_INSTALLER_PACKAGE_NAME, installerPackageName);
+ }
+ if (installerAppTitle != null) {
+ args.putString(EXTRA_INSTALLER_TITLE, installerAppTitle);
+ }
+
+ DialogFragment fragment = new UnarchiveErrorFragment();
+ fragment.setArguments(args);
+ fragment.show(ft, "dialog");
+ }
+}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorFragment.java
new file mode 100644
index 000000000000..d33433f3983b
--- /dev/null
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorFragment.java
@@ -0,0 +1,196 @@
+/*
+ * 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 com.android.packageinstaller;
+
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.PendingIntent;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.content.pm.PackageInstaller;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.format.Formatter;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+
+public class UnarchiveErrorFragment extends DialogFragment implements
+ DialogInterface.OnClickListener {
+
+ private static final String TAG = "UnarchiveErrorFragment";
+
+ private int mStatus;
+
+ @Nullable
+ private PendingIntent mExtraIntent;
+
+ @Nullable
+ private String mInstallerPackageName;
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Bundle args = getArguments();
+ mStatus = args.getInt(PackageInstaller.EXTRA_UNARCHIVE_STATUS, -1);
+ mExtraIntent = args.getParcelable(Intent.EXTRA_INTENT, PendingIntent.class);
+ long requiredBytes = args.getLong(UnarchiveErrorActivity.EXTRA_REQUIRED_BYTES);
+ mInstallerPackageName = args.getString(
+ UnarchiveErrorActivity.EXTRA_INSTALLER_PACKAGE_NAME);
+ String installerAppTitle = args.getString(UnarchiveErrorActivity.EXTRA_INSTALLER_TITLE);
+
+ AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
+
+ dialogBuilder.setTitle(getDialogTitle(mStatus, installerAppTitle));
+ dialogBuilder.setMessage(getBodyText(mStatus, installerAppTitle, requiredBytes));
+
+ addButtons(dialogBuilder, mStatus);
+
+ return dialogBuilder.create();
+ }
+
+ private void addButtons(AlertDialog.Builder dialogBuilder, int status) {
+ switch (status) {
+ case PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED:
+ dialogBuilder.setPositiveButton(R.string.unarchive_action_required_continue, this);
+ dialogBuilder.setNegativeButton(R.string.close, this);
+ break;
+ case PackageInstaller.UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE:
+ dialogBuilder.setPositiveButton(R.string.unarchive_clear_storage_button, this);
+ dialogBuilder.setNegativeButton(R.string.close, this);
+ break;
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_DISABLED:
+ dialogBuilder.setPositiveButton(R.string.external_sources_settings, this);
+ dialogBuilder.setNegativeButton(R.string.close, this);
+ break;
+ case PackageInstaller.UNARCHIVAL_ERROR_NO_CONNECTIVITY:
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED:
+ case PackageInstaller.UNARCHIVAL_GENERIC_ERROR:
+ dialogBuilder.setPositiveButton(android.R.string.ok, this);
+ break;
+ default:
+ // This should never happen through normal API usage.
+ throw new IllegalArgumentException("Invalid unarchive status " + status);
+ }
+ }
+
+ private String getBodyText(int status, String installerAppTitle, long requiredBytes) {
+ switch (status) {
+ case PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED:
+ return getString(R.string.unarchive_action_required_body);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE:
+ return String.format(getString(R.string.unarchive_error_storage_body),
+ Formatter.formatShortFileSize(getActivity(), requiredBytes));
+ case PackageInstaller.UNARCHIVAL_ERROR_NO_CONNECTIVITY:
+ return getString(R.string.unarchive_error_offline_body);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_DISABLED:
+ return String.format(getString(R.string.unarchive_error_installer_disabled_body),
+ installerAppTitle);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED:
+ return String.format(
+ getString(R.string.unarchive_error_installer_uninstalled_body),
+ installerAppTitle);
+ case PackageInstaller.UNARCHIVAL_GENERIC_ERROR:
+ return getString(R.string.unarchive_error_generic_body);
+ default:
+ // This should never happen through normal API usage.
+ throw new IllegalArgumentException("Invalid unarchive status " + status);
+ }
+ }
+
+ private String getDialogTitle(int status, String installerAppTitle) {
+ switch (status) {
+ case PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED:
+ return getString(R.string.unarchive_action_required_title);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE:
+ return getString(R.string.unarchive_error_storage_title);
+ case PackageInstaller.UNARCHIVAL_ERROR_NO_CONNECTIVITY:
+ return getString(R.string.unarchive_error_offline_title);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_DISABLED:
+ return String.format(getString(R.string.unarchive_error_installer_disabled_title),
+ installerAppTitle);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED:
+ return String.format(
+ getString(R.string.unarchive_error_installer_uninstalled_title),
+ installerAppTitle);
+ case PackageInstaller.UNARCHIVAL_GENERIC_ERROR:
+ return getString(R.string.unarchive_error_generic_title);
+ default:
+ // This should never happen through normal API usage.
+ throw new IllegalArgumentException("Invalid unarchive status " + status);
+ }
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (which != Dialog.BUTTON_POSITIVE) {
+ return;
+ }
+
+ try {
+ onClickInternal();
+ } catch (IntentSender.SendIntentException e) {
+ Log.e(TAG, "Failed to start intent after onClick.", e);
+ }
+ }
+
+ private void onClickInternal() throws IntentSender.SendIntentException {
+ Activity activity = getActivity();
+ if (activity == null) {
+ // This probably shouldn't happen in practice.
+ Log.i(TAG, "Lost reference to activity, cannot act onClick.");
+ return;
+ }
+
+ switch (mStatus) {
+ case PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED:
+ activity.startIntentSender(mExtraIntent.getIntentSender(), /* fillInIntent= */
+ null, /* flagsMask= */ 0, FLAG_ACTIVITY_NEW_TASK, /* extraFlags= */ 0);
+ break;
+ case PackageInstaller.UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE:
+ if (mExtraIntent != null) {
+ activity.startIntentSender(mExtraIntent.getIntentSender(), /* fillInIntent= */
+ null, /* flagsMask= */ 0, FLAG_ACTIVITY_NEW_TASK, /* extraFlags= */ 0);
+ } else {
+ Intent intent = new Intent("android.intent.action.MANAGE_PACKAGE_STORAGE");
+ startActivity(intent);
+ }
+ break;
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_DISABLED:
+ Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ Uri uri = Uri.fromParts("package", mInstallerPackageName, null);
+ intent.setData(uri);
+ startActivity(intent);
+ break;
+ default:
+ // Do nothing. The rest of the dialogs are purely informational.
+ }
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ super.onDismiss(dialog);
+ if (isAdded()) {
+ getActivity().finish();
+ }
+ }
+}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
index 34062a4cbde6..ba627e9e9202 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
@@ -17,8 +17,8 @@
package com.android.packageinstaller;
import static android.app.AppOpsManager.MODE_ALLOWED;
+import static android.content.pm.Flags.usePiaV2;
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
-
import static com.android.packageinstaller.PackageUtil.getMaxTargetSdkVersionForUid;
import android.Manifest;
@@ -81,9 +81,6 @@ public class UninstallerActivity extends Activity {
private String mPackageName;
private DialogInfo mDialogInfo;
- // TODO (sumedhsen): Replace with an Android Feature Flag once implemented
- private static final boolean USE_PIA_V2 = false;
-
@Override
public void onCreate(Bundle icicle) {
getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
@@ -92,7 +89,18 @@ public class UninstallerActivity extends Activity {
// be stale, if e.g. the app was uninstalled while the activity was destroyed.
super.onCreate(null);
- if (USE_PIA_V2 && !isTv()) {
+ if (usePiaV2() && !isTv()) {
+ Log.i(TAG, "Using Pia V2");
+
+ PackageManager pm = getPackageManager();
+ pm.setComponentEnabledSetting(
+ new ComponentName(this, com.android.packageinstaller.UninstallEventReceiver.class),
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
+ pm.setComponentEnabledSetting(
+ new ComponentName(this,
+ com.android.packageinstaller.v2.model.UninstallEventReceiver.class),
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
+
boolean returnResult = getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false);
Intent piaV2 = new Intent(getIntent());
piaV2.putExtra(UninstallLaunch.EXTRA_CALLING_PKG_UID, getLaunchedFromUid());
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
index d113878a3181..e8890504f622 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
@@ -30,6 +30,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
+import android.os.Flags;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
@@ -157,6 +158,12 @@ public class UninstallAlertDialogFragment extends DialogFragment implements
mIsClonedApp = true;
messageBuilder.append(getString(
R.string.uninstall_application_text_current_user_clone_profile));
+ } else if (Flags.allowPrivateProfile()
+ && customUserManager.isPrivateProfile()
+ && customUserManager.isSameProfileGroup(dialogInfo.user, myUserHandle)) {
+ messageBuilder.append(getString(
+ R.string.uninstall_application_text_current_user_private_profile,
+ userName));
} else {
messageBuilder.append(
getString(R.string.uninstall_application_text_user, userName));
diff --git a/packages/SettingsLib/MainSwitchPreference/Android.bp b/packages/SettingsLib/MainSwitchPreference/Android.bp
index 4871ef3097a5..010a6ce9d4d9 100644
--- a/packages/SettingsLib/MainSwitchPreference/Android.bp
+++ b/packages/SettingsLib/MainSwitchPreference/Android.bp
@@ -17,7 +17,6 @@ android_library {
static_libs: [
"androidx.preference_preference",
"SettingsLibSettingsTheme",
- "SettingsLibUtils",
],
sdk_version: "system_current",
diff --git a/packages/SettingsLib/MainSwitchPreference/AndroidManifest.xml b/packages/SettingsLib/MainSwitchPreference/AndroidManifest.xml
index 4b3acbf2c394..e70114f36e97 100644
--- a/packages/SettingsLib/MainSwitchPreference/AndroidManifest.xml
+++ b/packages/SettingsLib/MainSwitchPreference/AndroidManifest.xml
@@ -17,5 +17,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.settingslib.widget.mainswitch">
-
+ <uses-sdk android:minSdkVersion="21" />
</manifest>
diff --git a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
index 2b5fcd807899..e6f61a8400c4 100644
--- a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
+++ b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
@@ -18,6 +18,8 @@ package com.android.settingslib.widget;
import android.content.Context;
import android.content.res.TypedArray;
+import android.os.Build;
+import android.os.Build.VERSION_CODES;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
@@ -30,7 +32,6 @@ import android.widget.TextView;
import androidx.annotation.ColorInt;
-import com.android.settingslib.utils.BuildCompatUtils;
import com.android.settingslib.widget.mainswitch.R;
import java.util.ArrayList;
@@ -72,11 +73,18 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen
LayoutInflater.from(context).inflate(R.layout.settingslib_main_switch_bar, this);
- if (!BuildCompatUtils.isAtLeastS()) {
- final TypedArray a = context.obtainStyledAttributes(
- new int[]{android.R.attr.colorAccent});
- mBackgroundActivatedColor = a.getColor(0, 0);
- mBackgroundColor = context.getColor(androidx.appcompat.R.color.material_grey_600);
+ if (Build.VERSION.SDK_INT < VERSION_CODES.S) {
+ TypedArray a;
+ if (Build.VERSION.SDK_INT >= VERSION_CODES.M) {
+ a = context.obtainStyledAttributes(
+ new int[]{android.R.attr.colorAccent});
+ mBackgroundActivatedColor = a.getColor(0, 0);
+ mBackgroundColor = context.getColor(androidx.appcompat.R.color.material_grey_600);
+ } else {
+ a = context.obtainStyledAttributes(new int[]{android.R.attr.colorPrimary});
+ mBackgroundActivatedColor = a.getColor(0, 0);
+ mBackgroundColor = a.getColor(0, 0);
+ }
a.recycle();
}
@@ -148,7 +156,7 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen
* Set icon space reserved for title
*/
public void setIconSpaceReserved(boolean iconSpaceReserved) {
- if (mTextView != null && !BuildCompatUtils.isAtLeastS()) {
+ if (mTextView != null && (Build.VERSION.SDK_INT < VERSION_CODES.S)) {
LayoutParams params = (LayoutParams) mTextView.getLayoutParams();
int iconSpace = getContext().getResources().getDimensionPixelSize(
R.dimen.settingslib_switchbar_subsettings_margin_start);
@@ -207,7 +215,7 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen
mTextView.setEnabled(enabled);
mSwitch.setEnabled(enabled);
- if (BuildCompatUtils.isAtLeastS()) {
+ if (Build.VERSION.SDK_INT >= VERSION_CODES.S) {
mFrameView.setEnabled(enabled);
mFrameView.setActivated(isChecked());
}
@@ -222,7 +230,7 @@ public class MainSwitchBar extends LinearLayout implements OnCheckedChangeListen
}
private void setBackground(boolean isChecked) {
- if (!BuildCompatUtils.isAtLeastS()) {
+ if (Build.VERSION.SDK_INT < VERSION_CODES.S) {
setBackgroundColor(isChecked ? mBackgroundActivatedColor : mBackgroundColor);
} else {
mFrameView.setActivated(isChecked);
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml
index 6979825c9a20..e4befc290939 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml
@@ -70,6 +70,7 @@
<style name="SettingsSwitchPreferenceCompat.SettingsLib" parent="@style/Preference.SwitchPreferenceCompat.Material">
<item name="layout">@layout/settingslib_preference</item>
+ <item name="singleLineTitle">false</item>
<item name="iconSpaceReserved">@bool/settingslib_config_icon_space_reserved</item>
</style>
diff --git a/packages/SettingsLib/Spa/build.gradle.kts b/packages/SettingsLib/Spa/build.gradle.kts
index 80b944f5749f..60bf48c8b75e 100644
--- a/packages/SettingsLib/Spa/build.gradle.kts
+++ b/packages/SettingsLib/Spa/build.gradle.kts
@@ -25,11 +25,11 @@ plugins {
alias(libs.plugins.kotlin.android) apply false
}
-val androidTop : String = File(rootDir, "../../../../..").canonicalPath
+val androidTop: String = File(rootDir, "../../../../..").canonicalPath
allprojects {
extra["androidTop"] = androidTop
- extra["jetpackComposeVersion"] = "1.6.0-alpha08"
+ extra["jetpackComposeVersion"] = "1.6.0-beta01"
}
subprojects {
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt
index 8386bc1b1ba3..f216abb66a64 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt
@@ -17,24 +17,32 @@
package com.android.settingslib.spa.gallery.card
import android.os.Bundle
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Error
import androidx.compose.material.icons.outlined.PowerOff
import androidx.compose.material.icons.outlined.Shield
import androidx.compose.material.icons.outlined.WarningAmber
+import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
+import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.gallery.R
import com.android.settingslib.spa.widget.card.CardButton
import com.android.settingslib.spa.widget.card.CardModel
import com.android.settingslib.spa.widget.card.SettingsCard
import com.android.settingslib.spa.widget.card.SettingsCollapsibleCard
+import com.android.settingslib.spa.widget.card.SettingsCardContent
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
@@ -50,6 +58,7 @@ object CardPageProvider : SettingsPageProvider {
SettingsCardWithIcon()
SettingsCardWithoutIcon()
SampleSettingsCollapsibleCard()
+ SampleSettingsCardContent()
}
}
@@ -108,6 +117,32 @@ object CardPageProvider : SettingsPageProvider {
)
}
+ @Composable
+ fun SampleSettingsCardContent() {
+ SettingsCard {
+ SettingsCardContent {
+ Box(
+ Modifier
+ .fillMaxWidth()
+ .clickable { }
+ .padding(SettingsDimension.dialogItemPadding),
+ ) {
+ Text(text = "Abc")
+ }
+ }
+ SettingsCardContent {
+ Box(
+ Modifier
+ .fillMaxWidth()
+ .clickable { }
+ .padding(SettingsDimension.dialogItemPadding),
+ ) {
+ Text(text = "123")
+ }
+ }
+ }
+ }
+
fun buildInjectEntry(): SettingsEntryBuilder {
return SettingsEntryBuilder.createInject(owner = createSettingsPage())
.setUiLayoutFn {
diff --git a/packages/SettingsLib/Spa/spa/build.gradle.kts b/packages/SettingsLib/Spa/spa/build.gradle.kts
index 4335173dd706..acd90f3c4f4d 100644
--- a/packages/SettingsLib/Spa/spa/build.gradle.kts
+++ b/packages/SettingsLib/Spa/spa/build.gradle.kts
@@ -57,13 +57,13 @@ dependencies {
api("androidx.slice:slice-builders:1.1.0-alpha02")
api("androidx.slice:slice-core:1.1.0-alpha02")
api("androidx.slice:slice-view:1.1.0-alpha02")
- api("androidx.compose.material3:material3:1.2.0-alpha10")
+ api("androidx.compose.material3:material3:1.2.0-alpha11")
api("androidx.compose.material:material-icons-extended:$jetpackComposeVersion")
api("androidx.compose.runtime:runtime-livedata:$jetpackComposeVersion")
api("androidx.compose.ui:ui-tooling-preview:$jetpackComposeVersion")
api("androidx.lifecycle:lifecycle-livedata-ktx")
api("androidx.lifecycle:lifecycle-runtime-compose")
- api("androidx.navigation:navigation-compose:2.7.5")
+ api("androidx.navigation:navigation-compose:2.7.4")
api("com.github.PhilJay:MPAndroidChart:v3.1.0-alpha")
api("com.google.android.material:material:1.7.0-alpha03")
debugApi("androidx.compose.ui:ui-tooling:$jetpackComposeVersion")
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt
index 8c862d401c6b..f7c5414a420c 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt
@@ -20,6 +20,8 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.ui.unit.dp
object SettingsShape {
+ val CornerExtraSmall = RoundedCornerShape(4.dp)
+
val CornerMedium = RoundedCornerShape(12.dp)
val CornerExtraLarge = RoundedCornerShape(28.dp)
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsTheme.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsTheme.kt
index 26372b6bfd32..c395558b769c 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsTheme.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsTheme.kt
@@ -17,9 +17,7 @@
package com.android.settingslib.spa.framework.theme
import androidx.compose.foundation.isSystemInDarkTheme
-import androidx.compose.material.ripple.LocalRippleTheme
-import androidx.compose.material.ripple.RippleAlpha
-import androidx.compose.material.ripple.RippleTheme
+import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
@@ -39,7 +37,7 @@ fun SettingsTheme(content: @Composable () -> Unit) {
MaterialTheme(colorScheme = colorScheme, typography = rememberSettingsTypography()) {
CompositionLocalProvider(
LocalColorScheme provides settingsColorScheme(isDarkTheme),
- LocalRippleTheme provides SettingsRippleTheme,
+ LocalContentColor provides MaterialTheme.colorScheme.onSurface,
) {
content()
}
@@ -52,19 +50,3 @@ object SettingsTheme {
@ReadOnlyComposable
get() = LocalColorScheme.current
}
-
-private object SettingsRippleTheme : RippleTheme {
- @Composable
- override fun defaultColor() = MaterialTheme.colorScheme.onSurface
-
- @Composable
- override fun rippleAlpha() = RippleAlpha
-}
-
-/** Alpha levels for all content. */
-private val RippleAlpha = RippleAlpha(
- pressedAlpha = 0.48f,
- focusedAlpha = 0.48f,
- draggedAlpha = 0.32f,
- hoveredAlpha = 0.16f,
-)
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCard.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCard.kt
index 10e26869a76e..43792787c5aa 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCard.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCard.kt
@@ -36,10 +36,13 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.unit.dp
import com.android.settingslib.spa.debug.UiModePreviews
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraLarge
+import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraSmall
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.widget.ui.SettingsBody
import com.android.settingslib.spa.widget.ui.SettingsTitle
@@ -49,7 +52,7 @@ fun SettingsCard(content: @Composable ColumnScope.() -> Unit) {
Card(
shape = CornerExtraLarge,
colors = CardDefaults.cardColors(
- containerColor = SettingsTheme.colorScheme.surface,
+ containerColor = Color.Transparent,
),
modifier = Modifier
.fillMaxWidth()
@@ -62,6 +65,20 @@ fun SettingsCard(content: @Composable ColumnScope.() -> Unit) {
}
@Composable
+fun SettingsCardContent(content: @Composable ColumnScope.() -> Unit) {
+ Card(
+ shape = CornerExtraSmall,
+ colors = CardDefaults.cardColors(
+ containerColor = SettingsTheme.colorScheme.surface,
+ ),
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(vertical = 1.dp),
+ content = content,
+ )
+}
+
+@Composable
fun SettingsCard(model: CardModel) {
SettingsCard {
SettingsCardImpl(model)
@@ -70,14 +87,16 @@ fun SettingsCard(model: CardModel) {
@Composable
internal fun SettingsCardImpl(model: CardModel) {
- Column(
- modifier = Modifier.padding(SettingsDimension.itemPaddingStart),
- verticalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingAround)
- ) {
- CardIcon(model.imageVector)
- SettingsTitle(model.title)
- SettingsBody(model.text)
- Buttons(model.buttons)
+ SettingsCardContent {
+ Column(
+ modifier = Modifier.padding(SettingsDimension.itemPaddingStart),
+ verticalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingAround)
+ ) {
+ CardIcon(model.imageVector)
+ SettingsTitle(model.title)
+ SettingsBody(model.text)
+ Buttons(model.buttons)
+ }
}
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCard.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCard.kt
index 7d1064512a64..bf192a18679e 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCard.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCard.kt
@@ -30,7 +30,6 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Error
import androidx.compose.material.icons.outlined.PowerOff
import androidx.compose.material.icons.outlined.Shield
-import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
@@ -54,18 +53,16 @@ import com.android.settingslib.spa.widget.ui.SettingsTitleSmall
fun SettingsCollapsibleCard(
title: String,
imageVector: ImageVector,
- models: List<CardModel>
+ models: List<CardModel>,
) {
var expanded by rememberSaveable { mutableStateOf(false) }
SettingsCard {
- Header(title, imageVector, models.size, expanded) { expanded = it }
+ SettingsCardContent {
+ Header(title, imageVector, models.size, expanded) { expanded = it }
+ }
AnimatedVisibility(expanded) {
Column {
for (model in models) {
- HorizontalDivider(
- thickness = SettingsDimension.paddingSmall,
- color = MaterialTheme.colorScheme.surface,
- )
SettingsCardImpl(model)
}
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/chart/BarChart.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/chart/BarChart.kt
index 7ca15d95cee1..e761a33cf67a 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/chart/BarChart.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/chart/BarChart.kt
@@ -86,6 +86,10 @@ interface BarChartModel {
*/
val yAxisLabelCount: Int
get() = 3
+
+ /** If set to true, touch gestures are enabled on the [BarChart]. */
+ val enableBarchartTouch: Boolean
+ get() = true
}
data class BarChartData(
@@ -127,6 +131,7 @@ fun BarChart(barChartModel: BarChartModel) {
legend.isEnabled = false
extraBottomOffset = 4f
setScaleEnabled(false)
+ setTouchEnabled(barChartModel.enableBarchartTouch)
xAxis.apply {
position = XAxis.XAxisPosition.BOTTOM
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalFlow.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/database/ContentChangeFlow.kt
index de5c558fea56..8f67354b76f3 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalFlow.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/database/ContentChangeFlow.kt
@@ -14,12 +14,11 @@
* limitations under the License.
*/
-package com.android.settingslib.spaprivileged.settingsprovider
+package com.android.settingslib.spaprivileged.database
import android.content.Context
import android.database.ContentObserver
-import android.os.Handler
-import android.provider.Settings
+import android.net.Uri
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
@@ -27,20 +26,19 @@ import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.flowOn
-internal fun <T> Context.settingsGlobalFlow(
- name: String,
- sendInitialValue: Boolean = true,
- value: () -> T,
-): Flow<T> = callbackFlow {
- val contentObserver = object : ContentObserver(Handler.getMain()) {
+/** Content change flow for the given [uri]. */
+internal fun Context.contentChangeFlow(
+ uri: Uri,
+ sendInitial: Boolean = true,
+): Flow<Unit> = callbackFlow {
+ val contentObserver = object : ContentObserver(null) {
override fun onChange(selfChange: Boolean) {
- trySend(value())
+ trySend(Unit)
}
}
- val uri = Settings.Global.getUriFor(name)
contentResolver.registerContentObserver(uri, false, contentObserver)
- if (sendInitialValue) {
- trySend(value())
+ if (sendInitial) {
+ trySend(Unit)
}
awaitClose { contentResolver.unregisterContentObserver(contentObserver) }
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepository.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBoolean.kt
index 8e28bf8e632d..5d67f57136e3 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepository.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBoolean.kt
@@ -22,13 +22,15 @@ import android.provider.Settings
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
fun Context.settingsGlobalBoolean(name: String, defaultValue: Boolean = false):
ReadWriteProperty<Any?, Boolean> = SettingsGlobalBooleanDelegate(this, name, defaultValue)
fun Context.settingsGlobalBooleanFlow(name: String, defaultValue: Boolean = false): Flow<Boolean> {
val value by settingsGlobalBoolean(name, defaultValue)
- return settingsGlobalFlow(name) { value }
+ return settingsGlobalChangeFlow(name).map { value }.distinctUntilChanged()
}
private class SettingsGlobalBooleanDelegate(
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlow.kt
index 4098987256a2..675b2e5db430 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlow.kt
@@ -17,7 +17,9 @@
package com.android.settingslib.spaprivileged.settingsprovider
import android.content.Context
+import android.provider.Settings
+import com.android.settingslib.spaprivileged.database.contentChangeFlow
import kotlinx.coroutines.flow.Flow
fun Context.settingsGlobalChangeFlow(name: String, sendInitialValue: Boolean = true): Flow<Unit> =
- settingsGlobalFlow(name, sendInitialValue) { }
+ contentChangeFlow(Settings.Global.getUriFor(name), sendInitialValue)
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBoolean.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBoolean.kt
new file mode 100644
index 000000000000..25090a4140a4
--- /dev/null
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBoolean.kt
@@ -0,0 +1,51 @@
+/*
+ * 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 com.android.settingslib.spaprivileged.settingsprovider
+
+import android.content.ContentResolver
+import android.content.Context
+import android.provider.Settings
+import com.android.settingslib.spaprivileged.database.contentChangeFlow
+import kotlin.properties.ReadWriteProperty
+import kotlin.reflect.KProperty
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
+
+fun Context.settingsSecureBoolean(name: String, defaultValue: Boolean = false):
+ ReadWriteProperty<Any?, Boolean> = SettingsSecureBooleanDelegate(this, name, defaultValue)
+
+fun Context.settingsSecureBooleanFlow(name: String, defaultValue: Boolean = false): Flow<Boolean> {
+ val value by settingsSecureBoolean(name, defaultValue)
+ return contentChangeFlow(Settings.Secure.getUriFor(name)).map { value }.distinctUntilChanged()
+}
+
+private class SettingsSecureBooleanDelegate(
+ context: Context,
+ private val name: String,
+ private val defaultValue: Boolean = false,
+) : ReadWriteProperty<Any?, Boolean> {
+
+ private val contentResolver: ContentResolver = context.contentResolver
+
+ override fun getValue(thisRef: Any?, property: KProperty<*>): Boolean =
+ Settings.Secure.getInt(contentResolver, name, if (defaultValue) 1 else 0) != 0
+
+ override fun setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) {
+ Settings.Secure.putInt(contentResolver, name, if (value) 1 else 0)
+ }
+}
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepositoryTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanTest.kt
index 996c2d57c38a..70b38feae9d5 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepositoryTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanTest.kt
@@ -30,7 +30,7 @@ import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
-class SettingsGlobalBooleanRepositoryTest {
+class SettingsGlobalBooleanTest {
private val context: Context = ApplicationProvider.getApplicationContext()
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepositoryTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlowTest.kt
index 37e00e6f671b..2e6a39603deb 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepositoryTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlowTest.kt
@@ -29,7 +29,7 @@ import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
-class SettingsGlobalChangeRepositoryTest {
+class SettingsGlobalChangeFlowTest {
private val context: Context = ApplicationProvider.getApplicationContext()
@@ -52,7 +52,7 @@ class SettingsGlobalChangeRepositoryTest {
var value by context.settingsGlobalBoolean(TEST_NAME)
value = false
- val flow = context.settingsGlobalBooleanFlow(TEST_NAME)
+ val flow = context.settingsGlobalChangeFlow(TEST_NAME)
value = true
assertThat(flow.toListWithTimeout()).hasSize(1)
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBooleanTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBooleanTest.kt
new file mode 100644
index 000000000000..29a89be87acd
--- /dev/null
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBooleanTest.kt
@@ -0,0 +1,111 @@
+/*
+ * 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 com.android.settingslib.spaprivileged.settingsprovider
+
+import android.content.Context
+import android.provider.Settings
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
+import com.android.settingslib.spa.testutils.toListWithTimeout
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.async
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class SettingsSecureBooleanTest {
+
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ @Test
+ fun getValue_setTrue_returnTrue() {
+ Settings.Secure.putInt(context.contentResolver, TEST_NAME, 1)
+
+ val value by context.settingsSecureBoolean(TEST_NAME)
+
+ assertThat(value).isTrue()
+ }
+
+ @Test
+ fun getValue_setFalse_returnFalse() {
+ Settings.Secure.putInt(context.contentResolver, TEST_NAME, 0)
+
+ val value by context.settingsSecureBoolean(TEST_NAME)
+
+ assertThat(value).isFalse()
+ }
+
+ @Test
+ fun setValue_setTrue_returnTrue() {
+ var value by context.settingsSecureBoolean(TEST_NAME)
+
+ value = true
+
+ assertThat(Settings.Secure.getInt(context.contentResolver, TEST_NAME, 0)).isEqualTo(1)
+ }
+
+ @Test
+ fun setValue_setFalse_returnFalse() {
+ var value by context.settingsSecureBoolean(TEST_NAME)
+
+ value = false
+
+ assertThat(Settings.Secure.getInt(context.contentResolver, TEST_NAME, 1)).isEqualTo(0)
+ }
+
+ @Test
+ fun settingsSecureBooleanFlow_valueNotChanged() = runBlocking {
+ var value by context.settingsSecureBoolean(TEST_NAME)
+ value = false
+
+ val flow = context.settingsSecureBooleanFlow(TEST_NAME)
+
+ assertThat(flow.firstWithTimeoutOrNull()).isFalse()
+ }
+
+ @Test
+ fun settingsSecureBooleanFlow_collectAfterValueChanged_onlyKeepLatest() = runBlocking {
+ var value by context.settingsSecureBoolean(TEST_NAME)
+ value = false
+
+ val flow = context.settingsSecureBooleanFlow(TEST_NAME)
+ value = true
+
+ assertThat(flow.firstWithTimeoutOrNull()).isTrue()
+ }
+
+ @Test
+ fun settingsSecureBooleanFlow_collectBeforeValueChanged_getBoth() = runBlocking {
+ var value by context.settingsSecureBoolean(TEST_NAME)
+ value = false
+
+ val listDeferred = async {
+ context.settingsSecureBooleanFlow(TEST_NAME).toListWithTimeout()
+ }
+ delay(100)
+ value = true
+
+ assertThat(listDeferred.await()).containsExactly(false, true).inOrder()
+ }
+
+ private companion object {
+ const val TEST_NAME = "test_boolean_delegate"
+ }
+}
diff --git a/packages/SettingsLib/res/layout-v33/restricted_switch_preference.xml b/packages/SettingsLib/res/layout-v33/restricted_switch_preference.xml
index 31e9696813af..bee9e20ced0f 100644
--- a/packages/SettingsLib/res/layout-v33/restricted_switch_preference.xml
+++ b/packages/SettingsLib/res/layout-v33/restricted_switch_preference.xml
@@ -53,7 +53,7 @@
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:maxLines="2"
+ android:maxLines="10"
android:hyphenationFrequency="normalFast"
android:lineBreakWordStyle="phrase"
android:textAppearance="?android:attr/textAppearanceListItem"
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index d2825209ee5f..3a258380b3d0 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Gekoppel deur ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Gekoppel deur eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV-verstek"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-uitset"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interne luidsprekers"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kan nie koppel nie. Skakel toestel af en weer aan"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedrade oudiotoestel"</string>
<string name="help_label" msgid="3528360748637781274">"Hulp en terugvoer"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index f047648fd905..c2be887ea777 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI ኢኤአርሲ"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"በኤአርሲ በኩል ተገናኝቷል"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"በኢኤአርሲ በኩል ተገናኝቷል"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"የቲቪ ነባሪ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"የHDMI ውጽዓት"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ውስጣዊ ድምፅ ማውጫዎች"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"የቲቪ ነባሪ"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"የHDMI ውጤት"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"ውስጣዊ ድምፅ ማውጫዎች"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"መገናኘት ላይ ችግር። መሳሪያውን ያጥፉት እና እንደገና ያብሩት"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ባለገመድ የኦዲዮ መሣሪያ"</string>
<string name="help_label" msgid="3528360748637781274">"እገዛ እና ግብረመልስ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 7fa5c03e5eb4..6dd70fa0dbf4 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"‏متّصل من خلال ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"‏متّصل من خلال eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"الجهاز التلقائي لإخراج صوت التلفزيون"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"‏إخراج الصوت من خلال HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"مكبّرات الصوت الداخلية"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"حدثت مشكلة أثناء الاتصال. يُرجى إيقاف الجهاز ثم إعادة تشغيله."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"جهاز سماعي سلكي"</string>
<string name="help_label" msgid="3528360748637781274">"المساعدة والملاحظات"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index a2d6955b8950..c8eeee330fd9 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARCৰ জৰিয়তে সংযুক্ত"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARCৰ জৰিয়তে সংযুক্ত"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"টিভি ডিফ’ল্ট"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI আউটপুট"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"অভ্যন্তৰীণ স্পীকাৰ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"সংযোগ হোৱাত সমস্যা হৈছে। ডিভাইচটো অফ কৰি পুনৰ অন কৰক"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"তাঁৰযুক্ত অডিঅ’ ডিভাইচ"</string>
<string name="help_label" msgid="3528360748637781274">"সহায় আৰু মতামত"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 99af5570b09d..34f506e94ab3 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Chrome-da Tətbiqin İşləmə Müddəti vasitəsilə qoşulub"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC vasitəsilə qoşulub"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV Defoltu"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Çıxışı"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Daxili Dinamiklər"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Qoşulmaqla bağlı problem. Cihazı deaktiv edin, sonra yenidən aktiv edin"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio cihaz"</string>
<string name="help_label" msgid="3528360748637781274">"Yardım və rəy"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index cca83154a381..ee75df24eae3 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Povezano preko ARC-a"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Povezano preko eARC-a"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Podrazumevana vrednost za TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI izlaz"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Unutrašnji zvučnici"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem pri povezivanju. Isključite uređaj, pa ga ponovo uključite"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index de703e98bf34..c17d7236376d 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Падключана праз ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Падключана праз eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Стандартны (тэлевізар)"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Выхад HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Унутраныя дынамікі"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Праблема з падключэннем. Выключыце і зноў уключыце прыладу"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Правадная аўдыяпрылада"</string>
<string name="help_label" msgid="3528360748637781274">"Даведка і водгукі"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index fd173c1f379e..222e758601cf 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Свързано посредством ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Свързано посредством eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Стандартна настройка за телевизора"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI изход"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Вградени високоговорители"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"При свързването възникна проблем. Изключете устройството и го включете отново"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Аудиоустройство с кабел"</string>
<string name="help_label" msgid="3528360748637781274">"Помощ и отзиви"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 2290c09a5f79..a7c95dfa4e07 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC-এর মাধ্যমে কানেক্ট করা হয়েছে"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC-এর মাধ্যমে কানেক্ট করা হয়েছে"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"টিভির ডিফল্ট অডিও আউটপুট"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI আউটপুট"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ইন্টার্নাল স্পিকার"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"কানেক্ট করতে সমস্যা হচ্ছে। ডিভাইস বন্ধ করে আবার চালু করুন"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ওয়্যার অডিও ডিভাইস"</string>
<string name="help_label" msgid="3528360748637781274">"সহায়তা ও মতামত"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 70576195f4b6..31ea4d406e8f 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Povezano je putem ARC-a"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Povezano je putem eARC-a"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV je zadan"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI izlaz"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interni zvučnici"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Došlo je do problema prilikom povezivanja. Isključite, pa ponovo uključite uređaj"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 00c31dc31ba3..1bb02c279c73 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connectat mitjançant ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connectat mitjançant eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Valor predeterminat per al televisor"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Sortida HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Altaveus interns"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Hi ha hagut un problema amb la connexió. Apaga el dispositiu i torna\'l a encendre."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositiu d\'àudio amb cable"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda i suggeriments"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 47ed7e9334f9..53b7c707636f 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Připojeno přes ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Připojeno přes eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Výchozí nastavení televize"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Výstup HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interní reproduktory"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Výchozí nastavení televize"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Výstup HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Interní reproduktory"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problém s připojením. Vypněte zařízení a znovu jej zapněte"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kabelové audiozařízení"</string>
<string name="help_label" msgid="3528360748637781274">"Nápověda a zpětná vazba"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 6e127716c589..7ab666980285 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Forbundet via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Forbundet via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Fjernsyn som standard"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-udgang"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interne højttalere"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Der kunne ikke oprettes forbindelse. Sluk og tænd enheden"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhed med ledning"</string>
<string name="help_label" msgid="3528360748637781274">"Hjælp og feedback"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 4a7f786fc664..7936478306eb 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Per ARC verbunden"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Per eARC verbunden"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Standardeinstellung: Fernseher"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-Ausgang"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interne Lautsprecher"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Standardeinstellung: Fernseher"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"HDMI-Ausgang"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Interne Lautsprecher"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Verbindung kann nicht hergestellt werden. Schalte das Gerät aus &amp; und wieder ein."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Netzbetriebenes Audiogerät"</string>
<string name="help_label" msgid="3528360748637781274">"Hilfe und Feedback"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 532e380da272..65f1f775efcf 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Συνδέθηκε μέσω ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Συνδέθηκε μέσω eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Προεπιλογή τηλεόρασης"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Έξοδος HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Εσωτερικά ηχεία"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Προεπιλογή τηλεόρασης"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Έξοδος HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Εσωτερικά ηχεία"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Πρόβλημα κατά τη σύνδεση. Απενεργοποιήστε τη συσκευή και ενεργοποιήστε την ξανά"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ενσύρματη συσκευή ήχου"</string>
<string name="help_label" msgid="3528360748637781274">"Βοήθεια και σχόλια"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 27f2fc524d08..29038bcde637 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connected via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connected via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV default"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Output"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Internal speakers"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index b59f76593aaa..1c51ea553414 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connected via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connected via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV Default"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Output"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Internal Speakers"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"TV default"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"HDMI output"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Internal speakers"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off &amp; back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 27f2fc524d08..29038bcde637 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connected via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connected via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV default"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Output"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Internal speakers"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 27f2fc524d08..29038bcde637 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connected via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connected via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV default"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Output"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Internal speakers"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 15946f4a809a..2ff386c91851 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‎HDMI eARC‎‏‎‎‏‎"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‎‎‎‏‏‎‏‎‎Connected via ARC‎‏‎‎‏‎"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‏‎‏‎Connected via eARC‎‏‎‎‏‎"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‏‏‏‎‏‎‏‏‏‎‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‏‎‏‎‎‎‎TV Default‎‏‎‎‏‎"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‎‏‏‏‏‎‎‎‎‎‏‎‏‏‎‏‎‎HDMI Output‎‏‎‎‏‎"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‎‏‎Internal Speakers‎‏‎‎‏‎"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎TV default‎‏‎‎‏‎"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‎‏‎HDMI output‎‏‎‎‏‎"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‎Internal speakers‎‏‎‎‏‎"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‎‏‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‎‎‎‏‏‏‎‎‎‏‎Problem connecting. Turn device off &amp; back on‎‏‎‎‏‎"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎Wired audio device‎‏‎‎‏‎"</string>
<string name="help_label" msgid="3528360748637781274">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‎Help &amp; feedback‎‏‎‎‏‎"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index a76cf867760e..780a45de74d1 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Se estableció conexión con un cable ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Se estableció conexión con un cable eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Configuración predeterminada de la TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Salida de HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Bocinas internas"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Configuración predeterminada de la TV"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Salida de HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Bocinas internas"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Error al establecer la conexión. Apaga el dispositivo y vuelve a encenderlo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
<string name="help_label" msgid="3528360748637781274">"Ayuda y comentarios"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 90476b6ff396..82cd2bffbae9 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Conectado mediante ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Conectado mediante eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Predeterminado de la televisión"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Salida HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Altavoces internos"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"No se ha podido conectar; reinicia el dispositivo"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
<string name="help_label" msgid="3528360748637781274">"Ayuda y comentarios"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index e5c8242d5cad..35ae73ee7460 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Ühendatud ARC-i kaudu"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Ühendatud eARC-i kaudu"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Teleri vaikeseade"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-väljund"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Sisemised kõlarid"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem ühendamisel. Lülitage seade välja ja uuesti sisse"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Juhtmega heliseade"</string>
<string name="help_label" msgid="3528360748637781274">"Abi ja tagasiside"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 65a88d3b741e..7ebad6842eb1 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC bidez konektatuta"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC bidez konektatuta"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Telebistaren audio-irteera lehenetsia"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI irteera"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Barneko bozgorailuak"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Arazo bat izan da konektatzean. Itzali gailua eta pitz ezazu berriro."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio-gailu kableduna"</string>
<string name="help_label" msgid="3528360748637781274">"Laguntza eta iritziak"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index b01bcbcfe852..51fd6266d8d1 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"‏متصل ازطریق ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"‏متصل ازطریق eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"پیش‌فرض تلویزیون"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"‏خروجی HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"بلندگوهای داخلی"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"مشکل در اتصال. دستگاه را خاموش و دوباره روشن کنید"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"دستگاه صوتی سیمی"</string>
<string name="help_label" msgid="3528360748637781274">"راهنما و بازخورد"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 58e87a6820b0..f8c9054ac266 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Yhdistetty ARC:n kautta"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Yhdistetty eARC:n kautta"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV:n oletusasetus"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-toisto"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Sisäiset kaiuttimet"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Yhteysvirhe. Sammuta laite ja käynnistä se uudelleen."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Langallinen äänilaite"</string>
<string name="help_label" msgid="3528360748637781274">"Ohje ja palaute"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index c889d3da305d..2a7266d911d5 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connecté par ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connecté par eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Sortie audio par défaut de la télévision"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Sortie HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Haut-parleurs internes"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteingez et rallumez l\'appareil"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio à câble"</string>
<string name="help_label" msgid="3528360748637781274">"Aide et commentaires"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 8a9bedfca062..e30a4ab3cf32 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connecté via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connecté via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Sortie audio par défaut de la TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Sortie HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Haut-parleurs internes"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Sortie par défaut de la TV"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Sortie HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Haut-parleurs internes"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteignez l\'appareil, puis rallumez-le"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio filaire"</string>
<string name="help_label" msgid="3528360748637781274">"Aide et commentaires"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 3258db097468..7b793863f804 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Conectado mediante ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Conectado mediante eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Saída predeterminada da televisión"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Saída HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Altofalantes internos"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Produciuse un problema coa conexión. Apaga e acende o dispositivo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
<string name="help_label" msgid="3528360748637781274">"Axuda e comentarios"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 0dd9bfef3f95..ec534daec56e 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC મારફતે કનેક્ટેડ"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC મારફતે કનેક્ટેડ"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ટીવીમાંથી ડિફૉલ્ટ ઑડિયો આઉટપુટ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI આઉટપુટ"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"આંતરિક સ્પીકર"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"કનેક્ટ કરવામાં સમસ્યા આવી રહી છે. ડિવાઇસને બંધ કરીને ફરી ચાલુ કરો"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"વાયરવાળો ઑડિયો ડિવાઇસ"</string>
<string name="help_label" msgid="3528360748637781274">"સહાય અને પ્રતિસાદ"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index ea5c5ba9b0ab..092c729e7504 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"एचडीएमआई eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC से कनेक्ट किए गए डिवाइस"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC से कनेक्ट किए गए डिवाइस"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"टीवी का डिफ़ॉल्ट ऑडियो आउटपुट"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"एचडीएमआई आउटपुट"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"इंटरनल स्पीकर"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करने में समस्या हो रही है. डिवाइस को बंद करके चालू करें"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर वाला ऑडियो डिवाइस"</string>
<string name="help_label" msgid="3528360748637781274">"सहायता और सुझाव"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 346b602176b5..eaebfc90af37 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Povezano putem ARC-a"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Povezano putem eARC-a"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Zadano za TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI izlaz"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Unutarnji zvučnici"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem s povezivanjem. Isključite i ponovo uključite uređaj"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audiouređaj"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 186b42b3fe9f..d287ce35b58a 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Csatlakoztatva ARC-n keresztül"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Csatlakoztatva eARC-n keresztül"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Alapértelmezett tévé"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-kimenet"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Belső hangszóró"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sikertelen csatlakozás. Kapcsolja ki az eszközt, majd kapcsolja be újra."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vezetékes audioeszköz"</string>
<string name="help_label" msgid="3528360748637781274">"Súgó és visszajelzés"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index ff42a37f0be6..4d2709961857 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Միացված է ARC-ի միջոցով"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Միացված է eARC-ի միջոցով"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Հեռուստացույցի կանխադրված կարգավորումներ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ելք"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Ներքին բարձրախոսներ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Կապի խնդիր կա: Սարքն անջատեք և նորից միացրեք:"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Լարով աուդիո սարք"</string>
<string name="help_label" msgid="3528360748637781274">"Օգնություն և հետադարձ կապ"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 7159d870d37b..ce770af09438 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Terhubung melalui ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Terhubung melalui eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV sebagai Default"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Output HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Speaker Internal"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ada masalah saat menghubungkan. Nonaktifkan perangkat &amp; aktifkan kembali"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Perangkat audio berkabel"</string>
<string name="help_label" msgid="3528360748637781274">"Bantuan &amp; masukan"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 53f904523042..09587eee5b04 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Tengt með ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Tengt með eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Sjálfgefið í sjónvarpi"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-úttak"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Innri hátalarar"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Sjálfgefið í sjónvarpi"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"HDMI-úttak"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Innri hátalarar"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Vandamál í tengingu. Slökktu og kveiktu á tækinu"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Snúrutengt hljómtæki"</string>
<string name="help_label" msgid="3528360748637781274">"Hjálp og ábendingar"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index f83594df1948..fd68d1405a28 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"eARC HDMI"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connessione tramite ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connessione tramite eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Valore predefinito: TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Uscita HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Speaker interni"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema di connessione. Spegni e riaccendi il dispositivo"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo audio cablato"</string>
<string name="help_label" msgid="3528360748637781274">"Guida e feedback"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 755e8ce64397..fbd715a40384 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"‏חיבור דרך ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"‏חיבור דרך eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ברירת המחדל של הטלוויזיה"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"‏פלט HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"רמקולים פנימיים"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"ברירת המחדל של הטלוויזיה"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"‏פלט HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"רמקולים פנימיים"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"יש בעיה בחיבור. עליך לכבות את המכשיר ולהפעיל אותו מחדש"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"התקן אודיו חוטי"</string>
<string name="help_label" msgid="3528360748637781274">"עזרה ומשוב"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index d9f76fd46925..58d4f0ec8388 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC 経由で接続済み"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC 経由で接続済み"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"テレビのデフォルト"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI 出力"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"内蔵スピーカー"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"接続エラーです。デバイスを OFF にしてから ON に戻してください"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線オーディオ デバイス"</string>
<string name="help_label" msgid="3528360748637781274">"ヘルプとフィードバック"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index fb58973a172e..eb89b19a4ea5 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"დაკავშირებულია ARC-ის მეშვეობით"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"დაკავშირებულია eARC-ის მეშვეობით"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ნაგულისხმევი ტელევიზორი"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"გამომავალი HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"შიდა დინამიკები"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"ტელევიზორის ნაგულისხმევი"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"გამომავალი HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"შიდა დინამიკები"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"დაკავშირებისას წარმოიქმნა პრობლემა. გამორთეთ და კვლავ ჩართეთ მოწყობილობა"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"სადენიანი აუდიო მოწყობილობა"</string>
<string name="help_label" msgid="3528360748637781274">"დახმარება და გამოხმაურება"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index c99113355363..0d31dde9d87b 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC арқылы жалғанған."</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC арқылы жалғанған."</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Әдепкі теледидар"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI шығыс құрылғысы"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Ішкі динамиктер"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Байланыс орнату қатесі шығуып жатыр. Құрылғыны өшіріп, қайта қосыңыз."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Сымды аудио құрылғысы"</string>
<string name="help_label" msgid="3528360748637781274">"Анықтама және пікір"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 7ad4e53b6eaf..8ee7987cc78b 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"បានភ្ជាប់តាមរយៈ ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"បានភ្ជាប់តាមរយៈ eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"លំនាំដើម​ទូរទស្សន៍"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"ធាតុចេញ HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ឧបករណ៍បំពងសំឡេងខាងក្នុង"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"មាន​បញ្ហា​ក្នុងការ​ភ្ជាប់។ បិទ រួច​បើក​ឧបករណ៍​វិញ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ឧបករណ៍​សំឡេងប្រើខ្សែ"</string>
<string name="help_label" msgid="3528360748637781274">"ជំនួយ និងមតិកែលម្អ"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 8f5c04290c4c..73f7a20cc706 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC ಮೂಲಕ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC ಮೂಲಕ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ಟಿವಿ ಡೀಫಾಲ್ಟ್"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ಔಟ್‌‌ಪುಟ್"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ಆಂತರಿಕ ಸ್ಪೀಕರ್‌ಗಳು"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ಕನೆಕ್ಟ್ ಮಾಡುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ ಸಾಧನವನ್ನು ಆಫ್ ಮಾಡಿ ಹಾಗೂ ನಂತರ ಪುನಃ ಆನ್ ಮಾಡಿ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ವೈರ್ ಹೊಂದಿರುವ ಆಡಿಯೋ ಸಾಧನ"</string>
<string name="help_label" msgid="3528360748637781274">"ಸಹಾಯ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index b2564a0150d2..418e47e41ce5 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC를 통해 연결됨"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC를 통해 연결됨"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV 기본값"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI 출력"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"내부 스피커"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"연결 중에 문제가 발생했습니다. 기기를 껐다가 다시 켜 보세요."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"유선 오디오 기기"</string>
<string name="help_label" msgid="3528360748637781274">"고객센터"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 18f792c56cd7..182e912fe74c 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC аркылуу туташты"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC аркылуу туташты"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV\'нин демейки параметрлери"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Аудио түзмөгү"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Ички динамиктер"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Туташууда маселе келип чыкты. Түзмөктү өчүрүп, кайра күйгүзүп көрүңүз"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Зымдуу аудио түзмөк"</string>
<string name="help_label" msgid="3528360748637781274">"Жардам/Пикир билдирүү"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index c75326e90043..5f8ba5fe135d 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ເຊື່ອມຕໍ່ຜ່ານ ARC ແລ້ວ"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"ເຊື່ອມຕໍ່ຜ່ານ eARC ແລ້ວ"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ຄ່າເລີ່ມຕົ້ນສຳລັບໂທລະທັດ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"ເອົ້າພຸດ HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ລຳໂພງຂອງເຄື່ອງ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ເກີດບັນຫາໃນການເຊື່ອມຕໍ່. ປິດອຸປະກອນແລ້ວເປີດກັບຄືນມາໃໝ່"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ອຸປະກອນສຽງແບບມີສາຍ"</string>
<string name="help_label" msgid="3528360748637781274">"ຊ່ວຍເຫຼືອ ແລະ ຕິຊົມ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 37a35769f361..5294f4abdb35 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI „eARC“"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Prisijungta per ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Prisijungta per „eARC“"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV numatytasis"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI išvesti"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Vidiniai garsiakalbiai"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Prisijungiant kilo problema. Išjunkite įrenginį ir vėl jį įjunkite"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Laidinis garso įrenginys"</string>
<string name="help_label" msgid="3528360748637781274">"Pagalba ir atsiliepimai"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 6cd9c577a2ee..7ea01e73b884 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -266,9 +266,9 @@
<string name="keep_screen_on_summary" msgid="1510731514101925829">"Uzlādes laikā ekrāns nekad nepārslēgsies miega režīmā"</string>
<string name="bt_hci_snoop_log" msgid="7291287955649081448">"Iespējot Bluetooth HCI analizētāja žurnālu"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Tvert Bluetooth paketes. (Pārslēgt Bluetooth pēc šī iestatījuma mainīšanas.)"</string>
- <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM atbloķēšana"</string>
+ <string name="oem_unlock_enable" msgid="5334869171871566731">"OAR atbloķēšana"</string>
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Atļaut palaišanas ielādētāja atbloķēšanu"</string>
- <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Vai atļaut OEM atbloķēšanu?"</string>
+ <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Vai atļaut OAR atbloķēšanu?"</string>
<string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"BRĪDINĀJUMS. Kamēr šis iestatījums būs ieslēgts, ierīces aizsardzības funkcijas nedarbosies."</string>
<string name="mock_location_app" msgid="6269380172542248304">"Atlasīt imitētas atrašanās vietas lietotni"</string>
<string name="mock_location_app_not_set" msgid="6972032787262831155">"Nav iestatīta imitētas atrašanās vietas lietotne"</string>
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Savienojums izveidots, izmantojot ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Savienojums izveidots, izmantojot eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Noklusējuma iestatījums televizorā"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI izvade"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Iekšējie skaļruņi"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Radās problēma ar savienojuma izveidi. Izslēdziet un atkal ieslēdziet ierīci."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vadu audioierīce"</string>
<string name="help_label" msgid="3528360748637781274">"Palīdzība un atsauksmes"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 75dbbf1aeb72..d38f42c9fb3b 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Поврзано преку ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Поврзано преку eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Стандардни поставки за телевизор"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Излез за HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Внатрешни звучници"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем со поврзување. Исклучете го уредот и повторно вклучете го"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичен аудиоуред"</string>
<string name="help_label" msgid="3528360748637781274">"Помош и повратни информации"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 2cb4da1330b0..8b6150d50c5c 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC വഴി കണക്റ്റ് ചെയ്തിരിക്കുന്നു"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC വഴി കണക്റ്റ് ചെയ്തിരിക്കുന്നു"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ടിവി ഡിഫോൾട്ട്"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ഔട്ട്പുട്ട്"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ആന്തരിക സ്‌പീക്കറുകൾ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"കണക്‌റ്റ് ചെയ്യുന്നതിൽ പ്രശ്‌നമുണ്ടായി. ഉപകരണം ഓഫാക്കി വീണ്ടും ഓണാക്കുക"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"വയർ മുഖേന ബന്ധിപ്പിച്ച ഓഡിയോ ഉപകരണം"</string>
<string name="help_label" msgid="3528360748637781274">"സഹായവും ഫീഡ്‌ബാക്കും"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 0a99650ce990..e7c83a87ea45 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC-р холбогдсон"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC-р холбогдсон"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ТВ-ийн өгөгдмөл"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI гаралт"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Дотоод чанга яригч"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Холбогдоход асуудал гарлаа. Төхөөрөмжийг унтраагаад дахин асаана уу"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Утастай аудио төхөөрөмж"</string>
<string name="help_label" msgid="3528360748637781274">"Тусламж, санал хүсэлт"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index dca07e2f4577..381d0b861324 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC द्वारे कनेक्ट केलेली"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC द्वारे कनेक्ट केलेली"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"टीव्ही डीफॉल्ट"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI आउटपुट"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"अंतर्गत स्पीकर"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्‍ट करण्‍यात समस्‍या आली. डिव्हाइस बंद करा आणि नंतर सुरू करा"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर असलेले ऑडिओ डिव्हाइस"</string>
<string name="help_label" msgid="3528360748637781274">"मदत आणि फीडबॅक"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index ad29abc1b5e0..3e7d901addd6 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Disambungkan melalui ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Disambungkan melalui eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Tetapan Lalai TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Output HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Pembesar Suara Dalaman"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Masalah penyambungan. Matikan &amp; hidupkan kembali peranti"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Peranti audio berwayar"</string>
<string name="help_label" msgid="3528360748637781274">"Bantuan &amp; maklum balas"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index d538dc82b7d1..68ae54962991 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV မူရင်း"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI အထွက်"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"စက်ရှိ စပီကာများ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ချိတ်ဆက်ရာတွင် ပြဿနာရှိပါသည်။ စက်ကိုပိတ်ပြီး ပြန်ဖွင့်ပါ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ကြိုးတပ် အသံစက်ပစ္စည်း"</string>
<string name="help_label" msgid="3528360748637781274">"အကူအညီနှင့် အကြံပြုချက်"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index ae46b6860eaf..a11bfff7a31f 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Tilkoblet via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Tilkoblet via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV-ens standardinnstilling"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-utdata"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interne høyttalere"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Tilkoblingsproblemer. Slå enheten av og på igjen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhet med kabel"</string>
<string name="help_label" msgid="3528360748637781274">"Hjelp og tilbakemelding"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index f73cd0b92107..b833c140e996 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC मार्फत कनेक्ट गरिएका"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC मार्फत कनेक्ट गरिएका"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"टिभीको डिफल्ट अडियो आउटपुट"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI आउटपुट"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"आन्तरिक स्पिकरहरू"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"जोड्ने क्रममा समस्या भयो। यन्त्रलाई निष्क्रिय पारेर फेरि अन गर्नुहोस्"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"तारयुक्त अडियो यन्त्र"</string>
<string name="help_label" msgid="3528360748637781274">"मद्दत र प्रतिक्रिया"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 2a47d7efd7e0..f9215e547cfe 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Verbonden via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Verbonden via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Tv-standaard"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-uitvoer"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interne speakers"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem bij verbinding maken. Zet het apparaat uit en weer aan."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedraad audioapparaat"</string>
<string name="help_label" msgid="3528360748637781274">"Hulp en feedback"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 185870a9e467..c4ed00585cb9 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC ମାଧ୍ୟମରେ କନେକ୍ଟ କରାଯାଇଛି"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC ମାଧ୍ୟମରେ କନେକ୍ଟ କରାଯାଇଛି"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ଟିଭିର ଡିଫଲ୍ଟ ଅଡିଓ ଆଉଟପୁଟ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ଆଉଟପୁଟ"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ଇଣ୍ଟର୍ନଲ ସ୍ପିକର"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ସଂଯୋଗ କରିବାରେ ସମସ୍ୟା ହେଉଛି। ଡିଭାଇସ୍ ବନ୍ଦ କରି ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ତାରଯୁକ୍ତ ଅଡିଓ ଡିଭାଇସ୍"</string>
<string name="help_label" msgid="3528360748637781274">"ସାହାଯ୍ୟ ଓ ମତାମତ"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 4a72574540f0..b7a67fd4a5ac 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤੇ ਗਏ ਡੀਵਾਈਸ"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤੇ ਗਏ ਡੀਵਾਈਸ"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ਟੀਵੀ ਦਾ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਆਊਟਪੁੱਟ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ਆਊਟਪੁੱਟ"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ਅੰਦਰੂਨੀ ਸਪੀਕਰ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ। ਡੀਵਾਈਸ ਨੂੰ ਬੰਦ ਕਰਕੇ ਵਾਪਸ ਚਾਲੂ ਕਰੋ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ਤਾਰ ਵਾਲਾ ਆਡੀਓ ਡੀਵਾਈਸ"</string>
<string name="help_label" msgid="3528360748637781274">"ਮਦਦ ਅਤੇ ਵਿਚਾਰ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 61ae709fbf01..3ef8fd7e01f3 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Połączono przez ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Połączono przez eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Wyjście domyślne telewizora"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Wyjście HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Głośniki wewnętrzne"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem z połączeniem. Wyłącz i ponownie włącz urządzenie"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Przewodowe urządzenie audio"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoc i opinie"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 20c0460d723d..b76b37bb8e05 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Conectado via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Conectado via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Padrão da TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Saída HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Alto-falantes internos"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda e feedback"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 8c8482f9a0ad..1a81f2dd8576 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Ligado através de ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Ligado através de eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Predefinição da TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Saída HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Altifalantes internos"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Predefinição da TV"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Saída HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Altifalantes internos"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema ao ligar. Desligue e volte a ligar o dispositivo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fios"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda e comentários"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 20c0460d723d..b76b37bb8e05 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Conectado via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Conectado via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Padrão da TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Saída HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Alto-falantes internos"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda e feedback"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 4b4c0752b7cd..5956d635c68d 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Conectat prin ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Conectat prin eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Prestabilită pentru televizor"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Ieșire HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Difuzoare interne"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Prestabilit pentru televizor"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Ieșire HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Difuzoare interne"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problemă la conectare. Oprește și repornește dispozitivul."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispozitiv audio cu fir"</string>
<string name="help_label" msgid="3528360748637781274">"Ajutor și feedback"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 53f27299f2f4..862e3d4c2df4 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Подключено через ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Подключено через eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Стандартный выход на телевизоре"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Выход HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Внутренние динамики"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ошибка подключения. Выключите и снова включите устройство."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Проводное аудиоустройство"</string>
<string name="help_label" msgid="3528360748637781274">"Справка/отзыв"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index d7dd1d09fddd..795abec84d40 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC හරහා සම්බන්ධ කර ඇත"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC හරහා සම්බන්ධ කර ඇත"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"රූපවාහිනී පෙරනිමිය"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ප්‍රතිදානය"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"අභ්‍යන්තර ස්පීකර්"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"සම්බන්ධ කිරීමේ ගැටලුවකි උපාංගය ක්‍රියාවිරහිත කර &amp; ආපසු ක්‍රියාත්මක කරන්න"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"රැහැන්ගත කළ ඕඩියෝ උපාංගය"</string>
<string name="help_label" msgid="3528360748637781274">"උදවු &amp; ප්‍රතිපෝෂණ"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 4b83ba0678da..00c0bc1c5c00 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Pripojené prostredníctvom rozhrania ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Pripojené prostredníctvom rozhrania eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Predvolené nastavenie televízora"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Výstup HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Vnútorné reproduktory"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Pri pripájaní sa vyskytol problém. Zariadenie vypnite a znova zapnite."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio zariadenie s káblom"</string>
<string name="help_label" msgid="3528360748637781274">"Pomocník a spätná väzba"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index c70716d294f2..ddf0f710f0b2 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Povezano prek zvočnega kanala ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Povezano prek zvočnega kanala eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Privzeti izhod televizorja"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Izhod HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Notranji zvočniki"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Privzeti izhod televizorja"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Izhod HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Notranji zvočniki"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Težava pri povezovanju. Napravo izklopite in znova vklopite."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žična zvočna naprava"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoč in povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index a02ca5a6f549..f20401744b8e 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Lidhur përmes ARC-së"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Lidhur përmes eARC-së"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Parazgjedhja e televizorit"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Dalja HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Altoparlantët e brendshëm"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem me lidhjen. Fike dhe ndize përsëri pajisjen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Pajisja audio me tel"</string>
<string name="help_label" msgid="3528360748637781274">"Ndihma dhe komentet"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index bc0114f9756c..b83986a8ac42 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Повезано преко ARC-а"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Повезано преко eARC-а"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Подразумевана вредност за ТВ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI излаз"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Унутрашњи звучници"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем при повезивању. Искључите уређај, па га поново укључите"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичани аудио уређај"</string>
<string name="help_label" msgid="3528360748637781274">"Помоћ и повратне информације"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 51e00b701ea5..58e3705e0ec3 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Ansluten via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Ansluten via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Standardinställning för tv:n"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-utgång"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interna högtalare"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Det gick inte att ansluta. Stäng av enheten och slå på den igen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ljudenhet med kabelanslutning"</string>
<string name="help_label" msgid="3528360748637781274">"Hjälp och feedback"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 6bacc324c9c0..5870cde59025 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Imeunganishwa kupitia ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Imeunganishwa kupitia eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Mipangilio Chaguomsingi ya Televisheni"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Kutoa Sauti Kupitia HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Spika za Ndani"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Mipangilio Chaguomsingi ya TV"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Kutoa sauti kupitia HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Spika za ndani"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kuna tatizo la kuunganisha kwenye Intaneti. Zima kisha uwashe kifaa"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kifaa cha sauti kinachotumia waya"</string>
<string name="help_label" msgid="3528360748637781274">"Usaidizi na maoni"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 07bdaf2ff9e5..2a2536b2cbfa 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC மூலம் இணைக்கப்பட்டுள்ளவை"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC மூலம் இணைக்கப்பட்டுள்ளவை"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"டிவி இயல்புநிலை"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI அவுட்புட்"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"உட்புற ஸ்பீக்கர்கள்"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"இணைப்பதில் சிக்கல். சாதனத்தை ஆஃப் செய்து மீண்டும் ஆன் செய்யவும்"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"வயருடன்கூடிய ஆடியோ சாதனம்"</string>
<string name="help_label" msgid="3528360748637781274">"உதவியும் கருத்தும்"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 81739b396a3e..303d31044b6b 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC ద్వారా కనెక్ట్ చేయబడింది"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC ద్వారా కనెక్ట్ చేయబడింది"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"టీవీ ఆటోమేటిక్ సెట్టింగ్"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI అవుట్‌పుట్"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"అంతర్గత స్పీకర్‌లు"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"కనెక్ట్ చేయడంలో సమస్య ఉంది. పరికరాన్ని ఆఫ్ చేసి, ఆపై తిరిగి ఆన్ చేయండి"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"వైర్ గల ఆడియో పరికరం"</string>
<string name="help_label" msgid="3528360748637781274">"సహాయం &amp; ఫీడ్‌బ్యాక్"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 001af0163801..0ac8cb858a2c 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"เชื่อมต่อผ่าน ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"เชื่อมต่อผ่าน eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ค่าเริ่มต้นของทีวี"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"เอาต์พุต HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ลำโพงของเครื่อง"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"เกิดปัญหาในการเชื่อมต่อ ปิดอุปกรณ์แล้วเปิดใหม่อีกครั้ง"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"อุปกรณ์เสียงแบบมีสาย"</string>
<string name="help_label" msgid="3528360748637781274">"ความช่วยเหลือและความคิดเห็น"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 9ccc801e5b4b..4f92e1d1bab1 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Nakakonekta sa pamamagitan ng ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Nakakonekta sa pamamagitan ng eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Naka-default sa TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Output"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Mga Internal na Speaker"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Nagkaproblema sa pagkonekta. I-off at pagkatapos ay i-on ang device"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired na audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Tulong at feedback"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index a49f3ab13e99..795bb303e292 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC ile bağlandı"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC ile bağlandı"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV Varsayılanı"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Çıkışı"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Dahili Hoparlörler"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Bağlanırken sorun oluştu. Cihazı kapatıp tekrar açın"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kablolu ses cihazı"</string>
<string name="help_label" msgid="3528360748637781274">"Yardım ve geri bildirim"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index eba792681068..beb2c917e923 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Підключено через ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Підключено через eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Стандартні налаштування телевізора"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Вихід HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Внутрішні динаміки"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Не вдається підключитися. Перезавантажте пристрій."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Дротовий аудіопристрій"</string>
<string name="help_label" msgid="3528360748637781274">"Довідка й відгуки"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index ce5ed31abaef..13718d94eee0 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"‏ARC کے ذریعے منسلک ہے"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"‏eARC کے ذریعے منسلک ہے"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"‏TV ڈیفالٹ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"‏HDMI آؤٹ پٹ"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"اندرونی اسپیکرز"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"منسلک کرنے میں مسئلہ پیش آ گیا۔ آلہ کو آف اور بیک آن کریں"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"وائرڈ آڈیو آلہ"</string>
<string name="help_label" msgid="3528360748637781274">"مدد اور تاثرات"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 5d23a9355a08..7559a3dbd89f 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC orqali ulangan"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC orqali ulangan"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Televizorda birlamchi"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI chiqishi"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Ichki karnaylar"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ulanishda muammo yuz berdi. Qurilmani oʻchiring va yoqing"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio qurilma"</string>
<string name="help_label" msgid="3528360748637781274">"Yordam/fikr-mulohaza"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index e96c49fbbad6..ccdc0bc96cc4 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Đã kết nối qua ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Đã kết nối qua eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Chế độ mặc định của TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Đầu ra HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Loa trong"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sự cố kết nối. Hãy tắt thiết bị rồi bật lại"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Thiết bị âm thanh có dây"</string>
<string name="help_label" msgid="3528360748637781274">"Trợ giúp và phản hồi"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 2174e12a78df..6b3e06104efa 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"已通过 ARC 连接"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"已通过 eARC 连接"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"电视默认设置"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI 输出"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"内置扬声器"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"连接时遇到问题。请关闭并重新开启设备"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有线音频设备"</string>
<string name="help_label" msgid="3528360748637781274">"帮助和反馈"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index dc490eea4d49..35171090b977 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"已透過 ARC 連接"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"已透過 eARC 連接"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"電視預設的音訊輸出裝置"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI 輸出"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"內置喇叭"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連接,請關閉裝置然後重新開機"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音響裝置"</string>
<string name="help_label" msgid="3528360748637781274">"說明與意見反映"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 504901106be5..eeed9f3ea5d4 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"透過 ARC 連線"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"透過 eARC 連線"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"電視預設的音訊輸出裝置"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI 輸出裝置"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"內建喇叭"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連線,請關閉裝置後再重新開啟"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音訊裝置"</string>
<string name="help_label" msgid="3528360748637781274">"說明與意見回饋"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 7c82c19b1bfc..e94b9299e187 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"I-HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Ixhunywe nge-ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Ixhunywe nge-eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"I-TV Ezenzakalelayo"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Okukhishwayo kwe-HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Izipikha Zangaphakathi"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Inkinga yokuxhumeka. Vala idivayisi futhi uphinde uyivule"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Idivayisi yomsindo enentambo"</string>
<string name="help_label" msgid="3528360748637781274">"Usizo nempendulo"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/PrimarySwitchPreference.java b/packages/SettingsLib/src/com/android/settingslib/PrimarySwitchPreference.java
index 0a2d9fc3372e..e41126f03c60 100644
--- a/packages/SettingsLib/src/com/android/settingslib/PrimarySwitchPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/PrimarySwitchPreference.java
@@ -140,12 +140,6 @@ public class PrimarySwitchPreference extends RestrictedPreference {
}
}
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
- setSwitchEnabled(enabled);
- }
-
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
public boolean isSwitchEnabled() {
return mEnableSwitch;
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java
index 8b0f19d455d2..29ea25e13835 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java
@@ -22,7 +22,6 @@ import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.UserHandle;
import android.text.TextUtils;
@@ -237,15 +236,13 @@ public class RestrictedPreferenceHelper {
}
private void updateDisabledState() {
- boolean isEnabled = !(mDisabledByAdmin || mDisabledByAppOps);
if (!(mPreference instanceof RestrictedTopLevelPreference)) {
- mPreference.setEnabled(isEnabled);
+ mPreference.setEnabled(!(mDisabledByAdmin || mDisabledByAppOps));
}
- Drawable icon = mPreference.getIcon();
- if (!isEnabled && icon != null) {
- Utils.convertToGrayscale(icon);
- mPreference.setIcon(icon);
+ if (mPreference instanceof PrimarySwitchPreference) {
+ ((PrimarySwitchPreference) mPreference)
+ .setSwitchEnabled(!(mDisabledByAdmin || mDisabledByAppOps));
}
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java
index f03263b71138..107d5f8a8ae9 100644
--- a/packages/SettingsLib/src/com/android/settingslib/Utils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java
@@ -728,14 +728,4 @@ public class Utils {
return false;
}
- /**
- * Convert a drawable to grayscale drawable
- */
- public static void convertToGrayscale(@NonNull Drawable drawable) {
- ColorMatrix matrix = new ColorMatrix();
- matrix.setSaturation(0.0f);
-
- ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
- drawable.setColorFilter(filter);
- }
}
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index 8412cbaaea36..5c09b1692453 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -251,6 +251,8 @@ public class SecureSettings {
Settings.Secure.STYLUS_HANDWRITING_ENABLED,
Settings.Secure.DEFAULT_NOTE_TASK_PROFILE,
Settings.Secure.CREDENTIAL_SERVICE,
- Settings.Secure.CREDENTIAL_SERVICE_PRIMARY
+ Settings.Secure.CREDENTIAL_SERVICE_PRIMARY,
+ Settings.Secure.EVEN_DIMMER_ACTIVATED,
+ Settings.Secure.EVEN_DIMMER_MIN_NITS
};
}
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index 9197554662d3..b0169a115ec5 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -110,6 +110,9 @@ public class SecureSettingsValidators {
VALIDATORS.put(Secure.FONT_WEIGHT_ADJUSTMENT, ANY_INTEGER_VALIDATOR);
VALIDATORS.put(Secure.REDUCE_BRIGHT_COLORS_LEVEL, PERCENTAGE_INTEGER_VALIDATOR);
VALIDATORS.put(Secure.REDUCE_BRIGHT_COLORS_PERSIST_ACROSS_REBOOTS, BOOLEAN_VALIDATOR);
+ VALIDATORS.put(Secure.EVEN_DIMMER_ACTIVATED, BOOLEAN_VALIDATOR);
+ VALIDATORS.put(Secure.EVEN_DIMMER_MIN_NITS,
+ new InclusiveFloatRangeValidator(0.0f, Float.MAX_VALUE));
VALIDATORS.put(Secure.TTS_DEFAULT_RATE, NON_NEGATIVE_INTEGER_VALIDATOR);
VALIDATORS.put(Secure.TTS_DEFAULT_PITCH, NON_NEGATIVE_INTEGER_VALIDATOR);
VALIDATORS.put(Secure.TTS_DEFAULT_SYNTH, PACKAGE_NAME_VALIDATOR);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index ed5654d4f259..ec50323dd91d 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2432,9 +2432,7 @@ class DatabaseHelper extends SQLiteOpenHelper {
R.bool.def_auto_time_zone); // Sync timezone to NITZ
loadSetting(stmt, Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
- ("1".equals(SystemProperties.get("ro.boot.qemu"))
- || res.getBoolean(R.bool.def_stay_on_while_plugged_in))
- ? 1 : 0);
+ res.getBoolean(R.bool.def_stay_on_while_plugged_in) ? 1 : 0);
loadIntegerSetting(stmt, Settings.Global.WIFI_SLEEP_POLICY,
R.integer.def_wifi_sleep_policy);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index a509ba33bad2..a97888949446 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -2135,6 +2135,15 @@ class SettingsProtoDumpUtil {
Settings.Secure.ENHANCED_VOICE_PRIVACY_ENABLED,
SecureSettingsProto.ENHANCED_VOICE_PRIVACY_ENABLED);
+ final long evenDimmerToken = p.start(SecureSettingsProto.EVEN_DIMMER);
+ dumpSetting(s, p,
+ Settings.Secure.EVEN_DIMMER_ACTIVATED,
+ SecureSettingsProto.EvenDimmer.EVEN_DIMMER_ACTIVATED);
+ dumpSetting(s, p,
+ Settings.Secure.EVEN_DIMMER_MIN_NITS,
+ SecureSettingsProto.EvenDimmer.EVEN_DIMMER_MIN_NITS);
+ p.end(evenDimmerToken);
+
final long gestureToken = p.start(SecureSettingsProto.GESTURE);
dumpSetting(s, p,
Settings.Secure.AWARE_ENABLED,
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index efed8c3c1ef4..85e87691ac85 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -235,6 +235,7 @@ public class SettingsBackupTest {
Settings.Global.DEVELOPMENT_RENDER_SHADOWS_IN_COMPOSITOR,
Settings.Global.DEVELOPMENT_WM_DISPLAY_SETTINGS_PATH,
Settings.Global.DEVICE_DEMO_MODE,
+ Settings.Global.DEVICE_IDLE_CONSTANTS,
Settings.Global.DISABLE_WINDOW_BLURS,
Settings.Global.BATTERY_SAVER_CONSTANTS,
Settings.Global.BATTERY_TIP_CONSTANTS,
diff --git a/packages/SoundPicker/res/values-ro/strings.xml b/packages/SoundPicker/res/values-ro/strings.xml
index 58b5aeb4dca8..01a2a1ad6bfa 100644
--- a/packages/SoundPicker/res/values-ro/strings.xml
+++ b/packages/SoundPicker/res/values-ro/strings.xml
@@ -19,7 +19,7 @@
<string name="ringtone_default" msgid="798836092118824500">"Ton de apel prestabilit"</string>
<string name="notification_sound_default" msgid="8133121186242636840">"Sunet de notificare prestabilit"</string>
<string name="alarm_sound_default" msgid="4787646764557462649">"Sunet de alarmă prestabilit"</string>
- <string name="add_ringtone_text" msgid="6642389991738337529">"Adaugă un ton de sonerie"</string>
+ <string name="add_ringtone_text" msgid="6642389991738337529">"Adaugă un ton de apel"</string>
<string name="add_alarm_text" msgid="3545497316166999225">"Adaugă o alarmă"</string>
<string name="add_notification_text" msgid="4431129543300614788">"Adaugă o notificare"</string>
<string name="delete_ringtone_text" msgid="201443984070732499">"Șterge"</string>
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index d78038ecee61..7cf562f48ff3 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -242,184 +242,10 @@ filegroup {
}
filegroup {
- name: "SystemUI-test-fakes",
- srcs: [
- /* Status bar fakes */
- "tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt",
- "tests/src/com/android/systemui/statusbar/pipeline/shared/data/repository/FakeConnectivityRepository.kt",
- "tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/FakeWifiRepository.kt",
- "tests/src/com/android/systemui/statusbar/pipeline/mobile/util/FakeSubscriptionManagerProxy.kt",
-
- /* QS fakes */
- "tests/src/com/android/systemui/qs/pipeline/domain/interactor/FakeQSTile.kt",
- ],
- path: "tests/src",
-}
-
-filegroup {
- name: "SystemUI-tests-robolectric-pilots",
- srcs: [
- /* Keyguard converted tests */
- // data
- "tests/src/com/android/systemui/bouncer/data/repository/SimBouncerRepositoryTest.kt",
- "tests/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfigTest.kt",
- "tests/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfigTest.kt",
- "tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigTest.kt",
- "tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLegacySettingSyncerTest.kt",
- "tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLocalUserSelectionManagerTest.kt",
- "tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceRemoteUserSelectionManagerTest.kt",
- "tests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfigTest.kt",
- "tests/src/com/android/systemui/keyguard/data/quickaffordance/QrCodeScannerKeyguardQuickAffordanceConfigTest.kt",
- "tests/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfigTest.kt",
- "tests/src/com/android/systemui/keyguard/data/quickaffordance/VideoCameraQuickAffordanceConfigTest.kt",
- "tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt",
- "tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt",
- "tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt",
- "tests/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryTest.kt",
- "tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt",
- "tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt",
- "tests/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepositoryTest.kt",
- "tests/src/com/android/systemui/keyguard/data/repository/TrustRepositoryTest.kt",
- // domain
- "tests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt",
- "tests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerCallbackInteractorTest.kt",
- "tests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorWithCoroutinesTest.kt",
- "tests/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractorTest.kt",
- "tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt",
- "tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLongPressInteractorTest.kt",
- "tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt",
- "tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt",
- "tests/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractorTest.kt",
- // ui
- "tests/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModelTest.kt",
- "tests/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelTest.kt",
- "tests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelTest.kt",
- "tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelTest.kt",
- "tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt",
- "tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt",
- "tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt",
- // Keyguard helper
- "tests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt",
- "tests/src/com/android/systemui/dock/DockManagerFake.java",
- "tests/src/com/android/systemui/dump/LogBufferHelper.kt",
- "tests/src/com/android/systemui/statusbar/phone/FakeKeyguardStateController.java",
-
- /* Biometric converted tests */
- "tests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt",
- "tests/src/com/android/systemui/biometrics/AuthControllerTest.java",
- "tests/src/com/android/systemui/biometrics/BiometricDisplayListenerTest.java",
- "tests/src/com/android/systemui/biometrics/FaceHelpMessageDeferralTest.kt",
- "tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt",
- "tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt",
- "tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java",
- "tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java",
- "tests/src/com/android/systemui/biometrics/UdfpsDisplayModeTest.java",
- "tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java",
- "tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerTest.java",
- "tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt",
- "tests/src/com/android/systemui/biometrics/UdfpsShellTest.kt",
- "tests/src/com/android/systemui/biometrics/UdfpsViewTest.kt",
-
- /* Status bar wifi converted tests */
- "tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepositorySwitcherTest.kt",
- "tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepositoryTest.kt",
- "tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt",
- "tests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt",
- "tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt",
- "tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt",
- "tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt",
-
- /* Bouncer UI tests */
- "tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt",
- "tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt",
- "tests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java",
- "tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt",
- "tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java",
- "tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt",
- "tests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java",
- "tests/src/com/android/keyguard/KeyguardSimPinViewControllerTest.kt",
- "tests/src/com/android/keyguard/KeyguardSimPukViewControllerTest.kt",
-
- /* Communal tests */
- "tests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt",
- "tests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt",
- "tests/src/com/android/systemui/communal/ui/view/layout/blueprints/DefaultCommunalBlueprintTest.kt",
-
- /* Dream tests */
- "tests/src/com/android/systemui/dreams/complication/HideComplicationTouchHandlerTest.java",
- "tests/src/com/android/systemui/dreams/conditions/AssistantAttentionConditionTest.java",
- "tests/src/com/android/systemui/dreams/conditions/DreamConditionTest.java",
- "tests/src/com/android/systemui/dreams/touch/scrim/BouncerlessScrimControllerTest.java",
- "tests/src/com/android/systemui/dreams/touch/scrim/ScrimManagerTest.java",
- "tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java",
- "tests/src/com/android/systemui/dreams/touch/ShadeTouchHandlerTest.java",
- "tests/src/com/android/systemui/dreams/DreamOverlayAnimationsControllerTest.kt",
- "tests/src/com/android/systemui/dreams/DreamOverlayCallbackControllerTest.kt",
- "tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java",
- "tests/src/com/android/systemui/dreams/DreamOverlayNotificationCountProviderTest.java",
- "tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java",
- "tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java",
- "tests/src/com/android/systemui/dreams/DreamOverlayStatusBarItemsProviderTest.java",
- "tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java",
-
- /* Smartspace tests */
- "tests/src/com/android/systemui/smartspace/BcSmartspaceConfigProviderTest.kt",
- "tests/src/com/android/systemui/smartspace/DreamSmartspaceControllerTest.kt",
- "tests/src/com/android/systemui/smartspace/LockscreenAndDreamTargetFilterTest.kt",
- "tests/src/com/android/systemui/smartspace/LockscreenPreconditionTest.kt",
-
- /* Quick Settings new pipeline converted tests */
- "tests/src/com/android/systemui/qs/pipeline/data/**/*Test.kt",
- "tests/src/com/android/systemui/qs/pipeline/domain/**/*Test.kt",
- "tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt",
- "tests/src/com/android/systemui/qs/tiles/base/**/*.kt",
- "tests/src/com/android/systemui/qs/tiles/viewmodel/**/*.kt",
- "tests/src/com/android/systemui/qs/tiles/impl/**/*.kt",
-
- /* Authentication */
- "tests/src/com/android/systemui/authentication/data/repository/AuthenticationRepositoryTest.kt",
- "tests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt",
-
- /* Device entry */
- "tests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepositoryTest.kt",
- "tests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt",
-
- /* Bouncer scene */
- "tests/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorTest.kt",
- "tests/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModelTest.kt",
- "tests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelTest.kt",
- "tests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt",
- "tests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt",
- "tests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt",
- "tests/src/com/android/systemui/bouncer/ui/viewmodel/PinInputViewModelTest.kt",
-
- /* Lockscreen scene */
- "tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt",
-
- /* Shade scene */
- "tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt",
- "tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt",
-
- /* Quick Settings scene */
- "tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt",
-
- /* Flexiglass / Scene framework tests */
- "tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt",
- "tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt",
- "tests/src/com/android/systemui/scene/data/repository/WindowRootViewVisibilityRepositoryTest.kt",
- "tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt",
- "tests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt",
- "tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt",
- "tests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt",
-
- ],
- path: "tests/src",
-}
-
-filegroup {
name: "SystemUI-tests-multivalent",
srcs: [
"multivalentTests/src/**/*.kt",
+ "multivalentTests/src/**/*.java",
],
path: "multivalentTests/src",
}
@@ -597,8 +423,6 @@ android_robolectric_test {
"tests/robolectric/src/**/*.kt",
"tests/robolectric/src/**/*.java",
":SystemUI-tests-utils",
- ":SystemUI-test-fakes",
- ":SystemUI-tests-robolectric-pilots",
":SystemUI-tests-multivalent",
],
static_libs: [
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 0a71cda4d6dd..f1029a335ab6 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -512,15 +512,6 @@
</intent-filter>
</activity-alias>
- <activity
- android:name="com.android.wm.shell.legacysplitscreen.ForcedResizableInfoActivity"
- android:theme="@style/ForcedResizableTheme"
- android:excludeFromRecents="true"
- android:stateNotNeeded="true"
- android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
- android:exported="false">
- </activity>
-
<!-- Springboard for launching the share and edit activity. This needs to be in the main
system ui process since we need to notify the status bar to dismiss the keyguard -->
<receiver android:name=".screenshot.ActionProxyReceiver"
diff --git a/packages/SystemUI/TEST_MAPPING b/packages/SystemUI/TEST_MAPPING
index 0480b9dbfc8e..0c89a5dcbcf4 100644
--- a/packages/SystemUI/TEST_MAPPING
+++ b/packages/SystemUI/TEST_MAPPING
@@ -126,24 +126,6 @@
"exclude-annotation": "android.platform.test.annotations.Postsubmit"
}
]
- },
- {
- // TODO(b/251476085): Consider merging with SystemUIGoogleScreenshotTests (in U+)
- "name": "SystemUIGoogleBiometricsScreenshotTests",
- "options": [
- {
- "exclude-annotation": "org.junit.Ignore"
- },
- {
- "exclude-annotation": "androidx.test.filters.FlakyTest"
- },
- {
- "exclude-annotation": "android.platform.test.annotations.FlakyTest"
- },
- {
- "exclude-annotation": "android.platform.test.annotations.Postsubmit"
- }
- ]
}
],
@@ -170,18 +152,6 @@
"include-annotation": "androidx.test.filters.FlakyTest"
}
]
- },
- {
- // TODO(b/251476085): Consider merging with SystemUIGoogleScreenshotTests (in U+)
- "name": "SystemUIGoogleBiometricsScreenshotTests",
- "options": [
- {
- "exclude-annotation": "org.junit.Ignore"
- },
- {
- "include-annotation": "androidx.test.filters.FlakyTest"
- }
- ]
}
]
}
diff --git a/packages/SystemUI/aconfig/OWNERS b/packages/SystemUI/aconfig/OWNERS
index e1a7a0f84ad0..902ba907a100 100644
--- a/packages/SystemUI/aconfig/OWNERS
+++ b/packages/SystemUI/aconfig/OWNERS
@@ -1 +1,2 @@
per-file accessibility.aconfig = file:/core/java/android/view/accessibility/OWNERS
+per-file biometrics_framework.aconfig = file:/services/core/java/com/android/server/biometrics/OWNERS
diff --git a/packages/SystemUI/aconfig/biometrics_framework.aconfig b/packages/SystemUI/aconfig/biometrics_framework.aconfig
new file mode 100644
index 000000000000..5fd3b485e9ed
--- /dev/null
+++ b/packages/SystemUI/aconfig/biometrics_framework.aconfig
@@ -0,0 +1,10 @@
+package: "com.android.systemui"
+
+# NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
+
+flag {
+ name: "bp_talkback"
+ namespace: "biometrics_framework"
+ description: "Adds talkback directional guidance when using UDFPS with biometric prompt"
+ bug: "310044658"
+} \ No newline at end of file
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index 17620651128f..d8d3f87c9566 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -68,6 +68,16 @@ flag {
}
flag {
+ name: "notification_background_tint_optimization"
+ namespace: "systemui"
+ description: "Re-enable the codepath that removed tinting of notifications when the"
+ " standard background color is desired. This was the behavior before we discovered"
+ " a resources threading issue, which we worked around by tinting the notification"
+ " backgrounds and footer buttons."
+ bug: "294347738"
+}
+
+flag {
name: "scene_container"
namespace: "systemui"
description: "Enables the scene container framework go/flexiglass."
@@ -164,3 +174,23 @@ flag {
bug: "296122467"
}
+flag {
+ name: "rest_to_unlock"
+ namespace: "systemui"
+ description: "Require prolonged touch for fingerprint authentication"
+ bug: "303672286"
+}
+
+flag {
+ name: "record_issue_qs_tile"
+ namespace: "systemui"
+ description: "Replace Record Trace QS Tile with expanded Record Issue QS Tile"
+ bug: "305049544"
+}
+
+flag {
+ name: "fast_unlock_transition"
+ namespace: "systemui"
+ description: "Faster wallpaper unlock transition"
+ bug: "298186160"
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
index ba80a8deffb7..1a653c316db1 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
@@ -34,9 +34,9 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
@@ -66,6 +66,7 @@ import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
@@ -97,7 +98,7 @@ import kotlin.math.pow
fun BouncerContent(
viewModel: BouncerViewModel,
dialogFactory: BouncerDialogFactory,
- modifier: Modifier
+ modifier: Modifier = Modifier,
) {
val isFullScreenUserSwitcherEnabled = viewModel.isUserSwitcherVisible
val isSideBySideSupported by viewModel.isSideBySideSupported.collectAsState()
@@ -142,6 +143,7 @@ private fun StandardLayout(
viewModel: BouncerViewModel,
dialogFactory: BouncerDialogFactory,
modifier: Modifier = Modifier,
+ layout: BouncerSceneLayout = BouncerSceneLayout.STANDARD,
outputOnly: Boolean = false,
) {
val foldPosture: FoldPosture by foldPosture()
@@ -161,6 +163,7 @@ private fun StandardLayout(
FoldSplittable(
viewModel = viewModel,
dialogFactory = dialogFactory,
+ layout = layout,
outputOnly = outputOnly,
isSplit = false,
)
@@ -170,6 +173,7 @@ private fun StandardLayout(
FoldSplittable(
viewModel = viewModel,
dialogFactory = dialogFactory,
+ layout = layout,
outputOnly = outputOnly,
isSplit = true,
)
@@ -193,6 +197,7 @@ private fun StandardLayout(
private fun SceneScope.FoldSplittable(
viewModel: BouncerViewModel,
dialogFactory: BouncerDialogFactory,
+ layout: BouncerSceneLayout,
outputOnly: Boolean,
isSplit: Boolean,
modifier: Modifier = Modifier,
@@ -210,13 +215,21 @@ private fun SceneScope.FoldSplittable(
// Content above the fold, when split on a foldable device in a "table top" posture:
Box(
modifier =
- Modifier.element(SceneElements.AboveFold).fillMaxWidth().thenIf(isSplit) {
- Modifier.weight(splitRatio)
- },
+ Modifier.element(SceneElements.AboveFold)
+ .fillMaxWidth()
+ .then(
+ if (isSplit) {
+ Modifier.weight(splitRatio)
+ } else if (outputOnly) {
+ Modifier.fillMaxHeight()
+ } else {
+ Modifier
+ }
+ ),
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
- modifier = Modifier.fillMaxWidth().padding(top = 92.dp),
+ modifier = Modifier.fillMaxWidth().padding(top = layout.topPadding),
) {
Crossfade(
targetState = message,
@@ -230,11 +243,23 @@ private fun SceneScope.FoldSplittable(
)
}
- Spacer(Modifier.heightIn(min = 21.dp, max = 48.dp))
+ if (!outputOnly) {
+ Spacer(Modifier.height(layout.spacingBetweenMessageAndEnteredInput))
+
+ UserInputArea(
+ viewModel = viewModel,
+ visibility = UserInputAreaVisibility.OUTPUT_ONLY,
+ layout = layout,
+ )
+ }
+ }
+ if (outputOnly) {
UserInputArea(
viewModel = viewModel,
visibility = UserInputAreaVisibility.OUTPUT_ONLY,
+ layout = layout,
+ modifier = Modifier.align(Alignment.Center),
)
}
}
@@ -242,25 +267,32 @@ private fun SceneScope.FoldSplittable(
// Content below the fold, when split on a foldable device in a "table top" posture:
Box(
modifier =
- Modifier.element(SceneElements.BelowFold).fillMaxWidth().thenIf(isSplit) {
- Modifier.weight(1 - splitRatio)
- },
+ Modifier.element(SceneElements.BelowFold)
+ .fillMaxWidth()
+ .weight(
+ if (isSplit) {
+ 1 - splitRatio
+ } else {
+ 1f
+ }
+ ),
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
- modifier = Modifier.fillMaxWidth(),
+ modifier = Modifier.fillMaxSize()
) {
if (!outputOnly) {
Box(Modifier.weight(1f)) {
UserInputArea(
viewModel = viewModel,
visibility = UserInputAreaVisibility.INPUT_ONLY,
- modifier = Modifier.align(Alignment.Center),
+ layout = layout,
+ modifier = Modifier.align(Alignment.BottomCenter),
)
}
}
- Spacer(Modifier.heightIn(min = 21.dp, max = 48.dp))
+ Spacer(Modifier.height(48.dp))
val actionButtonModifier = Modifier.height(56.dp)
@@ -275,7 +307,7 @@ private fun SceneScope.FoldSplittable(
}
}
- Spacer(Modifier.height(48.dp))
+ Spacer(Modifier.height(layout.bottomPadding))
}
}
@@ -311,6 +343,7 @@ private fun SceneScope.FoldSplittable(
private fun UserInputArea(
viewModel: BouncerViewModel,
visibility: UserInputAreaVisibility,
+ layout: BouncerSceneLayout,
modifier: Modifier = Modifier,
) {
val authMethodViewModel: AuthMethodBouncerViewModel? by
@@ -327,6 +360,7 @@ private fun UserInputArea(
UserInputAreaVisibility.INPUT_ONLY ->
PinPad(
viewModel = nonNullViewModel,
+ layout = layout,
modifier = modifier,
)
}
@@ -341,7 +375,8 @@ private fun UserInputArea(
if (visibility == UserInputAreaVisibility.INPUT_ONLY) {
PatternBouncer(
viewModel = nonNullViewModel,
- modifier = modifier.aspectRatio(1f, matchHeightConstraintsFirst = false)
+ layout = layout,
+ modifier = modifier.aspectRatio(1f, matchHeightConstraintsFirst = false),
)
}
else -> Unit
@@ -449,7 +484,7 @@ private fun UserSwitcher(
}
/**
- * Renders the dropdown menu that displays the actual users and/or user actions that can be
+ * Renders the dropdowm menu that displays the actual users and/or user actions that can be
* selected.
*/
@Composable
@@ -519,6 +554,7 @@ private fun SplitLayout(
StandardLayout(
viewModel = viewModel,
dialogFactory = dialogFactory,
+ layout = BouncerSceneLayout.SPLIT,
outputOnly = true,
modifier = startContentModifier,
)
@@ -527,10 +563,12 @@ private fun SplitLayout(
UserInputArea(
viewModel = viewModel,
visibility = UserInputAreaVisibility.INPUT_ONLY,
+ layout = BouncerSceneLayout.SPLIT,
modifier = endContentModifier,
)
},
- modifier = modifier
+ layout = BouncerSceneLayout.SPLIT,
+ modifier = modifier,
)
}
@@ -542,6 +580,7 @@ private fun SplitLayout(
private fun SwappableLayout(
startContent: @Composable (Modifier) -> Unit,
endContent: @Composable (Modifier) -> Unit,
+ layout: BouncerSceneLayout,
modifier: Modifier = Modifier,
) {
val layoutDirection = LocalLayoutDirection.current
@@ -597,7 +636,7 @@ private fun SwappableLayout(
alpha = animatedAlpha(animatedOffset)
}
) {
- endContent(Modifier.widthIn(max = 400.dp).align(Alignment.BottomCenter))
+ endContent(Modifier.align(layout.swappableEndContentAlignment).widthIn(max = 400.dp))
}
}
}
@@ -635,9 +674,11 @@ private fun SideBySideLayout(
StandardLayout(
viewModel = viewModel,
dialogFactory = dialogFactory,
+ layout = BouncerSceneLayout.SIDE_BY_SIDE,
modifier = endContentModifier,
)
},
+ layout = BouncerSceneLayout.SIDE_BY_SIDE,
modifier = modifier,
)
}
@@ -663,6 +704,7 @@ private fun StackedLayout(
StandardLayout(
viewModel = viewModel,
dialogFactory = dialogFactory,
+ layout = BouncerSceneLayout.STACKED,
modifier = Modifier.fillMaxWidth().weight(1f),
)
}
@@ -732,3 +774,48 @@ private object SceneElements {
private val SceneTransitions = transitions {
from(SceneKeys.ContiguousSceneKey, to = SceneKeys.SplitSceneKey) { spec = tween() }
}
+
+/** Whether a more compact size should be used for various spacing dimensions. */
+internal val BouncerSceneLayout.isUseCompactSize: Boolean
+ get() =
+ when (this) {
+ BouncerSceneLayout.SIDE_BY_SIDE -> true
+ BouncerSceneLayout.SPLIT -> true
+ else -> false
+ }
+
+/** Amount of space to place between the message and the entered input UI elements, in dips. */
+private val BouncerSceneLayout.spacingBetweenMessageAndEnteredInput: Dp
+ get() =
+ when {
+ this == BouncerSceneLayout.STACKED -> 24.dp
+ isUseCompactSize -> 96.dp
+ else -> 128.dp
+ }
+
+/** Amount of space to place above the topmost UI element, in dips. */
+private val BouncerSceneLayout.topPadding: Dp
+ get() =
+ if (this == BouncerSceneLayout.SPLIT) {
+ 40.dp
+ } else {
+ 92.dp
+ }
+
+/** Amount of space to place below the bottommost UI element, in dips. */
+private val BouncerSceneLayout.bottomPadding: Dp
+ get() =
+ if (this == BouncerSceneLayout.SPLIT) {
+ 40.dp
+ } else {
+ 48.dp
+ }
+
+/** The in-a-box alignment for the content on the "end" side of a swappable layout. */
+private val BouncerSceneLayout.swappableEndContentAlignment: Alignment
+ get() =
+ if (this == BouncerSceneLayout.SPLIT) {
+ Alignment.Center
+ } else {
+ Alignment.BottomCenter
+ }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PasswordBouncer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PasswordBouncer.kt
index 0b1338305076..279995959da2 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PasswordBouncer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PasswordBouncer.kt
@@ -16,12 +16,8 @@
package com.android.systemui.bouncer.ui.composable
+import android.view.ViewTreeObserver
import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.ExperimentalLayoutApi
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.WindowInsets
-import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.imeAnimationTarget
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.LocalTextStyle
@@ -30,46 +26,51 @@ import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
-import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
+import androidx.core.view.WindowInsetsCompat
import com.android.systemui.bouncer.ui.viewmodel.PasswordBouncerViewModel
/** UI for the input part of a password-requiring version of the bouncer. */
-@OptIn(ExperimentalLayoutApi::class)
@Composable
internal fun PasswordBouncer(
viewModel: PasswordBouncerViewModel,
modifier: Modifier = Modifier,
) {
val focusRequester = remember { FocusRequester() }
+ val isTextFieldFocusRequested by viewModel.isTextFieldFocusRequested.collectAsState()
+ LaunchedEffect(isTextFieldFocusRequested) {
+ if (isTextFieldFocusRequested) {
+ focusRequester.requestFocus()
+ }
+ }
+
val password: String by viewModel.password.collectAsState()
val isInputEnabled: Boolean by viewModel.isInputEnabled.collectAsState()
val animateFailure: Boolean by viewModel.animateFailure.collectAsState()
- val density = LocalDensity.current
- val isImeVisible by rememberUpdatedState(WindowInsets.imeAnimationTarget.getBottom(density) > 0)
+ val isImeVisible by isSoftwareKeyboardVisible()
LaunchedEffect(isImeVisible) { viewModel.onImeVisibilityChanged(isImeVisible) }
DisposableEffect(Unit) {
viewModel.onShown()
-
- // When the UI comes up, request focus on the TextField to bring up the software keyboard.
- focusRequester.requestFocus()
-
onDispose { viewModel.onHidden() }
}
@@ -104,16 +105,37 @@ internal fun PasswordBouncer(
onDone = { viewModel.onAuthenticateKeyPressed() },
),
modifier =
- Modifier.focusRequester(focusRequester).drawBehind {
- drawLine(
- color = color,
- start = Offset(x = 0f, y = size.height - lineWidthPx),
- end = Offset(size.width, y = size.height - lineWidthPx),
- strokeWidth = lineWidthPx,
- )
- },
+ Modifier.focusRequester(focusRequester)
+ .onFocusChanged { viewModel.onTextFieldFocusChanged(it.isFocused) }
+ .drawBehind {
+ drawLine(
+ color = color,
+ start = Offset(x = 0f, y = size.height - lineWidthPx),
+ end = Offset(size.width, y = size.height - lineWidthPx),
+ strokeWidth = lineWidthPx,
+ )
+ },
)
+ }
+}
+
+/** Returns a [State] with `true` when the IME/keyboard is visible and `false` when it's not. */
+@Composable
+fun isSoftwareKeyboardVisible(): State<Boolean> {
+ val view = LocalView.current
+ val viewTreeObserver = view.viewTreeObserver
+
+ return produceState(
+ initialValue = false,
+ key1 = viewTreeObserver,
+ ) {
+ val listener =
+ ViewTreeObserver.OnGlobalLayoutListener {
+ value = view.rootWindowInsets?.isVisible(WindowInsetsCompat.Type.ime()) ?: false
+ }
+
+ viewTreeObserver.addOnGlobalLayoutListener(listener)
- Spacer(Modifier.height(100.dp))
+ awaitDispose { viewTreeObserver.removeOnGlobalLayoutListener(listener) }
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PatternBouncer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PatternBouncer.kt
index ff1cbd6b04c3..a4b195508b3d 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PatternBouncer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PatternBouncer.kt
@@ -48,6 +48,7 @@ import androidx.compose.ui.unit.dp
import com.android.compose.animation.Easings
import com.android.compose.modifiers.thenIf
import com.android.internal.R
+import com.android.systemui.bouncer.ui.helper.BouncerSceneLayout
import com.android.systemui.bouncer.ui.viewmodel.PatternBouncerViewModel
import com.android.systemui.bouncer.ui.viewmodel.PatternDotViewModel
import kotlin.math.min
@@ -64,6 +65,7 @@ import kotlinx.coroutines.launch
@Composable
internal fun PatternBouncer(
viewModel: PatternBouncerViewModel,
+ layout: BouncerSceneLayout,
modifier: Modifier = Modifier,
) {
DisposableEffect(Unit) {
@@ -190,6 +192,8 @@ internal fun PatternBouncer(
// This is the position of the input pointer.
var inputPosition: Offset? by remember { mutableStateOf(null) }
var gridCoordinates: LayoutCoordinates? by remember { mutableStateOf(null) }
+ var offset: Offset by remember { mutableStateOf(Offset.Zero) }
+ var scale: Float by remember { mutableStateOf(1f) }
Canvas(
modifier
@@ -224,21 +228,42 @@ internal fun PatternBouncer(
},
) { change, _ ->
inputPosition = change.position
- viewModel.onDrag(
- xPx = change.position.x,
- yPx = change.position.y,
- containerSizePx = size.width,
- )
+ change.position.minus(offset).div(scale).let {
+ viewModel.onDrag(
+ xPx = it.x,
+ yPx = it.y,
+ containerSizePx = size.width,
+ )
+ }
}
}
}
) {
gridCoordinates?.let { nonNullCoordinates ->
val containerSize = nonNullCoordinates.size
+ if (containerSize.width <= 0 || containerSize.height <= 0) {
+ return@let
+ }
+
val horizontalSpacing = containerSize.width.toFloat() / colCount
val verticalSpacing = containerSize.height.toFloat() / rowCount
val spacing = min(horizontalSpacing, verticalSpacing)
- val verticalOffset = containerSize.height - spacing * rowCount
+ val horizontalOffset =
+ offset(
+ availableSize = containerSize.width,
+ spacingPerDot = spacing,
+ dotCount = colCount,
+ isCentered = true,
+ )
+ val verticalOffset =
+ offset(
+ availableSize = containerSize.height,
+ spacingPerDot = spacing,
+ dotCount = rowCount,
+ isCentered = layout.isCenteredVertically,
+ )
+ offset = Offset(horizontalOffset, verticalOffset)
+ scale = (colCount * spacing) / containerSize.width
if (isAnimationEnabled) {
// Draw lines between dots.
@@ -248,8 +273,9 @@ internal fun PatternBouncer(
val lineFadeOutAnimationProgress =
lineFadeOutAnimatables[previousDot]!!.value
val startLerp = 1 - lineFadeOutAnimationProgress
- val from = pixelOffset(previousDot, spacing, verticalOffset)
- val to = pixelOffset(dot, spacing, verticalOffset)
+ val from =
+ pixelOffset(previousDot, spacing, horizontalOffset, verticalOffset)
+ val to = pixelOffset(dot, spacing, horizontalOffset, verticalOffset)
val lerpedFrom =
Offset(
x = from.x + (to.x - from.x) * startLerp,
@@ -270,7 +296,7 @@ internal fun PatternBouncer(
// position.
inputPosition?.let { lineEnd ->
currentDot?.let { dot ->
- val from = pixelOffset(dot, spacing, verticalOffset)
+ val from = pixelOffset(dot, spacing, horizontalOffset, verticalOffset)
val lineLength =
sqrt((from.y - lineEnd.y).pow(2) + (from.x - lineEnd.x).pow(2))
drawLine(
@@ -288,7 +314,7 @@ internal fun PatternBouncer(
// Draw each dot on the grid.
dots.forEach { dot ->
drawCircle(
- center = pixelOffset(dot, spacing, verticalOffset),
+ center = pixelOffset(dot, spacing, horizontalOffset, verticalOffset),
color = dotColor,
radius = dotRadius * (dotScalingAnimatables[dot]?.value ?: 1f),
)
@@ -301,10 +327,11 @@ internal fun PatternBouncer(
private fun pixelOffset(
dot: PatternDotViewModel,
spacing: Float,
+ horizontalOffset: Float,
verticalOffset: Float,
): Offset {
return Offset(
- x = dot.x * spacing + spacing / 2,
+ x = dot.x * spacing + spacing / 2 + horizontalOffset,
y = dot.y * spacing + spacing / 2 + verticalOffset,
)
}
@@ -371,6 +398,35 @@ private suspend fun showFailureAnimation(
}
}
+/**
+ * Returns the amount of offset along the axis, in pixels, that should be applied to all dots.
+ *
+ * @param availableSize The size of the container, along the axis of interest.
+ * @param spacingPerDot The amount of pixels that each dot should take (including the area around
+ * that dot).
+ * @param dotCount The number of dots along the axis (e.g. if the axis of interest is the
+ * horizontal/x axis, this is the number of columns in the dot grid).
+ * @param isCentered Whether the dots should be centered along the axis of interest; if `false`, the
+ * dots will be pushed towards to end/bottom of the axis.
+ */
+private fun offset(
+ availableSize: Int,
+ spacingPerDot: Float,
+ dotCount: Int,
+ isCentered: Boolean = false,
+): Float {
+ val default = availableSize - spacingPerDot * dotCount
+ return if (isCentered) {
+ default / 2
+ } else {
+ default
+ }
+}
+
+/** Whether the UI should be centered vertically. */
+private val BouncerSceneLayout.isCenteredVertically: Boolean
+ get() = this == BouncerSceneLayout.SPLIT
+
private const val DOT_DIAMETER_DP = 16
private const val SELECTED_DOT_DIAMETER_DP = 24
private const val SELECTED_DOT_REACTION_ANIMATION_DURATION_MS = 83
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt
index 59617c9022ab..8f5d9f4a1790 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt
@@ -52,6 +52,7 @@ import androidx.compose.ui.unit.dp
import com.android.compose.animation.Easings
import com.android.compose.grid.VerticalGrid
import com.android.compose.modifiers.thenIf
+import com.android.systemui.bouncer.ui.helper.BouncerSceneLayout
import com.android.systemui.bouncer.ui.viewmodel.ActionButtonAppearance
import com.android.systemui.bouncer.ui.viewmodel.PinBouncerViewModel
import com.android.systemui.common.shared.model.ContentDescription
@@ -65,9 +66,11 @@ import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
+/** Renders the PIN button pad. */
@Composable
fun PinPad(
viewModel: PinBouncerViewModel,
+ layout: BouncerSceneLayout,
modifier: Modifier = Modifier,
) {
DisposableEffect(Unit) {
@@ -92,9 +95,9 @@ fun PinPad(
}
VerticalGrid(
- columns = 3,
- verticalSpacing = 12.dp,
- horizontalSpacing = 20.dp,
+ columns = columns,
+ verticalSpacing = layout.verticalSpacing,
+ horizontalSpacing = calculateHorizontalSpacingBetweenColumns(layout.gridWidth),
modifier = modifier,
) {
repeat(9) { index ->
@@ -254,7 +257,7 @@ private fun PinPadButton(
val cornerRadius: Dp by
animateDpAsState(
- if (isAnimationEnabled && isPressed) 24.dp else pinButtonSize / 2,
+ if (isAnimationEnabled && isPressed) 24.dp else pinButtonMaxSize / 2,
label = "PinButton round corners",
animationSpec = tween(animDurationMillis, easing = animEasing)
)
@@ -284,7 +287,7 @@ private fun PinPadButton(
contentAlignment = Alignment.Center,
modifier =
modifier
- .sizeIn(maxWidth = pinButtonSize, maxHeight = pinButtonSize)
+ .sizeIn(maxWidth = pinButtonMaxSize, maxHeight = pinButtonMaxSize)
.aspectRatio(1f)
.drawBehind {
drawRoundRect(
@@ -345,10 +348,32 @@ private suspend fun showFailureAnimation(
}
}
-private val pinButtonSize = 84.dp
-private val pinButtonErrorShrinkFactor = 67.dp / pinButtonSize
+/** Returns the amount of horizontal spacing between columns, in dips. */
+private fun calculateHorizontalSpacingBetweenColumns(
+ gridWidth: Dp,
+): Dp {
+ return (gridWidth - (pinButtonMaxSize * columns)) / (columns - 1)
+}
+
+/** The width of the grid of PIN pad buttons, in dips. */
+private val BouncerSceneLayout.gridWidth: Dp
+ get() = if (isUseCompactSize) 292.dp else 300.dp
+
+/** The spacing between rows of PIN pad buttons, in dips. */
+private val BouncerSceneLayout.verticalSpacing: Dp
+ get() = if (isUseCompactSize) 8.dp else 12.dp
+
+/** Number of columns in the PIN pad grid. */
+private const val columns = 3
+/** Maximum size (width and height) of each PIN pad button. */
+private val pinButtonMaxSize = 84.dp
+/** Scale factor to apply to buttons when animating the "error" animation on them. */
+private val pinButtonErrorShrinkFactor = 67.dp / pinButtonMaxSize
+/** Animation duration of the "shrink" phase of the error animation, on each PIN pad button. */
private const val pinButtonErrorShrinkMs = 50
+/** Amount of time to wait between application of the "error" animation to each row of buttons. */
private const val pinButtonErrorStaggerDelayMs = 33
+/** Animation duration of the "revert" phase of the error animation, on each PIN pad button. */
private const val pinButtonErrorRevertMs = 617
// Pin button motion spec: http://shortn/_9TTIG6SoEa
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt b/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt
new file mode 100644
index 000000000000..735c43356a40
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt
@@ -0,0 +1,50 @@
+/*
+ * 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 com.android.systemui.media.controls.ui.composable
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.viewinterop.AndroidView
+import com.android.compose.animation.scene.ElementKey
+import com.android.compose.animation.scene.SceneScope
+import com.android.systemui.media.controls.ui.MediaCarouselController
+import com.android.systemui.media.controls.ui.MediaHost
+import com.android.systemui.util.animation.MeasurementInput
+
+private object MediaCarousel {
+ object Elements {
+ internal val Content = ElementKey("MediaCarouselContent")
+ }
+}
+
+@Composable
+fun SceneScope.MediaCarousel(
+ mediaHost: MediaHost,
+ modifier: Modifier = Modifier,
+ layoutWidth: Int,
+ layoutHeight: Int,
+ carouselController: MediaCarouselController,
+) {
+ // Notify controller to size the carousel for the current space
+ mediaHost.measurementInput = MeasurementInput(layoutWidth, layoutHeight)
+ carouselController.setSceneContainerSize(layoutWidth, layoutHeight)
+
+ AndroidView(
+ modifier = modifier.element(MediaCarousel.Elements.Content),
+ factory = { _ -> carouselController.mediaFrame },
+ )
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
index 765468372604..f3cde534ebaa 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
@@ -17,11 +17,7 @@
package com.android.systemui.qs.ui.composable
import android.view.ContextThemeWrapper
-import android.view.View
-import android.view.ViewGroup
-import android.widget.FrameLayout
import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
@@ -30,7 +26,6 @@ import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
@@ -38,9 +33,15 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import com.android.compose.animation.scene.ElementKey
import com.android.compose.animation.scene.SceneScope
+import com.android.compose.animation.scene.TransitionState
import com.android.compose.theme.colorAttr
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
+import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Companion.Collapsing
+import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Expanding
import com.android.systemui.res.R
+import com.android.systemui.scene.ui.composable.Gone
+import com.android.systemui.scene.ui.composable.QuickSettings as QuickSettingsSceneKey
+import com.android.systemui.scene.ui.composable.Shade
object QuickSettings {
object Elements {
@@ -59,21 +60,45 @@ private fun QuickSettingsTheme(content: @Composable () -> Unit) {
CompositionLocalProvider(LocalContext provides themedContext) { content() }
}
+private fun SceneScope.stateForQuickSettingsContent(): QSSceneAdapter.State {
+ return when (val transitionState = layoutState.transitionState) {
+ is TransitionState.Idle -> {
+ when (transitionState.currentScene) {
+ Shade -> QSSceneAdapter.State.QQS
+ QuickSettingsSceneKey -> QSSceneAdapter.State.QS
+ else -> QSSceneAdapter.State.CLOSED
+ }
+ }
+ is TransitionState.Transition ->
+ with(transitionState) {
+ when {
+ fromScene == Shade && toScene == QuickSettingsSceneKey -> Expanding(progress)
+ fromScene == QuickSettingsSceneKey && toScene == Shade -> Collapsing(progress)
+ toScene == Shade -> QSSceneAdapter.State.QQS
+ toScene == QuickSettingsSceneKey -> QSSceneAdapter.State.QS
+ toScene == Gone -> QSSceneAdapter.State.CLOSED
+ else -> error("Bad transition for QuickSettings: $transitionState")
+ }
+ }
+ }
+}
+
+/**
+ * This composable will show QuickSettingsContent in the correct state (as determined by its
+ * [SceneScope]).
+ */
@Composable
fun SceneScope.QuickSettings(
modifier: Modifier = Modifier,
qsSceneAdapter: QSSceneAdapter,
- state: QSSceneAdapter.State
) {
- // TODO(b/272780058): implement.
- Column(
- modifier =
- modifier
- .element(QuickSettings.Elements.Content)
- .fillMaxWidth()
- .defaultMinSize(minHeight = 300.dp)
+ val contentState = stateForQuickSettingsContent()
+
+ MovableElement(
+ key = QuickSettings.Elements.Content,
+ modifier = modifier.fillMaxWidth().defaultMinSize(minHeight = 300.dp)
) {
- QuickSettingsContent(qsSceneAdapter = qsSceneAdapter, state)
+ QuickSettingsContent(qsSceneAdapter = qsSceneAdapter, contentState)
}
}
@@ -87,37 +112,20 @@ private fun QuickSettingsContent(
QuickSettingsTheme {
val context = LocalContext.current
- val frame by remember(context) { mutableStateOf(FrameLayout(context)) }
-
LaunchedEffect(key1 = context) {
if (qsView == null) {
- qsSceneAdapter.inflate(context, frame)
+ qsSceneAdapter.inflate(context)
}
}
- qsView?.let {
- it.attachToParent(frame)
+ qsView?.let { view ->
AndroidView(
modifier = modifier.fillMaxSize().background(colorAttr(R.attr.underSurface)),
factory = { _ ->
qsSceneAdapter.setState(state)
- frame
+ view
},
- onRelease = { frame.removeAllViews() },
update = { qsSceneAdapter.setState(state) }
)
}
}
}
-
-private fun View.attachToParent(parent: ViewGroup) {
- if (this.parent != null && this.parent != parent) {
- (this.parent as ViewGroup).removeView(this)
- }
- if (this.parent != parent) {
- parent.addView(
- this,
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT,
- )
- }
-}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
index 871d9f9b7627..d8c7290b76b8 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
@@ -46,7 +46,6 @@ import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.notifications.ui.composable.HeadsUpNotificationSpace
-import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.qs.ui.viewmodel.QuickSettingsSceneViewModel
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.scene.ui.composable.ComposableScene
@@ -156,7 +155,6 @@ private fun SceneScope.QuickSettingsScene(
QuickSettings(
modifier = Modifier.fillMaxHeight(),
viewModel.qsSceneAdapter,
- QSSceneAdapter.State.QS
)
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
index 2df151bc2d8e..9c0f1fe0ec68 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
@@ -23,23 +23,33 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.layout
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.unit.dp
import com.android.compose.animation.scene.ElementKey
import com.android.compose.animation.scene.SceneScope
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.media.controls.ui.MediaCarouselController
+import com.android.systemui.media.controls.ui.MediaHost
+import com.android.systemui.media.controls.ui.composable.MediaCarousel
+import com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL
import com.android.systemui.notifications.ui.composable.NotificationStack
-import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.qs.ui.composable.QuickSettings
+import com.android.systemui.res.R
import com.android.systemui.scene.shared.model.Direction
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.scene.shared.model.SceneModel
@@ -49,7 +59,9 @@ import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel
import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager
import com.android.systemui.statusbar.phone.StatusBarLocation
+import com.android.systemui.util.animation.MeasurementInput
import javax.inject.Inject
+import javax.inject.Named
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
@@ -59,6 +71,7 @@ import kotlinx.coroutines.flow.stateIn
object Shade {
object Elements {
val QuickSettings = ElementKey("ShadeQuickSettings")
+ val MediaCarousel = ElementKey("ShadeMediaCarousel")
val Scrim = ElementKey("ShadeScrim")
val ScrimBackground = ElementKey("ShadeScrimBackground")
}
@@ -87,6 +100,8 @@ constructor(
private val tintedIconManagerFactory: TintedIconManager.Factory,
private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory,
private val statusBarIconController: StatusBarIconController,
+ private val mediaCarouselController: MediaCarouselController,
+ @Named(QUICK_QS_PANEL) private val mediaHost: MediaHost,
) : ComposableScene {
override val key = SceneKey.Shade
@@ -108,6 +123,8 @@ constructor(
createTintedIconManager = tintedIconManagerFactory::create,
createBatteryMeterViewController = batteryMeterViewControllerFactory::create,
statusBarIconController = statusBarIconController,
+ mediaCarouselController = mediaCarouselController,
+ mediaHost = mediaHost,
modifier = modifier,
)
@@ -127,8 +144,12 @@ private fun SceneScope.ShadeScene(
createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager,
createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController,
statusBarIconController: StatusBarIconController,
+ mediaCarouselController: MediaCarouselController,
+ mediaHost: MediaHost,
modifier: Modifier = Modifier,
) {
+ val layoutWidth = remember { mutableStateOf(0) }
+
Box(modifier.element(Shade.Elements.Scrim)) {
Spacer(
modifier =
@@ -157,8 +178,35 @@ private fun SceneScope.ShadeScene(
QuickSettings(
modifier = Modifier.wrapContentHeight(),
viewModel.qsSceneAdapter,
- QSSceneAdapter.State.QQS
)
+
+ if (viewModel.isMediaVisible()) {
+ val mediaHeight = dimensionResource(R.dimen.qs_media_session_height_expanded)
+ MediaCarousel(
+ modifier =
+ Modifier.height(mediaHeight).fillMaxWidth().layout { measurable, constraints
+ ->
+ val placeable = measurable.measure(constraints)
+
+ // Notify controller to size the carousel for the current space
+ mediaHost.measurementInput =
+ MeasurementInput(placeable.width, placeable.height)
+ mediaCarouselController.setSceneContainerSize(
+ placeable.width,
+ placeable.height
+ )
+
+ layout(placeable.width, placeable.height) {
+ placeable.placeRelative(0, 0)
+ }
+ },
+ mediaHost = mediaHost,
+ layoutWidth = layoutWidth.value,
+ layoutHeight = with(LocalDensity.current) { mediaHeight.toPx() }.toInt(),
+ carouselController = mediaCarouselController,
+ )
+ }
+
Spacer(modifier = Modifier.height(16.dp))
NotificationStack(
viewModel = viewModel.notifications,
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
index 42ba6431822e..53755916f83e 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
@@ -53,6 +53,7 @@ class DefaultClockController(
private val resources: Resources,
private val settings: ClockSettings?,
private val hasStepClockAnimation: Boolean = false,
+ private val migratedClocks: Boolean = false,
) : ClockController {
override val smallClock: DefaultClockFaceController
override val largeClock: LargeClockFaceController
@@ -195,6 +196,10 @@ class DefaultClockController(
}
override fun recomputePadding(targetRegion: Rect?) {
+ // TODO(b/310989341): remove after changing migrate_clocks_to_blueprint to aconfig
+ if (migratedClocks) {
+ return
+ }
// We center the view within the targetRegion instead of within the parent
// view by computing the difference and adding that to the padding.
val lp = view.getLayoutParams() as FrameLayout.LayoutParams
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
index dd52e39488ac..f819da5b53de 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
@@ -32,7 +32,8 @@ class DefaultClockProvider(
val ctx: Context,
val layoutInflater: LayoutInflater,
val resources: Resources,
- val hasStepClockAnimation: Boolean = false
+ val hasStepClockAnimation: Boolean = false,
+ val migratedClocks: Boolean = false
) : ClockProvider {
override fun getClocks(): List<ClockMetadata> = listOf(ClockMetadata(DEFAULT_CLOCK_ID))
@@ -47,6 +48,7 @@ class DefaultClockProvider(
resources,
settings,
hasStepClockAnimation,
+ migratedClocks,
)
}
diff --git a/packages/SystemUI/docs/qs-tiles.md b/packages/SystemUI/docs/qs-tiles.md
index bd0b4abbeb34..4313f44c316b 100644
--- a/packages/SystemUI/docs/qs-tiles.md
+++ b/packages/SystemUI/docs/qs-tiles.md
@@ -4,25 +4,37 @@
## About this document
-This document is a more or less comprehensive summary of the state and infrastructure used by Quick Settings tiles. It provides descriptions about the lifecycle of a tile, how to create new tiles and how SystemUI manages and displays tiles, among other topics.
+This document is a more or less comprehensive summary of the state and infrastructure used by Quick
+Settings tiles. It provides descriptions about the lifecycle of a tile, how to create new tiles and
+how SystemUI manages and displays tiles, among other topics.
## What are Quick Settings Tiles?
-Quick Settings (from now on, QS) is the expanded panel that contains shortcuts for the user to toggle many settings. This is opened by expanding the notification drawer twice (or once when phone is locked). Quick Quick Settings (QQS) is the smaller panel that appears on top of the notifications before expanding twice and contains some of the toggles with no secondary line.
+Quick Settings (from now on, QS) is the expanded panel that contains shortcuts for the user to
+toggle many settings. This is opened by expanding the notification drawer twice (or once when phone
+is locked). Quick Quick Settings (QQS) is the smaller panel that appears on top of the notifications
+before expanding twice and contains some of the toggles with no secondary line.
-Each of these toggles that appear either in QS or QQS are called Quick Settings Tiles (or tiles for short). They allow the user to enable or disable settings quickly and sometimes provides access to more comprehensive settings pages.
+Each of these toggles that appear either in QS or QQS are called Quick Settings Tiles (or tiles for
+short). They allow the user to enable or disable settings quickly and sometimes provides access to
+more comprehensive settings pages.
The following image shows QQS on the left and QS on the right, with the tiles highlighted.
![QQS on the left, QS on the right](QS-QQS.png)
-QS Tiles usually depend on one or more Controllers that bind the tile with the necessary service. Controllers are obtained by the backend and used for communication between the user and the device.
+QS Tiles usually depend on one or more Controllers that bind the tile with the necessary service.
+Controllers are obtained by the backend and used for communication between the user and the device.
### A note on multi-user support
-All the classes described in this document that live inside SystemUI are only instantiated in the process of user 0. The different controllers that back the QS Tiles (also instantiated just in user 0) are user aware and provide an illusion of different instances for different users.
+All the classes described in this document that live inside SystemUI are only instantiated in the
+process of user 0. The different controllers that back the QS Tiles (also instantiated just in user
+0) are user aware and provide an illusion of different instances for different users.
-For an example on this, see [`RotationLockController`](/packages/SystemUI/src/com/android/systemui/statusbar/policy/RotationLockControllerImpl.java). This controller for the `RotationLockTile` listens to changes in all users.
+For an example on this,
+see [`RotationLockController`](/packages/SystemUI/src/com/android/systemui/statusbar/policy/RotationLockControllerImpl.java).
+This controller for the `RotationLockTile` listens to changes in all users.
## What are tiles made of?
@@ -30,104 +42,162 @@ For an example on this, see [`RotationLockController`](/packages/SystemUI/src/co
QS Tiles are composed of the following backend classes.
-* [`QSTile`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java): Interface providing common behavior for all Tiles. This class also contains some useful utility classes needed for the tiles.
- * `Icon`: Defines the basic interface for an icon as used by the tiles.
- * `State`: Encapsulates the state of the Tile in order to communicate between the backend and the UI.
-* [`QSTileImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java): Abstract implementation of `QSTile`, providing basic common behavior for all tiles. Also implements extensions for different types of `Icon`. All tiles currently defined in SystemUI subclass from this implementation.
-* [`SystemUI/src/com/android/systemui/qs/tiles`](/packages/SystemUI/src/com/android/systemui/qs/tiles): Each tile from SystemUI is defined here by a class that extends `QSTileImpl`. These implementations connect to corresponding controllers. The controllers serve two purposes:
- * track the state of the device and notify the tile when a change has occurred (for example, bluetooth connected to a device)
- * accept actions from the tiles to modify the state of the phone (for example, enablind and disabling wifi).
-* [`CustomTile`](/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java): Equivalent to the tiles in the previous item, but used for 3rd party tiles. In depth information to be found in [`CustomTile`](#customtile)
-
-All the elements in SystemUI that work with tiles operate on `QSTile` or the interfaces defined in it. However, all the current implementations of tiles in SystemUI subclass from `QSTileImpl`, as it takes care of many common situations. Throughout this document, we will focus on `QSTileImpl` as examples of tiles.
-
-The interfaces in `QSTile` as well as other interfaces described in this document can be used to implement plugins to add additional tiles or different behavior. For more information, see [plugins.md](plugins.md)
+* [`QSTile`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java): Interface
+ providing common behavior for all Tiles. This class also contains some useful utility classes
+ needed for the tiles.
+ * `Icon`: Defines the basic interface for an icon as used by the tiles.
+ * `State`: Encapsulates the state of the Tile in order to communicate between the backend and
+ the UI.
+* [`QSTileImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java): Abstract
+ implementation of `QSTile`, providing basic common behavior for all tiles. Also implements
+ extensions for different types of `Icon`. All tiles currently defined in SystemUI subclass from
+ this implementation.
+* [`SystemUI/src/com/android/systemui/qs/tiles`](/packages/SystemUI/src/com/android/systemui/qs/tiles):
+ Each tile from SystemUI is defined here by a class that extends `QSTileImpl`. These
+ implementations connect to corresponding controllers. The controllers serve two purposes:
+ * track the state of the device and notify the tile when a change has occurred (for example,
+ bluetooth connected to a device)
+ * accept actions from the tiles to modify the state of the phone (for example, enablind and
+ disabling wifi).
+* [`CustomTile`](/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java):
+ Equivalent to the tiles in the previous item, but used for 3rd party tiles. In depth information
+ to be found in [`CustomTile`](#customtile)
+
+All the elements in SystemUI that work with tiles operate on `QSTile` or the interfaces defined in
+it. However, all the current implementations of tiles in SystemUI subclass from `QSTileImpl`, as it
+takes care of many common situations. Throughout this document, we will focus on `QSTileImpl` as
+examples of tiles.
+
+The interfaces in `QSTile` as well as other interfaces described in this document can be used to
+implement plugins to add additional tiles or different behavior. For more information,
+see [plugins.md](plugins.md)
#### Tile State
-Each tile has an associated `State` object that is used to communicate information to the corresponding view. The base class `State` has (among others) the following fields:
+Each tile has an associated `State` object that is used to communicate information to the
+corresponding view. The base class `State` has (among others) the following fields:
* **`state`**: one of `Tile#STATE_UNAVAILABLE`, `Tile#STATE_ACTIVE`, `Tile#STATE_INACTIVE`.
* **`icon`**; icon to display. It may depend on the current state.
* **`label`**: usually the name of the tile.
* **`secondaryLabel`**: text to display in a second line. Usually extra state information.
* **`contentDescription`**
-* **`expandedAccessibilityClassName`**: usually `Switch.class.getName()` for boolean Tiles. This will make screen readers read the current state of the tile as well as the new state when it's toggled. For this, the Tile has to use `BooleanState`.
-* **`handlesLongClick`**: whether the Tile will handle long click. If it won't, it should be set to `false` so it will not be announced for accessibility.
+* **`expandedAccessibilityClassName`**: usually `Switch.class.getName()` for boolean Tiles. This
+ will make screen readers read the current state of the tile as well as the new state when it's
+ toggled. For this, the Tile has to use `BooleanState`.
+* **`handlesLongClick`**: whether the Tile will handle long click. If it won't, it should be set
+ to `false` so it will not be announced for accessibility.
Setting any of these fields during `QSTileImpl#handleUpdateState` will update the UI after it.
-Additionally. `BooleanState` has a `value` boolean field that usually would be set to `state == Tile#STATE_ACTIVE`. This is used by accessibility services along with `expandedAccessibilityClassName`.
+Additionally. `BooleanState` has a `value` boolean field that usually would be set
+to `state == Tile#STATE_ACTIVE`. This is used by accessibility services along
+with `expandedAccessibilityClassName`.
#### SystemUI tiles
-Each tile defined in SystemUI extends `QSTileImpl`. This abstract class implements some common functions and leaves others to be implemented by each tile, in particular those that determine how to handle different events (refresh, click, etc.).
+Each tile defined in SystemUI extends `QSTileImpl`. This abstract class implements some common
+functions and leaves others to be implemented by each tile, in particular those that determine how
+to handle different events (refresh, click, etc.).
-For more information on how to implement a tile in SystemUI, see [Implementing a SystemUI tile](#implementing-a-systemui-tile).
+For more information on how to implement a tile in SystemUI,
+see [Implementing a SystemUI tile](#implementing-a-systemui-tile).
### Tile views
-Each Tile has a couple of associated views for displaying it in QS and QQS. These views are updated after the backend updates the `State` using `QSTileImpl#handleUpdateState`.
-
-* **[`QSTileView`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java)**: Abstract class that provides basic Tile functionality. These allows external [Factories](#qsfactory) to create Tiles.
-* **[`QSTileViewImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.java)**: Implementation of `QSTileView`. It takes care of the following:
- * Holding the icon
- * Background color and shape
- * Ripple
- * Click listening
- * Labels
+Each Tile has a couple of associated views for displaying it in QS and QQS. These views are updated
+after the backend updates the `State` using `QSTileImpl#handleUpdateState`.
+
+* **[`QSTileView`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java)**:
+ Abstract class that provides basic Tile functionality. These allows
+ external [Factories](#qsfactory) to create Tiles.
+* **[`QSTileViewImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.java)
+ **: Implementation of `QSTileView`. It takes care of the following:
+ * Holding the icon
+ * Background color and shape
+ * Ripple
+ * Click listening
+ * Labels
* **[`QSIconView`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSIconView.java)**
-* **[`QSIconViewImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java)**
+* **[`QSIconViewImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java)
+ **
#### QSIconView and QSIconViewImpl
-`QSIconView` is an interface that define the basic actions that icons have to respond to. Its base implementation in SystemUI is `QSIconViewImpl` and it and its subclasses are used by all QS tiles.
+`QSIconView` is an interface that define the basic actions that icons have to respond to. Its base
+implementation in SystemUI is `QSIconViewImpl` and it and its subclasses are used by all QS tiles.
-This `ViewGroup` is a container for the icon used in each tile. It has methods to apply the current `State` of the tile, modifying the icon (color and animations). Classes that inherit from this can add other details that are modified when the `State` changes.
+This `ViewGroup` is a container for the icon used in each tile. It has methods to apply the
+current `State` of the tile, modifying the icon (color and animations). Classes that inherit from
+this can add other details that are modified when the `State` changes.
-Each `QSTileImpl` can specify that they use a particular implementation of this class when creating an icon.
+Each `QSTileImpl` can specify that they use a particular implementation of this class when creating
+an icon.
### How are the backend and the views related?
-The backend of the tiles (all the implementations of `QSTileImpl`) communicate with the views by using a `State`. The backend populates the state, and then the view maps the state to a visual representation.
+The backend of the tiles (all the implementations of `QSTileImpl`) communicate with the views by
+using a `State`. The backend populates the state, and then the view maps the state to a visual
+representation.
-It's important to notice that the state of the tile (internal or visual) is not directly modified by a user action like clicking on the tile. Instead, acting on a tile produces internal state changes on the device, and those trigger the changes on the tile state and UI.
+It's important to notice that the state of the tile (internal or visual) is not directly modified by
+a user action like clicking on the tile. Instead, acting on a tile produces internal state changes
+on the device, and those trigger the changes on the tile state and UI.
-When a container for tiles (`QuickQSPanel` or `QSPanel`) has to display tiles, they create a [`TileRecord`](/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java). This associates the corresponding `QSTile` with its `QSTileView`, doing the following:
+When a container for tiles (`QuickQSPanel` or `QSPanel`) has to display tiles, they create
+a [`TileRecord`](/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java). This associates the
+corresponding `QSTile` with its `QSTileView`, doing the following:
* Create the corresponding `QSTileView` to display in that container.
-* Create a callback for `QSTile` to call when its state changes. Note that a single tile will normally have up to two callbacks: one for QS and one for QQS.
+* Create a callback for `QSTile` to call when its state changes. Note that a single tile will
+ normally have up to two callbacks: one for QS and one for QQS.
#### Life of a tile click
-This is a brief run-down of what happens when a user clicks on a tile. Internal changes on the device (for example, changes from Settings) will trigger this process starting in step 3. Throughout this section, we assume that we are dealing with a `QSTileImpl`.
+This is a brief run-down of what happens when a user clicks on a tile. Internal changes on the
+device (for example, changes from Settings) will trigger this process starting in step 3. Throughout
+this section, we assume that we are dealing with a `QSTileImpl`.
1. User clicks on tile. The following calls happen in sequence:
- 1. `QSTileViewImpl#onClickListener`.
- 2. `QSTile#click`.
- 3. `QSTileImpl#handleClick`. This last call sets the new state for the device by using the associated controller.
+ 1. `QSTileViewImpl#onClickListener`.
+ 2. `QSTile#click`.
+ 3. `QSTileImpl#handleClick`. This last call sets the new state for the device by using the
+ associated controller.
2. State in the device changes. This is normally outside of SystemUI's control.
-3. Controller receives a callback (or `Intent`) indicating the change in the device. The following calls happen:
- 1. `QSTileImpl#refreshState`, maybe passing an object with necessary information regarding the new state.
- 2. `QSTileImpl#handleRefreshState`
-4. `QSTileImpl#handleUpdateState` is called to update the state with the new information. This information can be obtained both from the `Object` passed to `refreshState` as well as from the controller.
-5. If the state has changed (in at least one element), `QSTileImpl#handleStateChanged` is called. This will trigger a call to all the associated `QSTile.Callback#onStateChanged`, passing the new `State`.
-6. `QSTileView#onStateChanged` is called and this calls `QSTileView#handleStateChanged`. This method maps the state into the view:
- * The tile colors change to match the new state.
- * `QSIconView.setIcon` is called to apply the correct state to the icon and the correct icon to the view.
- * The tile labels change to match the new state.
+3. Controller receives a callback (or `Intent`) indicating the change in the device. The following
+ calls happen:
+ 1. `QSTileImpl#refreshState`, maybe passing an object with necessary information regarding the
+ new state.
+ 2. `QSTileImpl#handleRefreshState`
+4. `QSTileImpl#handleUpdateState` is called to update the state with the new information. This
+ information can be obtained both from the `Object` passed to `refreshState` as well as from the
+ controller.
+5. If the state has changed (in at least one element), `QSTileImpl#handleStateChanged` is called.
+ This will trigger a call to all the associated `QSTile.Callback#onStateChanged`, passing the
+ new `State`.
+6. `QSTileView#onStateChanged` is called and this calls `QSTileView#handleStateChanged`. This method
+ maps the state into the view:
+ * The tile colors change to match the new state.
+ * `QSIconView.setIcon` is called to apply the correct state to the icon and the correct icon to
+ the view.
+ * The tile labels change to match the new state.
## Third party tiles (TileService)
-A third party tile is any Quick Settings tile that is provided by an app (that's not SystemUI). This is implemented by developers subclassing [`TileService`](/core/java/android/service/quicksettings/TileService.java) and interacting with its API.
+A third party tile is any Quick Settings tile that is provided by an app (that's not SystemUI). This
+is implemented by developers
+subclassing [`TileService`](/core/java/android/service/quicksettings/TileService.java) and
+interacting with its API.
### API classes
-The classes that define the public API are in [core/java/android/service/quicksettings](/core/java/android/service/quicksettings).
+The classes that define the public API are
+in [core/java/android/service/quicksettings](/core/java/android/service/quicksettings).
#### Tile
-Parcelable class used to communicate information about the state between the external app and SystemUI. The class supports the following fields:
+Parcelable class used to communicate information about the state between the external app and
+SystemUI. The class supports the following fields:
* Label
* Subtitle
@@ -135,18 +205,25 @@ Parcelable class used to communicate information about the state between the ext
* State (`Tile#STATE_ACTIVE`, `Tile#STATE_INACTIVE`, `Tile#STATE_UNAVAILABLE`)
* Content description
-Additionally, it provides a method to notify SystemUI that the information may have changed and the tile should be refreshed.
+Additionally, it provides a method to notify SystemUI that the information may have changed and the
+tile should be refreshed.
#### TileService
-This is an abstract Service that needs to be implemented by the developer. The Service manifest must have the permission `android.permission.BIND_QUICK_SETTINGS_TILE` and must respond to the action `android.service.quicksettings.action.QS_TILE`. This will allow SystemUI to find the available tiles and display them to the user.
+This is an abstract Service that needs to be implemented by the developer. The Service manifest must
+have the permission `android.permission.BIND_QUICK_SETTINGS_TILE` and must respond to the
+action `android.service.quicksettings.action.QS_TILE`. This will allow SystemUI to find the
+available tiles and display them to the user.
-The implementer is responsible for creating the methods that will respond to the following calls from SystemUI:
+The implementer is responsible for creating the methods that will respond to the following calls
+from SystemUI:
* **`onTileAdded`**: called when the tile is added to QS.
* **`onTileRemoved`**: called when the tile is removed from QS.
-* **`onStartListening`**: called when QS is opened and the tile is showing. This marks the start of the window when calling `getQSTile` is safe and will provide the correct object.
-* **`onStopListening`**: called when QS is closed or the tile is no longer visible by the user. This marks the end of the window described in `onStartListening`.
+* **`onStartListening`**: called when QS is opened and the tile is showing. This marks the start of
+ the window when calling `getQSTile` is safe and will provide the correct object.
+* **`onStopListening`**: called when QS is closed or the tile is no longer visible by the user. This
+ marks the end of the window described in `onStartListening`.
* **`onClick`**: called when the user clicks on the tile.
Additionally, the following final methods are provided:
@@ -155,7 +232,8 @@ Additionally, the following final methods are provided:
public final Tile getQsTile()
```
- Provides the tile object that can be modified. This should only be called in the window between `onStartListening` and `onStopListening`.
+ Provides the tile object that can be modified. This should only be called in the window
+ between `onStartListening` and `onStopListening`.
* ```java
public final boolean isLocked()
@@ -163,13 +241,15 @@ Additionally, the following final methods are provided:
public final boolean isSecure()
```
- Provide information about the secure state of the device. This can be used by the tile to accept or reject actions on the tile.
+ Provide information about the secure state of the device. This can be used by the tile to accept
+ or reject actions on the tile.
* ```java
public final void unlockAndRun(Runnable)
```
- May prompt the user to unlock the device if locked. Once the device is unlocked, it runs the given `Runnable`.
+ May prompt the user to unlock the device if locked. Once the device is unlocked, it runs the
+ given `Runnable`.
* ```java
public final void showDialog(Dialog)
@@ -179,72 +259,110 @@ Additionally, the following final methods are provided:
##### Binding
-When the Service is bound, a callback Binder is provided by SystemUI for all the callbacks, as well as an identifier token (`Binder`). This token is used in the callbacks to identify this `TileService` and match it to the corresponding tile.
+When the Service is bound, a callback Binder is provided by SystemUI for all the callbacks, as well
+as an identifier token (`Binder`). This token is used in the callbacks to identify
+this `TileService` and match it to the corresponding tile.
-The tiles are bound once immediately on creation. After that, the tile is bound whenever it should start listening. When the panels are closed, and the tile is set to stop listening, it will be unbound after a delay of `TileServiceManager#UNBIND_DELAY` (30s), if it's not set to listening again.
+The tiles are bound once immediately on creation. After that, the tile is bound whenever it should
+start listening. When the panels are closed, and the tile is set to stop listening, it will be
+unbound after a delay of `TileServiceManager#UNBIND_DELAY` (30s), if it's not set to listening
+again.
##### Active tile
-A `TileService` can be declared as an active tile by adding specific meta-data to its manifest (see [TileService#META_DATA_ACTIVE_TILE](https://developer.android.com/reference/android/service/quicksettings/TileService#META_DATA_ACTIVE_TILE)). In this case, it won't receive a call of `onStartListening` when QS is opened. Instead, the tile must request listening status by making a call to `TileService#requestListeningState` with its component name. This will initiate a window that will last until the tile is updated.
+A `TileService` can be declared as an active tile by adding specific meta-data to its manifest (
+see [TileService#META_DATA_ACTIVE_TILE](https://developer.android.com/reference/android/service/quicksettings/TileService#META_DATA_ACTIVE_TILE)).
+In this case, it won't receive a call of `onStartListening` when QS is opened. Instead, the tile
+must request listening status by making a call to `TileService#requestListeningState` with its
+component name. This will initiate a window that will last until the tile is updated.
The tile will also be granted listening status if it's clicked by the user.
### SystemUI classes
-The following sections describe the classes that live in SystemUI to support third party tiles. These classes live in [SystemUI/src/com/android/systemui/qs/external](/packages/SystemUI/src/com/android/systemui/qs/external/)
+The following sections describe the classes that live in SystemUI to support third party tiles.
+These classes live
+in [SystemUI/src/com/android/systemui/qs/external](/packages/SystemUI/src/com/android/systemui/qs/external/)
#### CustomTile
-This class is an subclass of `QSTileImpl` to be used with third party tiles. It provides similar behavior to SystemUI tiles as well as handling exclusive behavior like lifting default icons and labels from the application manifest.
+This class is an subclass of `QSTileImpl` to be used with third party tiles. It provides similar
+behavior to SystemUI tiles as well as handling exclusive behavior like lifting default icons and
+labels from the application manifest.
#### TileServices
-This class is the central controller for all tile services that are currently in Quick Settings as well as provides the support for starting new ones. It is also an implementation of the `Binder` that receives all calls from current `TileService` components and dispatches them to SystemUI or the corresponding `CustomTile`.
+This class is the central controller for all tile services that are currently in Quick Settings as
+well as provides the support for starting new ones. It is also an implementation of the `Binder`
+that receives all calls from current `TileService` components and dispatches them to SystemUI or the
+corresponding `CustomTile`.
-Whenever a binder call is made to this class, it matches the corresponding token assigned to the `TileService` with the `ComponentName` and verifies that the call comes from the right UID to prevent spoofing.
+Whenever a binder call is made to this class, it matches the corresponding token assigned to
+the `TileService` with the `ComponentName` and verifies that the call comes from the right UID to
+prevent spoofing.
-As this class is the only one that's aware of every `TileService` that's currently bound, it is also in charge of requesting some to be unbound whenever there is a low memory situation.
+As this class is the only one that's aware of every `TileService` that's currently bound, it is also
+in charge of requesting some to be unbound whenever there is a low memory situation.
#### TileLifecycleManager
-This class is in charge of binding and unbinding to a particular `TileService` when necessary, as well as sending the corresponding binder calls. It does not decide whether the tile should be bound or unbound, unless it's requested to process a message. It additionally handles errors in the `Binder` as well as changes in the corresponding component (like updates and enable/disable).
+This class is in charge of binding and unbinding to a particular `TileService` when necessary, as
+well as sending the corresponding binder calls. It does not decide whether the tile should be bound
+or unbound, unless it's requested to process a message. It additionally handles errors in
+the `Binder` as well as changes in the corresponding component (like updates and enable/disable).
-The class has a queue that stores requests while the service is not bound, to be processed as soon as the service is bound.
+The class has a queue that stores requests while the service is not bound, to be processed as soon
+as the service is bound.
-Each `TileService` gets assigned an exclusive `TileLifecycleManager` when its corresponding tile is added to the set of current ones and kept as long as the tile is available to the user.
+Each `TileService` gets assigned an exclusive `TileLifecycleManager` when its corresponding tile is
+added to the set of current ones and kept as long as the tile is available to the user.
#### TileServiceManager
-Each instance of this class is an intermediary between the `TileServices` controller and a `TileLifecycleManager` corresponding to a particular `TileService`.
+Each instance of this class is an intermediary between the `TileServices` controller and
+a `TileLifecycleManager` corresponding to a particular `TileService`.
This class handles management of the service, including:
* Deciding when to bind and unbind, requesting it to the `TileLifecycleManager`.
* Relaying messages to the `TileService` through the `TileLifecycleManager`.
* Determining the service's bind priority (to deal with OOM situations).
-* Detecting when the package/component has been removed in order to remove the tile and references to it.
+* Detecting when the package/component has been removed in order to remove the tile and references
+ to it.
## How are tiles created/instantiated?
-This section describes the classes that aid in the creation of each tile as well as the complete lifecycle of a tile. First we describe two important interfaces/classes.
+This section describes the classes that aid in the creation of each tile as well as the complete
+lifecycle of a tile. First we describe two important interfaces/classes.
### QSTileHost
-This class keeps track of the tiles selected by the current user (backed in the Secure Setting `sysui_qs_tiles`) to be displayed in Quick Settings. Whenever the value of this setting changes (or on device start), the whole list of tiles is read. This is compared with the current tiles, destroying unnecessary ones and creating needed ones.
+This class keeps track of the tiles selected by the current user (backed in the Secure
+Setting `sysui_qs_tiles`) to be displayed in Quick Settings. Whenever the value of this setting
+changes (or on device start), the whole list of tiles is read. This is compared with the current
+tiles, destroying unnecessary ones and creating needed ones.
-It additionally provides a point of communication between the tiles and the StatusBar, for example to open it and collapse it. And a way for the StatusBar service to add tiles (only works for `CustomTile`).
+It additionally provides a point of communication between the tiles and the StatusBar, for example
+to open it and collapse it. And a way for the StatusBar service to add tiles (only works
+for `CustomTile`).
#### Tile specs
-Each single tile is identified by a spec, which is a unique String for that type of tile. The current tiles are stored as a Setting string of comma separated values of these specs. Additionally, the default tiles (that appear on a fresh system) configuration value is stored likewise.
+Each single tile is identified by a spec, which is a unique String for that type of tile. The
+current tiles are stored as a Setting string of comma separated values of these specs. Additionally,
+the default tiles (that appear on a fresh system) configuration value is stored likewise.
-SystemUI tile specs are usually a single simple word identifying the tile (like `wifi` or `battery`). Custom tile specs are always a string of the form `custom(...)` where the ellipsis is a flattened String representing the `ComponentName` for the corresponding `TileService`.
+SystemUI tile specs are usually a single simple word identifying the tile (like `wifi`
+or `battery`). Custom tile specs are always a string of the form `custom(...)` where the ellipsis is
+a flattened String representing the `ComponentName` for the corresponding `TileService`.
### QSFactory
-This interface provides a way of creating tiles and views from a spec. It can be used in plugins to provide different definitions for tiles.
+This interface provides a way of creating tiles and views from a spec. It can be used in plugins to
+provide different definitions for tiles.
-In SystemUI there is only one implementation of this factory and that is the default factory (`QSFactoryImpl`) in `QSTileHost`.
+In SystemUI there is only one implementation of this factory and that is the default
+factory (`QSFactoryImpl`) in `QSTileHost`.
#### QSFactoryImpl
@@ -254,87 +372,145 @@ This class implements two methods as specified in the `QSFactory` interface:
public QSTile createTile(String)
```
- Creates a tile (backend) from a given spec. The factory has providers for all of the SystemUI tiles, returning one when the correct spec is used.
+ Creates a tile (backend) from a given spec. The factory has providers for all of the SystemUI
+ tiles, returning one when the correct spec is used.
- If the spec is not recognized but it has the `custom(` prefix, the factory tries to create a `CustomTile` for the component in the spec. This could fail (the component is not a valid `TileService` or is not enabled) and will be detected later when the tile is polled to determine if it's available.
+ If the spec is not recognized but it has the `custom(` prefix, the factory tries to create
+ a `CustomTile` for the component in the spec. This could fail (the component is not a
+ valid `TileService` or is not enabled) and will be detected later when the tile is polled to
+ determine if it's available.
* ```java
public QSTileView createTileView(QSTile, boolean)
```
- Creates a view for the corresponding `QSTile`. The second parameter determines if the view that is created should be a collapsed one (for using in QQS) or not (for using in QS).
+ Creates a view for the corresponding `QSTile`. The second parameter determines if the view that is
+ created should be a collapsed one (for using in QQS) or not (for using in QS).
### Lifecycle of a Tile
-We describe first the parts of the lifecycle that are common to SystemUI tiles and third party tiles. Following that, there will be a section with the steps that are exclusive to third party tiles.
-
-1. The tile is added through the QS customizer by the user. This will immediately save the new list of tile specs to the Secure Setting `sysui_qs_tiles`. This step could also happend if `StatusBar` adds tiles (either through adb, or through its service interface as with the `DevelopmentTiles`).
-2. This triggers a "setting changed" that is caught by `QSTileHost`. This class processes the new value of the setting and finds out that there is a new spec in the list. Alternatively, when the device is booted, all tiles in the setting are considered as "new".
-3. `QSTileHost` calls all the available `QSFactory` classes that it has registered in order to find the first one that will be able to create a tile with that spec. Assume that `QSFactoryImpl` managed to create the tile, which is some implementation of `QSTile` (either a SystemUI subclass of `QSTileImpl` or a `CustomTile`). If the tile is available, it's stored in a map and things proceed forward.
-4. `QSTileHost` calls its callbacks indicating that the tiles have changed. In particular, `QSPanel` and `QuickQSPanel` receive this call with the full list of tiles. We will focus on these two classes.
-5. For each tile in this list, a `QSTileView` is created (collapsed or expanded) and attached to a `TileRecord` containing the tile backend and the view. Additionally:
- * a callback is attached to the tile to communicate between the backend and the view or the panel.
+We describe first the parts of the lifecycle that are common to SystemUI tiles and third party
+tiles. Following that, there will be a section with the steps that are exclusive to third party
+tiles.
+
+1. The tile is added through the QS customizer by the user. This will immediately save the new list
+ of tile specs to the Secure Setting `sysui_qs_tiles`. This step could also happend if `StatusBar`
+ adds tiles (either through adb, or through its service interface as with the `DevelopmentTiles`).
+2. This triggers a "setting changed" that is caught by `QSTileHost`. This class processes the new
+ value of the setting and finds out that there is a new spec in the list. Alternatively, when the
+ device is booted, all tiles in the setting are considered as "new".
+3. `QSTileHost` calls all the available `QSFactory` classes that it has registered in order to find
+ the first one that will be able to create a tile with that spec. Assume that `QSFactoryImpl`
+ managed to create the tile, which is some implementation of `QSTile` (either a SystemUI subclass
+ of `QSTileImpl` or a `CustomTile`). If the tile is available, it's stored in a map and things
+ proceed forward.
+4. `QSTileHost` calls its callbacks indicating that the tiles have changed. In particular, `QSPanel`
+ and `QuickQSPanel` receive this call with the full list of tiles. We will focus on these two
+ classes.
+5. For each tile in this list, a `QSTileView` is created (collapsed or expanded) and attached to
+ a `TileRecord` containing the tile backend and the view. Additionally:
+ * a callback is attached to the tile to communicate between the backend and the view or the
+ panel.
* the click listeners in the tile are attached to those of the view.
6. The tile view is added to the corresponding layout.
-When the tile is removed from the list of current tiles, all these classes are properly disposed including removing the callbacks and making sure that the backends remove themselves from the controllers they were listening to.
+When the tile is removed from the list of current tiles, all these classes are properly disposed
+including removing the callbacks and making sure that the backends remove themselves from the
+controllers they were listening to.
#### Lifecycle of a CustomTile
-In step 3 of the previous process, when a `CustomTile` is created, additional steps are taken to ensure the proper binding to the service as described in [Third party tiles (TileService)](#third-party-tiles-tileservice).
+In step 3 of the previous process, when a `CustomTile` is created, additional steps are taken to
+ensure the proper binding to the service as described
+in [Third party tiles (TileService)](#third-party-tiles-tileservice).
-1. The `CustomTile` obtains the `TileServices` class from the `QSTileHost` and request the creation of a `TileServiceManager` with its token. As the spec for the `CustomTile` contains the `ComponentName` of the associated service, this can be used to bind to it.
-2. The `TileServiceManager` creates its own `TileLifecycleManager` to take care of binding to the service.
-3. `TileServices` creates maps between the token, the `CustomTile`, the `TileServiceManager`, the token and the `ComponentName`.
+1. The `CustomTile` obtains the `TileServices` class from the `QSTileHost` and request the creation
+ of a `TileServiceManager` with its token. As the spec for the `CustomTile` contains
+ the `ComponentName` of the associated service, this can be used to bind to it.
+2. The `TileServiceManager` creates its own `TileLifecycleManager` to take care of binding to the
+ service.
+3. `TileServices` creates maps between the token, the `CustomTile`, the `TileServiceManager`, the
+ token and the `ComponentName`.
## Implementing a tile
-This section describes necessary and recommended steps when implementing a Quick Settings tile. Some of them are optional and depend on the requirements of the tile.
+This section describes necessary and recommended steps when implementing a Quick Settings tile. Some
+of them are optional and depend on the requirements of the tile.
### Implementing a SystemUI tile
-1. Create a class (preferably in [`SystemUI/src/com/android/systemui/qs/tiles`](/packages/SystemUI/src/com/android/systemui/qs/tiles)) implementing `QSTileImpl` with a particular type of `State` as a parameter.
-2. Create an injectable constructor taking a `QSHost` and whichever classes are needed for the tile's operation. Normally this would be other SystemUI controllers.
-3. Implement the methods described in [Abstract methods in QSTileImpl](#abstract-methods-in-qstileimpl). Look at other tiles for help. Some considerations to have in mind:
- * If the tile will not support long click (like the `FlashlightTile`), set `state.handlesLongClick` to `false` (maybe in `newTileState`).
+1. Create a class (preferably
+ in [`SystemUI/src/com/android/systemui/qs/tiles`](/packages/SystemUI/src/com/android/systemui/qs/tiles))
+ implementing `QSTileImpl` with a particular type of `State` as a parameter.
+2. Create an injectable constructor taking a `QSHost` and whichever classes are needed for the
+ tile's operation. Normally this would be other SystemUI controllers.
+3. Implement the methods described
+ in [Abstract methods in QSTileImpl](#abstract-methods-in-qstileimpl). Look at other tiles for
+ help. Some considerations to have in mind:
+ * If the tile will not support long click (like the `FlashlightTile`),
+ set `state.handlesLongClick` to `false` (maybe in `newTileState`).
* Changes to the tile state (either from controllers or from clicks) should call `refreshState`.
- * Use only `handleUpdateState` to modify the values of the state to the new ones. This can be done by polling controllers or through the `arg` parameter.
- * If the controller is not a `CallbackController`, respond to `handleSetListening` by attaching/dettaching from controllers.
+ * Use only `handleUpdateState` to modify the values of the state to the new ones. This can be
+ done by polling controllers or through the `arg` parameter.
+ * If the controller is not a `CallbackController`, respond to `handleSetListening` by
+ attaching/dettaching from controllers.
* Implement `isAvailable` so the tile will not be created when it's not necessary.
-4. Either create a new feature module or find an existing related feature module and add the following binding method:
+4. Either create a new feature module or find an existing related feature module and add the
+ following binding method:
* ```kotlin
@Binds
@IntoMap
@StringKey(YourNewTile.TILE_SPEC) // A unique word that will map to YourNewTile
fun bindYourNewTile(yourNewTile: YourNewTile): QSTileImpl<*>
```
-5. In [SystemUI/res/values/config.xml](/packages/SystemUI/res/values/config.xml), modify `quick_settings_tiles_stock` and add the spec defined in the previous step. If necessary, add it also to `quick_settings_tiles_default`. The first one contains a list of all the tiles that SystemUI knows how to create (to show to the user in the customization screen). The second one contains only the default tiles that the user will experience on a fresh boot or after they reset their tiles.
-6. In [SystemUI/res/values/tiles_states_strings.xml](/packages/SystemUI/res/values/tiles_states_strings.xml), add a new array for your tile. The name has to be `tile_states_<spec>`. Use a good description to help the translators.
-7. In [`SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt), add a new element to the map in `SubtitleArrayMapping` corresponding to the resource created in the previous step.
+5. In [SystemUI/res/values/config.xml](/packages/SystemUI/res/values/config.xml),
+ modify `quick_settings_tiles_stock` and add the spec defined in the previous step. If necessary,
+ add it also to `quick_settings_tiles_default`. The first one contains a list of all the tiles
+ that SystemUI knows how to create (to show to the user in the customization screen). The second
+ one contains only the default tiles that the user will experience on a fresh boot or after they
+ reset their tiles.
+6.
+In [SystemUI/res/values/tiles_states_strings.xml](/packages/SystemUI/res/values/tiles_states_strings.xml),
+add a new array for your tile. The name has to be `tile_states_<spec>`. Use a good description to
+help the translators.
+7.
+In [`SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt),
+add a new element to the map in `SubtitleArrayMapping` corresponding to the resource created in the
+previous step.
#### Abstract methods in QSTileImpl
-Following are methods that need to be implemented when creating a new SystemUI tile. `TState` is a type variable of type `State`.
+Following are methods that need to be implemented when creating a new SystemUI tile. `TState` is a
+type variable of type `State`.
* ```java
public TState newTileState()
```
- Creates a new `State` for this tile to use. Each time the state changes, it is copied into a new one and the corresponding fields are modified. The framework provides `State`, `BooleanState` (has an on and off state and provides this as a content description), `SignalState` (`BooleanState` with `activityIn` and `activityOut`), and `SlashState` (can be rotated or slashed through).
+ Creates a new `State` for this tile to use. Each time the state changes, it is copied into a new
+ one and the corresponding fields are modified. The framework provides `State`, `BooleanState` (has
+ an on and off state and provides this as a content description), `SignalState` (`BooleanState`
+ with `activityIn` and `activityOut`), and `SlashState` (can be rotated or slashed through).
- If a tile has special behavior (no long click, no ripple), it can be set in its state here.
+ If a tile has special behavior (no long click, no ripple), it can be set in its state here.
* ```java
public void handleSetListening(boolean)
```
- Initiates or terminates listening behavior, like listening to Callbacks from controllers. This gets triggered when QS is expanded or collapsed (i.e., when the tile is visible and actionable). Most tiles (like `WifiTile`) do not implement this. Instead, Tiles are LifecycleOwner and are marked as `RESUMED` or `DESTROYED` in `QSTileImpl#handleListening` and handled as part of the lifecycle of [CallbackController](/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackController.java)
+ Initiates or terminates listening behavior, like listening to Callbacks from controllers. This
+ gets triggered when QS is expanded or collapsed (i.e., when the tile is visible and actionable).
+ Most tiles (like `WifiTile`) do not implement this. Instead, Tiles are LifecycleOwner and are
+ marked as `RESUMED` or `DESTROYED` in `QSTileImpl#handleListening` and handled as part of the
+ lifecycle
+ of [CallbackController](/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackController.java)
* ```java
public QSIconView createTileView(Context)
```
- Allows a Tile to use a `QSIconView` different from `QSIconViewImpl` (see [Tile views](#tile-views)), which is the default defined in `QSTileImpl`
+ Allows a Tile to use a `QSIconView` different from `QSIconViewImpl` (
+ see [Tile views](#tile-views)), which is the default defined in `QSTileImpl`
* ```java
public Intent getLongClickIntent()
@@ -350,36 +526,47 @@ Following are methods that need to be implemented when creating a new SystemUI t
protected void handleLongClick()
```
- Handles what to do when the Tile is clicked. In general, a Tile will make calls to its controller here and maybe update its state immediately (by calling `QSTileImpl#refreshState`). A Tile can also decide to ignore the click here, if it's `Tile#STATE_UNAVAILABLE`.
+ Handles what to do when the Tile is clicked. In general, a Tile will make calls to its controller
+ here and maybe update its state immediately (by calling `QSTileImpl#refreshState`). A Tile can
+ also decide to ignore the click here, if it's `Tile#STATE_UNAVAILABLE`.
- By default long click redirects to click and long click launches the intent defined in `getLongClickIntent`.
+ By default long click redirects to click and long click launches the intent defined
+ in `getLongClickIntent`.
* ```java
protected void handleUpdateState(TState, Object)
```
- Updates the `State` of the Tile based on the state of the device as provided by the respective controller. It will be called every time the Tile becomes visible, is interacted with or `QSTileImpl#refreshState` is called. After this is done, the updated state will be reflected in the UI.
+ Updates the `State` of the Tile based on the state of the device as provided by the respective
+ controller. It will be called every time the Tile becomes visible, is interacted with
+ or `QSTileImpl#refreshState` is called. After this is done, the updated state will be reflected in
+ the UI.
* ```java
@Deprecated
public int getMetricsCategory()
```
- ~~Identifier for this Tile, as defined in [proto/src/metrics_constants/metrics_constants.proto](/proto/src/metrics_constants/metrics_constants.proto). This is used to log events related to this Tile.~~
+ ~~Identifier for this Tile, as defined
+ in [proto/src/metrics_constants/metrics_constants.proto](/proto/src/metrics_constants/metrics_constants.proto).
+ This is used to log events related to this Tile.~~
This is now deprecated in favor of `UiEvent` that use the tile spec.
* ```java
public boolean isAvailable()
```
- Determines if a Tile is available to be used (for example, disable `WifiTile` in devices with no Wifi support). If this is false, the Tile will be destroyed upon creation.
+ Determines if a Tile is available to be used (for example, disable `WifiTile` in devices with no
+ Wifi support). If this is false, the Tile will be destroyed upon creation.
* ```java
public CharSequence getTileLabel()
```
- Provides a default label for this Tile. Used by the QS Panel customizer to show a name next to each available tile.
+ Provides a default label for this Tile. Used by the QS Panel customizer to show a name next to
+ each available tile.
### Implementing a third party tile
-For information about this, use the Android Developer documentation for [TileService](https://developer.android.com/reference/android/service/quicksettings/TileService). \ No newline at end of file
+For information about this, use the Android Developer documentation
+for [TileService](https://developer.android.com/reference/android/service/quicksettings/TileService). \ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt
index 3fbcf6d77f82..3fbcf6d77f82 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt
index 74c922561343..74c922561343 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java
index d41c2497b230..d41c2497b230 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinBasedInputViewControllerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
index 80d45bcc23dd..78b854e39d13 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
@@ -22,8 +22,11 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
+import com.android.internal.logging.UiEventLogger
import com.android.internal.util.LatencyTracker
import com.android.internal.widget.LockPatternUtils
+import com.android.internal.widget.LockscreenCredential
+import com.android.keyguard.KeyguardPinViewController.PinBouncerUiEvent
import com.android.keyguard.KeyguardSecurityModel.SecurityMode
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingCollector
@@ -91,6 +94,7 @@ class KeyguardPinViewControllerTest : SysuiTestCase() {
@Mock lateinit var passwordTextView: PasswordTextView
@Mock lateinit var deleteButton: NumPadButton
@Mock lateinit var enterButton: View
+ @Mock lateinit var uiEventLogger: UiEventLogger
@Captor lateinit var postureCallbackCaptor: ArgumentCaptor<DevicePostureController.Callback>
@@ -137,6 +141,7 @@ class KeyguardPinViewControllerTest : SysuiTestCase() {
postureController,
featureFlags,
mSelectedUserInteractor,
+ uiEventLogger
)
}
@@ -251,4 +256,21 @@ class KeyguardPinViewControllerTest : SysuiTestCase() {
verify(lockPatternUtils).getCurrentFailedPasswordAttempts(anyInt())
}
+
+ @Test
+ fun onUserInput_autoConfirmation_attemptsUnlock() {
+ val pinViewController = constructPinViewController(mockKeyguardPinView)
+ whenever(featureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)).thenReturn(true)
+ whenever(lockPatternUtils.getPinLength(anyInt())).thenReturn(6)
+ whenever(lockPatternUtils.isAutoPinConfirmEnabled(anyInt())).thenReturn(true)
+ whenever(passwordTextView.text).thenReturn("000000")
+ whenever(enterButton.visibility).thenReturn(View.INVISIBLE)
+ whenever(mockKeyguardPinView.enteredCredential)
+ .thenReturn(LockscreenCredential.createPin("000000"))
+
+ pinViewController.onUserInput()
+
+ verify(uiEventLogger).log(PinBouncerUiEvent.ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE)
+ verify(keyguardUpdateMonitor).setCredentialAttempted()
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
index 543b2910bbda..543b2910bbda 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
index 156e06843d15..156e06843d15 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityContainerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java
index 7bb6ef1c8895..7bb6ef1c8895 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSecurityViewFlipperControllerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPinViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSimPinViewControllerTest.kt
index 94c3bde29597..94c3bde29597 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPinViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSimPinViewControllerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPukViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSimPukViewControllerTest.kt
index 7b1f302da6e8..7b1f302da6e8 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSimPukViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardSimPukViewControllerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/authentication/data/repository/AuthenticationRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/authentication/data/repository/AuthenticationRepositoryTest.kt
index 64ddbc7828ac..64ddbc7828ac 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/authentication/data/repository/AuthenticationRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/authentication/data/repository/AuthenticationRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt
index 56d3d260d196..56d3d260d196 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
index 602f3dc29491..da97a1283261 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
@@ -1041,8 +1041,9 @@ public class AuthControllerTest extends SysuiTestCase {
mExecution, mCommandQueue, mActivityTaskManager, mWindowManager,
mFingerprintManager, mFaceManager, () -> mUdfpsController,
() -> mSideFpsController, mDisplayManager, mWakefulnessLifecycle,
- mPanelInteractionDetector, mUserManager, mLockPatternUtils, mUdfpsLogger,
- mLogContextInteractor, () -> mBiometricPromptCredentialInteractor,
+ mPanelInteractionDetector, mUserManager, mLockPatternUtils, () -> mUdfpsLogger,
+ () -> mLogContextInteractor,
+ () -> mBiometricPromptCredentialInteractor,
() -> mPromptSelectionInteractor, () -> mCredentialViewModel,
() -> mPromptViewModel, mInteractionJankMonitor, mHandler, mBackgroundExecutor,
mUdfpsUtils, mVibratorHelper);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricDisplayListenerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/BiometricDisplayListenerTest.java
index 714461b715d6..714461b715d6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricDisplayListenerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/BiometricDisplayListenerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt
index 15633d1baed1..15633d1baed1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/BiometricTestExtensions.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/FaceHelpMessageDeferralTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/FaceHelpMessageDeferralTest.kt
index 39f0d570cb26..39f0d570cb26 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/FaceHelpMessageDeferralTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/FaceHelpMessageDeferralTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
index a1b801cd3d3f..a1b801cd3d3f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
index f5b6f14a627c..90d36e7fd814 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
@@ -23,7 +23,6 @@ import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_OTHER
import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_SETTINGS
import android.hardware.biometrics.BiometricOverlayConstants.REASON_ENROLL_ENROLLING
import android.hardware.biometrics.BiometricOverlayConstants.ShowReason
-import android.hardware.fingerprint.FingerprintManager
import android.hardware.fingerprint.IUdfpsOverlayControllerCallback
import android.testing.TestableLooper.RunWithLooper
import android.view.LayoutInflater
@@ -40,6 +39,8 @@ import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams
+import com.android.systemui.biometrics.ui.viewmodel.DefaultUdfpsTouchOverlayViewModel
+import com.android.systemui.biometrics.ui.viewmodel.DeviceEntryUdfpsTouchOverlayViewModel
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.dump.DumpManager
@@ -67,8 +68,8 @@ import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
-import org.mockito.junit.MockitoJUnit
import org.mockito.Mockito.`when` as whenever
+import org.mockito.junit.MockitoJUnit
private const val REQUEST_ID = 2L
@@ -86,7 +87,6 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
@JvmField @Rule var rule = MockitoJUnit.rule()
- @Mock private lateinit var fingerprintManager: FingerprintManager
@Mock private lateinit var inflater: LayoutInflater
@Mock private lateinit var windowManager: WindowManager
@Mock private lateinit var accessibilityManager: AccessibilityManager
@@ -98,8 +98,8 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
@Mock private lateinit var transitionController: LockscreenShadeTransitionController
@Mock private lateinit var configurationController: ConfigurationController
@Mock private lateinit var keyguardStateController: KeyguardStateController
- @Mock private lateinit var unlockedScreenOffAnimationController:
- UnlockedScreenOffAnimationController
+ @Mock
+ private lateinit var unlockedScreenOffAnimationController: UnlockedScreenOffAnimationController
@Mock private lateinit var udfpsDisplayMode: UdfpsDisplayModeProvider
@Mock private lateinit var secureSettings: SecureSettings
@Mock private lateinit var controllerCallback: IUdfpsOverlayControllerCallback
@@ -110,8 +110,12 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
@Mock private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor
@Mock private lateinit var alternateBouncerInteractor: AlternateBouncerInteractor
@Mock private lateinit var mSelectedUserInteractor: SelectedUserInteractor
- @Mock private lateinit var udfpsKeyguardAccessibilityDelegate:
- UdfpsKeyguardAccessibilityDelegate
+ @Mock
+ private lateinit var deviceEntryUdfpsTouchOverlayViewModel:
+ DeviceEntryUdfpsTouchOverlayViewModel
+ @Mock private lateinit var defaultUdfpsTouchOverlayViewModel: DefaultUdfpsTouchOverlayViewModel
+ @Mock
+ private lateinit var udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate
@Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
@Captor private lateinit var layoutParamsCaptor: ArgumentCaptor<WindowManager.LayoutParams>
@@ -121,28 +125,28 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
@Before
fun setup() {
- whenever(inflater.inflate(R.layout.udfps_view, null, false))
- .thenReturn(udfpsView)
+ whenever(inflater.inflate(R.layout.udfps_view, null, false)).thenReturn(udfpsView)
whenever(inflater.inflate(R.layout.udfps_bp_view, null))
- .thenReturn(mock(UdfpsBpView::class.java))
+ .thenReturn(mock(UdfpsBpView::class.java))
whenever(inflater.inflate(R.layout.udfps_keyguard_view_legacy, null))
- .thenReturn(mUdfpsKeyguardViewLegacy)
+ .thenReturn(mUdfpsKeyguardViewLegacy)
whenever(inflater.inflate(R.layout.udfps_fpm_empty_view, null))
- .thenReturn(mock(UdfpsFpmEmptyView::class.java))
+ .thenReturn(mock(UdfpsFpmEmptyView::class.java))
}
private fun withReason(
- @ShowReason reason: Int,
- isDebuggable: Boolean = false,
- enableDeviceEntryUdfpsRefactor: Boolean = false,
- block: () -> Unit,
+ @ShowReason reason: Int,
+ isDebuggable: Boolean = false,
+ enableDeviceEntryUdfpsRefactor: Boolean = false,
+ block: () -> Unit,
) {
if (enableDeviceEntryUdfpsRefactor) {
mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
} else {
mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
}
- controllerOverlay = UdfpsControllerOverlay(
+ controllerOverlay =
+ UdfpsControllerOverlay(
context,
inflater,
windowManager,
@@ -168,108 +172,106 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
udfpsKeyguardAccessibilityDelegate,
keyguardTransitionInteractor,
mSelectedUserInteractor,
- )
+ { deviceEntryUdfpsTouchOverlayViewModel },
+ { defaultUdfpsTouchOverlayViewModel },
+ )
block()
}
- @Test
- fun showUdfpsOverlay_bp() = withReason(REASON_AUTH_BP) { showUdfpsOverlay() }
+ @Test fun showUdfpsOverlay_bp() = withReason(REASON_AUTH_BP) { showUdfpsOverlay() }
@Test
- fun showUdfpsOverlay_keyguard() = withReason(REASON_AUTH_KEYGUARD) {
- showUdfpsOverlay()
- verify(mUdfpsKeyguardViewLegacy).updateSensorLocation(eq(overlayParams.sensorBounds))
- }
+ fun showUdfpsOverlay_keyguard() =
+ withReason(REASON_AUTH_KEYGUARD) {
+ showUdfpsOverlay()
+ verify(mUdfpsKeyguardViewLegacy).updateSensorLocation(eq(overlayParams.sensorBounds))
+ }
- @Test
- fun showUdfpsOverlay_other() = withReason(REASON_AUTH_OTHER) { showUdfpsOverlay() }
+ @Test fun showUdfpsOverlay_other() = withReason(REASON_AUTH_OTHER) { showUdfpsOverlay() }
private fun withRotation(@Rotation rotation: Int, block: () -> Unit) {
// Sensor that's in the top left corner of the display in natural orientation.
val sensorBounds = Rect(0, 0, SENSOR_WIDTH, SENSOR_HEIGHT)
val overlayBounds = Rect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT)
- overlayParams = UdfpsOverlayParams(
+ overlayParams =
+ UdfpsOverlayParams(
sensorBounds,
overlayBounds,
DISPLAY_WIDTH,
DISPLAY_HEIGHT,
scaleFactor = 1f,
rotation
- )
+ )
block()
}
@Test
- fun showUdfpsOverlay_withRotation0() = withRotation(Surface.ROTATION_0) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager).addView(
- eq(controllerOverlay.getTouchOverlay()),
- layoutParamsCaptor.capture()
- )
-
- // ROTATION_0 is the native orientation. Sensor should stay in the top left corner.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_WIDTH)
- assertThat(lp.height).isEqualTo(DISPLAY_HEIGHT)
+ fun showUdfpsOverlay_withRotation0() =
+ withRotation(Surface.ROTATION_0) {
+ withReason(REASON_AUTH_BP) {
+ controllerOverlay.show(udfpsController, overlayParams)
+ verify(windowManager)
+ .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
+
+ // ROTATION_0 is the native orientation. Sensor should stay in the top left corner.
+ val lp = layoutParamsCaptor.value
+ assertThat(lp.x).isEqualTo(0)
+ assertThat(lp.y).isEqualTo(0)
+ assertThat(lp.width).isEqualTo(DISPLAY_WIDTH)
+ assertThat(lp.height).isEqualTo(DISPLAY_HEIGHT)
+ }
}
- }
@Test
- fun showUdfpsOverlay_withRotation180() = withRotation(Surface.ROTATION_180) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager).addView(
- eq(controllerOverlay.getTouchOverlay()),
- layoutParamsCaptor.capture()
- )
-
- // ROTATION_180 is not supported. Sensor should stay in the top left corner.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_WIDTH)
- assertThat(lp.height).isEqualTo(DISPLAY_HEIGHT)
+ fun showUdfpsOverlay_withRotation180() =
+ withRotation(Surface.ROTATION_180) {
+ withReason(REASON_AUTH_BP) {
+ controllerOverlay.show(udfpsController, overlayParams)
+ verify(windowManager)
+ .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
+
+ // ROTATION_180 is not supported. Sensor should stay in the top left corner.
+ val lp = layoutParamsCaptor.value
+ assertThat(lp.x).isEqualTo(0)
+ assertThat(lp.y).isEqualTo(0)
+ assertThat(lp.width).isEqualTo(DISPLAY_WIDTH)
+ assertThat(lp.height).isEqualTo(DISPLAY_HEIGHT)
+ }
}
- }
@Test
- fun showUdfpsOverlay_withRotation90() = withRotation(Surface.ROTATION_90) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager).addView(
- eq(controllerOverlay.getTouchOverlay()),
- layoutParamsCaptor.capture()
- )
-
- // Sensor should be in the bottom left corner in ROTATION_90.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_HEIGHT)
- assertThat(lp.height).isEqualTo(DISPLAY_WIDTH)
+ fun showUdfpsOverlay_withRotation90() =
+ withRotation(Surface.ROTATION_90) {
+ withReason(REASON_AUTH_BP) {
+ controllerOverlay.show(udfpsController, overlayParams)
+ verify(windowManager)
+ .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
+
+ // Sensor should be in the bottom left corner in ROTATION_90.
+ val lp = layoutParamsCaptor.value
+ assertThat(lp.x).isEqualTo(0)
+ assertThat(lp.y).isEqualTo(0)
+ assertThat(lp.width).isEqualTo(DISPLAY_HEIGHT)
+ assertThat(lp.height).isEqualTo(DISPLAY_WIDTH)
+ }
}
- }
@Test
- fun showUdfpsOverlay_withRotation270() = withRotation(Surface.ROTATION_270) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager).addView(
- eq(controllerOverlay.getTouchOverlay()),
- layoutParamsCaptor.capture()
- )
-
- // Sensor should be in the top right corner in ROTATION_270.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_HEIGHT)
- assertThat(lp.height).isEqualTo(DISPLAY_WIDTH)
+ fun showUdfpsOverlay_withRotation270() =
+ withRotation(Surface.ROTATION_270) {
+ withReason(REASON_AUTH_BP) {
+ controllerOverlay.show(udfpsController, overlayParams)
+ verify(windowManager)
+ .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
+
+ // Sensor should be in the top right corner in ROTATION_270.
+ val lp = layoutParamsCaptor.value
+ assertThat(lp.x).isEqualTo(0)
+ assertThat(lp.y).isEqualTo(0)
+ assertThat(lp.width).isEqualTo(DISPLAY_HEIGHT)
+ assertThat(lp.height).isEqualTo(DISPLAY_WIDTH)
+ }
}
- }
private fun showUdfpsOverlay() {
val didShow = controllerOverlay.show(udfpsController, overlayParams)
@@ -285,17 +287,13 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
assertThat(controllerOverlay.getTouchOverlay()).isNotNull()
}
- @Test
- fun hideUdfpsOverlay_bp() = withReason(REASON_AUTH_BP) { hideUdfpsOverlay() }
+ @Test fun hideUdfpsOverlay_bp() = withReason(REASON_AUTH_BP) { hideUdfpsOverlay() }
- @Test
- fun hideUdfpsOverlay_keyguard() = withReason(REASON_AUTH_KEYGUARD) { hideUdfpsOverlay() }
+ @Test fun hideUdfpsOverlay_keyguard() = withReason(REASON_AUTH_KEYGUARD) { hideUdfpsOverlay() }
- @Test
- fun hideUdfpsOverlay_settings() = withReason(REASON_AUTH_SETTINGS) { hideUdfpsOverlay() }
+ @Test fun hideUdfpsOverlay_settings() = withReason(REASON_AUTH_SETTINGS) { hideUdfpsOverlay() }
- @Test
- fun hideUdfpsOverlay_other() = withReason(REASON_AUTH_OTHER) { hideUdfpsOverlay() }
+ @Test fun hideUdfpsOverlay_other() = withReason(REASON_AUTH_OTHER) { hideUdfpsOverlay() }
private fun hideUdfpsOverlay() {
val didShow = controllerOverlay.show(udfpsController, overlayParams)
@@ -313,53 +311,54 @@ class UdfpsControllerOverlayTest : SysuiTestCase() {
}
@Test
- fun canNotHide() = withReason(REASON_AUTH_BP) {
- assertThat(controllerOverlay.hide()).isFalse()
- }
+ fun canNotHide() = withReason(REASON_AUTH_BP) { assertThat(controllerOverlay.hide()).isFalse() }
@Test
- fun canNotReshow() = withReason(REASON_AUTH_BP) {
- assertThat(controllerOverlay.show(udfpsController, overlayParams)).isTrue()
- assertThat(controllerOverlay.show(udfpsController, overlayParams)).isFalse()
- }
+ fun canNotReshow() =
+ withReason(REASON_AUTH_BP) {
+ assertThat(controllerOverlay.show(udfpsController, overlayParams)).isTrue()
+ assertThat(controllerOverlay.show(udfpsController, overlayParams)).isFalse()
+ }
@Test
- fun cancels() = withReason(REASON_AUTH_BP) {
- controllerOverlay.cancel()
- verify(controllerCallback).onUserCanceled()
- }
+ fun cancels() =
+ withReason(REASON_AUTH_BP) {
+ controllerOverlay.cancel()
+ verify(controllerCallback).onUserCanceled()
+ }
@Test
- fun unconfigureDisplayOnHide() = withReason(REASON_AUTH_BP) {
- whenever(udfpsView.isDisplayConfigured).thenReturn(true)
+ fun unconfigureDisplayOnHide() =
+ withReason(REASON_AUTH_BP) {
+ whenever(udfpsView.isDisplayConfigured).thenReturn(true)
- controllerOverlay.show(udfpsController, overlayParams)
- controllerOverlay.hide()
- verify(udfpsView).unconfigureDisplay()
- }
+ controllerOverlay.show(udfpsController, overlayParams)
+ controllerOverlay.hide()
+ verify(udfpsView).unconfigureDisplay()
+ }
@Test
- fun matchesRequestIds() = withReason(REASON_AUTH_BP) {
- assertThat(controllerOverlay.matchesRequestId(REQUEST_ID)).isTrue()
- assertThat(controllerOverlay.matchesRequestId(REQUEST_ID + 1)).isFalse()
- }
+ fun matchesRequestIds() =
+ withReason(REASON_AUTH_BP) {
+ assertThat(controllerOverlay.matchesRequestId(REQUEST_ID)).isTrue()
+ assertThat(controllerOverlay.matchesRequestId(REQUEST_ID + 1)).isFalse()
+ }
@Test
- fun smallOverlayOnEnrollmentWithA11y() = withRotation(Surface.ROTATION_0) {
- withReason(REASON_ENROLL_ENROLLING) {
- // When a11y enabled during enrollment
- whenever(accessibilityManager.isTouchExplorationEnabled).thenReturn(true)
-
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager).addView(
- eq(controllerOverlay.getTouchOverlay()),
- layoutParamsCaptor.capture()
- )
-
- // Layout params should use sensor bounds
- val lp = layoutParamsCaptor.value
- assertThat(lp.width).isEqualTo(overlayParams.sensorBounds.width())
- assertThat(lp.height).isEqualTo(overlayParams.sensorBounds.height())
+ fun smallOverlayOnEnrollmentWithA11y() =
+ withRotation(Surface.ROTATION_0) {
+ withReason(REASON_ENROLL_ENROLLING) {
+ // When a11y enabled during enrollment
+ whenever(accessibilityManager.isTouchExplorationEnabled).thenReturn(true)
+
+ controllerOverlay.show(udfpsController, overlayParams)
+ verify(windowManager)
+ .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
+
+ // Layout params should use sensor bounds
+ val lp = layoutParamsCaptor.value
+ assertThat(lp.width).isEqualTo(overlayParams.sensorBounds.width())
+ assertThat(lp.height).isEqualTo(overlayParams.sensorBounds.height())
+ }
}
- }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index e2cab29c473c..97ee526b7108 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -81,6 +81,8 @@ import com.android.systemui.biometrics.udfps.InteractionEvent;
import com.android.systemui.biometrics.udfps.NormalizedTouchData;
import com.android.systemui.biometrics.udfps.SinglePointerTouchProcessor;
import com.android.systemui.biometrics.udfps.TouchProcessorResult;
+import com.android.systemui.biometrics.ui.viewmodel.DefaultUdfpsTouchOverlayViewModel;
+import com.android.systemui.biometrics.ui.viewmodel.DeviceEntryUdfpsTouchOverlayViewModel;
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
import com.android.systemui.dump.DumpManager;
@@ -106,6 +108,8 @@ import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
import com.android.systemui.util.time.SystemClock;
+import dagger.Lazy;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -241,6 +245,10 @@ public class UdfpsControllerTest extends SysuiTestCase {
private FpsUnlockTracker mFpsUnlockTracker;
@Mock
private KeyguardTransitionInteractor mKeyguardTransitionInteractor;
+ @Mock
+ private Lazy<DeviceEntryUdfpsTouchOverlayViewModel> mDeviceEntryUdfpsTouchOverlayViewModel;
+ @Mock
+ private Lazy<DefaultUdfpsTouchOverlayViewModel> mDefaultUdfpsTouchOverlayViewModel;
@Before
public void setUp() {
@@ -334,7 +342,10 @@ public class UdfpsControllerTest extends SysuiTestCase {
mUdfpsKeyguardViewModels,
mSelectedUserInteractor,
mFpsUnlockTracker,
- mKeyguardTransitionInteractor
+ mKeyguardTransitionInteractor,
+ mDeviceEntryUdfpsTouchOverlayViewModel,
+ mDefaultUdfpsTouchOverlayViewModel
+
);
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
mOverlayController = mOverlayCaptor.getValue();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java
index cd9189bef7f1..cd9189bef7f1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsDialogMeasureAdapterTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDisplayModeTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsDisplayModeTest.java
index 5239966f1923..5239966f1923 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsDisplayModeTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsDisplayModeTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java
index 2ea803c6aa8f..ac16c135e6a1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.Flags;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
@@ -94,6 +95,7 @@ public class UdfpsKeyguardViewLegacyControllerBaseTest extends SysuiTestCase {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR);
when(mView.getContext()).thenReturn(mResourceContext);
when(mResourceContext.getString(anyInt())).thenReturn("test string");
when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerTest.java
index 98d8b054716c..98d8b054716c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt
index 79f062536404..cbb772f49c93 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt
@@ -396,7 +396,7 @@ class UdfpsKeyguardViewLegacyControllerWithCoroutinesTest :
.onDozeAmountChanged(
eq(.3f),
eq(.3f),
- eq(UdfpsKeyguardViewLegacy.ANIMATION_UNLOCKED_SCREEN_OFF)
+ eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
)
transitionRepository.sendTransitionStep(
@@ -413,9 +413,130 @@ class UdfpsKeyguardViewLegacyControllerWithCoroutinesTest :
.onDozeAmountChanged(
eq(1f),
eq(1f),
- eq(UdfpsKeyguardViewLegacy.ANIMATION_UNLOCKED_SCREEN_OFF)
+ eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
)
job.cancel()
}
+
+ @Test
+ fun aodToOccluded_dozeAmountChanged() =
+ testScope.runTest {
+ // GIVEN view is attached
+ mController.onViewAttached()
+ Mockito.reset(mView)
+
+ val job = mController.listenForAodToOccludedTransitions(this)
+
+ // WHEN transitioning from aod to occluded
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.AOD,
+ to = KeyguardState.OCCLUDED,
+ value = .3f,
+ transitionState = TransitionState.RUNNING
+ )
+ )
+ runCurrent()
+ // THEN doze amount is updated
+ verify(mView)
+ .onDozeAmountChanged(eq(.7f), eq(.7f), eq(UdfpsKeyguardViewLegacy.ANIMATION_NONE))
+
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.AOD,
+ to = KeyguardState.OCCLUDED,
+ value = 1f,
+ transitionState = TransitionState.FINISHED
+ )
+ )
+ runCurrent()
+ // THEN doze amount is updated
+ verify(mView)
+ .onDozeAmountChanged(eq(0f), eq(0f), eq(UdfpsKeyguardViewLegacy.ANIMATION_NONE))
+
+ job.cancel()
+ }
+
+ @Test
+ fun occludedToAod_dozeAmountChanged() =
+ testScope.runTest {
+ // GIVEN view is attached
+ mController.onViewAttached()
+ Mockito.reset(mView)
+
+ val job = mController.listenForOccludedToAodTransition(this)
+
+ // WHEN transitioning from occluded to aod
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.OCCLUDED,
+ to = KeyguardState.AOD,
+ value = .3f,
+ transitionState = TransitionState.RUNNING
+ )
+ )
+ runCurrent()
+ // THEN doze amount is updated
+ verify(mView)
+ .onDozeAmountChanged(
+ eq(.3f),
+ eq(.3f),
+ eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
+ )
+
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.OCCLUDED,
+ to = KeyguardState.AOD,
+ value = 1f,
+ transitionState = TransitionState.FINISHED
+ )
+ )
+ runCurrent()
+ // THEN doze amount is updated
+ verify(mView)
+ .onDozeAmountChanged(
+ eq(1f),
+ eq(1f),
+ eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
+ )
+
+ job.cancel()
+ }
+
+ @Test
+ fun cancelledAodToLockscreen_dozeAmountChangedToZero() =
+ testScope.runTest {
+ // GIVEN view is attached
+ mController.onViewAttached()
+ Mockito.reset(mView)
+
+ val job = mController.listenForLockscreenAodTransitions(this)
+ // WHEN aod to lockscreen transition is cancelled
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.AOD,
+ to = KeyguardState.LOCKSCREEN,
+ value = 1f,
+ transitionState = TransitionState.CANCELED
+ )
+ )
+ runCurrent()
+ // ... and WHEN the next transition is from lockscreen => occluded
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.LOCKSCREEN,
+ to = KeyguardState.OCCLUDED,
+ value = .4f,
+ transitionState = TransitionState.STARTED
+ )
+ )
+ runCurrent()
+
+ // THEN doze amount is updated to zero
+ verify(mView)
+ .onDozeAmountChanged(eq(0f), eq(0f), eq(UdfpsKeyguardViewLegacy.ANIMATION_NONE))
+ job.cancel()
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsShellTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsShellTest.kt
index 8b374ae54127..8b374ae54127 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsShellTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsShellTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsViewTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsViewTest.kt
index 9fbe09619ff1..9fbe09619ff1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsViewTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsViewTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/data/repository/SimBouncerRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/data/repository/SimBouncerRepositoryTest.kt
index b391b5a45799..b391b5a45799 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/data/repository/SimBouncerRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/data/repository/SimBouncerRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
index f0d26b6bbb78..0870122594b1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
@@ -37,6 +37,7 @@ import kotlinx.coroutines.test.TestScope
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
+import org.junit.Ignore
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
@@ -166,6 +167,7 @@ class AlternateBouncerInteractorTest : SysuiTestCase() {
}
@Test
+ @Ignore("b/287599719")
fun canShowAlternateBouncerForFingerprint_rearFps() {
mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
initializeUnderTest()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorTest.kt
index 1e8073246f98..83fb17fa50e4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractorTest.kt
@@ -319,10 +319,10 @@ class BouncerInteractorTest : SysuiTestCase() {
@Test
fun imeHiddenEvent_isTriggered() =
testScope.runTest {
- val imeHiddenEvent by collectLastValue(underTest.onImeHidden)
+ val imeHiddenEvent by collectLastValue(underTest.onImeHiddenByUser)
runCurrent()
- underTest.onImeHidden()
+ underTest.onImeHiddenByUser()
runCurrent()
assertThat(imeHiddenEvent).isNotNull()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerCallbackInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerCallbackInteractorTest.kt
index 4aea4f329858..4aea4f329858 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerCallbackInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerCallbackInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorWithCoroutinesTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorWithCoroutinesTest.kt
index bdf5041f8a38..bdf5041f8a38 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorWithCoroutinesTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorWithCoroutinesTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractorTest.kt
index 8c53c0e3f267..8c53c0e3f267 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModelTest.kt
index 63c992bd7854..45c186dc3a77 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModelTest.kt
@@ -23,8 +23,6 @@ import com.android.systemui.authentication.data.repository.FakeAuthenticationRep
import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.scene.SceneTestUtils
-import com.android.systemui.scene.shared.model.SceneKey
-import com.android.systemui.scene.shared.model.SceneModel
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runTest
@@ -76,18 +74,4 @@ class AuthMethodBouncerViewModelTest : SysuiTestCase() {
underTest.onAuthenticateButtonClicked()
assertThat(animateFailure).isFalse()
}
-
- @Test
- fun onImeVisibilityChanged() =
- testScope.runTest {
- sceneInteractor.changeScene(SceneModel(SceneKey.Bouncer), "")
- sceneInteractor.onSceneChanged(SceneModel(SceneKey.Bouncer), "")
- val onImeHidden by collectLastValue(bouncerInteractor.onImeHidden)
-
- underTest.onImeVisibilityChanged(true)
- assertThat(onImeHidden).isNull()
-
- underTest.onImeVisibilityChanged(false)
- assertThat(onImeHidden).isNotNull()
- }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelTest.kt
index 75d6a007b4aa..75d6a007b4aa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModelTest.kt
index 90e0c19b7c65..90e0c19b7c65 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/KeyguardBouncerViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt
index 9b1e9585979a..937c703d6775 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt
@@ -20,7 +20,9 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
+import com.android.systemui.authentication.shared.model.AuthenticationThrottlingModel
import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.coroutines.collectValues
import com.android.systemui.res.R
import com.android.systemui.scene.SceneTestUtils
import com.android.systemui.scene.shared.model.SceneKey
@@ -43,7 +45,11 @@ class PasswordBouncerViewModelTest : SysuiTestCase() {
private val utils = SceneTestUtils(this)
private val testScope = utils.testScope
- private val authenticationInteractor = utils.authenticationInteractor()
+ private val authenticationRepository = utils.authenticationRepository
+ private val authenticationInteractor =
+ utils.authenticationInteractor(
+ repository = authenticationRepository,
+ )
private val sceneInteractor = utils.sceneInteractor()
private val bouncerInteractor =
utils.bouncerInteractor(
@@ -207,6 +213,101 @@ class PasswordBouncerViewModelTest : SysuiTestCase() {
assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer))
}
+ @Test
+ fun onImeVisibilityChanged_false_doesNothing() =
+ testScope.runTest {
+ val events by collectValues(bouncerInteractor.onImeHiddenByUser)
+ assertThat(events).isEmpty()
+
+ underTest.onImeVisibilityChanged(isVisible = false)
+ assertThat(events).isEmpty()
+ }
+
+ @Test
+ fun onImeVisibilityChanged_falseAfterTrue_emitsOnImeHiddenByUserEvent() =
+ testScope.runTest {
+ val events by collectValues(bouncerInteractor.onImeHiddenByUser)
+ assertThat(events).isEmpty()
+
+ underTest.onImeVisibilityChanged(isVisible = true)
+ assertThat(events).isEmpty()
+
+ underTest.onImeVisibilityChanged(isVisible = false)
+ assertThat(events).hasSize(1)
+
+ underTest.onImeVisibilityChanged(isVisible = true)
+ assertThat(events).hasSize(1)
+
+ underTest.onImeVisibilityChanged(isVisible = false)
+ assertThat(events).hasSize(2)
+ }
+
+ @Test
+ fun onImeVisibilityChanged_falseAfterTrue_whileThrottling_doesNothing() =
+ testScope.runTest {
+ val events by collectValues(bouncerInteractor.onImeHiddenByUser)
+ assertThat(events).isEmpty()
+ underTest.onImeVisibilityChanged(isVisible = true)
+ setThrottling(true)
+
+ underTest.onImeVisibilityChanged(isVisible = false)
+
+ assertThat(events).isEmpty()
+ }
+
+ @Test
+ fun isTextFieldFocusRequested_initiallyTrue() =
+ testScope.runTest {
+ val isTextFieldFocusRequested by collectLastValue(underTest.isTextFieldFocusRequested)
+ assertThat(isTextFieldFocusRequested).isTrue()
+ }
+
+ @Test
+ fun isTextFieldFocusRequested_focusGained_becomesFalse() =
+ testScope.runTest {
+ val isTextFieldFocusRequested by collectLastValue(underTest.isTextFieldFocusRequested)
+
+ underTest.onTextFieldFocusChanged(isFocused = true)
+
+ assertThat(isTextFieldFocusRequested).isFalse()
+ }
+
+ @Test
+ fun isTextFieldFocusRequested_focusLost_becomesTrue() =
+ testScope.runTest {
+ val isTextFieldFocusRequested by collectLastValue(underTest.isTextFieldFocusRequested)
+ underTest.onTextFieldFocusChanged(isFocused = true)
+
+ underTest.onTextFieldFocusChanged(isFocused = false)
+
+ assertThat(isTextFieldFocusRequested).isTrue()
+ }
+
+ @Test
+ fun isTextFieldFocusRequested_focusLostWhileThrottling_staysFalse() =
+ testScope.runTest {
+ val isTextFieldFocusRequested by collectLastValue(underTest.isTextFieldFocusRequested)
+ underTest.onTextFieldFocusChanged(isFocused = true)
+ setThrottling(true)
+
+ underTest.onTextFieldFocusChanged(isFocused = false)
+
+ assertThat(isTextFieldFocusRequested).isFalse()
+ }
+
+ @Test
+ fun isTextFieldFocusRequested_throttlingCountdownEnds_becomesTrue() =
+ testScope.runTest {
+ val isTextFieldFocusRequested by collectLastValue(underTest.isTextFieldFocusRequested)
+ underTest.onTextFieldFocusChanged(isFocused = true)
+ setThrottling(true)
+ underTest.onTextFieldFocusChanged(isFocused = false)
+
+ setThrottling(false)
+
+ assertThat(isTextFieldFocusRequested).isTrue()
+ }
+
private fun TestScope.switchToScene(toScene: SceneKey) {
val currentScene by collectLastValue(sceneInteractor.desiredScene)
val bouncerShown = currentScene?.key != SceneKey.Bouncer && toScene == SceneKey.Bouncer
@@ -226,6 +327,35 @@ class PasswordBouncerViewModelTest : SysuiTestCase() {
switchToScene(SceneKey.Bouncer)
}
+ private suspend fun TestScope.setThrottling(
+ isThrottling: Boolean,
+ failedAttemptCount: Int = 5,
+ ) {
+ if (isThrottling) {
+ repeat(failedAttemptCount) {
+ authenticationRepository.reportAuthenticationAttempt(false)
+ }
+ val remainingTimeMs = 30_000
+ authenticationRepository.setThrottleDuration(remainingTimeMs)
+ authenticationRepository.setThrottling(
+ AuthenticationThrottlingModel(
+ failedAttemptCount = failedAttemptCount,
+ remainingMs = remainingTimeMs,
+ )
+ )
+ } else {
+ authenticationRepository.reportAuthenticationAttempt(true)
+ authenticationRepository.setThrottling(
+ AuthenticationThrottlingModel(
+ failedAttemptCount = failedAttemptCount,
+ remainingMs = 0,
+ )
+ )
+ }
+
+ runCurrent()
+ }
+
companion object {
private const val ENTER_YOUR_PASSWORD = "Enter your password"
private const val WRONG_PASSWORD = "Wrong password"
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt
index 862c39c9d4cc..862c39c9d4cc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt
index c30e405ab911..c30e405ab911 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PinInputViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinInputViewModelTest.kt
index 55016bb1fc07..55016bb1fc07 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/viewmodel/PinInputViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PinInputViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt
index 182712a13174..182712a13174 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/data/repository/CommunalWidgetRepositoryImplTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt
index 16cfa2398fd5..16cfa2398fd5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/domain/interactor/CommunalInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/ui/view/layout/blueprints/DefaultCommunalBlueprintTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/view/layout/blueprints/DefaultCommunalBlueprintTest.kt
index a49629252520..a49629252520 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/communal/ui/view/layout/blueprints/DefaultCommunalBlueprintTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/view/layout/blueprints/DefaultCommunalBlueprintTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepositoryTest.kt
index 97ac8c62d69d..97ac8c62d69d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/data/repository/DeviceEntryRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt
index 910097eece52..910097eece52 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dock/DockManagerFake.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dock/DockManagerFake.java
index 37540621557f..37540621557f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dock/DockManagerFake.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dock/DockManagerFake.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayAnimationsControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayAnimationsControllerTest.kt
index 8a35ef11a364..8a35ef11a364 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayAnimationsControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayAnimationsControllerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayCallbackControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayCallbackControllerTest.kt
index 2c6c793c97f5..2c6c793c97f5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayCallbackControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayCallbackControllerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
index 2af6566e993a..2af6566e993a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayNotificationCountProviderTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayNotificationCountProviderTest.java
index d379dc6f3dc1..d379dc6f3dc1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayNotificationCountProviderTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayNotificationCountProviderTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
index e5f997257cfa..e5f997257cfa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java
index 6d5cd49b8af6..6d5cd49b8af6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarItemsProviderTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayStatusBarItemsProviderTest.java
index 7ff345cdcf7e..7ff345cdcf7e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarItemsProviderTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayStatusBarItemsProviderTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java
index 39db2beb4c44..39db2beb4c44 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/HideComplicationTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/complication/HideComplicationTouchHandlerTest.java
index 315a24bfd945..315a24bfd945 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/HideComplicationTouchHandlerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/complication/HideComplicationTouchHandlerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/conditions/AssistantAttentionConditionTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/conditions/AssistantAttentionConditionTest.java
index e0c6ab20c6e1..e0c6ab20c6e1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/conditions/AssistantAttentionConditionTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/conditions/AssistantAttentionConditionTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/conditions/DreamConditionTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/conditions/DreamConditionTest.java
index 480754c17616..480754c17616 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/conditions/DreamConditionTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/conditions/DreamConditionTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java
index 3d1efa59a11b..3d1efa59a11b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/ShadeTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/ShadeTouchHandlerTest.java
index 6aa821f15ab1..6aa821f15ab1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/ShadeTouchHandlerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/ShadeTouchHandlerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/scrim/BouncerlessScrimControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/scrim/BouncerlessScrimControllerTest.java
index 017fdbe8ac01..017fdbe8ac01 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/scrim/BouncerlessScrimControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/scrim/BouncerlessScrimControllerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/scrim/ScrimManagerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/scrim/ScrimManagerTest.java
index 4ee4a60fbeaf..4ee4a60fbeaf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/scrim/ScrimManagerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/touch/scrim/ScrimManagerTest.java
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferHelper.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/dump/LogBufferHelper.kt
index 0538227abd3f..0538227abd3f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferHelper.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dump/LogBufferHelper.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfigTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfigTest.kt
index 977f1db44258..977f1db44258 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfigTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfigTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt
index 548b5646f5d4..548b5646f5d4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfigTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfigTest.kt
index 4ae144c03314..4ae144c03314 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfigTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfigTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigTest.kt
index 7d68cc0a3560..7d68cc0a3560 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLegacySettingSyncerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLegacySettingSyncerTest.kt
index 26fcb234843d..26fcb234843d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLegacySettingSyncerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLegacySettingSyncerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLocalUserSelectionManagerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLocalUserSelectionManagerTest.kt
index 99a01858471c..99a01858471c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLocalUserSelectionManagerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLocalUserSelectionManagerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceRemoteUserSelectionManagerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceRemoteUserSelectionManagerTest.kt
index a1c9f87ee7bc..a1c9f87ee7bc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceRemoteUserSelectionManagerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceRemoteUserSelectionManagerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfigTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfigTest.kt
index b15352bfe6ab..b15352bfe6ab 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfigTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfigTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/QrCodeScannerKeyguardQuickAffordanceConfigTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/QrCodeScannerKeyguardQuickAffordanceConfigTest.kt
index 521dea34513e..521dea34513e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/QrCodeScannerKeyguardQuickAffordanceConfigTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/QrCodeScannerKeyguardQuickAffordanceConfigTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfigTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfigTest.kt
index 02db0d7a9a50..a613ad8852f6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfigTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfigTest.kt
@@ -29,17 +29,16 @@ import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.animation.Expandable
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.wallet.controller.QuickAccessWalletController
import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
-import kotlinx.coroutines.test.runBlockingTest
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestDispatcher
+import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
@@ -48,7 +47,6 @@ import org.mockito.Mock
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
-@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class QuickAccessWalletKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
@@ -56,26 +54,32 @@ class QuickAccessWalletKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
@Mock private lateinit var walletController: QuickAccessWalletController
@Mock private lateinit var activityStarter: ActivityStarter
+ private lateinit var testDispatcher: TestDispatcher
+ private lateinit var testScope: TestScope
+
private lateinit var underTest: QuickAccessWalletKeyguardQuickAffordanceConfig
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
+ testDispatcher = StandardTestDispatcher()
+ testScope = TestScope(testDispatcher)
+
underTest =
QuickAccessWalletKeyguardQuickAffordanceConfig(
context,
+ testDispatcher,
walletController,
activityStarter,
)
}
@Test
- fun affordance_keyguardShowing_hasWalletCard_visibleModel() = runBlockingTest {
+ fun affordance_keyguardShowing_hasWalletCard_visibleModel() = testScope.runTest {
setUpState()
- var latest: KeyguardQuickAffordanceConfig.LockScreenState? = null
- val job = underTest.lockScreenState.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.lockScreenState)
val visibleModel = latest as KeyguardQuickAffordanceConfig.LockScreenState.Visible
assertThat(visibleModel.icon)
@@ -88,77 +92,61 @@ class QuickAccessWalletKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
),
)
)
- job.cancel()
}
@Test
- fun affordance_keyguardShowing_hasNonPaymentCard_modelIsNone() =
- runTest(UnconfinedTestDispatcher()) {
+ fun affordance_keyguardShowing_hasNonPaymentCard_modelIsNone() = testScope.runTest {
setUpState(cardType = WalletCard.CARD_TYPE_NON_PAYMENT)
- var latest: KeyguardQuickAffordanceConfig.LockScreenState? = null
- val job = underTest.lockScreenState.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.lockScreenState)
assertThat(latest).isEqualTo(KeyguardQuickAffordanceConfig.LockScreenState.Hidden)
- job.cancel()
}
@Test
- fun affordance_keyguardShowing_hasPaymentCard_visibleModel() =
- runTest(UnconfinedTestDispatcher()) {
- setUpState(cardType = WalletCard.CARD_TYPE_PAYMENT)
- var latest: KeyguardQuickAffordanceConfig.LockScreenState? = null
-
- val job = underTest.lockScreenState.onEach { latest = it }.launchIn(this)
-
- val visibleModel = latest as KeyguardQuickAffordanceConfig.LockScreenState.Visible
- assertThat(visibleModel.icon)
- .isEqualTo(
- Icon.Loaded(
- drawable = ICON,
- contentDescription =
- ContentDescription.Resource(
- res = R.string.accessibility_wallet_button,
- ),
- )
+ fun affordance_keyguardShowing_hasPaymentCard_visibleModel() = testScope.runTest {
+ setUpState(cardType = WalletCard.CARD_TYPE_PAYMENT)
+
+ val latest by collectLastValue(underTest.lockScreenState)
+
+ val visibleModel = latest as KeyguardQuickAffordanceConfig.LockScreenState.Visible
+ assertThat(visibleModel.icon)
+ .isEqualTo(
+ Icon.Loaded(
+ drawable = ICON,
+ contentDescription =
+ ContentDescription.Resource(
+ res = R.string.accessibility_wallet_button,
+ ),
)
- job.cancel()
- }
+ )
+ }
@Test
- fun affordance_walletFeatureNotEnabled_modelIsNone() = runBlockingTest {
+ fun affordance_walletFeatureNotEnabled_modelIsNone() = testScope.runTest {
setUpState(isWalletFeatureAvailable = false)
- var latest: KeyguardQuickAffordanceConfig.LockScreenState? = null
- val job = underTest.lockScreenState.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.lockScreenState)
assertThat(latest).isEqualTo(KeyguardQuickAffordanceConfig.LockScreenState.Hidden)
-
- job.cancel()
}
@Test
- fun affordance_queryNotSuccessful_modelIsNone() = runBlockingTest {
+ fun affordance_queryNotSuccessful_modelIsNone() = testScope.runTest {
setUpState(isWalletQuerySuccessful = false)
- var latest: KeyguardQuickAffordanceConfig.LockScreenState? = null
- val job = underTest.lockScreenState.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.lockScreenState)
assertThat(latest).isEqualTo(KeyguardQuickAffordanceConfig.LockScreenState.Hidden)
-
- job.cancel()
}
@Test
- fun affordance_noSelectedCard_modelIsNone() = runBlockingTest {
+ fun affordance_noSelectedCard_modelIsNone() = testScope.runTest {
setUpState(hasSelectedCard = false)
- var latest: KeyguardQuickAffordanceConfig.LockScreenState? = null
- val job = underTest.lockScreenState.onEach { latest = it }.launchIn(this)
+ val latest by collectLastValue(underTest.lockScreenState)
assertThat(latest).isEqualTo(KeyguardQuickAffordanceConfig.LockScreenState.Hidden)
-
- job.cancel()
}
@Test
@@ -179,7 +167,7 @@ class QuickAccessWalletKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
}
@Test
- fun getPickerScreenState_default() = runTest {
+ fun getPickerScreenState_default() = testScope.runTest {
setUpState()
assertThat(underTest.getPickerScreenState())
@@ -187,7 +175,7 @@ class QuickAccessWalletKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
}
@Test
- fun getPickerScreenState_unavailable() = runTest {
+ fun getPickerScreenState_unavailable() = testScope.runTest {
setUpState(
isWalletServiceAvailable = false,
)
@@ -197,7 +185,7 @@ class QuickAccessWalletKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
}
@Test
- fun getPickerScreenState_disabledWhenTheFeatureIsNotEnabled() = runTest {
+ fun getPickerScreenState_disabledWhenTheFeatureIsNotEnabled() = testScope.runTest {
setUpState(
isWalletFeatureAvailable = false,
)
@@ -207,7 +195,7 @@ class QuickAccessWalletKeyguardQuickAffordanceConfigTest : SysuiTestCase() {
}
@Test
- fun getPickerScreenState_disabledWhenThereIsNoCard() = runTest {
+ fun getPickerScreenState_disabledWhenThereIsNoCard() = testScope.runTest {
setUpState(
hasSelectedCard = false,
)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/VideoCameraQuickAffordanceConfigTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/VideoCameraQuickAffordanceConfigTest.kt
index a9b9c9011636..a9b9c9011636 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/VideoCameraQuickAffordanceConfigTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/quickaffordance/VideoCameraQuickAffordanceConfigTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt
index 4587ea6dbdc8..4587ea6dbdc8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt
index 45aca175657e..45aca175657e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt
index 2b7221ec192c..2b7221ec192c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryTest.kt
index ae6c5b7b36b0..ae6c5b7b36b0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/DevicePostureRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt
index 567e0a9717fc..567e0a9717fc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt
index 6c4bb372bc3a..6c4bb372bc3a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepositoryTest.kt
index 7242cb20dc77..7242cb20dc77 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/TrustRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/TrustRepositoryTest.kt
index ee47c58f4002..ee47c58f4002 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/TrustRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/TrustRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
index 706f94e412ac..706f94e412ac 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLongPressInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLongPressInteractorTest.kt
index 98f0211587ea..98f0211587ea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLongPressInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLongPressInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt
index bc4bae0ed959..bc4bae0ed959 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt
index 4f7d9444020c..4f7d9444020c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractorTest.kt
index b483085cf1e5..b483085cf1e5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelTest.kt
index fd125e099f1b..fd125e099f1b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelTest.kt
index cf2012989624..cf2012989624 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt
index d07836d3abce..d07836d3abce 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenSceneViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelTest.kt
index ba72b4c95a44..ba72b4c95a44 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
index 3536d5c77c93..3536d5c77c93 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt
index d0772270ed5e..d0772270ed5e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt
index 6cab023d59b0..6cab023d59b0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/AutoAddSettingsRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/AutoAddSettingsRepositoryTest.kt
index d277fcab3690..d277fcab3690 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/AutoAddSettingsRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/AutoAddSettingsRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedSharedPreferencesRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedSharedPreferencesRepositoryTest.kt
index 3db676d68f42..3db676d68f42 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedSharedPreferencesRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/CustomTileAddedSharedPreferencesRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/InstalledTilesComponentRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/InstalledTilesComponentRepositoryImplTest.kt
index 070e07a75d23..070e07a75d23 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/InstalledTilesComponentRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/InstalledTilesComponentRepositoryImplTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/QSSettingsRestoredBroadcastRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/QSSettingsRestoredBroadcastRepositoryTest.kt
index ff8a9bd019fb..ff8a9bd019fb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/QSSettingsRestoredBroadcastRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/QSSettingsRestoredBroadcastRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt
index f7c3b213730c..f7c3b213730c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/TilesSettingConverterTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TilesSettingConverterTest.kt
index 9516c2181ac0..9516c2181ac0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/TilesSettingConverterTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TilesSettingConverterTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepositoryTest.kt
index 36e860e37ffa..36e860e37ffa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepositoryTest.kt
index d4a9fabd6806..d4a9fabd6806 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingListTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingListTest.kt
index 4454a3cb15fc..4454a3cb15fc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingListTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingListTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingTest.kt
index d153e9d1d361..d153e9d1d361 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/AutoAddableSettingTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddableTest.kt
index ec139e4c515e..ec139e4c515e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CallbackControllerAutoAddableTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddableTest.kt
index 4fae532d4174..4fae532d4174 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/CastAutoAddableTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddableTest.kt
index 9e2d1f885e2d..9e2d1f885e2d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DataSaverAutoAddableTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddableTest.kt
index 0116bd9575d8..0116bd9575d8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/DeviceControlsAutoAddableTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddableTest.kt
index e7ea9a66450c..e7ea9a66450c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/HotspotAutoAddableTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddableTest.kt
index 20fd3601f9ef..20fd3601f9ef 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/NightDisplayAutoAddableTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddableTest.kt
index 19ac63c36cab..19ac63c36cab 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/ReduceBrightColorsAutoAddableTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddableTest.kt
index d645ee34619b..d645ee34619b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/SafetyCenterAutoAddableTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddableTest.kt
index 83ff35d8022d..83ff35d8022d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WalletAutoAddableTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddableTest.kt
index adccc84e494b..adccc84e494b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/autoaddable/WorkTileAutoAddableTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractorTest.kt
index 41a7ec03408d..41a7ec03408d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt
index 8c896a6a1709..8c896a6a1709 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/FakeQSTile.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/FakeQSTile.kt
index 7e0e7d1f46e8..7e0e7d1f46e8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/FakeQSTile.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/FakeQSTile.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/PanelInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/PanelInteractorImplTest.kt
index 0d9711588a1f..0d9711588a1f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/PanelInteractorImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/PanelInteractorImplTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/RestoreReconciliationInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/RestoreReconciliationInteractorTest.kt
index f73cab8a10a3..f73cab8a10a3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/domain/interactor/RestoreReconciliationInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/RestoreReconciliationInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt
index 558e7694b54c..558e7694b54c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/shared/TileSpecTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerTest.kt
index bd1c310ab8de..bd1c310ab8de 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandlerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/analytics/QSTileAnalyticsTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/analytics/QSTileAnalyticsTest.kt
index 9861606fd1b1..9861606fd1b1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/analytics/QSTileAnalyticsTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/analytics/QSTileAnalyticsTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/interactor/DisabledByPolicyInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/interactor/DisabledByPolicyInteractorTest.kt
index 2bdc154dd885..2bdc154dd885 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/interactor/DisabledByPolicyInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/interactor/DisabledByPolicyInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/logging/QSTileLoggerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/logging/QSTileLoggerTest.kt
index 92c2d743c262..92c2d743c262 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/logging/QSTileLoggerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/base/logging/QSTileLoggerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileDataInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileDataInteractorTest.kt
index 937744db500e..937744db500e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileDataInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileDataInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileUserActionInteractorTest.kt
index 81bde8188f5e..81bde8188f5e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileUserActionInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/airplate/domain/interactor/AirplaneModeTileUserActionInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/CustomTileDefaultsRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/CustomTileDefaultsRepositoryTest.kt
index 89ba69fce9ad..89ba69fce9ad 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/CustomTileDefaultsRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/CustomTileDefaultsRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/CustomTilePackageUpdatesRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/CustomTilePackageUpdatesRepositoryTest.kt
index 4a221134ce67..4a221134ce67 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/CustomTilePackageUpdatesRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/CustomTilePackageUpdatesRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTileRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTileRepositoryTest.kt
index cf076c557765..cf076c557765 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTileRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTileRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileInteractorTest.kt
index eebb145ef384..eebb145ef384 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileInteractorTest.kt
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/flashlight/domain/FlashlightMapperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/flashlight/domain/FlashlightMapperTest.kt
index fab290da2953..7b2ac90b9766 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/flashlight/domain/FlashlightMapperTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/flashlight/domain/FlashlightMapperTest.kt
@@ -16,7 +16,6 @@
package com.android.systemui.qs.tiles.impl.flashlight.domain
-import android.graphics.drawable.Drawable
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -26,7 +25,6 @@ import com.android.systemui.qs.tiles.impl.flashlight.domain.model.FlashlightTile
import com.android.systemui.qs.tiles.impl.flashlight.qsFlashlightTileConfig
import com.android.systemui.qs.tiles.viewmodel.QSTileState
import com.android.systemui.res.R
-import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import junit.framework.Assert.assertEquals
import org.junit.Test
@@ -37,7 +35,7 @@ import org.junit.runner.RunWith
class FlashlightMapperTest : SysuiTestCase() {
private val kosmos = Kosmos()
private val qsTileConfig = kosmos.qsFlashlightTileConfig
- private val mapper by lazy { FlashlightMapper(context) }
+ private val mapper by lazy { FlashlightMapper(context.orCreateTestableResources.resources) }
@Test
fun mapsDisabledDataToInactiveState() {
@@ -58,12 +56,7 @@ class FlashlightMapperTest : SysuiTestCase() {
@Test
fun mapsEnabledDataToOnIconState() {
- val fakeDrawable = mock<Drawable>()
- context.orCreateTestableResources.addOverride(
- R.drawable.qs_flashlight_icon_on,
- fakeDrawable
- )
- val expectedIcon = Icon.Loaded(fakeDrawable, null)
+ val expectedIcon = Icon.Resource(R.drawable.qs_flashlight_icon_on, null)
val tileState: QSTileState = mapper.map(qsTileConfig, FlashlightTileModel(true))
@@ -73,12 +66,7 @@ class FlashlightMapperTest : SysuiTestCase() {
@Test
fun mapsDisabledDataToOffIconState() {
- val fakeDrawable = mock<Drawable>()
- context.orCreateTestableResources.addOverride(
- R.drawable.qs_flashlight_icon_off,
- fakeDrawable
- )
- val expectedIcon = Icon.Loaded(fakeDrawable, null)
+ val expectedIcon = Icon.Resource(R.drawable.qs_flashlight_icon_off, null)
val tileState: QSTileState = mapper.map(qsTileConfig, FlashlightTileModel(false))
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/location/domain/LocationTileMapperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/location/domain/LocationTileMapperTest.kt
index 820c0564c1a7..8791877f8863 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/location/domain/LocationTileMapperTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/location/domain/LocationTileMapperTest.kt
@@ -16,7 +16,6 @@
package com.android.systemui.qs.tiles.impl.location.domain
-import android.graphics.drawable.Drawable
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -26,7 +25,6 @@ import com.android.systemui.qs.tiles.impl.location.domain.model.LocationTileMode
import com.android.systemui.qs.tiles.impl.location.qsLocationTileConfig
import com.android.systemui.qs.tiles.viewmodel.QSTileState
import com.android.systemui.res.R
-import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth
import junit.framework.Assert
import org.junit.Test
@@ -37,7 +35,8 @@ import org.junit.runner.RunWith
class LocationTileMapperTest : SysuiTestCase() {
private val kosmos = Kosmos()
private val qsTileConfig = kosmos.qsLocationTileConfig
- private val mapper by lazy { LocationTileMapper(context) }
+
+ private val mapper by lazy { LocationTileMapper(context.orCreateTestableResources.resources) }
@Test
fun mapsDisabledDataToInactiveState() {
@@ -57,9 +56,7 @@ class LocationTileMapperTest : SysuiTestCase() {
@Test
fun mapsEnabledDataToOnIconState() {
- val fakeDrawable = mock<Drawable>()
- context.orCreateTestableResources.addOverride(R.drawable.qs_location_icon_on, fakeDrawable)
- val expectedIcon = Icon.Loaded(fakeDrawable, null)
+ val expectedIcon = Icon.Resource(R.drawable.qs_location_icon_on, null)
val tileState: QSTileState = mapper.map(qsTileConfig, LocationTileModel(true))
@@ -69,9 +66,7 @@ class LocationTileMapperTest : SysuiTestCase() {
@Test
fun mapsDisabledDataToOffIconState() {
- val fakeDrawable = mock<Drawable>()
- context.orCreateTestableResources.addOverride(R.drawable.qs_location_icon_off, fakeDrawable)
- val expectedIcon = Icon.Loaded(fakeDrawable, null)
+ val expectedIcon = Icon.Resource(R.drawable.qs_location_icon_off, null)
val tileState: QSTileState = mapper.map(qsTileConfig, LocationTileModel(false))
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfigProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfigProviderTest.kt
index 5eca8caa7d15..5eca8caa7d15 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfigProviderTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileConfigProviderTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt
index 3a0ebdbd6a17..3a0ebdbd6a17 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelUserInputTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelUserInputTest.kt
index 22fb152aee44..22fb152aee44 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelUserInputTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelUserInputTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt
index c1c012613fa1..d9b1ea1aedcc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt
@@ -216,6 +216,37 @@ class QSSceneAdapterImplTest : SysuiTestCase() {
}
@Test
+ fun state_expanding() =
+ testScope.runTest {
+ val qsImpl by collectLastValue(underTest.qsImpl)
+ val progress = 0.34f
+
+ underTest.inflate(context)
+ runCurrent()
+ clearInvocations(qsImpl!!)
+
+ underTest.setState(QSSceneAdapter.State.Expanding(progress))
+ with(qsImpl!!) {
+ verify(this).setQsVisible(true)
+ verify(this)
+ .setQsExpansion(
+ /* expansion= */ progress,
+ /* panelExpansionFraction= */ 1f,
+ /* proposedTranslation= */ 0f,
+ /* squishinessFraction= */ 1f,
+ )
+ verify(this).setListening(true)
+ verify(this).setExpanded(true)
+ verify(this)
+ .setTransitionToFullShadeProgress(
+ /* isTransitioningToFullShade= */ false,
+ /* qsTransitionFraction= */ 1f,
+ /* qsSquishinessFraction = */ 1f,
+ )
+ }
+ }
+
+ @Test
fun customizing_QS() =
testScope.runTest {
val customizing by collectLastValue(underTest.isCustomizing)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterTest.kt
new file mode 100644
index 000000000000..18a7320bf29d
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterTest.kt
@@ -0,0 +1,42 @@
+/*
+ * 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 com.android.systemui.qs.ui.adapter
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Companion.Collapsing
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class QSSceneAdapterTest : SysuiTestCase() {
+ @Test
+ fun expandingSpecialValues() {
+ assertThat(QSSceneAdapter.State.QQS).isEqualTo(QSSceneAdapter.State.Expanding(0f))
+ assertThat(QSSceneAdapter.State.QS).isEqualTo(QSSceneAdapter.State.Expanding(1f))
+ }
+
+ @Test
+ fun collapsing() {
+ val collapsingProgress = 0.3f
+ assertThat(Collapsing(collapsingProgress))
+ .isEqualTo(QSSceneAdapter.State.Expanding(1 - collapsingProgress))
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
index 42e27ba12f42..6403ed19a9b2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
@@ -52,7 +52,7 @@ class QuickSettingsSceneViewModelTest : SysuiTestCase() {
private val sceneInteractor = utils.sceneInteractor()
private val mobileIconsInteractor = FakeMobileIconsInteractor(FakeMobileMappingsProxy(), mock())
private val flags = FakeFeatureFlagsClassic().also { it.set(Flags.NEW_NETWORK_SLICE_UI, false) }
- private val qsFlexiglassAdapter = FakeQSSceneAdapter { _, _ -> mock() }
+ private val qsFlexiglassAdapter = FakeQSSceneAdapter { mock() }
private var mobileIconsViewModel: MobileIconsViewModel =
MobileIconsViewModel(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
index c953743fd272..c110de969b57 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
@@ -20,7 +20,6 @@ package com.android.systemui.scene
import android.telecom.TelecomManager
import android.telephony.TelephonyManager
-import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.internal.R
@@ -30,12 +29,15 @@ import com.android.systemui.authentication.data.repository.FakeAuthenticationRep
import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
import com.android.systemui.bouncer.domain.interactor.BouncerActionButtonInteractor
import com.android.systemui.bouncer.ui.viewmodel.BouncerViewModel
+import com.android.systemui.bouncer.ui.viewmodel.PasswordBouncerViewModel
import com.android.systemui.bouncer.ui.viewmodel.PinBouncerViewModel
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel
import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneViewModel
import com.android.systemui.log.table.TableLogBuffer
+import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.ui.MediaHost
import com.android.systemui.model.SysUiState
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
@@ -185,7 +187,10 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() {
private var bouncerSceneJob: Job? = null
- private val qsFlexiglassAdapter = FakeQSSceneAdapter(inflateDelegate = { _, _ -> mock<View>() })
+ private val qsFlexiglassAdapter = FakeQSSceneAdapter(inflateDelegate = { mock() })
+
+ @Mock private lateinit var mediaDataManager: MediaDataManager
+ @Mock private lateinit var mediaHost: MediaHost
@Before
fun setUp() {
@@ -239,6 +244,8 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() {
shadeHeaderViewModel = shadeHeaderViewModel,
qsSceneAdapter = qsFlexiglassAdapter,
notifications = utils.notificationsPlaceholderViewModel(),
+ mediaDataManager = mediaDataManager,
+ mediaHost = mediaHost,
)
utils.deviceEntryRepository.setUnlocked(false)
@@ -777,11 +784,11 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() {
private suspend fun TestScope.dismissIme(
showImeBeforeDismissing: Boolean = true,
) {
- bouncerViewModel.authMethodViewModel.value?.apply {
+ (bouncerViewModel.authMethodViewModel.value as? PasswordBouncerViewModel)?.let {
if (showImeBeforeDismissing) {
- onImeVisibilityChanged(true)
+ it.onImeVisibilityChanged(true)
}
- onImeVisibilityChanged(false)
+ it.onImeVisibilityChanged(false)
runCurrent()
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt
index ddeb05b39e53..ddeb05b39e53 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/WindowRootViewVisibilityRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/data/repository/WindowRootViewVisibilityRepositoryTest.kt
index 7ae501d05fcd..7ae501d05fcd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/scene/data/repository/WindowRootViewVisibilityRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/data/repository/WindowRootViewVisibilityRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt
index 7f4bbbe36768..7f4bbbe36768 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt
index 8be4eeb7be7a..8be4eeb7be7a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
index adc1c61da50a..3cb97e369a67 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
@@ -479,7 +479,7 @@ class SceneContainerStartableTest : SysuiTestCase() {
underTest.start()
runCurrent()
- bouncerInteractor.onImeHidden()
+ bouncerInteractor.onImeHiddenByUser()
runCurrent()
assertThat(currentSceneKey).isEqualTo(SceneKey.Lockscreen)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
index c89cd9e0c1f1..c89cd9e0c1f1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt
index 77ddf15c41ad..77ddf15c41ad 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
index e2640af136a7..1d2497dfd716 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
@@ -23,6 +23,8 @@ import com.android.systemui.authentication.shared.model.AuthenticationMethodMode
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.FakeFeatureFlagsClassic
import com.android.systemui.flags.Flags
+import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.ui.MediaHost
import com.android.systemui.qs.ui.adapter.FakeQSSceneAdapter
import com.android.systemui.scene.SceneTestUtils
import com.android.systemui.scene.shared.model.SceneKey
@@ -35,6 +37,7 @@ import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsVi
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
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.test.runCurrent
@@ -42,6 +45,8 @@ import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@@ -77,14 +82,18 @@ class ShadeSceneViewModelTest : SysuiTestCase() {
scope = testScope.backgroundScope,
)
- private val qsFlexiglassAdapter = FakeQSSceneAdapter { _, _ -> mock() }
+ private val qsFlexiglassAdapter = FakeQSSceneAdapter { mock() }
private lateinit var shadeHeaderViewModel: ShadeHeaderViewModel
private lateinit var underTest: ShadeSceneViewModel
+ @Mock private lateinit var mediaDataManager: MediaDataManager
+ @Mock private lateinit var mediaHost: MediaHost
+
@Before
fun setUp() {
+ MockitoAnnotations.initMocks(this)
shadeHeaderViewModel =
ShadeHeaderViewModel(
applicationScope = testScope.backgroundScope,
@@ -102,6 +111,8 @@ class ShadeSceneViewModelTest : SysuiTestCase() {
shadeHeaderViewModel = shadeHeaderViewModel,
qsSceneAdapter = qsFlexiglassAdapter,
notifications = utils.notificationsPlaceholderViewModel(),
+ mediaDataManager = mediaDataManager,
+ mediaHost = mediaHost,
)
}
@@ -174,4 +185,20 @@ class ShadeSceneViewModelTest : SysuiTestCase() {
assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer))
}
+
+ @Test
+ fun hasActiveMedia_mediaVisible() =
+ testScope.runTest {
+ whenever(mediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(true)
+
+ assertThat(underTest.isMediaVisible()).isTrue()
+ }
+
+ @Test
+ fun doesNotHaveActiveMedia_mediaNotVisible() =
+ testScope.runTest {
+ whenever(mediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(false)
+
+ assertThat(underTest.isMediaVisible()).isFalse()
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/smartspace/BcSmartspaceConfigProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/BcSmartspaceConfigProviderTest.kt
index cb83e7c7adbc..cb83e7c7adbc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/smartspace/BcSmartspaceConfigProviderTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/BcSmartspaceConfigProviderTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/smartspace/DreamSmartspaceControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/DreamSmartspaceControllerTest.kt
index e09385934991..e09385934991 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/smartspace/DreamSmartspaceControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/DreamSmartspaceControllerTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/smartspace/LockscreenAndDreamTargetFilterTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/LockscreenAndDreamTargetFilterTest.kt
index 886c61ae29dd..886c61ae29dd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/smartspace/LockscreenAndDreamTargetFilterTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/LockscreenAndDreamTargetFilterTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/smartspace/LockscreenPreconditionTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/LockscreenPreconditionTest.kt
index 0b5aea7d8683..0b5aea7d8683 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/smartspace/LockscreenPreconditionTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/smartspace/LockscreenPreconditionTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/FakeKeyguardStateController.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/FakeKeyguardStateController.java
index c669c6f6fb1c..c669c6f6fb1c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/FakeKeyguardStateController.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/FakeKeyguardStateController.java
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
index 0b922a844690..de767e39499a 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
@@ -65,7 +65,7 @@ public class SystemUIDialogTest extends SysuiTestCase {
@Mock
private BroadcastDispatcher mBroadcastDispatcher;
@Mock
- private DialogDelegate<SystemUIDialog> mDelegate;
+ private SystemUIDialog.Delegate mDelegate;
@Before
public void setup() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt
index 638925d0a705..638925d0a705 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt
index 5f4d7bf6f371..5f4d7bf6f371 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt
index 75d1869adc7c..75d1869adc7c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/util/FakeSubscriptionManagerProxy.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/util/FakeSubscriptionManagerProxy.kt
index a80238167b85..a80238167b85 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/util/FakeSubscriptionManagerProxy.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/util/FakeSubscriptionManagerProxy.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/data/repository/FakeConnectivityRepository.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/data/repository/FakeConnectivityRepository.kt
index 28d632d9fcea..28d632d9fcea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/data/repository/FakeConnectivityRepository.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/data/repository/FakeConnectivityRepository.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/FakeWifiRepository.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/FakeWifiRepository.kt
index 106b54891948..106b54891948 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/FakeWifiRepository.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/FakeWifiRepository.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepositorySwitcherTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepositorySwitcherTest.kt
index d06a6e26b4ce..d06a6e26b4ce 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepositorySwitcherTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepositorySwitcherTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepositoryTest.kt
index ce00250467f6..ce00250467f6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/DisabledWifiRepositoryTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt
index cf20ba87e8c2..cf20ba87e8c2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/prod/WifiRepositoryImplTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt
index 7fbbfc77300e..7fbbfc77300e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/domain/interactor/WifiInteractorImplTest.kt
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt
index 791a028eef4e..791a028eef4e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt
diff --git a/packages/SystemUI/res/color/notification_overlay_color.xml b/packages/SystemUI/res/color/notification_overlay_color.xml
index c24bff9c7271..a14a7ad9d2da 100644
--- a/packages/SystemUI/res/color/notification_overlay_color.xml
+++ b/packages/SystemUI/res/color/notification_overlay_color.xml
@@ -17,7 +17,9 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:state_pressed="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha="0.15" />
+ <!-- Pressed state's alpha is set to 0.00 temporarily until this bug is resolved permanently
+ b/313920497 Design intended alpha is 0.15-->
+ <item android:state_pressed="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha="0.00" />
<item android:state_hovered="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha="0.11" />
<item android:color="@color/transparent" />
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 45a2e8a5c800..09f37669cb74 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Knoppie <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Op"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Af"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Links"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Regs"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Middel"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Spasie"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Kennisgewings"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Kortpadsleutels"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Wissel sleutelborduitleg"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Vee teks uit"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Kortpaaie"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Soek kortpaaie"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Geen kortpaaie gevind nie"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Invoer"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Maak apps oop"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Huidige app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Kry toegang tot kennisgewingskerm"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Neem ’n volle skermskoot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Kry toegang tot lys met stelsel-/appkortpaaie"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Terug: gaan terug na vorige staat (terugknoppie)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Kry toegang tot tuisskerm"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Oorsig van oop apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Beweeg deur onlangse apps (vorentoe)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Beweeg deur onlangse apps (terug)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Kry toegang tot lys met alle apps en soektogte (d.w.s., Search/Lanseerder)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Versteek en wys (weer) taakbalk"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Kry toegang tot stelselinstellings"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Kry toegang tot Google Assistent"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Bekyk kennisgewings"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Neem skermskoot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Wys kortpaaie"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Gaan terug"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Gaan na tuisskerm"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Bekyk onlangse apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Beweeg vorentoe deur onlangse apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Beweeg terug deur onlangse apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Maak appslys oop"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Wys taakbalk"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Maak instellings oop"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Maak Assistent oop"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Sluit skerm"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Haal Notas-app op vir vinnige memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Maak notas oop"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Verrig veelvuldige stelseltake"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Gaan by verdeelde skerm in met huidige app aan die regterkant"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Gaan by verdeelde skerm in met huidige app aan die linkerkant"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Skakel oor van verdeelde skerm na volskerm"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Tydens verdeelde skerm: verplaas ’n app van een skerm na ’n ander"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Gaan by verdeelde skerm in met huidige app aan die regterkant"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Gaan by verdeelde skerm in met huidige app aan die linkerkant"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skakel oor van verdeelde skerm na volskerm"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Tydens verdeelde skerm: verplaas ’n app van een skerm na ’n ander"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Invoer"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Wissel invoertaal (volgende taal)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Wissel invoertaal (vorige taal)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Skakel oor na volgende taal"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Skakel oor na vorige taal"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Kry toegang tot emosiekone"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Kry toegang tot steminvoer"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Programme"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Bystand"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Blaaier (Chrome as verstek)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Blaaier"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakte"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-pos (Gmail as verstek)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-pos"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiek"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index bac72bf8cd9f..9c07491465c4 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"አዝራር <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"መነሻ"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ተመለስ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ላይ"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ወደታች"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ግራ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ቀኝ"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"የላይ ቀስት"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"የታች ቀስት"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"የግራ ቀስት"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"የቀኝ ቀስት"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"መሃል"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"ክፍተት"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ማሳወቂያዎች"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"የቁልፍ ሰሌዳ አቋራጮች"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"የቁልፍ ሰሌዳ ገጽታ ለውጥ"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ጽሑፍን አጽዳ"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ወይም"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"የፍለጋ መጠይቅን አጽዳ"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"አቋራጮች"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"አቋራጮችን ይፈልጉ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ምንም አቋራጮች አልተገኙም"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ግቤት"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"መተግበሪያዎችን ይክፈቱ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"የአሁኑ መተግበሪያ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"የማሳወቂያ ጥላ መዳረሻ"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ሙሉ ቅጽበታዊ ገፅ ዕይታ ያነሳል"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"የሥርዓት / የመተግበሪያ አቋራጮች ዝርዝር መዳረሻ"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ተመለስ፦ ወደ ቀዳሚው ሁኔታ ይመለሳል (ተመለስ አዝራር)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"የመነሻ ማያ ገፅ መዳረሻ"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"የክፍት መተግበሪያዎች አጠቃላይ ዕይታ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"የቅርብ ጊዜ መተግበሪያዎች ላይ ዑደት ያደርጋል (ወደ ፊት)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"የቅርብ ጊዜ መተግበሪያዎች ላይ ዑደት ያደርጋል (ወደ ኋላ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"የሁሉም መተግበሪያዎች ዝርዝር እና ፍለጋ መዳረሻ (ማለትም ፍለጋ/ማስጀመሪያ)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"የተግባር አሞሌን ይደብቃል እና (እንደገና) ያሳያል"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"የሥርዓት ቅንብሮች መዳረሻ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"የGoogle ረዳት መዳረሻ"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"የፍለጋ ውጤቶችን በማሳየት ላይ"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"የስርዓት አቋራጮችን በማሳየት ላይ"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"የግብዓት አቋራጮችን በማሳየት ላይ"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"መተግበሪያዎችን የሚከፍቱ አቋራጮችን በማሳየት ላይ"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"ለአሁኑ መተግበሪያ አቋራጮችን በማሳየት ላይ"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ማሳወቂያዎችን አሳይ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ቅጽበታዊ ገጽ ዕይታን አንሳ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"አቋራጮችን አሳይ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ወደኋላ ተመለስ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ወደ መነሻ ማያ ገጽ ሂድ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"የቅርብ ጊዜ መተግበሪያዎችን አሳይ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"የቅርብ ጊዜ መተግበሪያዎች ላይ ወደ ፊት ዑደት ማድረግ።"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"የቅርብ ጊዜ መተግበሪያዎች ላይ ወደ ኋላ ዑደት ማድረግ።"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"የመተግበሪያ ዝርዝር ክፈት"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"የተግባር አሞሌን አሳይ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ቅንብሮችን ክፈት"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"ረዳትን ክፈት"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ማያ ገፅ ቁልፍ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ለፈጣን ማስታወሻ የማስታወሻዎች መተግበሪያን ያወጣል"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"ማስታወሻዎችን ክፈት"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"የሥርዓት ብዙ ተግባራትን በተመሳሳይ ጊዜ ማከናወን"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"ለአርኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገፅ ይገባል"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"ለኤልኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገፅ ይገባል"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ከየተከፈለ ማያ ገፅ ወደ ሙሉ ገፅ ዕይታ ይቀይራል"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"በተከፈለ ማያ ገፅ ወቅት፦ መተግበሪያን ከአንዱ ወደ ሌላው ይተካል"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"ለአርኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገጽ ግባ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"ለኤልኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገጽ ይግቡ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ከየተከፈለ ማያ ገጽ ወደ ሙሉ ገጽ ዕይታ ቀይር"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"በተከፈለ ማያ ገጽ ወቅት፡- መተግበሪያን ከአንዱ ወደ ሌላው ተካ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ግቤት"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"የግቤት ቋንቋን ይቀይራል (ቀጣይ ቋንቋ)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ግቤት ቋንቋን ይቀይራል (ቀዳሚ ቋንቋ)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ወደ ቀጣዩ ቋንቋ ቀይር"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ወደ ቀዳሚ ቋንቋ ቀይር"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"የስሜት ገላጭ ምስል መዳረሻ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"የድምፅ ትየባ መዳረሻ"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"መተግበሪያዎች"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ረዳት"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"አሳሸ (Chrome እንደ ነባሪ)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"ረዳት"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"አሳሽ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"እውቂያዎች"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ኢሜይል (Gmail እንደ ነባሪ)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ኢሜይል"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"ኤስኤምኤስ"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ሙዚቃ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"የቀን መቁጠሪያ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index c188535f224a..1c065bb20bec 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"الزر <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"أعلى"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"أسفل"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"يسار"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"يمين"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"وسط"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"مسافة"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"الإشعارات"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"اختصارات لوحة المفاتيح"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"تبديل تنسيق لوحة المفاتيح"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"محو النص"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"الاختصارات"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"البحث في الاختصارات"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"لم يُعثَر على اختصارات."</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"إدخال"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"فتح التطبيقات"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"التطبيق الحالي"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"الوصول إلى مركز الإشعارات"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"أخذ لقطة شاشة كاملة"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"الوصول إلى قائمة اختصارات التطبيقات والنظام"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"رجوع: العودة إلى الحالة السابقة (زر الرجوع)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"الوصول إلى الشاشة الرئيسية"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"نظرة عامة على التطبيقات المفتوحة"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"التنقّل بين التطبيقات المُستخدَمة مؤخرًا (للأمام)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"التنقّل بين التطبيقات الحديثة (للخلف)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"قائمة الوصول لجميع التطبيقات والبحث (أي البحث/مشغّل التطبيقات)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"إظهار أو إخفاء أو إعادة إظهار شريط التطبيقات"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"الوصول إلى إعدادات النظام"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"‏الوصول إلى \"مساعد Google\""</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"عرض الإشعارات"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"أخذ لقطة شاشة"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"عرض الاختصارات"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"رجوع"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"الانتقال إلى الشاشة الرئيسية"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"عرض التطبيقات المستخدمة مؤخرًا"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"التنقّل للأمام بين التطبيقات المُستخدَمة مؤخرًا"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"التنقّل للوراء بين التطبيقات المُستخدَمة مؤخرًا"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"فتح قائمة التطبيقات"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"عرض شريط التطبيقات"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"فتح الإعدادات"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"‏فتح \"مساعد Google\""</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"شاشة القفل"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"‏سحب تطبيق Notes لإضافة مذكّرة سريعة"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"فتح تطبيق تدوين الملاحظات"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"تعدُّد المهام في النظام"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"الدخول في وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يسار الشاشة"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"الدخول في وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يمين الشاشة"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"التبديل من وضع \"تقسيم الشاشة\" إلى \"ملء الشاشة\""</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"في وضع \"تقسيم الشاشة\": استبدِل التطبيقات من تطبيق إلى آخر"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"تفعيل وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يسار الشاشة"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"تفعيل وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يمين الشاشة"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"التبديل من وضع \"تقسيم الشاشة\" إلى وضع \"ملء الشاشة\""</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"استبدال تطبيق بآخر في وضع \"تقسيم الشاشة\""</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"إدخال"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"تبديل لغة الإدخال (اللغة التالية)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"تبديل لغة الإدخال (اللغة السابقة)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"التبديل إلى اللغة التالية"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"التبديل إلى اللغة السابقة"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"الوصول إلى الرموز التعبيرية"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"الوصول إلى ميزة \"الكتابة بالصوت\""</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"التطبيقات"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"التطبيق المساعد"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"‏المتصفّح (فتح Chrome تلقائيًا)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"‏مساعد Google"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"المتصفح"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"جهات الاتصال"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"‏البريد الإلكتروني (فتح Gmail تلقائيًا)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"البريد الإلكتروني"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"‏الرسائل القصيرة SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"الموسيقى"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"التقويم"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 59eca3a28b75..0c5f1044b1d5 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> বুটাম"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"হ\'ম"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"উভতি যাওক"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ওপৰলৈ"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"তললৈ"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"বাওঁফালে"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"সোঁফালে"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"স্ক্ৰীনৰ মাজত"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"স্পেচ"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"জাননীসমূহ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"কীব\'ৰ্ড শ্বৰ্টকাটসমূহ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"কীব\'ৰ্ডৰ সজ্জা সলনি কৰক"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"পাঠ মচক"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"শ্বৰ্টকাট"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"সন্ধানৰ শ্বৰ্টকাট"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"কোনো শ্বৰ্টকাট বিচাৰি পোৱা নাই"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ইনপুট"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"এপ্ খোলক"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"বৰ্তমানৰ এপ্"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"জাননী পেনেল এক্সেছ কৰক"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"এটা সম্পূৰ্ণ স্ক্ৰীনশ্বট লওক"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ছিষ্টেম / এপৰ শ্বৰ্টকাটসমূহৰ সূচীখন এক্সেছ কৰক"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"উভতি যাওক: পূৰ্বৱৰ্তী অৱস্থালৈ উভতি যাওক (উভতি যাওক বুটাম)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"গৃহ স্ক্ৰীন এক্সেছ কৰক"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"খোলা এপৰ ৰূপৰেখা"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"শেহতীয়া এপ্‌সমূহ এটা এটাকৈ চাওক (আগলৈ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"শেহতীয়া এপ্‌সমূহ এটা এটাকৈ চাওক (পিছলৈ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"আটাইবোৰ এপ্ আৰু সন্ধানৰ এক্সেছৰ সূচী (যেনে, Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"টাস্কবাৰ লুকুৱাওক আৰু (পুনৰ) দেখুৱাওক"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ছিষ্টেমৰ ছেটিং এক্সেছ কৰক"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant এক্সেছ কৰক"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"জাননী চাওক"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"স্ক্ৰীনশ্বট লওক"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"শ্বৰ্টকাট দেখুৱাওক"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"উভতি যাওক"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"গৃহ স্ক্ৰীনলৈ যাওক"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"শেহতীয়া এপ্‌সমূহ চাওক"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"শেহতীয়া এপ্‌সমূহ আগলৈ এটা এটাকৈ চাওক"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"শেহতীয়া এপ্‌সমূহ পিছলৈ এটা এটাকৈ চাওক"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"এপৰ সূচী খোলক"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"টাস্কবাৰ দেখুৱাওক"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ছেটিং খোলক"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant খোলক"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"লক স্ক্ৰীন"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ক্ষিপ্ৰ মেম’ৰ বাবে Notes এপ্ উলিয়াওক"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notes এপ্ খোলক"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ছিষ্টেম মাল্টিটাস্কিং"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ সোঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ বাওঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"বিভাজিত স্ক্ৰীনৰ পৰা পূৰ্ণ স্ক্ৰীনলৈ সলনি কৰক"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"বিভাজিত স্ক্ৰীনৰ ব্যৱহাৰ কৰাৰ সময়ত: কোনো এপ্ এখন স্ক্ৰীনৰ পৰা আনখনলৈ নিয়ক"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ সোঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ বাওঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"বিভাজিত স্ক্ৰীনৰ পৰা পূৰ্ণ স্ক্ৰীনলৈ সলনি কৰক"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"বিভাজিত স্ক্ৰীনৰ ব্যৱহাৰ কৰাৰ সময়ত: কোনো এপ্ এখন স্ক্ৰীনৰ পৰা আনখনলৈ নিয়ক"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ইনপুট"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ইনপুটৰ ভাষা সলনি কৰক (পৰৱৰ্তী ভাষা)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ইনপুটৰ ভাষা সলনি কৰক (পূৰ্বৱৰ্তী ভাষা)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"পৰৱৰ্তী ভাষাটোলৈ সলনি কৰক"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"পূৰ্বৰ ভাষালৈ সলনি কৰক"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ইম’জি এক্সেছ কৰক"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ভইচ টাইপিং এক্সেছ কৰক"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"এপ্লিকেশ্বনসমূহ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"সহায়"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ব্ৰাউজাৰ (ডিফ’ল্ট হিচাপে Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ব্ৰাউজাৰ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"সম্পৰ্কসূচী"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ইমেইল (ডিফ’ল্ট হিচাপে Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ইমেইল"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"এছএমএছ"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"সংগীত"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 121e276af72a..b2ee45529680 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Düymə <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Əsas səhifə"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Geri"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Yuxarı"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Aşağı"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Sol"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Sağ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Mərkəz"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Boşluq"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Bildirişlər"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klaviatura qısa yolları"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klaviatura düzümünü dəyişin"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Mətni silin"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Qısayollar"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Qısayollar axtarın"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Qısayol tapılmadı"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Daxiletmə"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Açıq tətbiqlər"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Cari tətbiq"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Bildiriş göstərişinə giriş"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Tam skrinşot çəkin"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Sistem siyahısına/tətbiq qısayollarına giriş"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Geri: əvvəlki vəziyyətə geri qayıdın (geri düyməsi)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Ana ekrana giriş"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Açıq tətbiqlərin icmalı"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Son tətbiqlər arasında keçid edin (irəli)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Son tətbiqlər arasında keçid edin (geri)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Tətbiqlər siyahısına və axtarışa (yəni Axtarış/Başladıcı) giriş"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"İşləmə panelini gizlədin və (yenidən) göstərin"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Sistem ayarlarına giriş"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistentə giriş"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Bildirişlərə baxın"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Skrinşot çəkin"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Qısayolları göstərin"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Geri qayıdın"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Əsas ekrana keçin"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Son tətbiqlərə baxın"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Son tətbiqlər boyunca irəli keçin"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Son tətbiqlər boyunca geri keçin"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Tətbiq siyahısını açın"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"İşləmə panelini göstərin"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ayarları açın"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistenti açın"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Kilid ekranı"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Sürətli qeyd üçün Qeydlər tətbiqini yuxarı dartın"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Qeydləri açın"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Sistemdə çoxsaylı tapşırıq icrası"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Cari tətbiq sağda olmaqla Bölünmüş ekrana daxil olun"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Cari tətbiq solda olmaqla Bölünmüş ekrana daxil olun"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Bölünmüş ekrandan tam ekrana dəyişin"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Bölünmüş ekran rejimində: tətbiqi birindən digərinə dəyişdirin"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Cari tətbiq sağda olmaqla bölünmüş ekrana daxil olun"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Cari tətbiq solda olmaqla bölünmüş ekrana daxil olun"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bölünmüş ekrandan tam ekrana keçin"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Bölünmüş ekran rejimində: tətbiqi birindən digərinə dəyişin"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Daxiletmə"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Daxiletmə dilini dəyişin (növbəti dil)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Daxiletmə dilini dəyişin (əvvəlki dil)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Növbəti dilə keçin"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Əvvəlki dilə keçin"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Emojiyə giriş"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Səslə yazmaya giriş"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Tətbiqlər"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Yardım"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Brauzer (defolt olaraq Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Brauzer"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktlar"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-poçt (defolt olaraq Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-poçt"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiqi"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Təqvim"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 4c535d81aede..ce734dc7b9fc 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Dugme <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Taster Početna"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Taster Nazad"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Taster sa strelicom nagore"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Taster sa strelicom nadole"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Taster sa strelicom nalevo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Taster sa strelicom nadesno"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Taster sa centralnom strelicom"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Razmak"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obaveštenja"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tasterske prečice"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Promeni raspored tastature"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Obrišite tekst"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Prečice"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Pretražite prečice"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nisu pronađene prečice"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Unos"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otvaranje aplik"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuelna aplik"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Pristup traci sa obaveštenjima"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Snimanje ekrana"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Pristup listi prečica za sistem/aplikacije"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Nazad: nazad na prethodno stanje (dugme Nazad)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Pristup početnom ekranu"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Pregled otvorenih aplikacija"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Pregled nedavnih aplikacija (napred)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Pregled nedavnih aplikacija (nazad)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Pristup listi svih alpikacija i pretraga (npr. Pretraga/Pokretač)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skrivanje i ponovno prikazivanje trake zadataka"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Pristup podešavanjima sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Pristup Google pomoćniku"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Prikaži obaveštenja"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Napravi snimak ekrana"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Prikaži prečice"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Nazad"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Idi na početni ekran"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Pregledaj nedavno korišćene aplikacije"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Pregledaj nedavno korišćene aplikacije unapred"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Pregledaj nedavno korišćene aplikacije unazad"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvori listu aplikacija"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Prikaži traku zadataka"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvori podešavanja"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvori pomoćnika"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Zaključavanje ekrana"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Otvaranje aplikacije Beleške za brzo pravljenje beleške"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otvori beleške"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Obavljanje više zadataka sistema istovremeno"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Pokretanje podeljenog ekrana za aktuelnu aplikaciju na desnoj strani"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Pokretanje podeljenog ekrana za aktuelnu aplikaciju na levoj strani"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Prelazak sa podeljenog ekrana na ceo ekran"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Tokom podeljenog ekrana: zamena jedne aplikacije drugom"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Pokreni podeljeni ekran za aktuelnu aplikaciju na desnoj strani"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Pokreni podeljeni ekran za aktuelnu aplikaciju na levoj strani"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Pređi sa podeljenog ekrana na ceo ekran"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"U režimu podeljenog ekrana: zamena jedne aplikacije drugom"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Promena jezika unosa (sledeći jezik)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Promena jezika unosa (prethodni jezik)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Pređi na sledeći jezik"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Pređi na prethodni jezik"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Pristup emodžijima"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Pristup unosu teksta glasom"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacije"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Aplikacija za pomoć"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Pregledač (podrazumevano Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Pomoćnik"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Pregledač"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakti"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Imejl (Gmail kao podrazumevani)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Imejl"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index ffde20e4d177..74e46fc3f154 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Кнопка <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Уверх"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Уніз"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Улева"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Управа"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Цэнтр"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Прабел"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Апавяшчэнні"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Спалучэнні клавіш"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Пераключыць раскладку клавіятуры"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Выдаліць тэкст"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Ярлыкі"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Пошук ярлыкоў"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ярлыкі не знойдзены"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Увод"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Адкрытыя праграмы"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Бягучая праграма"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Перайсці да шчытка апавяшчэнняў"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Зрабіць здымак усяго экрана"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Перайсці да спіса сістэмных ярлыкоў і ярлыкоў праграм"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Вярнуцца ў папярэдні стан (кнопка \"Назад\")"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Перайсці на галоўны экран"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Агляд адкрытых праграм"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Перайсці да нядаўніх праграм (пераключэнне ўперад)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Перайсці да нядаўніх праграм (пераключэнне назад)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Перайсці да спісу ўсіх праграм і пошуку (Пошук/Панэль запуску)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Схаваць і (зноў) паказаць панэль задач"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Перайсці да налад сістэмы"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Выклік Памочніка Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Праглядзець апавяшчэнні"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Зрабіць здымак экрана"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Паказаць спалучэнні клавіш"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Перайсці назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Перайсці на галоўны экран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Праглядзець нядаўнія праграмы"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Пераходзіць паміж нядаўнімі праграмамі, перамяшчаючыся ўперад"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Пераходзіць паміж нядаўнімі праграмамі, перамяшчаючыся назад"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Адкрыць спіс праграм"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Паказаць панэль задач"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Адкрыць налады"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Выклікаць Памочніка"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Экран блакіроўкі"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Выклікаць праграму \"Нататкі\", каб зрабіць запіс"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Адкрыць нататкі"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Шматзадачнасць сістэмы"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай справа"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай злева"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Пераключыцца з рэжыму падзеленага экрана на поўнаэкранны рэжым"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"У рэжыме падзеленага экрана замяніць адну праграму на іншую"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай справа"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай злева"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Пераключыцца з рэжыму падзеленага экрана на поўнаэкранны рэжым"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"У рэжыме падзеленага экрана замяніць адну праграму на іншую"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Увод"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Пераключыць мову ўводу (наступная мова)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Пераключыць мову ўводу (папярэдняя мова)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Пераключыцца на наступную мову"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Пераключыцца на папярэднюю мову"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Перайсці да эмодзі"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Актываваць галасавы ўвод"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Праграмы"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Памочнік"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Браўзер (стандартна выкарыстоўваецца Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Памочнік"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Браўзер"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Кантакты"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Электронная пошта (стандартна выкарыстоўваецца Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Электронная пошта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS-паведамленні"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Каляндар"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index ad690e657b0f..7a00ded88cc9 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Бутон „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Начало"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Нагоре"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Надолу"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Наляво"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Надясно"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Център"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Интервал"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Известия"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Клавишни комбинации"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Превкл. на клавиат. подредба"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Изчистване на текста"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Клавишни комбинации"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Търсете комбинации"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Няма клавишни комбинации"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Въвеждане"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Отворени прил."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Текущо прилож."</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Достъп до падащия панел с известия"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Заснемане на целия екран"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Достъп до списъка с клавишни комбинации за системата/приложенията"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Назад: връщане към предишното състояние (бутон за връщане назад)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Достъп до началния екран"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Общ преглед на отворените приложения"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Преглед на скорошните приложения (напред)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Преглед на скорошните приложения (назад)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Достъп до списъка с прилож. и търсене (т.е. Търсене/стартов панел)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Скриване и (повторно) показване на лентата на задачите"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Достъп до системните настройки"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Достъп до Google Асистент"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Преглед на известията"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Създаване на екранна снимка"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Показване на клавишните комбинации"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Отваряне на началния екран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Преглед на скорошните приложения"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Превъртане напред през скорошните приложения"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Превъртане назад през скорошните приложения"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Отваряне на списъка с приложения"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Показване на лентата на задачите"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Отваряне на настройките"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Отваряне на Асистент"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Заключване на екрана"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Отваряне на приложението за бележки с цел бързо записване"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Отваряне на бележките"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Едновременно изпълняване на няколко задачи в системата"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Преминаване към разделен екран с текущото приложение отдясно"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Преминаване към разделен екран с текущото приложение отляво"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Превключване от разделен към цял екран"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"При разделен екран: замяна на дадено приложение с друго"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Преминаване към разделен екран с текущото приложение отдясно"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Преминаване към разделен екран с текущото приложение отляво"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Превключване от разделен към цял екран"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"При разделен екран: замяна на дадено приложение с друго"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Въвеждане"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Превключване към следващия език на въвеждане"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Превключване към предишния език на въвеждане"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Превключване към следващия език"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Превключване към предишния език"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Достъп до емоджи"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Достъп до функцията за печатане с глас"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Приложения"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Помощно приложение"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Браузър (по подразбиране е Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Асистент"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Браузър"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контакти"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Електронна поща (по подразбиране е Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Електронна поща"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 13837769a76e..9954fbd4d5eb 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> বোতাম"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"হোম"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ফিরুন"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"উপরে"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"নিচে"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"বাঁ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ডান"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"কেন্দ্র"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"বিজ্ঞপ্তি"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"কীবোর্ড শর্টকাট"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"কীবোর্ড লে-আউট পাল্টান"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"টেক্সট মুছুন"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"শর্টকাট"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"শর্টকাট সার্চ করুন"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"কোনও শর্টকার্ট পাওয়া যায়নি"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ইনপুট"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"খুলে রাখা অ্যাপ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"বর্তমান অ্যাপ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"বিজ্ঞপ্তি শেড অ্যাক্সেস করুন"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"সম্পূর্ণ স্ক্রিনশট নিন"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"সিস্টেমের তালিকা / অ্যাপ শর্টকাটের তালিকা অ্যাক্সেস করুন"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ফিরে আসা: আগের স্ট্যাটাসে ফিরে আসুন (ফিরে যাওয়ার বোতাম)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"হোম স্ক্রিন অ্যাক্সেস করুন"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"এক নজরে অফিসের অ্যাপ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"সাম্প্রতিক অ্যাপ দেখুন (পরবর্তীতে যান)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"সাম্প্রতিক অ্যাপ দেখুন (আগে ফিরে যান)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"সব অ্যাপ ও সার্চের ফলাফলের তালিকা অ্যাক্সেস করুন (যেমন, সার্চ/লঞ্চার)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"টাস্কবার লুকান এবং (আবার)দেখুন"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"সিস্টেমের সেটিংস অ্যাক্সেস করুন"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant অ্যাক্সেস করুন"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"বিজ্ঞপ্তি দেখুন"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"স্ক্রিনশট নিন"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"শর্টকাট দেখুন"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ফিরে যান"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"হোম স্ক্রিনে যান"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"সম্প্রতি ব্যবহার করা হয়েছে এমন অ্যাপ দেখুন"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"সাম্প্রতিক অ্যাপের মাধ্যমে পরবর্তী জায়গায় যান"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"সাম্প্রতিক অ্যাপের মাধ্যমে আগের জায়গায় ফিরুন"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"অ্যাপের তালিকা খুলুন"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"টাস্কবার দেখুন"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"সেটিংস খুলুন"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant খুলুন"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"লক স্ক্রিন"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"দ্রুত মেমোর জন্য Notes অ্যাপ উপরের দিকে তুলুন"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"নোট খুলুন"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"সিস্টেম মাল্টিটাস্কিং"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"ডান দিকে থাকা বর্তমান অ্যাপ ব্যবহার করে স্প্লিট স্ক্রিন যোগ করুন"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"বাঁদিকে থাকা বর্তমান অ্যাপ ব্যবহার করে স্প্লিট স্ক্রিন যোগ করুন"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"স্প্লিট স্ক্রিন থেকে ফুল স্ক্রিনে পাল্টান"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"স্প্লিট স্ক্রিন থাকাকালীন: একটি অ্যাপ থেকে অন্যটিতে পরিবর্তন করুন"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"ডানদিকে থাকা বর্তমান অ্যাপ ব্যবহার করে \'স্প্লিট স্ক্রিন\' যোগ করুন"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"বাঁদিকে থাকা বর্তমান অ্যাপ ব্যবহার করে \'স্প্লিট স্ক্রিন\' যোগ করুন"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"\'স্প্লিট স্ক্রিন\' থেকে ফুল স্ক্রিনে পাল্টান"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"\'স্প্লিট স্ক্রিন\' থাকাকালীন: একটি অ্যাপ থেকে অন্যটিতে পাল্টান"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ইনপুট"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"লেখার ভাষা পাল্টান (পরবর্তী ভাষা)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"লেখার ভাষা পাল্টান (আগের ভাষা)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"পরবর্তী ভাষায় পাল্টান"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"আগের ভাষায় পাল্টান"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ইমোজি অ্যাক্সেস করুন"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ভয়েস টাইপিং অ্যাক্সেস করুন"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"অ্যাপ্লিকেশন"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"সহযোগিতা"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ব্রাউজার (ডিফল্ট হিসেবে Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ব্রাউজার"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"পরিচিতি"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ইমেল (ডিফল্ট হিসেবে Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ইমেল"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"সংগীত"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 04812881c854..041e3b6a78f0 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Dugme <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Tipka za početak"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Nazad"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Gore"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Dolje"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Lijevo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Desno"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Sredina"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Tipka za razmak"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obavještenja"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Prečice tastature"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Zamijeni raspored tastature"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Brisanje teksta"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Prečice"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Pretraživanje prečica"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nisu pronađene prečice"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Unos"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otvorene aplik."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Trenutna aplik."</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Pristup lokaciji za obavještenja"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Snimanje cijelog ekrana"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Pristup listi prečica sistema/aplikacija"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Nazad: vraćanje na prethodno stanje (dugme za nazad)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Pristup početnom ekranu"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Pregled otvorenih aplikacija"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Pregled nedavnih aplikacija (unaprijed)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Pregled nedavnih aplikacija (unazad)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Pristup listi svih aplikacija i pretraživanje (Pretraživanje/Pokretač)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Sakrivanje i (ponovno) prikazivanje trake zadataka"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Pristup postavkama sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Pristup Google Asistentu"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Prikaz obavještenja"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Pravljenje snimka ekrana"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Prikaz prečica"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Nazad"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Odlazak na početni ekran"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Prikaz nedavnih aplikacija"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Kruženje kroz nedavne aplikacije unaprijed"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Kruženje kroz nedavne aplikacije unazad"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvaranje liste aplikacija"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Prikaz trake zadataka"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvaranje postavki"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvaranje Asistenta"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Zaključavanje ekrana"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Preuzimanje aplikacije Bilješke za brzi podsjetnik"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otvaranje Bilješki"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na desnoj strani"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na lijevoj strani"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Prebacivanje s podijeljenog ekrana na prikaz preko cijelog ekrana"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Za vrijeme podijeljenog ekrana: zamjena jedne aplikacije drugom"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na desnoj strani"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na lijevoj strani"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prebacivanje s podijeljenog ekrana na prikaz preko cijelog ekrana"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Za vrijeme podijeljenog ekrana: zamjena jedne aplikacije drugom"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Promjena jezika unosa (sljedeći jezik)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Promjena jezika unosa (prethodni jezik)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Prebacivanje na sljedeći jezik"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Prebacivanje na prethodni jezik"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Pristup emoji sličicama"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Pristup pisanju govorom"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacije"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pomoć"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Preglednik (Chrome kao zadani)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Preglednik"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakti"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-pošta (Gmail kao zadana)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-pošta"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 03ef98d5820d..eb652a16cca0 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botó <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Inici"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Enrere"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Amunt"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Avall"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Esquerra"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Dreta"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espai"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificacions"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tecles de drecera"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Canvia disposició de teclat"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Esborra el text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Dreceres"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Cerca dreceres"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No s\'ha trobat cap drecera"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Obre aplicacions"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aplicació actual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Accedeix a l\'àrea de notificacions"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Fes una captura de pantalla completa"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Accedeix a la llista de dreceres d\'aplicacions i del sistema"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Enrere: torna a l\'estat anterior (botó Enrere)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Accedeix a la pantalla d\'inici"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Informació general sobre les aplicacions obertes"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Recorre les aplicacions recents (endavant)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Recorre les aplicacions recents (enrere)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Accedeix a la llista de totes les apps i a la cerca (Cerca/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Amaga i torna a mostrar la barra de tasques"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Accedeix a la configuració del sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Accedeix a l\'Assistent de Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Mostra les notificacions"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Fes una captura de pantalla"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostra les dreceres"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Torna"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ves a la pantalla d\'inici"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Mostra les aplicacions recents"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Desplaça\'t cap endavant per les aplicacions recents"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Desplaça\'t cap enrere per les aplicacions recents"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Obre la llista d\'aplicacions"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostra la barra de tasques"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Obre la configuració"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Obre l\'Assistent"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueig"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Obre l\'aplicació Notes per prendre notes ràpides"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Obre les notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasques del sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Entra al mode de pantalla dividida amb l\'aplicació actual a la dreta"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Entra al mode de pantalla dividida amb l\'aplicació actual a l\'esquerra"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Canvia de pantalla dividida a pantalla completa"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Durant el mode de pantalla dividida: substitueix una app per una altra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Entra al mode de pantalla dividida amb l\'aplicació actual a la dreta"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Entra al mode de pantalla dividida amb l\'aplicació actual a l\'esquerra"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Canvia de pantalla dividida a pantalla completa"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Durant el mode de pantalla dividida: substitueix una app per una altra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Canvia l\'idioma d\'introducció (idioma següent)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Canvia l\'idioma d\'introducció (idioma anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Canvia a l\'idioma següent"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Caniva a l\'idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Accedeix als emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Accedeix a l\'escriptura per veu"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicacions"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistència"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome com a predeterminat)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contactes"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Correu electrònic (Gmail com a predeterminat)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Correu electrònic"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 8b75a3e7bfe2..05a20c1c039c 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Tlačítko <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Zpět"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Nahoru"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Dolů"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vlevo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Vpravo"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Šipka nahoru"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Šipka dolů"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Šipka vlevo"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Šipka doprava"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Střed"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"TAB"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Mezerník"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Oznámení"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klávesové zkratky"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Přepnout rozložení klávesnice"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Vymazat text"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"nebo"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Vymazat vyhledávaný dotaz"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Zkratky"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Vyhledat zkratky"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Žádné zkratky nenalezeny"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Vstup"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otevřené aplikace"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuální aplikace"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Otevřít panel oznámení"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Pořídit snímek celé obrazovky"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Otevřít seznam zkratek do systému / aplikací"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Zpět: vrátit se k předchozímu stavu (tlačítko zpět)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Přejít na plochu"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Přehled otevřených aplikací"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Procházet nedávné aplikace (vpřed)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Procházet nedávné aplikace (zpět)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Otevřít seznam všech aplikací a vyhledávání (např. Vyhledávání/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skrýt a (znovu) zobrazit panel aplikací"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Otevřít systémová nastavení"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Otevřít Asistenta Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Zobrazují se výsledky vyhledávání"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Zobrazují se systémové zkratky"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Zobrazují se zkratky pro zadávání"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Zobrazují se zkratky, které otevírají aplikace"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Zobrazují se zkratky pro aktuální aplikaci"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Zobrazit oznámení"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Pořídit snímek obrazovky"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Zobrazit zkratky"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Zpět"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Přejít na plochu"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Zobrazit nedávné aplikace"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Procházet nedávné aplikace směrem vpřed"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Procházet nedávné aplikace směrem zpět"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otevřít seznam aplikací"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Zobrazit panel aplikací"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otevřít nastavení"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otevřít Asistenta"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Uzamknout obrazovku"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Spustit aplikaci Poznámky a udělat rychlý zápis"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otevřít poznámky"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Systémový multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi napravo"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi nalevo"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Přepnout z rozdělené obrazovky na celou obrazovku"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"V režimu rozdělené obrazovky: nahradit jednu aplikaci druhou"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi napravo"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi nalevo"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Přepnout z rozdělené obrazovky na celou obrazovku"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"V režimu rozdělené obrazovky: nahradit jednu aplikaci druhou"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vstup"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Přepnout jazyk vstupu (další jazyk)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Přepnout jazyk vstupu (předchozí jazyk)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Přepnout na další jazyk"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Přepnout na předchozí jazyk"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Otevřít smajlíky"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Otevřít hlasové zadávání"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikace"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistence"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Prohlížeč (výchozí je Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Prohlížeč"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakty"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (výchozí je Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Hudba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendář"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 9f5b6008d425..1cfb005b3140 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g>-knap"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Tilbage"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Op"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Ned"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Venstre"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Højre"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Midtertast"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Mellemrumstast"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifikationer"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tastaturgenveje"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Skift tastaturlayout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Ryd tekst"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Genveje"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Søg efter genveje"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ingen genveje blev fundet"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Åbn apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuel app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Åbn notifikationspanel"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Tag et screenshot af hele skærmen"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Åbn liste over system-/appgenveje"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Forrige: Gå tilbage til den forrige tilstand (knappen Tilbage)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Åbn startskærm"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Oversigt over åbne apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Gennemgå seneste apps (næste)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Gennemgå seneste apps (forrige)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Åbn liste over alle apps, og søg (dvs. Søg/Starter)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skjul, og vis proceslinjen (igen)"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Åbn systemindstillinger"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Åbn Google Assistent"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Se notifikationer"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Tag et screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Vis genveje"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Gå tilbage"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Gå til startskærm"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Se seneste apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Gå frem i dine seneste apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Gå tilbage i dine seneste apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Åbn appfortegnelse"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Vis proceslinje"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Åbn indstillinger"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Åbn Assistent"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lås skærm"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Åbn appen Notes for at skrive et hurtigt notat"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Åbn noter"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Systemmultitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Start opdelt skærm med aktuel app til højre"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Start opdelt skærm med aktuel app til venstre"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Skift fra opdelt skærm til fuld skærm"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Ved opdelt skærm: Erstat en app med en anden app"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Start opdelt skærm med aktuel app til højre"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Start opdelt skærm med aktuel app til venstre"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skift fra opdelt skærm til fuld skærm"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ved opdelt skærm: Udskift én app med en anden"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Skift inputsprog (næste sprog)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Skift inputsprog (forrige sprog)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Skift til næste sprog"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Skift til forrige sprog"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Find emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Åbn indtaling"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applikationer"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistance"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakter"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Mail (Gmail som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sms"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 25d7202436a6..5ce500de531e 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Taste <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Pos1"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Zurück"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Nach oben"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Nach unten"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Nach links"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Nach rechts"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Aufwärtspfeil"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Abwärtspfeil"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Linkspfeil"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Rechtspfeil"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Zentrieren"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tabulatortaste"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Leertaste"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Benachrichtigungen"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tastenkürzel"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Tastaturlayout wechseln"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Text löschen"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"oder"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Suchanfrage löschen"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Tastenkombinationen"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Tastenkombinationen suchen"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Keine gefunden"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Eingabe"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Geöffnete Apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuelle App"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Auf Benachrichtigungsleiste zugreifen"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Vollbild-Screenshot aufnehmen"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Auf Liste mit System-/App-Verknüpfungen zugreifen"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Zurück: Vorherigen Zustand wiederherstellen (Schaltfläche „Zurück“)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Auf Startbildschirm zugreifen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Übersicht über geöffnete Apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Zuletzt verwendete Apps vorwärts durchgehen"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Zuletzt verwendete Apps rückwärts durchgehen"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Auf Liste mit Apps und Suchmaschinen zugreifen, z. B. Google Suche / Google Now Launcher"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Taskleiste ausblenden und (wieder) einblenden"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Auf Systemeinstellungen zugreifen"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Auf Google Assistant zugreifen"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Suchergebnisse werden angezeigt"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Tastenkombinationen des Systems werden angezeigt"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Tastenkombinationen für die Eingabe werden angezeigt"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Tastenkombinationen zum Öffnen von Apps werden angezeigt"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Tastenkombinationen für die aktuelle App werden angezeigt"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Benachrichtigungen ansehen"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Screenshot erstellen"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Tastenkombinationen anzeigen"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Zurück"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Zum Startbildschirm wechseln"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Letzte Apps aufrufen"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Zuletzt verwendete Apps vorwärts durchgehen"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Zuletzt verwendete Apps rückwärts durchgehen"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Liste der Apps öffnen"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Taskleiste anzeigen"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Einstellungen öffnen"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant öffnen"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Sperrbildschirm"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Notizen-App für schnelles Memo aufrufen"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notizen öffnen"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System-Multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Splitscreen aktivieren, aktuelle App rechts"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Splitscreen aktivieren, aktuelle App links"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Vom Splitscreen zum Vollbild wechseln"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Im Splitscreen: eine App durch eine andere ersetzen"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Splitscreen aktivieren, aktuelle App rechts"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Splitscreen aktivieren, aktuelle App links"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Vom Splitscreen zum Vollbild wechseln"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Im Splitscreen: eine App durch eine andere ersetzen"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Eingabe"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Eingabesprache ändern (nächste Sprache)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Eingabesprache ändern (vorherige Sprache)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Zur nächsten Sprache wechseln"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Zu vorheriger Sprache wechseln"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Auf Emoji zugreifen"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Auf Spracheingabe zugreifen"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Apps"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistent"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome ist Standard)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakte"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-Mail-Programm (Gmail ist Standard)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-Mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 9bd246a64668..fe8a07ffa09a 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Κουμπί <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Πίσω"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Πάνω"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Κάτω"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Αριστερά"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Δεξιά"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Επάνω βέλος"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Κάτω βέλος"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Αριστερό βέλος"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Δεξί βέλος"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Κέντρο"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Πλήκτρο διαστήματος"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Ειδοποιήσεις"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Συντομεύσεις πληκτρολογίου"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Αλλαγή διάταξης πληκτρολογίου"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Διαγραφή κειμένου"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ή"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Διαγραφή ερωτήματος αναζήτησης"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Συντομεύσεις"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Αναζήτηση συντομεύσεων"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Δεν βρέθηκαν συντομεύσεις"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Είσοδος"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ανοιχτές εφαρμ."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Τρέχ. εφαρμογή"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Πρόσβαση στο πλαίσιο σκίασης ειδοποιήσεων"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Λήψη πλήρους στιγμιότυπου οθόνης"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Πρόσβαση σε λίστα συντομεύσεων συστήματος / εφαρμογών"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Πίσω: επιστροφή στην προηγούμενη κατάσταση (κουμπί πίσω)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Πρόσβαση στην αρχική οθόνη"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Επισκόπηση ανοιχτών εφαρμογών"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Περιήγηση σε πρόσφατες εφαρμογές (εμπρός)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Περιήγηση σε πρόσφατες εφαρμογές (πίσω)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Πρόσβαση σε λίστα εφαρμογών και αναζήτησης (Αναζήτηση/Εφ. εκκίνησης)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Απόκρυψη και (επαν)εμφάνιση της γραμμής εργαλείων"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Πρόσβαση στις ρυθμίσεις συστήματος"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Πρόσβαση στον Βοηθό Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Εμφάνιση αποτελεσμάτων αναζήτησης"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Εμφάνιση συντομεύσεων συστήματος"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Εμφάνιση συντομεύσεων εισόδου"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Εμφάνιση συντομεύσεων για το άνοιγμα εφαρμογών"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Εμφάνιση συντομεύσεων για την τρέχουσα εφαρμογή"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Προβολή ειδοποιήσεων"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Λήψη στιγμιότυπου οθόνης"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Εμφάνιση συντομεύσεων"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Επιστροφή"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Μετάβαση στην αρχική οθόνη"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Προβολή πρόσφατων εφαρμογών"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Περιήγηση προς τα εμπρός σε πρόσφατες εφαρμογές"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Περιήγηση προς τα πίσω σε πρόσφατες εφαρμογές"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Άνοιγμα λίστας εφαρμογών"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Εμφάνιση γραμμής εργαλείων"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Άνοιγμα ρυθμίσεων"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Άνοιγμα Βοηθού"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Κλείδωμα οθόνης"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Εμφάνιση εφαρμογής Σημειώσεις για γρήγορη σύνταξη σημείωσης"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Άνοιγμα σημειώσεων"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Πολυδιεργασία συστήματος"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα δεξιά"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα αριστερά"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Εναλλαγή από διαχωρισμό οθόνης σε πλήρη οθόνη"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Κατά τον διαχωρισμό οθόνης: αντικατάσταση μιας εφαρμογής με άλλη"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα δεξιά"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα αριστερά"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Εναλλαγή από διαχωρισμό οθόνης σε πλήρη οθόνη"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Κατά τον διαχωρισμό οθόνης: αντικατάσταση μιας εφαρμογής με άλλη"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Είσοδος"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Εναλλαγή γλώσσας εισόδου (επόμενη γλώσσα)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Εναλλαγή γλώσσας εισόδου (προηγούμενη γλώσσα)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Εναλλαγή στην επόμενη γλώσσα"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Εναλλαγή στην προηγούμενη γλώσσα"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Πρόσβαση στα emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Πρόσβαση στη φωνητική πληκτρολόγηση"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Εφαρμογές"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Υποβοήθηση"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Πρόγραμμα περιήγησης (Chrome ως προεπιλογή)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Βοηθός"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Πρόγραμμα περιήγησης"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Επαφές"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Ηλεκτρονικό ταχυδρομείο (Gmail ως προεπιλογή)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Ηλεκτρονικό ταχυδρομείο"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Μουσική"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Ημερολόγιο"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index b3dea8d4a666..30b03b21a9fb 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Clear text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Shortcuts"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Search shortcuts"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No shortcuts found"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Open apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Current app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Access notification shade"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Take a full screenshot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Access list of system/apps shortcuts"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Back: Go back to previous state (back button)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Access home screen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overview of open apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Cycle through recent apps (forward)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Cycle through recent apps (back)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Access list of all apps and search (i.e. Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Hide and (re)show taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Access system settings"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Access Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"View notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Take screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Show shortcuts"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Go back"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Go to home screen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"View recent apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forwards through recent apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backwards through recent apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Pull up Notes app for quick memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Open notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Enter split screen with current app to right-hand side"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Enter split screen with current app to left-hand screen"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Switch from split screen to full screen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"During split screen: Replace an app from one to another"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Switch input language (next language)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Switch input language (previous language)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Switch to previous language"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Access emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Access voice typing"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome as default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail as default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index bbfdcea79a24..d349d6d9f020 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Up arrow"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Down arrow"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Left arrow"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Right arrow"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard Shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Clear text"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"or"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Clear search query"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Shortcuts"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Search shortcuts"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No shortcuts found"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Open apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Current app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Access notification shade"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Take a full screenshot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Access list of system / apps shortcuts"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Back: go back to previous state (back button)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Access home screen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overview of open apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Cycle through recent apps (forward)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Cycle through recent apps (back)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Access list of all apps and search (i.e. Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Hide and (re)show taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Access system settings"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Access Google Assistant"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Showing search results"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Showing system shortcuts"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Showing input shortcuts"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Showing shortcuts that open apps"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Showing shortcuts for the current app"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"View notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Take screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Show shortcuts"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Go back"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Go to home screen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"View recent apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forward through recent apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backward through recent apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Pull up Notes app for quick memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Open notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Enter Split screen with current app to RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Enter Split screen with current app to LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Switch from Split screen to full screen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"During Split screen: replace an app from one to another"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Switch input language (next language)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Switch input language (previous language)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Switch to previous language"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Access emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Access voice typing"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome as default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail as default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
@@ -1194,7 +1200,7 @@
<string name="mirror_display" msgid="2515262008898122928">"Mirror display"</string>
<string name="dismiss_dialog" msgid="2195508495854675882">"Dismiss"</string>
<string name="connected_display_icon_desc" msgid="6373560639989971997">"Display connected"</string>
- <string name="privacy_dialog_title" msgid="7839968133469098311">"Microphone &amp; Camera"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"Microphone and camera"</string>
<string name="privacy_dialog_summary" msgid="2458769652125995409">"Recent app use"</string>
<string name="privacy_dialog_more_button" msgid="7610604080293562345">"See recent access"</string>
<string name="privacy_dialog_done_button" msgid="4504330708531434263">"Done"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index b3dea8d4a666..30b03b21a9fb 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Clear text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Shortcuts"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Search shortcuts"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No shortcuts found"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Open apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Current app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Access notification shade"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Take a full screenshot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Access list of system/apps shortcuts"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Back: Go back to previous state (back button)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Access home screen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overview of open apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Cycle through recent apps (forward)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Cycle through recent apps (back)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Access list of all apps and search (i.e. Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Hide and (re)show taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Access system settings"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Access Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"View notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Take screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Show shortcuts"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Go back"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Go to home screen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"View recent apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forwards through recent apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backwards through recent apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Pull up Notes app for quick memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Open notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Enter split screen with current app to right-hand side"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Enter split screen with current app to left-hand screen"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Switch from split screen to full screen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"During split screen: Replace an app from one to another"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Switch input language (next language)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Switch input language (previous language)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Switch to previous language"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Access emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Access voice typing"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome as default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail as default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index b3dea8d4a666..30b03b21a9fb 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Clear text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Shortcuts"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Search shortcuts"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No shortcuts found"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Open apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Current app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Access notification shade"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Take a full screenshot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Access list of system/apps shortcuts"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Back: Go back to previous state (back button)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Access home screen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overview of open apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Cycle through recent apps (forward)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Cycle through recent apps (back)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Access list of all apps and search (i.e. Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Hide and (re)show taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Access system settings"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Access Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"View notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Take screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Show shortcuts"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Go back"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Go to home screen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"View recent apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forwards through recent apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backwards through recent apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Pull up Notes app for quick memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Open notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Enter split screen with current app to right-hand side"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Enter split screen with current app to left-hand screen"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Switch from split screen to full screen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"During split screen: Replace an app from one to another"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Switch input language (next language)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Switch input language (previous language)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Switch to previous language"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Access emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Access voice typing"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome as default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail as default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 5340b7bd2d37..9b464423a6fa 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‎Button ‎‏‎‎‏‏‎<xliff:g id="NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‎‎‎‎‎‏‏‎‎‏‎‏‎‏‎‎‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‎Home‎‏‎‎‏‎"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‎‎‎‎‏‏‏‏‎Back‎‏‎‎‏‎"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‏‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‏‎‏‏‏‎‏‏‎‏‎‎‎‎Up‎‏‎‎‏‎"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‎‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‎‎‎‎‏‎‎‏‎‎‎Down‎‏‎‎‏‎"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‎‎‎‎‎‎‏‎‏‎‏‏‏‎‎‎‎Left‎‏‎‎‏‎"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‏‎Right‎‏‎‎‏‎"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‎‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‎‏‎‎‎‎‏‎Up arrow‎‏‎‎‏‎"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‎Down arrow‎‏‎‎‏‎"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‎‎‎‎‎‏‏‎‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‏‎Left arrow‎‏‎‎‏‎"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‎‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‎Right arrow‎‏‎‎‏‎"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‏‎‎‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎Center‎‏‎‎‏‎"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎Tab‎‏‎‎‏‎"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‎‎‎‎‎‏‎‏‏‏‎‎‎Space‎‏‎‎‏‎"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‎‏‎‏‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‎‎‏‏‏‎‏‏‎‎Notifications‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‎‎‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎Keyboard Shortcuts‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎‏‎‏‎‏‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‎‎‏‎‏‎‎‎‏‏‎‎Switch keyboard layout‎‏‎‎‏‎"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‏‎Clear text‎‏‎‎‏‎"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‎‎‎or‎‏‎‎‏‎"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‎‏‏‏‎‎‎‏‎‏‏‎‎‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎‎‎‎‎‎‏‎Clear search query‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‎‎‏‏‏‎‎‎‎‎‏‏‏‎‏‎Shortcuts‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‎‏‏‎‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎‏‏‏‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‎‎Search shortcuts‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎No shortcuts found‎‏‎‎‏‎"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‏‎Input‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‎‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‎‎‏‏‎‏‏‏‎‏‏‏‎‏‏‎‏‏‎‏‎‎Open apps‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‏‎‏‏‎Current app‎‏‎‎‏‎"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‏‏‎‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎‎‎‏‏‎Access notification shade‎‏‎‎‏‎"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‎‎‏‎‏‎‏‏‎Take a full screenshot‎‏‎‎‏‎"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‏‎Access list of system / apps shortcuts‎‏‎‎‏‎"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‏‎‎‎‎‏‏‎Back: go back to previous state (back button)‎‏‎‎‏‎"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎Access home screen‎‏‎‎‏‎"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‏‏‎‎‎‎‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‎Overview of open apps‎‏‎‎‏‎"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎‎Cycle through recent apps (forward)‎‏‎‎‏‎"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‏‏‎‏‏‎‎‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎Cycle through recent apps (back)‎‏‎‎‏‎"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎Access list of all apps and search (i.e. Search/Launcher)‎‏‎‎‏‎"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‎‏‏‏‎‏‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‎‏‏‎‏‏‎Hide and (re)show taskbar‎‏‎‎‏‎"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎Access system settings‎‏‎‎‏‎"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‎‎‏‎‏‏‎‎‎‎Access Google Assistant‎‏‎‎‏‎"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‎‎‎‏‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‎‏‏‏‎‎‏‎‏‎‎‎‏‎‎‏‏‏‏‏‎‏‎‎‏‎Showing search results‎‏‎‎‏‎"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‎‎‏‎‏‏‏‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‏‏‏‏‎‎‏‏‎Showing system shortcuts‎‏‎‎‏‎"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‎‏‎‎‏‎Showing input shortcuts‎‏‎‎‏‎"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‏‎Showing shortcuts that open apps‎‏‎‎‏‎"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎Showing shortcuts for the current app‎‏‎‎‏‎"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‎‏‎View notifications‎‏‎‎‏‎"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‏‎‎‎‏‏‏‎‎‎‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‎‎‏‎Take screenshot‎‏‎‎‏‎"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‏‏‏‎‏‎‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎‎‏‏‏‏‏‏‎‎‎‏‎‏‎‎Show shortcuts‎‏‎‎‏‎"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‎‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎Go back‎‏‎‎‏‎"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‎‏‎‏‎‏‏‎‎‏‏‎Go to home screen‎‏‎‎‏‎"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‎‎‎‎View recent apps‎‏‎‎‏‎"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‏‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‏‎‏‏‎‏‏‏‏‎‏‎Cycle forward through recent apps‎‏‎‎‏‎"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎Cycle backward through recent apps‎‏‎‎‏‎"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‏‏‏‎‎‏‏‏‎‏‏‏‎‏‎Open apps list‎‏‎‎‏‎"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎‎‏‎‎‎‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‏‎Show taskbar‎‏‎‎‏‎"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‎‎‎‎‏‎Open settings‎‏‎‎‏‎"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‎Open assistant‎‏‎‎‏‎"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎Lock screen‎‏‎‎‏‎"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‎‎‎‎‏‏‎‏‏‏‏‎Pull up Notes app for quick memo‎‏‎‎‏‎"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‏‏‏‏‎‏‎‏‏‎‎‎‏‎‎‎‏‎Open notes‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‎‎‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎System multitasking‎‏‎‎‏‎"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎‏‎‎‎‏‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‏‏‎Enter Split screen with current app to RHS‎‏‎‎‏‎"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‏‏‎‎‏‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‏‏‏‎‎Enter Split screen with current app to LHS‎‏‎‎‏‎"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‏‎‏‎‏‎‏‏‏‎‎‏‎‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‏‎‎‏‎Switch from Split screen to full screen‎‏‎‎‏‎"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‎During Split screen: replace an app from one to another‎‏‎‎‏‎"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‎‎‎‎‎‏‎Enter split screen with current app to RHS‎‏‎‎‏‎"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎Enter split screen with current app to LHS‎‏‎‎‏‎"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‎‎Switch from split screen to full screen‎‏‎‎‏‎"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‏‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎During split screen: replace an app from one to another‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‎‏‎‎‎‎‎‎‏‏‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‏‎‎Input‎‏‎‎‏‎"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‎‎‎‎‎‎‎‎‎‎‏‎Switch input language (next language)‎‏‎‎‏‎"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎Switch input language (previous language)‎‏‎‎‏‎"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎Switch to next language‎‏‎‎‏‎"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‎Switch to previous language‎‏‎‎‏‎"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‏‏‎Access emoji‎‏‎‎‏‎"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎Access voice typing‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‎‎‎‎‏‏‏‎‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎Applications‎‏‎‎‏‎"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‏‎‏‎‏‎‎‏‎‏‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‎‎‎‏‏‎‏‏‎‎Assist‎‏‎‎‏‎"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‏‎‏‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‎‎‎Browser (Chrome as default)‎‏‎‎‏‎"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‏‎‎‏‎‏‏‎‎‎‎Assistant‎‏‎‎‏‎"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‎‏‎‎‎‎‏‏‎‎‏‏‎‎‎‏‏‎Browser‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‎‎‎‏‏‏‏‎‎‏‎‎‎Contacts‎‏‎‎‏‎"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‏‎‎‏‎‏‎‎‎‎‎‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎Email (Gmail as default)‎‏‎‎‏‎"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎‎‎‎Email‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‎‏‏‏‎‎SMS‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‏‎‏‏‏‏‎‎‏‎Music‎‏‎‎‏‎"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‎Calendar‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 78f91b192b28..0bc807e67e47 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Inicio"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Atrás"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Arriba"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Abajo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Izquierda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Derecha"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Flecha hacia arriba"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Flecha hacia abajo"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Flecha a la izquierda"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Flecha hacia la derecha"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centro"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espacio"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificaciones"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ver combinaciones de teclas"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambiar diseño del teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Borrar texto"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"o bien"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Borrar búsqueda"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Combinaciones de teclas"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Buscar comb. de teclas"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No hay comb. de teclas"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps abiertas"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App actual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Acceder al panel de notificaciones"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Tomar una captura de pantalla completa"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Acceder a una lista de combinación de teclas del sistema/apps"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atrás: Vuelve al estado anterior (botón Atrás)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Acceder a la pantalla principal"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Obtener una descripción general de las apps abiertas"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Desplazar por las apps recientes (adelante)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Desplazar por las apps recientes (atrás)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Acceder a lista de apps y búsquedas (p. ej. Búsqueda/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Esconder y volver a mostrar la barra de tareas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Acceder a la configuración del sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Acceder a Asistente de Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Mostrando los resultados de la búsqueda"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Mostrando combinaciones de teclas del sistema"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Mostrando entradas de combinaciones de teclas"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Mostrando combinaciones de teclas que abren apps"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Mostrando combinaciones de teclas para la app actual"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ver notificaciones"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Tomar captura de pantalla"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar accesos directos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Atrás"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir a la pantalla principal"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ver apps recientes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Desplazar por las apps recientes (adelante)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Desplazar por las apps recientes (atrás)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar Barra de tareas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configuración"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir Asistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Bloquear la pantalla"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Mostrar la app de Notas para crear un recordatorio rápido"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir notas"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Tareas múltiples del sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Activar pantalla dividida con la app actual en el lado derecho (RHS)"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Activar pantalla dividida con la app actual en el lado izquierdo (LHS)"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Cambiar de pantalla dividida a pantalla completa"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Durante pantalla dividida: Reemplaza una app con otra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Activar pantalla dividida con la app actual en el lado derecho (RHS)"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Activar pantalla dividida con la app actual en el lado izquierdo (LHS)"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Durante pantalla dividida: Reemplaza una app con otra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Cambiar el idioma de escritura (próximo idioma)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Cambiar el idioma de escritura (idioma anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar al próximo idioma"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Cambiar al idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Acceder a los emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Acceder al dictado por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicaciones"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistencia"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome como predeterminado)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contactos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Correo electrónico (Gmail como predeterminado)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Correo electrónico"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendario"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 59802adc4617..f64238656d03 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Inicio"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Atrás"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Arriba"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Abajo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Izquierda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Derecha"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centro"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tabulador"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espacio"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificaciones"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ver combinaciones de teclas"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambiar diseño del teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Borrar texto"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Combinaciones de teclas"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Buscar combinaciones de teclas"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ninguna encontrada"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps abiertas"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App en uso"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Acceder a la pantalla de notificaciones"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Hacer una captura de pantalla completa"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Acceder a la lista de combinaciones de teclas de apps y del sistema"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atrás: volver al estado anterior (botón para volver)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Acceder a la pantalla de inicio"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Vista general de aplicaciones abiertas"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Recorrer aplicaciones recientes (hacia delante)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Recorrer aplicaciones recientes (hacia atrás)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Acceder a la lista de todas las apps y a la búsqueda (Buscar/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ocultar y mostrar la barra de tareas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Acceder a los ajustes del sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Acceder al Asistente de Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ver notificaciones"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Hacer captura de pantalla"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar accesos directos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Volver"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir a la pantalla de inicio"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ver aplicaciones recientes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Desplazarse por las aplicaciones recientes (adelante)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Desplazarse por las aplicaciones recientes (atrás)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de aplicaciones"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar la barra de tareas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir ajustes"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir el Asistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueo"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Abrir la aplicación de notas para tomar una nota rápida"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir notas"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Función multitarea del sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Iniciar pantalla dividida con esta aplicación en el lado derecho"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Iniciar pantalla dividida con esta aplicación en el lado izquierdo"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Cambiar de pantalla dividida a pantalla completa"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Con pantalla dividida: reemplazar una aplicación por otra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Iniciar pantalla dividida con esta aplicación en el lado derecho"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Iniciar pantalla dividida con esta aplicación en el lado izquierdo"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Con pantalla dividida: reemplazar una aplicación por otra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Cambiar idioma de entrada (idioma siguiente)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Cambiar idioma de entrada (idioma anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar al siguiente idioma"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Cambiar al idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Acceder a los emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Acceder a Escribir por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicaciones"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistencia"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome como predeterminado)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contactos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Correo (Gmail como predeterminado)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Correo electrónico"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendario"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index ec65920ff73c..8e9616fc2948 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Nupp <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Avakuva"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Tagasi"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Üles"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Alla"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vasakule"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Paremale"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Keskele"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Tühik"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Märguanded"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klaviatuuri otseteed"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klaviatuuripaigutuse vahetus"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Teksti kustutamine"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Otseteed"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Otseteede otsing"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Otseteid ei leitud"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Sisend"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Rakenduste avamine"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Praegune rakendus"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Juurdepääs märguandealale"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Täisekraanipildi jäädvustamine"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Juurdepääs süsteemi/rakenduste otseteede loendile"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Tagasi: eelmisesse olekusse naasmine (tagasinupp)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Juurdepääs avakuvale"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Avatud rakenduste ülevaade"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Hiljutiste rakenduste sirvimine (edasi)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Hiljutiste rakenduste sirvimine (tagasi)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Juurdepääs kõigi rakenduste ja otsingute loendile (st Otsing/Käivitusprogramm)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Tegumiriba peitmine ja kuvamine"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Juurdepääs süsteemi seadetele"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Juurdepääs Google\'i assistendile"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Märguannete vaatamine"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ekraanipildi jäädvustamine"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Otseteede kuvamine"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Tagasiliikumine"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Avakuvale liikumine"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Hiljutiste rakenduste vaatamine"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Hiljutiste rakenduste hulgas edasi liikumine"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Hiljutiste rakenduste hulgas tagasi liikumine"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Rakenduste loendi avamine"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Tegumiriba kuvamine"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Seadete avamine"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistendi avamine"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lukustuskuva"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Rakenduse Märkmed avamine kiirmemo jaoks"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Märkmete avamine"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Süsteemi multitegumtöö"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Ekraanikuva jagamine, nii et praegune rakendus on paremal"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Ekraanikuva jagamine, nii et praegune rakendus on vasakul"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Jagatud ekraanikuvalt täisekraanile lülitamine"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Ekraanikuva jagamise ajal: ühe rakenduse asendamine teisega"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Ekraanikuva jagamine, nii et praegune rakendus on paremal"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Ekraanikuva jagamine, nii et praegune rakendus on vasakul"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Jagatud ekraanikuvalt täisekraanile lülitamine"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ekraanikuva jagamise ajal: ühe rakenduse asendamine teisega"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Sisend"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Sisendkeele vahetamine (järgmine keel)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Sisendkeele vahetamine (eelmine keel)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Järgmisele keelele lülitamine"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Eelmisele keelele lülitamine"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Juurdepääs emotikonile"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Juurdepääs häälsisestusele"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Rakendused"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Abi"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Brauser (vaikimisi Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Brauser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktid"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-post (vaikimisi Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-post"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muusika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index b5a12cfdf468..fe04218bcbd6 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> botoia"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Hasiera"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Atzera"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Gora"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Behera"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Ezkerrera"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Eskuinera"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Erdiratu"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Zuriunea"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Jakinarazpenak"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Lasterbideak"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Aldatu tekl. diseinua"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Garbitu testua"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Lasterbideak"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Bilatu lasterbideak"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ez da aurkitu lasterbiderik"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Sarrera"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Irekitako aplikazioak"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Uneko aplikazioa"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Atzitu jakinarazpenen panela"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Atera pantaila osoaren argazki bat"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Atzitu sistemaren edo aplikazioetarako lasterbideen zerrenda"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atzera: itzuli aurreko egoerara (atzera egiteko botoia)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Atzitu hasierako pantaila"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Ikusi irekitako aplikazioen ikuspegi orokorra"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Joan azkenaldian erabilitako aplikazio batetik bestera (aurrera)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Joan azkenaldian erabilitako aplikazio batetik bestera (atzera)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Atzitu aplikazio guztien zerrenda eta bilatu (adibidez, bilatzeko aukeraren edo Exekutatzeko tresna aplikazioaren bidez)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ezkutatu eta erakutsi (berriro) zereginen barra"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Atzitu sistemaren ezarpenak"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Atzitu Google-ren Laguntzailea"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ikusi jakinarazpenak"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Atera pantaila-argazki bat"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Erakutsi lasterbideak"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Egin atzera"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Joan hasierako pantailara"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ikusi azkenaldiko aplikazioak"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Ikusi azken aplikazioak banan-banan (aurrerantz)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Ikusi azken aplikazioak banan-banan (atzerantz)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ireki aplikazioen zerrenda"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Erakutsi zereginen barra"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ireki ezarpenak"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Ireki Laguntzailea"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Blokeatu pantaila"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Ireki Oharrak aplikazioa oharrak bizkor idazteko"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Ireki oharrak"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Zereginen aldibereko sistemaren exekuzioa"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Sartu pantaila zatituaren eskuineko aldean uneko aplikazioarekin"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Sartu pantaila zatituaren ezkerreko aldean uneko aplikazioarekin"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Aldatu pantaila zatitutik pantaila osora"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Pantaila zatituan zaudela: ordeztu aplikazio bat beste batekin"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Sartu pantaila zatituaren eskuineko aldean oraingo aplikazioarekin"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Sartu pantaila zatituaren ezkerreko aldean oraingo aplikazioarekin"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Aldatu pantaila zatitutik pantaila osora"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Pantaila zatituan zaudela, ordeztu aplikazio bat beste batekin"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Sarrera"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Aldatu idazteko hizkuntza (hurrengo hizkuntza)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Aldatu idazteko hizkuntza (aurreko hizkuntza)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Aldatu hurrengo hizkuntzara"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Aldatu aurreko hizkuntzara"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Atzitu emojiak"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Atzitu ahozko idazketa"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikazioak"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Laguntzailea"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Ireki arakatzailea (Chrome, modu lehenetsian)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Laguntzailea"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Arakatzailea"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktuak"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Ireki posta elektronikoa (Gmail, modu lehenetsian)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Posta"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMSak"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 055ea3beea74..2f1783523919 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"دکمه <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"ابتدا"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"برگشت"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"بالا"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"پایین"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"چپ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"راست"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"مرکز"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"اعلان‌ها"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"میان‌برهای صفحه‌کلید"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"تغییر جانمایی صفحه‌کلید"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"پاک کردن نوشتار"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"میان‌برها"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"جستجوی میان‌برها"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"میان‌بری پیدا نشد"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ورودی"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"باز کردن برنامه‌ها"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"برنامه فعلی"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"دسترسی به کشوی اعلانات"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"گرفتن نماگرفت کامل"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"دسترسی به فهرست میان‌برهای برنامه‌ها / سیستم"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"برگشت: برگشتن به وضعیت قبلی (دکمه برگشت)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"دسترسی به صفحه اصلی"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"نمای کلی برنامه‌های باز"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"چرخش میان برنامه‌های اخیر (جلو)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"چرخش میان برنامه‌های اخیر (عقب)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"دسترسی به فهرست همه برنامه‌ها و جستجو (یعنی «جستجو»/ «راه‌انداز»)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"پنهان کردن و نمایش مجدد نوار وظیفه"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"دسترسی به تنظیمات سیستم"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"‏دسترسی به «‏‫دستیار Google‬»"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"مشاهده اعلان‌ها"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"گرفتن نماگرفت"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"نمایش میان‌برها"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"برگشتن"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"رفتن به صفحه اصلی"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"مشاهده برنامه‌های اخیر"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"چرخش به جلو در برنامه‌های اخیر"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"چرخش به عقب در برنامه‌های اخیر"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"باز کردن فهرست برنامه‌ها"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"نمایش نوار وظیفه"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"باز کردن تنظیمات"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"باز کردن «دستیار»"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"قفل صفحه"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"برای یادداشت سریع، برنامه «یادداشت‌ها» را بالا بکشید"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"باز کردن یادداشت‌ها"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"چندوظیفگی سیستم"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت راست"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت چپ"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"جابه‌جایی از صفحهٔ دونیمه به تمام صفحه"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"درحین صفحهٔ دونیمه: برنامه‌ای را با دیگری جابه‌جا می‌کند"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت راست"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت چپ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"جابه‌جایی از صفحهٔ دونیمه به تمام صفحه"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"درحین صفحهٔ دونیمه: برنامه‌ای را با دیگری جابه‌جا می‌کند"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ورودی"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"تغییر زبان ورودی (زبان بعدی)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"تغییر زبان ورودی (زبان قبلی)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"رفتن به زبان بعدی"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"رفتن به زبان قبلی"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"دسترسی به اموجی"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"دسترسی به تایپ صوتی"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"برنامه‌ها"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"دستیار"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"‏مرورگر (Chrome به‌عنوان پیش‌فرض)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"دستیار"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"مرورگر"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"مخاطبین"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"‏ایمیل (Gmail به‌عنوان پیش‌فرض)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ایمیل"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"پیامک"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"موسیقی"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"تقویم"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 82e5231ff976..d1bd05be11ad 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Painike <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Takaisin"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Ylös"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Alas"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vasemmalle"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Oikealle"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Keskelle"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Välilyönti"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Ilmoitukset"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Pikanäppäimet"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Vaihda näppäimistöasettelu"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Tyhjennä teksti"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Pikanäppäimet"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Hae pikanäppäimiä"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Pikanäppäimiä ei löytynyt"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Syöttötapa"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Avoimet"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Sovelluslista"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Käytä ilmoitusaluetta"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ota kuvakaappaus"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Käytä järjestelmän ja sovellusten pikakuvakkeita"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Takaisin: siirry takaisin edelliseen tilaan (takaisin-painike)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Käytä aloitusnäyttöä"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Avointen sovellusten yleiskatsaus"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Selaa viimeaikaisia sovelluksia (eteenpäin)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Selaa viimeaikaisia sovelluksia (takaisin)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Sovellusten ja haun luettelon käyttö (esim. Haku/Käynnistysohjelma)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Piilota ja tuo tehtäväpalkki näkyviin"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Käytä järjestelmäasetuksia"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Käytä Google Assistantia"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Katso ilmoitukset"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ota kuvakaappaus"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Näytä pikakuvakkeet"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Takaisin"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Siirry aloitusnäytölle"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Katso viimeisimmät sovellukset"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Siirry eteenpäin viimeaikaisten sovellusten kautta"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Siirry takaisin viimeaikaisten sovellusten kautta"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Avaa sovelluslista"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Näytä tehtäväpalkki"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Avaa asetukset"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Avaa Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lukitusnäyttö"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Avaa muistiinpanosovellus pikaisia merkintöjä varten"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Avaa muistiinpanot"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Järjestelmän monikäyttö"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Siirry jaettuun näyttöön (sovellus oikeanpuoleiseen näyttöön)"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Siirry jaettuun näyttöön (sovellus vasemmanpuoleiseen näyttöön)"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Vaihda jaetusta näytöstä koko näyttöön"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Jaetun näytön aikana: korvaa sovellus toisella"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Siirry jaettuun näyttöön (sovellus oikeanpuoleiseen näyttöön)"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Siirry jaettuun näyttöön (sovellus vasemmanpuoleiseen näyttöön)"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Vaihda jaetusta näytöstä koko näyttöön"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Jaetun näytön aikana: korvaa sovellus toisella"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Syöttötapa"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Vaihda syöttökieli (seuraava kieli)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Vaihda syöttökieli (edellinen kieli)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Vaihda seuraavaan kieleen"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Vaihda aiempaan kieleen"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Emojin käyttö"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Puhekirjoituksen käyttö"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Sovellukset"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Apusovellus"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Selain (oletuksena Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Selain"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Yhteystiedot"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Sähköposti (oletuksena Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Sähköposti"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Tekstiviesti"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiikki"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalenteri"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 619c7f88da58..bcf0e96c1d60 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Bouton <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Accueil"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Précédent"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Haut"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Bas"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Gauche"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Droite"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centrer"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espace"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Raccourcis clavier"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Changer la disposition du clavier"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Effacer le texte"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Raccourcis"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Recherchez des raccourcis"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Aucun raccourci trouvé"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrée"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ouvrir applis"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Appli actuelle"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Accéder au volet de notification"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Prendre une capture d\'écran complète"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Accéder à la liste des raccourcis du système/des applications"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Retour : retour à l\'état précédent (bouton précédent)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Accéder à l\'écran d\'accueil"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Aperçu des applications ouvertes"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Parcourir les applications récentes (avancer)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Parcourir les applications récentes (retour)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Accéder à la liste des applis et à la recherche (recherche/lanceur)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Masquer et (ré)afficher la barre des tâches"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Accéder aux paramètres système"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Accéder à l\'Assistant Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Afficher les notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Prendre une capture d\'écran"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Afficher les raccourcis"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Retour"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Aller à l’écran d’accueil"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Afficher les applications récentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Parcourir les applications récentes"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Parcourir les applications récentes en sens inverse"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ouvrir la liste des applications"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Afficher la barre des tâches"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ouvrir les paramètres"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Ouvrir l\'Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Écran de verrouillage"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Ouvrir l\'application de prise de notes pour prendre des notes rapides"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Ouvrir les notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitâche du système"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Passer à l\'écran partagé avec l\'application actuelle à droite"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Passer à l\'écran partagé avec l\'application actuelle à gauche"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Passer de l\'écran partagé au plein écran"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"En mode d\'écran partagé : remplacer une application par une autre"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Passer à l\'écran divisé avec l\'application actuelle à droite"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Passer à l\'écran divisé avec l\'application actuelle à gauche"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passer de l\'écran divisé au plein écran"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"En mode d\'écran divisé : remplacer une application par une autre"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrée"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Changer la langue d\'entrée (langue suivante)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Changer la langue d\'entrée (langue précédente)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passer à la langue suivante"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Passer à la langue précédente"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Accéder aux émojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Accéder à l\'entrée vocale"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistance"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navigateur (Chrome par défaut)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navigateur"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Courriel (Gmail par défaut)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Courriel"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Messages texte"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musique"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 9f22a57fe2b3..6555f27accae 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Bouton <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Accueil"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Précédent"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Vers le haut"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Vers le bas"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vers la gauche"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Vers la droite"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Flèche vers le haut"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Flèche vers le bas"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Flèche vers la gauche"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Flèche vers la droite"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espace"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Raccourcis clavier"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Changer disposition du clavier"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Effacer le texte"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ou"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Effacer la requête de recherche"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Raccourcis"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Raccourcis de recherche"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Aucun raccourci trouvé"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Saisie"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Applis ouvertes"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Appli actuelle"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Accéder au volet des notifications"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Prendre une capture d\'écran complète"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Accéder à la liste des raccourcis d\'applis/système"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Retour : revenir à l\'état précédent (bouton Retour)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Accéder à l\'écran d\'accueil"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Aperçu des applis ouvertes"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Parcourir les applis récentes (avancer)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Parcourir les applis récentes (reculer)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Accéder à la liste d\'applis et rechercher (Recherche/Lanceur d\'applis)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Masquer et (ré)afficher la barre des tâches"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Accéder aux paramètres système"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Accéder à l\'Assistant Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Affichage des résultats de recherche"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Affichage des raccourcis système"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Affichage des raccourcis clavier"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Affichage des raccourcis pour ouvrir les applications"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Affichage des raccourcis pour l\'application actuelle"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Afficher les notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Prendre une capture d\'écran"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Afficher les raccourcis"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Retour"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Accéder à l\'écran d\'accueil"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Afficher les applis récentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Aller vers les applications récentes"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Revenir sur les applications récentes"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ouvrir la liste d\'applications"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Afficher la barre des tâches"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ouvrir les paramètres"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Ouvrir l\'Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Verrouiller l\'écran"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Tirer l\'appli de notes vers le haut pour une note rapide"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Ouvrir les notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitâche du système"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Passer en écran partagé avec l\'appli actuelle affichée à droite"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Passer en écran partagé avec l\'appli actuelle affichée à gauche"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Passer de l\'écran partagé au plein écran"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"En mode écran partagé : remplacer une appli par une autre"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Passer en écran partagé avec l\'appli actuelle affichée à droite"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Passer en écran partagé avec l\'appli actuelle affichée à gauche"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passer de l\'écran partagé au plein écran"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"En mode écran partagé : Remplacer une appli par une autre"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Saisie"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Changer la langue de saisie (langue suivante)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Changer la langue de saisie (langue précédente)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passer à la langue suivante"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Passer à la langue précédente"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Accéder aux emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Accéder à la saisie vocale"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistance"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Parcourir (Chrome par défaut)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navigateur"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (Gmail par défaut)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Messagerie"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musique"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index a7341b0d9926..716fcf23f485 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Inicio"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Volver"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Arriba"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Abaixo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Esquerda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Dereita"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centro"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espazo"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificacións"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atallos de teclado"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambiar deseño do teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Borrar o texto"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Atallos"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Buscar atallos"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Non se atoparon atallos"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Abrir aplicacións"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App actual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Acceder ao panel despregable"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Facer captura de pantalla completa"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Acceder á lista de atallos do sistema ou das aplicacións"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atrás: Volver ao estado anterior (botón Atrás)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Acceder á pantalla de inicio"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Visión xeral de aplicacións abertas"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Percorrer aplicacións recentes (adiante)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Percorrer aplicacións recentes (atrás)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Acceder á lista de apps e á busca (por exemplo, a Busca ou Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ocultar e volver mostrar barra de tarefas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Acceder á configuración do sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Acceder ao Asistente de Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ver notificacións"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Facer captura de pantalla"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar atallos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Volver"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir á pantalla de inicio"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ver aplicacións recentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Percorrer aplicacións recentes cara adiante"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Percorrer aplicacións recentes cara atrás"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de aplicacións"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar barra de tarefas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configuración"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir Asistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueo"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Abrir aplicación Notas para facer unha nota rápida"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir notas"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitarefa do sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Activar pantalla dividida con esta aplicación no lado dereito"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Activar pantalla dividida con esta aplicación no lado esquerdo"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Cambiar de pantalla dividida a pantalla completa"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"En modo de pantalla dividida: Substituír unha aplicación por outra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Activar pantalla dividida con esta aplicación no lado dereito"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Activar pantalla dividida con esta aplicación no lado esquerdo"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"En modo de pantalla dividida: Substituír unha aplicación por outra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Cambiar idioma de escritura (seguinte idioma)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Cambiar idioma de escritura (idioma anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar ao seguinte idioma"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Cambiar ao idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Acceder aos emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Acceder á escritura por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicacións"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistente"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (predeterminado: Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contactos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Correo electrónico (predeterminado: Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Correo electrónico"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 2ca21c537507..837986546e78 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"બટન <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"નોટિફિકેશન"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"કીબોર્ડ શૉર્ટકટ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"કીબોર્ડ લેઆઉટ સ્વિચ કરો"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ટેક્સ્ટ સાફ કરો"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"શૉર્ટકટ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"શૉર્ટકટ શોધો"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"કોઈ શૉર્ટકટ મળ્યો નથી"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ઇનપુટ"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ઍપ ખોલો"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"હાલની ઍપ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"નોટિફિકેશન શેડ ઍક્સેસ કરો"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"કોઈ આખો સ્ક્રીનશૉટ લો"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"સિસ્ટમ / ઍપ્લિકેશન શૉર્ટકટની સૂચિ ઍક્સેસ કરો"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"પાછળ: પાછળની સ્થિતિ પર પાછા જાઓ (પાછળ બટન)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"હોમ સ્ક્રીન ઍક્સેસ કરો"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ખુલ્લી ઍપનો ઓવરવ્યૂ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"તાજેતરની ઍપ વચ્ચે સ્વિચ કરો (ફૉરવર્ડ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"તાજેતરની ઍપ વચ્ચે સ્વિચ કરો (પાછળ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"તમામ ઍપ અને શોધની સૂચિ (દા.ત. Search/Launcher) ઍક્સેસ કરો"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ટાસ્કબાર છુપાવો અને (ફરી) બતાવો"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"સિસ્ટમ સેટિંગ ઍક્સેસ કરો"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant ઍક્સેસ કરો"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"નોટિફિકેશન જુઓ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"સ્ક્રીનશૉટ લો"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"શૉર્ટકટ બતાવો"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"પાછળ જાઓ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"હોમ સ્ક્રીન પર જાઓ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"તાજેતરની ઍપ જુઓ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"તાજેતરની ઍપ પર આગળ જાઓ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"તાજેતરની ઍપ પર પાછળ જાઓ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ઍપની સૂચિ ખોલો"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ટાસ્કબાર બતાવો"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"સેટિંગ ખોલો"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ખોલો"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"લૉક સ્ક્રીન"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ઝડપી મેમો માટે Notes ઍપ ખોલો"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"નોંધ ખોલો"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"સિસ્ટમ દ્વારા એકથી વધુ કાર્યો કરવા"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"જમણી બાજુ પર હાલની ઍપ વડે વિભાજિત સ્ક્રીન દાખલ કરો"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"ડાબી બાજુ પર હાલની ઍપ વડે વિભાજિત સ્ક્રીન દાખલ કરો"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"વિભાજિત સ્ક્રીનથી પૂર્ણ સ્ક્રીન પર સ્વિચ કરો"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"વિભાજિત સ્ક્રીન દરમિયાન: એક ઍપને બીજી ઍપમાં બદલો"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"જમણી બાજુ પર હાલની ઍપ સાથે વિભાજિત સ્ક્રીનમાં દાખલ થાઓ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"ડાબી બાજુ પર હાલની ઍપ સાથે વિભાજિત સ્ક્રીનમાં દાખલ થાઓ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"વિભાજિત સ્ક્રીનથી પૂર્ણ સ્ક્રીન પર સ્વિચ કરો"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"વિભાજિત સ્ક્રીન દરમિયાન: એક ઍપને બીજી ઍપમાં બદલો"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ઇનપુટ"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ઇનપુટની ભાષા સ્વિચ કરો (આગલી ભાષા)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ઇનપુટની ભાષા સ્વિચ કરો (પાછલી ભાષા)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"આગલી ભાષા પર સ્વિચ કરો"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"પાછલી ભાષા પર સ્વિચ કરો"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ઇમોજી ઍક્સેસ કરો"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"વૉઇસ ટાઇપિંગ ઍક્સેસ કરો"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ઍપ્લિકેશનો"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"સહાય"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"બ્રાઉઝર (ડિફૉલ્ટ તરીકે Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"બ્રાઉઝર"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"સંપર્કો"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ઇમેઇલ (ડિફૉલ્ટ તરીકે Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ઇમેઇલ"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"મ્યુઝિક"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 6a7d143601ba..ab01d2bd79aa 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"बटन <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ऊपर तीर"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"नीचे तीर"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"बायां तीर"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"दायां तीर"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"मध्य तीर"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"सूचनाएं"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"कीबोर्ड शॉर्टकट"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"कीबोर्ड लेआउट बदलें"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"टेक्स्ट मिटाएं"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"शॉर्टकट"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"शॉर्टकट खोजें"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"कोई शॉर्टकट नहीं मिला"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"इनपुट"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"खुले हुए ऐप्लिकेशन"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"मौजूदा ऐप्लिकेशन"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"नोटिफ़िकेशन शेड को ऐक्सेस करें"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"पूरा स्क्रीनशॉट लें"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"सिस्टम / ऐप्लिकेशन के शॉर्टकट की सूची ऐक्सेस करें"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"वापस जाएं: पिछली स्क्रीन पर वापस जाएं (\'वापस जाएं\' बटन)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"होम स्क्रीन को ऐक्सेस करें"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"खुले हुए ऐप्लिकेशन की जानकारी"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन पर जाएं (सबसे पहले इस्तेमाल किए गए ऐप्लिकेशन सबसे पहले)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन पर जाएं (सबसे हाल के ऐप्लिकेशन सबसे पहले)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"सभी ऐप्लिकेशन और की गई खोजों की सूची ऐक्सेस करें (जैसे, Search/लॉन्चर)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"टास्कबार छिपाएं और (फिर से) दिखाएं"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"सिस्टम की सेटिंग ऐक्सेस करें"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant को ऐक्सेस करें"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"सूचनाएं देखें"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"स्क्रीनशॉट लें"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"शॉर्टकट दिखाएं"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"वापस जाएं"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"होम स्क्रीन पर जाएं"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन देखें"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन के अगले पेज पर जाएं"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन के पिछले पेज पर जाएं"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ऐप्लिकेशन की सूची खोलें"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"टास्कबार दिखाएं"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"सेटिंग खोलें"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Google Assistant खोलें"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"लॉक स्क्रीन"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"तेज़ी से मेमो बनाने के लिए Notes ऐप्लिकेशन का इस्तेमाल करें"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notes ऐप्लिकेशन खोलें"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"सिस्टम मल्टीटास्किंग"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"मौजूदा ऐप्लिकेशन को स्प्लिट स्क्रीन की मदद से दाईं ओर ले जाएं"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"मौजूदा ऐप्लिकेशन को स्प्लिट स्क्रीन की मदद से बाईं ओर ले जाएं"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"स्प्लिट स्क्रीन से फ़ुल स्क्रीन मोड पर जाएं"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"स्प्लिट स्क्रीन के दौरान: एक ऐप्लिकेशन को दूसरे से बदलें"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"स्प्लिट स्क्रीन का इस्तेमाल करके, मौजूदा ऐप्लिकेशन को दाईं ओर ले जाएं"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"स्प्लिट स्क्रीन का इस्तेमाल करके, मौजूदा ऐप्लिकेशन को बाईं ओर ले जाएं"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीन से फ़ुल स्क्रीन मोड पर स्विच करें"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रीन के दौरान: एक ऐप्लिकेशन को दूसरे ऐप्लिकेशन से बदलें"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"इनपुट भाषा बदलें (अगली भाषा)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"इनपुट भाषा बदलें (पिछली भाषा)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"अगली भाषा पर स्विच करें"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"इस्तेमाल की गई पिछली भाषा पर स्विच करें"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"इमोजी ऐक्सेस करें"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"बोली को लिखाई में बदलने की सुविधा ऐक्सेस करें"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ऐप्लिकेशन"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"सहायक"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ब्राउज़र (डिफ़ॉल्ट के तौर पर Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ब्राउज़र"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"संपर्क"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ईमेल (डिफ़ॉल्ट के तौर पर Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ईमेल"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"मैसेज (एसएमएस) करें"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"संगीत"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 4469d788be61..7584e8ae6e32 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Tipka <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Početak"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Natrag"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Gore"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Dolje"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Lijevo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Desno"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Sredina"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Razmaknica"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obavijesti"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tipkovni prečaci"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Promjena rasporeda tipkovnice"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Ukloni tekst"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Prečaci"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Pretražite prečace"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nema nijednog prečaca"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Unos"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otvaranje aplikacija"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Trenutačna aplikacija"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Pristupanje zaslonu obavijesti"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Izrada snimke cijelog zaslona"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Pristupanje popisu prečaca sustava/aplikacija"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Natrag: povratak na prethodno stanje (gumb za natrag)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Pristupanje početnom zaslonu"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Pregled otvorenih aplikacija"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Pregledavanje nedavnih aplikacija (unaprijed)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Pregledavanje nedavnih aplikacija (unatrag)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Pristupanje popisu svih aplikacija i pretraživanja (npr. Pretraživanje/Pokretač)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Sakrivanje i (ponovno) prikazivanje trake sa zadacima"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Pristupanje postavkama sustava"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Pristupanje Google asistentu"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Prikaži obavijesti"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Snimi zaslon"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Prikaži prečace"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Natrag"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Idi na početni zaslon"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Prikaži nedavne aplikacije"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Kruži unaprijed kroz nedavne aplikacije"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Kruži unatrag kroz nedavne aplikacije"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvori popis aplikacija"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Pokaži traku sa zadacima"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvori postavke"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvori Asistenta"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Zaključavanje zaslona"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Izvlačenje aplikacije Bilješke za brzu bilješku"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otvori bilješke"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Obavljanje više zadataka sustava"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Otvorite podijeljeni zaslon s trenutačnom aplikacijom s desne strane"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Otvorite podijeljeni zaslon s trenutačnom aplikacijom s lijeve strane"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Prijelaz s podijeljenog zaslona na cijeli zaslon"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Tijekom podijeljenog zaslona: zamijenite aplikaciju drugom"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Otvori podijeljeni zaslon s trenutačnom aplikacijom s desne strane"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Otvori podijeljeni zaslon s trenutačnom aplikacijom s lijeve strane"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prijeđi s podijeljenog zaslona na cijeli zaslon"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Tijekom podijeljenog zaslona: zamijeni aplikaciju drugom"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Prebacivanje jezika unosa (sljedeći jezik)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Prebacivanje jezika unosa (prethodni jezik)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Prijeđi na sljedeći jezik"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Prijeđi na prethodni jezik"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Pristupanje emojijima"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Pristupanje unosu teksta govorom"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacije"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pomoć"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Preglednik (Chrome kao zadani)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Preglednik"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakti"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-pošta (Gmail kao zadani)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-pošta"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Glazba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 51c3932261a9..85fe45525ea5 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> gomb"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Kezdőképernyő"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Vissza"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Fel"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Le"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Balra"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Jobbra"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Középre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Szóköz"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Értesítések"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Billentyűkódok"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Billentyűzetkiosztás váltása"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Szöveg törlése"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Billentyűparancsok"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Billentyűparancs keresése"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nincs billentyűparancs"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Bevitel"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Futó appok"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuális app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Ugrás az értesítési felületre"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Teljes képernyőkép készítése"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Ugrás a rendszer-/alkalmazás-parancsikonok listájához"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Vissza: visszaváltás az előző állapotra (vissza gomb)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Ugrás a kezdőképernyőre"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Megnyitott alkalmazások áttekintése"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Lépegetés a legutóbbi appok között (előre)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Lépegetés a legutóbbi appok között (visszafelé)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Ugrás az összes app listájához és a kereséshez (pl. Kereső/Indító)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Elrejtés és a feladatsáv (újbóli) megjelenítése"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Ugrás a rendszerbeállításokhoz"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Ugrás a Google Segédhez"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Értesítések megtekintése"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Képernyőkép készítése"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Parancsikonok megjelenítése"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Vissza"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ugrás a kezdőképernyőre"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Legutóbbi alkalmazások megtekintése"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Lépegetés előrefelé a legutóbbi alkalmazások között"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Lépegetés visszafelé a legutóbbi alkalmazások között"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Alkalmazáslista megnyitása"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Feladatsáv megjelenítése"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Beállítások megnyitása"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"A Segéd megnyitása"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lezárási képernyő"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"A jegyzetkészítő app megnyitása gyors feljegyzés készítéséhez"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Jegyzetek megnyitása"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Rendszermultitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Osztott képernyő aktiválása, az aktuális app kerüljön jobbra"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Osztott képernyő aktiválása, az aktuális app kerüljön balra"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Váltás osztott képernyőről teljes képernyőre"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Osztott képernyőn: az egyik app lecserélése egy másikra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Osztott képernyő aktiválása; az aktuális alkalmazás kerüljön jobbra"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Osztott képernyő aktiválása; az aktuális alkalmazás kerüljön balra"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Váltás osztott képernyőről teljes képernyőre"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Osztott képernyőn: az egyik alkalmazás lecserélése egy másikra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Bevitel"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Beviteli nyelv váltása (következő nyelv)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Beviteli nyelv váltása (előző nyelv)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Váltás a következő nyelvre"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Váltás az előző nyelvre"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Ugrás az emojikhoz"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Ugrás a hangvezérelt íráshoz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Alkalmazások"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Segédalkalmazás"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Böngésző (alapértelmezés szerint: Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Segéd"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Böngésző"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Névjegyek"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail-alkalmazás (alapértelmezés szerint: Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS-üzenetek"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Zene"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Naptár"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 917fb77de826..5be6a874af0e 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> կոճակ"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Գլխավոր էջ"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Հետ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Վերև"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Ներքև"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Ձախ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Աջ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Կենտրոն"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Բացատ"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Ծանուցումներ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ստեղնային դյուրանցումներ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Դասավորության փոխարկում"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Ջնջել տեքստը"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Դյուրանցումներ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Դյուրանցումների որոնում"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Դյուրանցումներ չեն գտնվել"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Ներածում"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Բաց հավելվածներ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Այս հավելվածը"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Բացել ծանուցումների վահանակը"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ստեղծել ամբողջ էկրանի սքրինշոթ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Բացել համակարգի/հավելվածների դյուրանցումների ցանկը"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Վերադառնալ նախկին վիճակին («Հետ» կոճակ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Բացել հիմնական էկրանը"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Բաց հավելվածների համատեսք"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Դիտել վերջին հավելվածները (սովորական հերթականությամբ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Դիտել վերջին հավելվածները (հակառակ հերթականությամբ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Բացել բոլոր հավելվածների և որոնումների (օր.՝ Որոնում/Գործարկիչ) ցանկը"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Թաքցնել և (նորից) ցուցադրել հավելվածների վահանակը"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Բացել համակարգի կարգավորումները"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Գործարկել Google Օգնականը"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Դիտել ծանուցումները"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Սքրինշոթ անել"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Ցույց տալ դյուրանցումները"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Հետ գնալ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Անցնել հիմնական էկրան"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Դիտել վերջին հավելվածները"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Առաջ անցնել վերջին հավելվածների միջով"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Հետ անցնել վերջին հավելվածների միջով"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Բացել հավելվածների ցանկը"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Ցուցադրել հավելվածների վահանակը"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Բացել կարգավորումները"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Բացել Օգնականը"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Կողպէկրան"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Բացել «Նշումներ» հավելվածը՝ արագ նշում ստեղծելու համար"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Բացել նշումները"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Համակարգի բազմախնդրության ռեժիմ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածն աջ կողմում"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածը ձախ կողմում"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Տրոհված էկրանից անցնել լիաէկրան ռեժիմ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Տրոհված էկրանի ռեժիմում մեկ հավելվածը փոխարինել մյուսով"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածն աջ կողմում"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածը ձախ կողմում"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Տրոհված էկրանից անցնել լիաէկրան ռեժիմ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Տրոհված էկրանի ռեժիմում մեկ հավելվածը փոխարինել մյուսով"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ներածում"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Անցնել ներածման հաջորդ լեզվին"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Անցնել ներածման նախորդ լեզվին"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Անցնել հաջորդ լեզվին"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Անցնել նախորդ լեզվին"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Բացել էմոջիները"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Ակտիվացնել ձայնային ներածումը"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Հավելվածներ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Օգնություն"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Դիտարկիչ (Chrome-ը որպես կանխադրված)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Օգնական"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Դիտարկիչ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Կոնտակտներ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Էլփոստ (Gmail-ը որպես կանխադրված)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Էլփոստ"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Երաժշտություն"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Օրացույց"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 83db83b6ce80..8d372dc16f6b 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Tombol <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifikasi"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Pintasan keyboard"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Ganti tata letak keyboard"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Hapus teks"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Pintasan"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Pintasan penelusuran"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Tidak ditemukan pintasan"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Aplikasi yang terbuka"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aplikasi saat ini"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Akses menu notifikasi"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ambil screenshot penuh"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Akses daftar sistem/pintasan aplikasi"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Kembali: kembali ke status sebelumnya (tombol kembali)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Akses layar utama"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Ringkasan aplikasi yang terbuka"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Berpindah-pindah antara aplikasi terbaru (maju)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Berpindah-pindah antara aplikasi terbaru (mundur)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Akses daftar semua aplikasi dan penelusuran (yaitu Penelusuran/Peluncur)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Sembunyikan dan tampilkan (kembali) taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Akses setelan sistem"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Akses Asisten Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Lihat notifikasi"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ambil screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Tampilkan pintasan"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Kembali"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Buka layar utama"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Lihat aplikasi terbaru"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Menavigasi maju pada aplikasi terbaru"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Menavigasi mundur pada aplikasi terbaru"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Buka daftar aplikasi"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Tampilkan taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Buka setelan"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Buka Asisten"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Kunci layar"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Buka aplikasi Catatan untuk memo cepat"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Buka catatan"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking sistem"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Masuk ke Layar terpisah dengan aplikasi saat ini ke RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Masuk ke Layar terpisah dengan aplikasi saat ini ke LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Beralih dari Layar terpisah ke layar penuh"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Dalam Layar terpisah: ganti dari satu aplikasi ke aplikasi lainnya"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Masuk ke layar terpisah dengan aplikasi saat ini ke RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Masuk ke layar terpisah dengan aplikasi saat ini ke LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Beralih dari layar terpisah ke layar penuh"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Dalam layar terpisah: ganti salah satu aplikasi dengan yang lain"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Beralih bahasa input (bahasa berikutnya)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Beralih bahasa input (bahasa sebelumnya)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Beralih ke bahasa berikutnya"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Beralih ke bahasa sebelumnya"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Akses emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Akses dikte"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikasi"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Bantuan"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome sebagai default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asisten"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontak"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail sebagai default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index bf0b73d6d86c..102e8b819ec7 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Hnappur <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Til baka"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Upp"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Niður"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vinstri"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Hægri"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Ör upp"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Ör niður"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Ör til vinstri"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Ör til hægri"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Miðja"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Bilslá"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Tilkynningar"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Flýtilyklar"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Skipta um lyklaskipan"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Hreinsa texta"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"eða"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Hreinsa leitarfyrirspurn"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Flýtileiðir"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Leita að flýtileiðum"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Engar flýtileiðir fundust"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Innsláttur"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Opna forrit"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Gildandi forrit"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Opna tilkynningaglugga"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Taka heildarskjámynd"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Opna lista yfir flýtileiðir fyrir kerfi/forrit"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Til baka: Fara til baka í fyrri stöðu (bakkhnappur)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Opna heimaskjá"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Yfirlit yfir opin forrit"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Fletta í gegnum nýleg forrit (áfram)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Fletta í gegnum nýleg forrit (til baka)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Opna lista yfir öll forrit og leit (þ.e. Leit/Ræsiforrit)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Fela og sýna (aftur) forritastiku"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Opna kerfisstillingar"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Opna Google-hjálpara"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Sýnir leitarniðurstöður"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Sýnir flýtileiðir fyrir kerfi"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Sýnir flýtileiðir fyrir innslátt"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Sýnir flýtileiðir til að opna forrit"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Sýnir flýtileiðir fyrir núverandi forrit"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Skoða tilkynningar"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Taka skjámynd"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Sýna flýtilykla"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Til baka"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Opna heimaskjáinn"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Skoða nýleg forrit"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Fletta áfram í gegnum nýleg forrit"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Fletta aftur á bak í gegnum nýleg forrit"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Opna forritalista"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Sýna forritastiku"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Opna stillingar"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Opna Hjálpara"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lásskjár"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Opna glósuforrit til að skrá minnispunkt á fljótlegan hátt"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Opna glósur"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Fjölvinnsla kerfis"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Opna skjáskiptingu hægra megin með núverandi forriti"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Opna skjáskiptingu vinstra megin með núverandi forriti"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Skipta úr skjáskiptingu yfir í allan skjáinn"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Í skjáskiptingu: Skipta forriti út fyrir annað forrit"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Opna skjáskiptingu hægra megin með núverandi forriti"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Opna skjáskiptingu vinstra megin með núverandi forriti"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skipta úr skjáskiptingu yfir á allan skjáinn"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Í skjáskiptingu: Skipta forriti út fyrir annað forrit"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Innsláttur"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Breyta innsláttartungumáli (næsta tungumál)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Breyta innsláttartungumáli (fyrra tungumál)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Skipta yfir í næsta tungumál"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Skipta yfir í fyrra tungumál"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Opna emoji-tákn"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Opna raddinnslátt"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Forrit"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Aðstoð"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Vafri (Chrome sem sjálfgefinn)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Hjálpari"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Vafri"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Tengiliðir"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Tölvupóstur (Gmail sem sjálfgefinn)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Tölvupóstur"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS-skilaboð"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Tónlist"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Dagatal"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index e65e3aa29ab1..aad1e56d88bc 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Pulsante <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home page"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Indietro"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Su"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Giù"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Sinistra"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Destra"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Al centro"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Spazio"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifiche"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Scorciatoie da tastiera"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambia layout della tastiera"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Cancella testo"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Scorciatoie"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Cerca scorciatoie"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Scorciatoie non trovate"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Inserimento"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"App aperte"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App corrente"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Accedi all\'area notifiche"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Acquisisci uno screenshot completo"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Accedi all\'elenco di scorciatoie app e di sistema"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Indietro: torna allo stato precedente (pulsante Indietro)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Accedi alla schermata Home"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Panoramica delle app aperte"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Scorri le app recenti (in avanti)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Scorri le app recenti (a ritroso)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Accedi all\'elenco di tutte le app e alla ricerca (Ricerca/Avvio app)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Nascondi e mostra di nuovo la barra delle app"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Accedi alle impostazioni di sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Accedi all\'Assistente Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Visualizza notifiche"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Acquisisci screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostra scorciatoie"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Indietro"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Vai alla schermata Home"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Visualizza app recenti"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Spostati avanti tra le app recenti"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Spostati indietro tra le app recenti"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Apri elenco di app"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostra barra delle app"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Apri impostazioni"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Apri l\'assistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Blocca lo schermo"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Visualizza l\'app Note per appunti rapidi"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Apri note"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking di sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Attiva lo schermo diviso con l\'app corrente a destra"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Attiva lo schermo diviso con l\'app corrente a sinistra"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Passa da schermo diviso a schermo intero"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Con lo schermo diviso: sostituisci un\'app con un\'altra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Attiva lo schermo diviso con l\'app corrente a destra"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Attiva lo schermo diviso con l\'app corrente a sinistra"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passa da schermo diviso a schermo intero"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Con lo schermo diviso: sostituisci un\'app con un\'altra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Inserimento"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Cambia lingua di inserimento (lingua successiva)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Cambia lingua di inserimento (lingua precedente)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passa alla prossima lingua"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Passa alla lingua precedente"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Accedi all\'emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Accedi alla digitazione vocale"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applicazioni"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistenza"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (quello predefinito è Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contatti"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (l\'app predefinita è Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musica"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendario"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index a14aa1b91b57..bbfbe3249eb0 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"לחצן <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"דף הבית"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"הקודם"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"למעלה"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"למטה"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"שמאלה"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ימינה"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"חץ למעלה"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"חץ למטה"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"חץ שמאלה"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"חץ ימינה"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"מרכז"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"רווח"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"התראות"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"מקשי קיצור במקלדת"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"החלפה של פריסת מקלדת"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"מחיקת הטקסט"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"או"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"ניקוי שאילתת החיפוש"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"מקשי קיצור"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"חיפוש מקשי קיצור"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"לא נמצאו מקשי קיצור"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"קלט"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"פתיחת אפליקציות"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"האפליקציה הנוכחית"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"גישה ללוח ההתראות"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ביצוע צילום מסך מלא"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"גישה לרשימת מקשי קיצור של המערכת/אפליקציות"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"חזרה: חזרה למצב הקודם (לחצן \'הקודם\')"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"גישה למסך הבית"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"סקירה כללית של האפליקציות הפתוחות"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"דפדוף בין האפליקציות האחרונות (קדימה)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"דפדוף בין האפליקציות האחרונות (לאחור)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"גישה לרשימת כל האפליקציות ולחיפוש (כלומר חיפוש/מרכז האפליקציות)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"הסתרה והצגה (מחדש) של סרגל האפליקציות"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"גישה להגדרות המערכת"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"‏גישה ל-Google Assistant"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"מוצגות: תוצאות החיפוש"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"מוצגים: קיצורי הדרך של המערכת"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"מוצגים: קיצורי הדרך של הקלט"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"מוצגים: קיצורי הדרך לפתיחת אפליקציות"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"מוצגים: קיצורי הדרך של האפליקציה הנוכחית"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"הצגת הודעות"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"צילום המסך"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"הצגת מקשי הקיצור"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"חזרה"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"מעבר למסך הבית"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"הצגת האפליקציות האחרונות"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"דפדוף קדימה באפליקציות האחרונות"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"דפדוף אחורה באפליקציות האחרונות"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"פתיחה של רשימת האפליקציות"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"הצגת סרגל האפליקציות"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"פתיחת ההגדרות"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"‏לפתיחת Google Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"מסך הנעילה"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"אפשר למשוך למעלה את אפליקציית הפתקים לשימוש מהיר"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"פתיחה של אפליקציית הפתקים"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ריבוי משימות מערכת"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"‏כניסה למסך מפוצל עם האפליקציה הנוכחית ל-RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"‏כניסה למסך מפוצל עם האפליקציה הנוכחית ל-LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"החלפה ממסך מפוצל למסך מלא"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"כשהמסך מפוצל: החלפה בין אפליקציה אחת לאחרת"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"‏כניסה למסך מפוצל עם האפליקציה הנוכחית ל-RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"‏כניסה למסך מפוצל עם האפליקציה הנוכחית ל-LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"החלפה ממסך מפוצל למסך מלא"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"כשהמסך מפוצל: החלפה בין אפליקציה אחת לאחרת"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"קלט"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"החלפת שפת הקלט (השפה הבאה)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"החלפת שפת הקלט (השפה הקודמת)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"מעבר לשפה הבאה"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"מעבר לשפה הקודמת"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"גישה לאמוג\'י"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"גישה להכתבה בקול"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"אפליקציות"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"אסיסטנט"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"‏דפדפן (Chrome כברירת מחדל)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"דפדפן"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"אנשי קשר"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"‏אימייל (Gmail כברירת מחדל)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"אימייל"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"מוזיקה"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"יומן"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 75166d9546ad..c8a0a540fb6a 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> ボタン"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"戻る"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"上"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"下"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"左"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"右"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"中央"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"キーボード ショートカット"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"キーボード レイアウトの切り替え"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"テキストを消去"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ショートカット"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ショートカットの検索"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ショートカットがありません"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"入力"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"開いているアプリ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"現在のアプリ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"通知シェードにアクセス"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"フル スクリーンショットを撮影"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"システム / アプリのショートカットの一覧にアクセス"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"戻る: 前の状態に戻る([戻る] ボタン)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ホーム画面にアクセス"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"開いているアプリの概要"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"最近使ったアプリを切り替え(進む)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"最近使ったアプリを切り替え(戻る)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"すべてのアプリの一覧にアクセスして検索(検索 / ランチャー)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"タスクバーを非表示 /(再)表示"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"システム設定にアクセス"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google アシスタントにアクセス"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"お知らせを表示する"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"スクリーンショットを撮る"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ショートカットを表示する"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"戻る"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ホーム画面に移動する"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"最近使ったアプリを表示する"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"最近使ったアプリを確認する"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"最近使ったアプリを確認する(逆方向)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"アプリの一覧を開く"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"タスクバーを表示する"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"設定を開く"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"アシスタントを開く"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"画面をロック"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"クイックメモのためにメモアプリを表示"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"メモを開く"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"システム マルチタスク"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"分割画面にして現在のアプリを右側に設定"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"分割画面にして現在のアプリを左側に設定"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"分割画面から全画面に切り替え"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"分割画面中: アプリを順に置換"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"分割画面にして現在のアプリを右側に設定する"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"分割画面にして現在のアプリを左側に設定する"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"分割画面から全画面に切り替える"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"分割画面中: アプリを順に置換する"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"入力"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"入力言語を切り替え(次の言語)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"入力言語を切り替え(前の言語)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"次の言語に切り替える"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"前の言語に切り替える"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"絵文字にアクセス"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"音声入力にアクセス"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"アプリ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"アシスト"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ブラウザ(デフォルト: Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"アシスタント"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ブラウザ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"連絡先"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"メール(デフォルト: Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"メール"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音楽"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"カレンダー"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index b363f993338b..c6c4a57cdb90 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ღილაკი „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"უკან"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ზემოთ"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ქვემოთ"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"მარცხნივ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"მარჯვნივ"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"ზემოთ მიმართული ისარი"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"ქვემოთ მიმართული ისარი"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"მარცხნივ მიმართული ისარი"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"მარჯვნივ მიმართული ისარი"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"ცენტრში"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"შორისი"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"შეტყობინებები"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"კლავიატურის მალსახმობები"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"კლავიატურის განლაგების გადართვა"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ტექსტის გასუფთავება"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ან"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"საძიებო ფრაზის გასუფთავება"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"მალსახმობები"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"მალსახმობების ძიება"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"მალსახმობები ვერ მოიძებნა"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"შეყვანა"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ღია აპები"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"მიმდინარე აპი"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"შეტყობინებების ფარდაზე წვდომა"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"სრული ეკრანის ანაბეჭდის გადაღება"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"სისტემის / აპების მალსახმობებზე წვდომის სია"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"უკან: წინა მდგომარეობაში დაბრუნება (უკან გადასვლის ღილაკი)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"მთავარ ეკრანზე წვდომა"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ღია აპების მიმოხილვა"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ბოლო აპების გადახედვა (წინ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ბოლო აპების გადახედვა (უკან)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ყველა აპსა და ძიებაზე წვდომის სია (ე.ი. Search/გამშვები)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ამოცანათა ზოლის დამალვა და ჩვენება (განმეორებით ჩვენება)"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"სისტემის პარამეტრებზე წვდომა"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google ასისტენტზე წვდომა"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"ნაჩვენებია ძიების შედეგები"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"ნაჩვენებია სისტემის მალსახმობები"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"ნაჩვენებია შენატანის მალსახმობები"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"ნაჩვენებია მალსახმობები, რომლებიც ხსნის აპებს"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"ნაჩვენებია მალსახმობები მიმდინარე აპისთვის"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"შეტყობინებების ნახვა"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ეკრანის ანაბეჭდის გადაღება"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"მალსახმობების ჩვენება"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"უკან დაბრუნება"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"მთავარ ეკრანზე გადასვლა"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ბოლო აპების ნახვა"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"წინ გადასვლა ბოლოდროინდელი აპების მეშვეობით"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"უკან გადასვლა ბოლოდროინდელი აპების მეშვეობით"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"აპების სიის გახსნა"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ამოცანათა ზოლის ჩვენება"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"პარამეტრების გახსნა"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"ასისტენტის გახსნა"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ჩაკეტილი ეკრანი"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ჩანიშვნების აპის ამოწევა სწრაფი ჩანაწერისთვის"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"ჩანიშვნების გახსნა"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"სისტემის მრავალამოცანიანი რეჟიმი"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით RHS-ში"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით LHS-ში"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"გადართვა ეკრანის გაყოფიდან სრულ ეკრანზე"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ეკრანის გაყოფის დროს: ერთი აპის მეორით ჩანაცვლება"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით RHS-ში"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით LHS-ში"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"გადართვა ეკრანის გაყოფიდან სრულ ეკრანზე"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ეკრანის გაყოფის დროს: ერთი აპის მეორით ჩანაცვლება"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"შეყვანა"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"შეყვანის ენის შეცვლა (შემდეგი ენა)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"შეყვანის ენის შეცვლა (წინა ენა)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"შემდეგ ენაზე გადართვა"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"წინა ენაზე გადართვა"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"emoji-ზე წვდომა"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ხმოვან აკრეფაზე წვდომა"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"აპლიკაციები"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"დახმარება"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ბრაუზერი (Chrome ნაგულისხმევად)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"ასისტენტი"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ბრაუზერი"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"კონტაქტები"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ელფოსტა (Gmail ნაგულისხმევად)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ელფოსტა"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"მუსიკა"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"კალენდარი"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index b887e4b28508..2831cf941861 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> түймесі"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Артқа"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Жоғары"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Төмен"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Сол"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Оң"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Орталық"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Бос орын"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Хабарландырулар"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Перне тіркесімдері"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Пернетақта форматын ауыстыру"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Мәтінді өшіру"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Перне тіркесімдері"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Перне тіркесімдерін іздеу"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Перне тіркесімдері табылмады."</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Енгізу"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ашылған қолданбалар"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Ағымдағы қолданба"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Хабарландыру тақтасына кіру"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Толық экранның скриншотын жасау"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Жүйе / қолданба таңбашаларының тізімін пайдалану"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Артқа: алдыңғы күйге қайтару (артқа түймесі)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Негізгі экранға кіру"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Ашылған қолданбаларға шолу"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Соңғы пайдаланылған қолданбаларды қарап шығу (алға)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Соңғы пайдаланылған қолданбаларды қарап шығу (артқа)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Барлық қолданба мен іздеу нәтижесі тізімін (яғни Search/Launcher) пайдалану"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Тапсырмалар жолағын жасыру және (қайта)көрсету"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Жүйе параметрлеріне кіру"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant-ке кіру"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Хабарландыруларды көру"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Скриншот жасау"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Жылдам пәрмендерді көрсету"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Артқа"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Негізгі экранға өту"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Соңғы қолданбаларды көру"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Соңғы қолданбаларға алға өту"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Соңғы қолданбаларға артқа өту"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Қолданбалар тізімін ашу"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Тапсырмалар жолағын көрсету"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Параметрлерді ашу"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant-ті ашу"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Экранды құлыптау"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Жылдам ескертпе жасау үшін ескертпелер қолданбасын ашу"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Ескертпелерді ашу"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Жүйе мультитаскингі"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Ағымдағы қолданбамен оң жаққа қарай экранды бөлу режиміне кіру"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Ағымдағы қолданбамен сол жаққа қарай экранды бөлу режиміне кіру"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Экранды бөлу режимінен толық экран режиміне ауысу"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Экранды бөлу кезінде: бір қолданбаны басқасына ауыстыру"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Бөлінген экран режиміне кіру (ағымдағы қолданбаны оңға орналастыру)"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Бөлінген экран режиміне кіру (ағымдағы қолданбаны солға орналастыру)"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Бөлінген экран режимінен толық экран режиміне ауысу"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Экранды бөлу кезінде: бір қолданбаны басқасымен алмастыру"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Енгізу"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Енгізу тілін (келесі тіл) ауыстыру"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Енгізу тілін (алдыңғы тіл) ауыстыру"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Келесі тілге ауысу"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Алдыңғы тілге ауысу"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Эмоджи пайдалану"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Дауыспен теру функциясын пайдалану"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Қолданбалар"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Көмекші"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Браузер (әдепкісінше Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Браузер"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контактілер"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Электрондық пошта (әдепкісінше Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Электрондық пошта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Мәтіндік хабар"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Mузыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Күнтізбе"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 0a4c2d8ae0e3..aff6ef7ae59c 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ប៊ូតុង <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ការជូនដំណឹង"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ផ្លូវកាត់ក្ដារចុច"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ប្ដូរប្លង់ក្ដារចុច"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"សម្អាតអក្សរ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ផ្លូវកាត់"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ស្វែងរកផ្លូវកាត់"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"រកផ្លូវកាត់មិនឃើញទេ"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"បញ្ចូល"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"កម្មវិធីដែលបើក"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"កម្មវិធីបច្ចុប្បន្ន"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"ចូលប្រើប្រាស់ផ្ទាំងជូនដំណឹង"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ថតរូបថតអេក្រង់ពេញ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ចូលប្រើប្រាស់បញ្ជីប្រព័ន្ធ/ផ្លូវកាត់​កម្មវិធី"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ថយក្រោយ៖ ត្រឡប់ទៅស្ថានភាពពីមុនវិញ (ប៊ូតុងថយក្រោយ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ចូលប្រើប្រាស់អេក្រង់ដើម"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ទិដ្ឋភាពរួមអំពីកម្មវិធីដែលបើក"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"រុករកកម្មវិធីថ្មីៗ (ទៅមុខ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"រុករកកម្មវិធីថ្មីៗ (ថយក្រោយ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ចូលប្រើប្រាស់បញ្ជីកម្មវិធី និងម៉ាស៊ីនស្វែងរកទាំងអស់ (ឧ. ម៉ាស៊ីនស្វែងរក/កម្មវិធីចាប់ផ្ដើម)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"លាក់ រួចបង្ហាញរបារកិច្ចការ (ឡើងវិញ)"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ចូលប្រើប្រាស់ការ​កំណត់​ប្រព័ន្ធ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"ចូលប្រើប្រាស់ Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"មើលការជូនដំណឹង"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ថតរូប​អេក្រង់"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"បង្ហាញផ្លូវកាត់"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ថយ​ក្រោយ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ចូលទៅកាន់អេក្រង់ដើម"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"មើលកម្មវិធីថ្មីៗ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"រុករកទៅមុខ ដើម្បីមើលកម្មវិធីថ្មីៗ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"រុករកថយក្រោយ ដើម្បីមើលកម្មវិធីថ្មីៗ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"បើកបញ្ជីកម្មវិធី"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"បង្ហាញរបារកិច្ចការ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"បើកការកំណត់"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"បើក​ជំនួយការ"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ចាក់​សោ​អេក្រង់"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ទាញកម្មវិធីកំណត់ចំណាំឡើងលើ ដើម្បីប្រើកំណត់ហេតុរហ័ស"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"បើក​កំណត់ចំណាំ"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ការដំណើរការបានច្រើននៃប្រព័ន្ធ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"ចូលក្នុងមុខងារ​បំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅចំហៀងខាងស្ដាំ"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"ចូលក្នុងមុខងារ​បំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅចំហៀងខាងឆ្វេង"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ប្ដូរពីមុខងារ​បំបែកអេក្រង់ទៅជាអេក្រង់ពេញ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"អំឡុងពេលប្រើមុខងារ​បំបែកអេក្រង់៖ ជំនួសកម្មវិធីពីកម្មវិធីមួយទៅមួយទៀត"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"ចូលក្នុងមុខងារបំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅខាងស្ដាំដៃ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"ចូលក្នុងមុខងារ​បំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅខាងឆ្វេងដៃ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ប្ដូរពីមុខងារ​បំបែកអេក្រង់ទៅជាអេក្រង់ពេញ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ក្នុងអំឡុងពេលប្រើមុខងារបំបែកអេក្រង់៖ ជំនួសកម្មវិធីពីមួយទៅមួយទៀត"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"បញ្ចូល"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ប្ដូរភាសាបញ្ចូល (ភាសាបន្ទាប់)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ប្ដូរភាសាបញ្ចូល (ភាសាមុន)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ប្ដូរទៅភាសាបន្ទាប់"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ប្ដូរទៅភាសាមុន"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ចូលប្រើប្រាស់រូបអារម្មណ៍"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ចូលប្រើប្រាស់ការវាយបញ្ចូលដោយប្រើសំឡេង"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"កម្មវិធី"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ជំនួយ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"កម្មវិធីរុករកតាមអ៊ីនធឺណិត (Chrome តាមលំនាំដើម)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"កម្មវិធីរុករក"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"ទំនាក់ទំនង"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"អ៊ីមែល (Gmail តាមលំនាំដើម)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"អ៊ីមែល"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"សារ SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"តន្ត្រី"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ប្រតិទិន"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 850bb0ad5f8f..5be72d837d00 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> ಬಟನ್"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ಹಿಂದೆ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ಮೇಲೆ"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ಕೆಳಗೆ"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ಎಡ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ಬಲ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"ಮಧ್ಯ"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"ಸ್ಪೇಸ್"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ನೋಟಿಫಿಕೇಶನ್‌ಗಳು"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ಕೀಬೋರ್ಡ್‌ ಲೇಔಟ್‌ ಬದಲಾಯಿಸಿ"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ಪಠ್ಯ ತೆರವುಗೊಳಿಸಿ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ಹುಡುಕಿ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ಯಾವುದೇ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳಿಲ್ಲ"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ಇನ್‌ಪುಟ್"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ಆ್ಯಪ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"ಪ್ರಸ್ತುತ ಆ್ಯಪ್"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"ಅಧಿಸೂಚನೆಯ ಪರದೆಯನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ಪೂರ್ಣ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಿ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ಸಿಸ್ಟಂ / ಆ್ಯಪ್‌ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳ ಪಟ್ಟಿ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ಹಿಂದೆ: ಹಿಂದಿನ ಸ್ಥಿತಿಗೆ ಹಿಂತಿರುಗಿ (ಹಿಂತಿರುಗುವ ಬಟನ್)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ತೆರೆದ ಆ್ಯಪ್‌ಗಳ ಅವಲೋಕನ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ಇತ್ತೀಚೆಗೆ ಬಳಸಿದ ಆ್ಯಪ್‌ಗಳ ನಡುವೆ ಬದಲಿಸಿ (ಮುಂದೆ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ಇತ್ತೀಚೆಗೆ ಬಳಸಿದ ಆ್ಯಪ್‌ಗಳ ನಡುವೆ ಬದಲಿಸಿ (ಹಿಂದೆ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳ ಮತ್ತು ಹುಡುಕಾಟದ ಆ್ಯಕ್ಸೆಸ್ ಪಟ್ಟಿ (ಅಂದರೆ ಹುಡುಕಾಟ/ಲಾಂಚರ್)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ಟಾಸ್ಕ್‌ಬಾರ್ ಅನ್ನು ಮರೆಮಾಡಿ ಹಾಗೂ (ಪುನಃ)ತೋರಿಸಿ"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Access Google Assistant ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ನೋಟಿಫಿಕೇಶನ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಿ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ತೋರಿಸಿ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ಹಿಂತಿರುಗಿ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ಹೋಮ್ ಸ್ಕ್ರೀನ್‌ಗೆ ಹೋಗಿ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"ಇತ್ತೀಚೆಗೆ ಬಳಸಿದ ಆ್ಯಪ್‌ಗಳ ಸಹಾಯದಿಂದ ಮುಂದಕ್ಕೆ ಹೋಗಿ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"ಇತ್ತೀಚೆಗೆ ಬಳಸಿದ ಆ್ಯಪ್‌ಗಳ ಸಹಾಯದಿಂದ ಹಿಂದಕ್ಕೆ ಹೋಗಿ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ಆ್ಯಪ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ತೆರೆಯಿರಿ"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ಟಾಸ್ಕ್‌ಬಾರ್ ಅನ್ನು ತೋರಿಸಿ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ಸೆಟ್ಟಿಂಗ್‍ಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"assistant ಅನ್ನು ತೆರೆಯಿರಿ"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಮಾಡಿ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ತ್ವರಿತ ಮೆಮೊಗಾಗಿ ಟಿಪ್ಪಣಿಗಳ ಆ್ಯಪ್ ಅನ್ನು ಮೇಲಕ್ಕೆ ಎಳೆಯಿರಿ"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"ಟಿಪ್ಪಣಿಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ಸಿಸ್ಟಂ ಮಲ್ಟಿಟಾಸ್ಕಿಂಗ್"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"RHS ಗೆ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಜೊತೆಗೆ ಪರದೆ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"LHS ಗೆ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಜೊತೆಗೆ ಪರದೆ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ಪರದೆ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್‌ನಿಂದ ಪೂರ್ಣ ಸ್ಕ್ರೀನ್‌ಗೆ ಬದಲಿಸಿ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ಪರದೆ ಬೇರ್ಪಡಿಸುವ ಸಮಯದಲ್ಲಿ: ಒಂದು ಆ್ಯಪ್‌ನಿಂದ ಮತ್ತೊಂದು ಆ್ಯಪ್‌ಗೆ ಬದಲಾಯಿಸಿ"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS ಗೆ ಇರುವ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಸಹಾಯದಿಂದ ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ನಮೂದಿಸಿ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS ಗೆ ಇರುವ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಸಹಾಯದಿಂದ ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ನಮೂದಿಸಿ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್‌ನಿಂದ ಪೂರ್ಣ ಸ್ಕ್ರೀನ್‌ಗೆ ಬದಲಿಸಿ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸುವ ಸಮಯದಲ್ಲಿ: ಒಂದು ಆ್ಯಪ್‌ನಿಂದ ಮತ್ತೊಂದು ಆ್ಯಪ್‌ಗೆ ಬದಲಿಸಿ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ಇನ್‌ಪುಟ್"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ಇನ್‌ಪುಟ್ ಭಾಷೆಯನ್ನು ಬದಲಿಸಿ (ಮುಂದಿನ ಭಾಷೆ)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ಇನ್‌ಪುಟ್ ಭಾಷೆಯನ್ನು ಬದಲಿಸಿ (ಹಿಂದಿನ ಭಾಷೆ)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ಮುಂದಿನ ಭಾಷೆಗೆ ಬದಲಿಸಿ"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ಹಿಂದಿನ ಭಾಷೆಗೆ ಬದಲಿಸಿ"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ಎಮೋಜಿಯನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ಧ್ವನಿ ಟೈಪಿಂಗ್ ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳು"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ಸಹಾಯ ಮಾಡು"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ಬ್ರೌಸರ್ (ಡೀಫಾಲ್ಟ್ ಆಗಿ Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ಬ್ರೌಸರ್"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"ಸಂಪರ್ಕಗಳು"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ಇಮೇಲ್ (ಡೀಫಾಲ್ಟ್ ಆಗಿ Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ಇಮೇಲ್"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"ಎಸ್ಎಂಎಸ್"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ಸಂಗೀತ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index a9395b2fadaf..71c0a3526154 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> 버튼"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"뒤로"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"위쪽"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"아래쪽"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"왼쪽"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"오른쪽"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"중앙"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"알림"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"단축키"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"키보드 레이아웃 전환"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"텍스트 삭제"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"단축키"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"단축키 검색"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"단축키 없음"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"입력"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"열린 앱"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"현재 앱"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"알림 창에 액세스"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"전체 스크린샷 촬영"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"시스템/앱 단축키 목록에 액세스"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"뒤로: 이전 상태로 되돌아가기(뒤로 버튼)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"홈 화면에 액세스"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"열린 앱 개요"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"최근 앱 간 순환(앞으로)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"최근 앱 간 순환(뒤로)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"모든 앱 및 검색 목록(예: 검색/런처)에 액세스"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"태스크 바 숨김 및 다시 표시"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"시스템 설정에 액세스"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google 어시스턴트에 액세스"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"알림 보기"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"스크린샷 촬영"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"단축키 표시"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"돌아가기"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"홈 화면으로 이동"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"최근 앱 보기"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"최근 앱 간 앞으로 순환"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"최근 앱 간 뒤로 순환"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"앱 목록 열기"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"태스크 바 표시"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"설정 열기"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"어시스턴트 열기"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"잠금 화면"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"빠른 메모를 위해 노트 앱 불러오기"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"메모 열기"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"시스템 멀티태스킹"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"현재 앱을 오른쪽으로 보내는 화면 분할 입력"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"현재 앱을 왼쪽으로 보내는 화면 분할 입력"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"화면 분할에서 전체 화면으로 전환"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"화면 분할 중: 다른 앱으로 바꾸기"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"현재 앱을 오른쪽으로 보내는 화면 분할 입력"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"현재 앱을 왼쪽으로 보내는 화면 분할 입력"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"화면 분할에서 전체 화면으로 전환"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"화면 분할 중: 다른 앱으로 바꾸기"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"입력"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"입력 언어 전환(다음 언어)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"입력 언어 전환(이전 언어)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"다음 언어로 전환"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"이전 언어로 전환"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"이모티콘에 액세스"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"음성 입력에 액세스"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"애플리케이션"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"지원"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"브라우저(Chrome을 기본값으로 설정)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"어시스턴트"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"브라우저"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"연락처"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"이메일(Gmail을 기본값으로 설정)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"이메일"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"음악"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"캘린더"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 73e76477468c..6276160ff67a 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> баскычы"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Башкы бет"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Артка"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Өйдө"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Төмөн"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Солго"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Оңго"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Ортолотуу"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Боштук"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Билдирмелер"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ыкчам баскычтар"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Баскычтоп калыбын которуштуруу"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Текстти тазалоо"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Ыкчам баскычтар"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Ыкчам баскычтарды издөө"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ыкчам баскычтар жок"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Киргизүү"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ачык колдон-лор"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Учурдагы кол-мо"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Билдирмелер тактасына кирүү"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Толук скриншот тартуу"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Системанын / колдонмолордун ыкчам баскычтарынын тизмесине кирүү"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Артка: мурунку абалга кайтуу (артка баскычы)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Башкы экранга кирүү"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Ачылып турган колдонмолордун тизмесин көрүү"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Соңку колдонмолорду көрүү (кадимки тартипте)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Соңку колдонмолорду көрүү (тескери тартипте)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Бардык колдонмолордун тизмесин ачуу жана издөө (Издөө/Жүргүзгүч)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Тапшырмалар тактасын жашыруу жана көрсөтүү"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Система параметрлерине кирүү"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Жардамчыны иштетүү"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Билдирмелерди көрүү"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Скриншот тартуу"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Ыкчам баскычтарды көрсөтүү"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Артка кайтуу"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Башкы экранга өтүү"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Акыркы колдонмолорду көрүү"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Соңку колдонмолордо алдыга өтүү"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Соңку колдонмолордо артка кайтуу"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Колдонмолордун тизмесин ачуу"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Тапшырмалар панелин көрсөтүү"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Параметрлерди ачуу"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Жардамчыны ачуу"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Экранды кулпулоо"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Ыкчам кыска жазууну түзүү"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Кыска жазууларды ачуу"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Системанын бир нече тапшырма аткаруусу"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Оң жакта жайгашкан учурдагы колдонмо менен экранды бөлүүнү иштетүү"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Сол жакта жайгашкан учурдагы колдонмо менен экранды бөлүүнү иштетүү"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Экранды бөлүү режиминен толук экранга которулуу"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Экранды бөлүү режиминде бир колдонмону экинчисине алмаштыруу"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Учурда оң жактагы колдонмо менен экранды бөлүүнү иштетүү"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Учурда сол жактагы колдонмо менен экранды бөлүүнү иштетүү"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Экранды бөлүү режиминен толук экранга которулуу"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Экранды бөлүү режиминде бир колдонмону экинчисине алмаштыруу"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Киргизүү"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Кийинки киргизүү тилине которулуу"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Мурунку киргизүү тилине которулуу"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Кийинки тилге которулуу"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Мурунку тилге которулуу"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Быйтыкчаларды көрүү"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Айтып терүүнү иштетүү"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Колдонмолор"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Көмөкчү"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Серепчи (демейки шартта Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Жардамчы"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Серепчи"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Байланыштар"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Электрондук почта (демейки шартта Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Электрондук почта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Жылнаама"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index e9f6a19b5ec2..5da52a5d97c2 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ປຸ່ມ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ກັບຄືນ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ຂຶ້ນ"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ລົງ"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ຊ້າຍ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ຂວາ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"ເຄິ່ງກາງ"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ການແຈ້ງເຕືອນ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ປຸ່ມລັດແປ້ນພິມ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ສະຫຼັບແປ້ນພິມ"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ລຶບລ້າງຂໍ້ຄວາມ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ທາງລັດ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ທາງລັດການຊອກຫາ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ບໍ່ພົບທາງລັດ"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ການປ້ອນຂໍ້ມູນ"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ແອັບທີ່ເປີດຢູ່"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"ແອັບປັດຈຸບັນ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"ເຂົ້າເຖິງເງົາການແຈ້ງເຕືອນ"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ຖ່າຍຮູບໜ້າຈໍແບບເຕັມ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ເຂົ້າເຖິງລາຍຊື່ຂອງລະບົບ / ທາງລັດແອັບ"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ກັບຄືນ: ກັບຄືນຫາສະຖານະກ່ອນໜ້າ (ປຸ່ມກັບຄືນ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ເຂົ້າເຖິງໂຮມສະກຣີນ"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ພາບຮວມຂອງແອັບທີ່ເປີດຢູ່"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ໝູນວຽນຜ່ານແອັບຫຼ້າສຸດ (ໄປໜ້າ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ໝູນວຽນຜ່ານແອັບຫຼ້າສຸດ (ກັບຄືນ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ເຂົ້າເຖິງລາຍຊື່ຂອງແອັບທັງໝົດ ແລະ ການຊອກຫາ (ຕົວຢ່າງ: ຊອກຫາ/ລັນເຊີ)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ເຊື່ອງ ແລະ ສະແດງ(ຄືນ) ແຖບໜ້າວຽກ"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ເຂົ້າເຖິງການຕັ້ງຄ່າລະບົບ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"ເຂົ້າເຖິງຜູ້ຊ່ວຍ Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ເບິ່ງການແຈ້ງເຕືອນ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ຖ່າຍຮູບໜ້າຈໍ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ສະແດງທາງລັດ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ກັບຄືນ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ເຂົ້າໄປໂຮມສະກຣີນ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ເບິ່ງແອັບຫຼ້າສຸດ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"ສະຫຼັບລະຫວ່າງແອັບຫຼ້າສຸດແບບໄປໜ້າ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"ສະຫຼັບລະຫວ່າງແອັບຫຼ້າສຸດແບບກັບຫຼັງ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ເປີດລາຍຊື່ແອັບ"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ສະແດງແຖບໜ້າວຽກ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ເປີດການຕັ້ງຄ່າ"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"ເປີດຜູ້ຊ່ວຍ"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ໜ້າຈໍລັອກ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ດຶງແອັບ Notes ຂຶ້ນມາເພື່ອບັນທຶກຢ່າງວ່ອງໄວ"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"ເປີດບັນທຶກ"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ການເຮັດຫຼາຍໜ້າວຽກພ້ອມກັນຂອງລະບົບ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ສະຫຼັບຈາກແບ່ງໜ້າຈໍໄປເປັນເຕັມຈໍ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ໃນລະຫວ່າງແບ່ງໜ້າຈໍ: ປ່ຽນແທນຈາກແອັບໜຶ່ງໄປຫາແອັບອື່ນ"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ສະຫຼັບຈາກແບ່ງໜ້າຈໍໄປເປັນເຕັມຈໍ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ໃນລະຫວ່າງແບ່ງໜ້າຈໍ: ໃຫ້ປ່ຽນຈາກແອັບໜຶ່ງເປັນອີກແອັບໜຶ່ງ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ການປ້ອນຂໍ້ມູນ"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ສະຫຼັບການປ້ອນພາສາ (ພາສາຕໍ່ໄປ)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ສະຫຼັບການປ້ອນພາສາ (ພາສາກ່ອນໜ້າ)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ສະຫຼັບເປັນພາສາຖັດໄປ"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ສະຫຼັບເປັນພາສາກ່ອນໜ້າ"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ເຂົ້າເຖິງອີໂມຈິ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ເຂົ້າເຖິງການພິມດ້ວຍສຽງ"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ແອັບພລິເຄຊັນ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ຕົວຊ່ວຍ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ໂປຣແກຣມທ່ອງເວັບ (Chrome ເປັນຄ່າເລີ່ມຕົ້ນ)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"ຜູ້ຊ່ວຍ"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ໂປຣແກຣມທ່ອງເວັບ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"ລາຍຊື່ຜູ້ຕິດຕໍ່"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ອີເມວ (Gmail ເປັນຄ່າເລີ່ມຕົ້ນ)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ອີເມວ"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"ຂໍ້ຄວາມສັ້ນ(SMS)"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ດົນຕີ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ປະຕິທິນ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 0e9e94018e48..34c06bd89d99 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Mygtukas <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Pagrindinis"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Atgal"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Aukštyn"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Žemyn"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Kairėn"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Dešinėn"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centras"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Tarpas"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Pranešimai"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Spartieji klavišai"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Perjungti klaviat. išdėstymą"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Išvalyti tekstą"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Spartieji klavišai"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Ieškoti sparčiųjų klavišų"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Sparčiųjų klavišų nerasta"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Įvestis"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Atidar. progr."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Esama programa"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Pasiekti pranešimų skydelį"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Padaryti viso ekrano kopiją"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Pasiekti sistemos sąrašą / programų šaukinius"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atgal: grįžti prie ankstesnės būsenos (mygtukas „Atgal“)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Pasiekti pagrindinį ekraną"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Peržiūrėti atidarytas programas"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Pereiti prie naujausių programų (į priekį)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Pereiti prie naujausių programų (atgal)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Visų progr. ir paiešk. prieig. sąrašas (t. y. Paieška, paleid. priem.)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Slėpti ir (iš naujo) parodyti užduočių juostą"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Pasiekti sistemos nustatymus"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Pasiekti „Google“ padėjėją"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Peržiūrėti pranešimus"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Padaryti ekrano kopiją"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Rodyti sparčiuosius klavišus"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Grįžti"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Grįžti į pagrindinį ekraną"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Peržiūrėti naujausias programas"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Pereiti į priekį per naujausias programas"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Pereiti atgal per naujausias programas"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Atidaryti programų sąrašą"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Rodyti užduočių juostą"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Atidaryti nustatymus"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Atidaryti Padėjėją"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Užrakinti ekraną"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Gauti pastabų programą trumpiems užrašams"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Atidaryti pastabas"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Kelių užduočių atlikimas sistemoje"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Eiti į išskaidyto ekrano režimą su dabartine programa dešinėje"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Eiti į išskaidyto ekrano režimą su dabartine programa kairėje"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Perjungti iš išskaidyto ekrano režimo į viso ekrano režimą"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Išskaidyto ekrano režimu: pakeisti iš vienos programos į kitą"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Eiti į išskaidyto ekrano režimą su dabartine programa dešinėje"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Eiti į išskaidyto ekrano režimą su dabartine programa kairėje"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Perjungti iš išskaidyto ekrano režimo į viso ekrano režimą"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Išskaidyto ekrano režimu: pakeisti iš vienos programos į kitą"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Įvestis"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Perjungti įvesties kalbą (kita kalba)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Perjungti įvesties kalbą (ankstesnė kalba)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Perjungti į kitą kalbą"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Perjungti ankstesnę kalbą"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Pasiekti jaustuką"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Pasiekti rašymą balsu"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Programos"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pagalbinė programa"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Naršyti („Chrome“ kaip numatytoji naršyklė)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Padėjėjas"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Naršyklė"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktai"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"El. paštas („Gmail“ kaip numatytasis el. paštas)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"El. paštas"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendorius"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 8c7af638f875..66933bc2f112 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Poga <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Sākumvietas taustiņš"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Atpakaļ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Uz augšu"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Uz leju"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Pa kreisi"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Pa labi"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centrā"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Atstarpe"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Paziņojumi"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Īsinājumtaustiņi"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Mainīt tastatūras izkārtojumu"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Notīrīt tekstu"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Īsinājumtaustiņi"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Meklēt īsinājumtaustiņus"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nav atrasti"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Ievade"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Atvērtās"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Pašreizējā"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Piekļūt paziņojumu panelim"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Izveidot visa ekrāna ekrānuzņēmumu"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Piekļūt sistēmas/lietotnes saīšņu sarakstam"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atpakaļ: atgriezties iepriekšējā stāvoklī (poga Atpakaļ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Piekļūt sākuma ekrānam"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Atvērto lietotņu kopsavilkums"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Secīgi pārlūkot nesen izmantotās lietotnes (pāriet uz nākamo)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Secīgi pārlūkot nesen izmantotās lietotnes (pāriet uz iepriekšējo)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Visu lietotņu saraksts un meklēšana (meklēšana / Palaišanas programma)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Paslēpt vai (atkārtoti) parādīt uzdevumu joslu"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Piekļūt sistēmas iestatījumiem"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Piekļūt Google asistentam"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Skatīt paziņojumus"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Izveidot ekrānuzņēmumu"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Rādīt īsinājumtaustiņus"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Atpakaļ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Pāriet uz sākuma ekrānu"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Skatīt nesen izmantotās lietotnes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Secīgi pārlūkot nesen izmantotās lietotnes (pāriet uz nākamo)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Secīgi pārlūkot nesen izmantotās lietotnes (pāriet uz iepriekšējo)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Atvērt lietotņu sarakstu"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Rādīt uzdevumu joslu"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Atvērt iestatījumus"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Atvērt Asistentu"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Bloķēt ekrānu"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Atvērt piezīmju lietotni, lai izveidotu piezīmi"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Atvērt piezīmes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Sistēmas vairākuzdevumu režīms"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa labi"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa kreisi"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Pārslēgties no ekrāna sadalīšanas režīma uz pilnekrāna režīmu"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Ekrāna sadalīšanas režīmā: pārvietot lietotni no viena uz otru"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa labi"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa kreisi"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Pārslēgties no ekrāna sadalīšanas režīma uz pilnekrāna režīmu"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ekrāna sadalīšanas režīmā: pārvietot lietotni no viena ekrāna uz otru"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ievade"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Pārslēgt ievades valodu (uz nākamo valodu)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Pārslēgt ievades valodu (uz iepriekšējo valodu)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Pārslēgt uz nākamo valodu"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Pārslēgt uz iepriekšējo valodu"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Piekļūt emocijzīmēm"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Piekļūt rakstīšanai ar balsi"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Lietojumprogrammas"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Palīgs"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Pārlūks (pēc noklusējuma Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistents"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Pārlūkprogramma"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktpersonas"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-pasts (pēc noklusējuma Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-pasts"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Īsziņas"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Mūzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendārs"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 6c577ce01713..44f6e0c0e772 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -401,11 +401,9 @@
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни бавно • Полна по <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни • Полна по <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="communal_tutorial_indicator_text" msgid="4503010353591430123">"Повлечете налево за да го започнете заедничкото упатство"</string>
- <!-- no translation found for button_to_open_widget_editor (5599945944349057600) -->
- <skip />
+ <string name="button_to_open_widget_editor" msgid="5599945944349057600">"Го отвора уредникот на виџети"</string>
<string name="button_to_remove_widget" msgid="1511255853677835341">"Отстранува виџет"</string>
- <!-- no translation found for hub_mode_add_widget_button_text (3956587989338301487) -->
- <skip />
+ <string name="hub_mode_add_widget_button_text" msgid="3956587989338301487">"Додајте виџет"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Промени го корисникот"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"паѓачко мени"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Сите апликации и податоци во сесијата ќе се избришат."</string>
@@ -642,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Копче <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home-копче"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Стрелка нагоре"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Стрелка надолу"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Стрелка налево"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Стрелка надесно"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Центар"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -673,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Известувања"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Кратенки на тастатурата"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Промени јазик на тастатура"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Избришете го текстот"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Кратенки"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Пребарувајте кратенки"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Не се пронајдени кратенки"</string>
@@ -681,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Внесување"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Отворени аплик."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Тековна аплик."</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Пристапете до панелот со известувања"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Снимете целосна слика од екранот"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Пристапете до список на кратенки за системот и апликациите"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Назад: вратете се во претходната состојба (копче за назад)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Пристапете до почетниот екран"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Преглед на отворените апликации"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Прелистувајте ги неодамнешните апликации (напред)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Прелистувајте ги неодамнешните апликации (назад)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Отв. список со сите аплик. и пребарувајте (т.е. Пребарување/Стартер)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Скриј и (повторно) прикажи ја лентата со задачи"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Пристапете до поставките на системот"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Пристапете до „Помошник на Google“"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Прегледајте ги известувањата"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Направете слика од екранот"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Прикажи кратенки"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Вратете се назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Одете на почетниот екран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Прегледајте ги неодамнешните апликации"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Прелистувајте ги неодамнешните апликации нанапред"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Прелистувајте ги неодамнешните апликации наназад"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Отворете го списокот со апликации"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Прикажи „Лента со задачи“"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Отворете „Поставки“"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Отворете го „Помошникот“"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Заклучен екран"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Отворете ја апликацијата „Белешки“ за брз меморандум"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Отворете „Белешки“"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Системски мултитаскинг"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Активирајте поделен екран со тековната апликација десно"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Активирајте поделен екран со тековната апликација лево"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Префрлете се од поделен екран во цел екран"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"За време на поделен. екран: префрл. ги аплик. од една на друга страна"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Активирајте поделен екран со тековната апликација десно"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Активирајте поделен екран со тековната апликација лево"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Префрлете од поделен екран во цел екран"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"При поделен екран: префрлете ги аплик. од едната на другата страна"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Внесување"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Променете го влезниот јазик (следен јазик)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Променете го влезниот јазик (претходен јазик)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Префрлете на следниот јазик"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Префрлете на претходниот јазик"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Пристапете до емоџијата"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Пристапете до гласовното пишување"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Апликации"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Помош"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Прелистувач (Chrome е стандардна опција)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Помошник"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Прелистувач"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контакти"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Е-пошта (Gmail е стандардна опција)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Е-пошта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 7354e914f558..4644fa5e5886 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ബട്ടൺ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"ഹോം"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ബാക്ക്"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"മുകളിലേക്ക്"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"താഴേക്ക്"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ഇടത്"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"വലത്"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"മധ്യം"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"TAB"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"സ്പെയ്സ്"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"അറിയിപ്പുകൾ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"കീബോർഡ് കുറുക്കുവഴികൾ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"കീബോർഡ് ലേഔട്ട് മാറുക"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ടെക്‌സ്റ്റ് മായ്‌ക്കുക"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"കുറുക്കുവഴികൾ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"കുറുക്കുവഴികൾ തിരയുക"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"കുറുക്കുവഴി കണ്ടെത്തിയില്ല"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ഇൻപുട്ട്"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"തുറന്ന ആപ്പുകൾ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"നിലവിലെ ആപ്പ്"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"അറിയിപ്പ് ഷെയ്‌ഡ് ആക്സസ് ചെയ്യുക"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"പൂർണ്ണ സ്ക്രീൻഷോട്ട് എടുക്കുക"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"സിസ്റ്റം / ആപ്പ് കുറുക്കുവഴികളുടെ ലിസ്റ്റ് ആക്‌സസ് ചെയ്യുക"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"മടങ്ങുക: മുമ്പത്തെ നിലയിലേക്ക് പോകുക (മടങ്ങുക ബട്ടൺ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ഹോം സ്‌ക്രീൻ ആക്സസ് ചെയ്യുക"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"തുറന്ന ആപ്പുകളുടെ അവലോകനം"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"സമീപകാലത്തെ ആപ്പുകൾ തമ്മിൽ മാറുക (മുന്നിലേക്ക്)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"സമീപകാലത്തെ ആപ്പുകൾ തമ്മിൽ മാറുക (പിന്നിലേക്ക്)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ആപ്പ്, തിരയൽ ലിസ്റ്റുകളെല്ലാം ആക്സസ് ചെയ്യൂ (Search/Launcher എന്നിവ)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ടാസ്‌ക്ബാർ മറയ്ക്കുക, (വീണ്ടും) കാണിക്കുക"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"സിസ്റ്റം ക്രമീകരണം ആക്സസ് ചെയ്യുക"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant ആക്സസ് ചെയ്യുക"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"അറിയിപ്പുകൾ കാണുക"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"സ്ക്രീൻഷോട്ട് എടുക്കുക"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"കുറുക്കുവഴികൾ കാണിക്കുക"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"മടങ്ങുക"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ഹോം സ്ക്രീനിലേക്ക് പോകുക"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"അടുത്തിടെയുള്ള ആപ്പുകൾ കാണുക"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"സമീപകാലത്തെ ആപ്പുകളിലൂടെ പോകുക (മുന്നോട്ട്)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"സമീപകാലത്തെ ആപ്പുകളിലൂടെ പോകുക (പിന്നോട്ട്)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ആപ്പ് ലിസ്റ്റ് തുറക്കുക"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ടാസ്‌ക്ബാർ കാണിക്കുക"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ക്രമീകരണം തുറക്കുക"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant തുറക്കുക"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ലോക്ക് സ്‌ക്രീൻ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"അതിവേഗ മെമോ തയ്യാറാക്കുന്നതിന് നോട്ട്‌സ് ആപ്പ് തുറക്കുക"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"കുറിപ്പുകൾ തുറക്കുക"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"സിസ്റ്റം മൾട്ടിടാസ്‌കിംഗ്"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"നിലവിലെ ആപ്പ് വലതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"നിലവിലെ ആപ്പ് ഇടതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"സ്‌ക്രീൻ വിഭജന മോഡിൽ നിന്ന് പൂർണ്ണ സ്ക്രീനിലേക്ക് മാറുക"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"സ്‌ക്രീൻ വിഭജന മോഡിൽ: ഒരു ആപ്പിൽ നിന്ന് മറ്റൊന്നിലേക്ക് മാറുക"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"നിലവിലെ ആപ്പ് വലതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"നിലവിലെ ആപ്പ് ഇടതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"സ്‌ക്രീൻ വിഭജന മോഡിൽ നിന്ന് പൂർണ്ണ സ്ക്രീനിലേക്ക് മാറുക"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"സ്‌ക്രീൻ വിഭജന മോഡിൽ: ഒരു ആപ്പിൽ നിന്ന് മറ്റൊന്നിലേക്ക് മാറുക"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ഇൻപുട്ട്"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ഇൻ‌പുട്ട് ഭാഷ മാറുക (അടുത്ത ഭാഷ)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ഇൻ‌പുട്ട് ഭാഷ മാറുക (മുമ്പത്തെ ഭാഷ)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"അടുത്ത ഭാഷയിലേക്ക് മാറുക"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"മുമ്പത്തെ ഭാഷയിലേക്ക് മാറുക"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ഇമോജി ആക്സസ് ചെയ്യുക"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"വോയ്‌സ് ടൈപ്പിംഗ് ആക്സസ് ചെയ്യുക"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"അപ്ലിക്കേഷനുകൾ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"അസിസ്റ്റ്"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ബ്രൗസർ (ഡിഫോൾട്ടായി Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ബ്രൗസർ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"കോൺടാക്റ്റുകൾ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ഇമെയിൽ (ഡിഫോൾട്ടായി Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ഇമെയിൽ"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS:"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"സംഗീതം"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index e6dc9e55383b..217eeb1a3192 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> товчлуур"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Нүүр хуудас"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Буцах"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Дээш"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Доош"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Зүүн"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Баруун"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Гол хэсэг"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Зай"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Мэдэгдэл"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Гарын товчлол"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Гарын бүдүүвч рүү сэлгэх"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Текстийг арилгах"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Товчлолууд"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Товчлолууд хайх"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ямар ч товчлол олдсонгүй"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Оролт"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Нээлттэй аппууд"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Одоогийн апп"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Мэдэгдлийн хураангуй самбарт хандах"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Бүтэн дэлгэцийн агшин авах"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Системийн жагсаалт / аппын товчлолд хандах"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Буцах: өмнөх төлөв рүү буцах (буцах товчлуур)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Үндсэн нүүрэнд хандах"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Нээлттэй аппуудын тойм"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Саяхны аппуудаар шилжих (урагшлах)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Саяхны аппуудаар шилжих (буцах)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Бүх апп болон хайлтын жагсаалтад хандах (ж.нь Хайлт/Эхлүүлэгч)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ажлын хэсгийг нуух болон (дахин) харуулах"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Системийн тохиргоонд хандах"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Туслахад хандах"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Мэдэгдлийг харах"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Дэлгэцийн агшныг авах"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Товчлол харуулах"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Буцах"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Үндсэн нүүр лүү очих"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Саяхны аппуудыг харах"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Саяхны аппуудаар урагш гүйлгэх"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Саяхны аппуудаар арагш гүйлгэх"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Аппуудын жагсаалтыг нээх"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Ажлын хэсгийг харуулах"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Тохиргоог нээх"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Туслахыг нээх"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Түгжээтэй дэлгэц"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Шуурхай тэмдэглэхийн тулд Notes аппыг харуулах"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Тэмдэглэлүүдийг нээх"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Систем олон ажил зэрэг хийх"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Одоогийн аппаар баруун гар талд Дэлгэц хуваахад орох"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Одоогийн аппаар зүүн гар талд Дэлгэц хуваахад орох"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Дэлгэц хуваахаас бүтэн дэлгэц рүү сэлгэх"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Дэлгэц хуваах үеэр: аппыг нэгээс нөгөөгөөр солих"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Одоогийн аппаар баруун гар талд дэлгэц хуваахад орох"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Одоогийн аппаар зүүн гар талд дэлгэц хуваахад орох"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Дэлгэц хуваахаас бүтэн дэлгэц рүү сэлгэх"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Дэлгэц хуваах үеэр: аппыг нэгээс нөгөөгөөр солих"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Оролт"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Оролтын хэлийг сэлгэх (дараагийн хэл)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Оролтын хэлийг сэлгэх (өмнөх хэл)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Дараагийн хэл рүү сэлгэх"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Өмнөх хэл рүү сэлгэх"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Эможид хандах"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Дуу хоолойгоор бичихэд хандах"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Апп"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Дэмжлэг"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Хөтөч (Chrome-г өгөгдмөлөөр тохируулах)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Туслах"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Хөтөч"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Харилцагчид"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Имэйл (Gmail-г өгөгдмөлөөр тохируулах)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Имэйл"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Хөгжим"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календарь"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index a5d0afa965af..f7688810007d 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"बटण <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"परत"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"वर"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"खाली"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"डावा"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"उजवा"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"मध्यवर्ती"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"सूचना"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"कीबोर्ड शॉर्टकट"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"कीबोर्ड लेआउट स्विच करा"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"मजकूर साफ करा"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"शॉर्टकट"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"शॉर्टकट शोधा"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"एकही शॉर्टकट आढळला नाहीत"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"इनपुट"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ॲप्स उघडा"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"सध्याचे अ‍ॅप"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"सूचना शेड अ‍ॅक्सेस करा"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"संपूर्ण स्क्रीनशॉट घ्या"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"सिस्टीम / अ‍ॅप्स शॉर्टकटची सूची अ‍ॅक्सेस करा"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"मागे: मागील स्थितीवर परत जा (मागे जा बटण)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"होम स्क्रीन अ‍ॅक्सेस करा"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"उघड्या असलेल्या अ‍ॅप्सचे अवलोकन"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"अलीकडील अ‍ॅप्स पहा (पुढील)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"अलीकडील अ‍ॅप्स पहा (मागील)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"सर्व अ‍ॅप्सची सूची अ‍ॅक्सेस करा आणि शोधा (उदा. शोध/लाँचर)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"टास्कबार लपवा आणि (पुन्हा) दाखवा"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"सिस्टीम सेटिंग्ज अ‍ॅक्सेस करा"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant अ‍ॅक्सेस करा"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"सूचना पहा"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"स्क्रीनशॉट घ्या"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"शॉर्टकट दाखवा"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"मागे जा"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"होम स्क्रीनवर जा"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"अलीकडील अ‍ॅप्स पहा"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"अलीकडील ॲप्सवरून पुढे जा"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"अलीकडील ॲप्सवरून मागे जा"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ॲप्सची सूची उघडा"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"टास्कबार दाखवा"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"सेटिंग्ज उघडा"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant उघडा"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"लॉक स्क्रीन"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"झटपट मेमोसाठी Notes अ‍ॅप वर ओढा"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"टिपा उघडा"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"सिस्टीम मल्टिटास्किंग"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"उजव्या बाजूला सध्याचे अ‍ॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"डाव्या बाजूला सध्याचे अ‍ॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"स्प्लिट स्क्रीन वरून फुल स्क्रीनवर स्विच करा"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"स्प्लिट स्क्रीन दरम्यान: एक अ‍ॅप दुसऱ्या अ‍ॅपने बदला"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"उजव्या बाजूला सध्याचे अ‍ॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"डाव्या बाजूला सध्याचे अ‍ॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीनवरून फुल स्क्रीनवर स्विच करा"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रीनदरम्यान: एक अ‍ॅप दुसऱ्या अ‍ॅपने बदला"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"इनपुट भाषा स्विच करा (पुढील भाषा)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"इनपुट भाषा स्विच करा (मागील भाषा)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"पुढील भाषेवर स्विच करा"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"मागील भाषेवर स्विच करा"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"इमोजी अ‍ॅक्सेस करा"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"व्हॉइस टायपिंग अ‍ॅक्सेस करा"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ॲप्लिकेशन"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ब्राउझर (डीफॉल्ट म्हणून Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ब्राउझर"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"संपर्क"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ईमेल (डीफॉल्ट म्हणून Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ईमेल"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"एसएमएस"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"संगीत"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"कॅलेंडर"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index bf0a60cc7044..db538904255c 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Butang <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Skrin Utama"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Kembali"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Ke atas"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Ke bawah"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Ke kiri"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Ke kanan"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Tengah"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Pemberitahuan"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Pintasan Papan Kekunci"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Tukar reka letak papan kekunci"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Kosongkan teks"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Pintasan"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Cari pintasan"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Tiada pintasan ditemukan"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apl yang dibuka"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Apl semasa"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Akses bidai pemberitahuan"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ambil tangkapan skrin penuh"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Akses senarai pintasan sistem / apl"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Kembali: kembali kepada keadaan sebelumnya (butang kembali)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Akses skrin utama"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Gambaran keseluruhan apl yang dibuka"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Mengitar apl terbaharu (hadapan)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Mengitar apl terbaharu (belakang)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Akses senarai semua apl dan cari (iaitu Carian/Pelancar)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Sembunyikan dan tunjukkan (semula) bar tugas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Akses tetapan sistem"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Akses Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Lihat pemberitahuan"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ambil tangkapan skrin"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Tunjukkan pintasan"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Kembali"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Akses skrin utama"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Lihat apl terbaharu"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Kitar ke hadapan menerusi apl terbaharu"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Kitar ke belakang menerusi apl terbaharu"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Buka senarai apl"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Tunjukkan bar tugas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Buka tetapan"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Buka Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Kunci skrin"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Tarik ke atas apl Nota untuk memo pantas"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Buka nota"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Berbilang tugas sistem"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Masuk skrin Pisah dengan apl semasa pada sisi kanan"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Masuk skrin Pisah dengan apl semasa pada sisi kiri"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Tukar daripada skrin Pisah kepada skrin penuh"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Semasa skrin Pisah: gantikan apl daripada satu apl kepada apl lain"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Masuk skrin pisah dengan apl semasa pada sisi kanan"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Masuk skrin pisah dengan apl semasa pada sisi kiri"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Beralih daripada skrin pisah kepada skrin penuh"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Semasa skrin pisah: gantikan apl daripada satu apl kepada apl lain"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Tukar bahasa input (bahasa seterusnya)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Tukar bahasa input (bahasa sebelumnya)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Beralih kepada bahasa seterusnya"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Beralih kepada bahasa sebelumnya"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Akses emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Akses penaipan suara"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikasi"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Bantu"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Penyemak imbas (Chrome sebagai lalai)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Penyemak imbas"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kenalan"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mel (Gmail sebagai lalai)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mel"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 5568fa7d0b25..6221ca1c62fe 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -401,11 +401,9 @@
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • နှေးကွေးစွာ အားသွင်းနေသည် • အားပြည့်ရန် <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> လိုသည်"</string>
<string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • အားသွင်းနေသည် • အားပြည့်ရန် <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> လိုသည်"</string>
<string name="communal_tutorial_indicator_text" msgid="4503010353591430123">"အများသုံးရှင်းလင်းပို့ချချက် စတင်ရန် ဘယ်သို့ပွတ်ဆွဲပါ"</string>
- <!-- no translation found for button_to_open_widget_editor (5599945944349057600) -->
- <skip />
+ <string name="button_to_open_widget_editor" msgid="5599945944349057600">"ဝိဂျက်တည်းဖြတ်စနစ် ဖွင့်ရန်"</string>
<string name="button_to_remove_widget" msgid="1511255853677835341">"ဝိဂျက် ဖယ်ရှားရန်"</string>
- <!-- no translation found for hub_mode_add_widget_button_text (3956587989338301487) -->
- <skip />
+ <string name="hub_mode_add_widget_button_text" msgid="3956587989338301487">"ဝိဂျက် ထည့်ရန်"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"အသုံးပြုသူကို ပြောင်းလဲရန်"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ဆွဲချမီနူး"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ဒီချိတ်ဆက်မှု ထဲက အက်ပ်များ အားလုံး နှင့် ဒေတာကို ဖျက်ပစ်မည်။"</string>
@@ -642,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ခလုတ် <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"ပင်မ"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"နောက်သို့"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"အပေါ်"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"အောက်"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ဘယ်"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ညာ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"ဌာန"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -673,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"အကြောင်းကြားချက်များ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ကီးဘုတ် ဖြတ်လမ်းများ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ကီးဘုတ်အပြင်အဆင် ပြောင်းခြင်း"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"စာသား ဖယ်ရှားရန်"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ဖြတ်လမ်းလင့်ခ်များ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ဖြတ်လမ်းလင့်ခ်များ ရှာပါ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ဖြတ်လမ်းလင့်ခ် မတွေ့ပါ"</string>
@@ -681,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"စာရိုက်ခြင်း"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ဖွင့်ထားသောအက်ပ်"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"လက်ရှိအက်ပ်"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"အကြောင်းကြားစာအကွက် သုံးရန်"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ဖန်သားပြင်ဓာတ်ပုံအပြည့် ရိုက်ကူးရန်"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"စနစ် / အက်ပ်ဖြတ်လမ်းလင့်ခ်စာရင်း ဝင်ကြည့်ရန်"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"နောက်သို့- ယခင်အခြေအနေသို့ ပြန်သွားရန် (နောက်သို့ ခလုတ်)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ပင်မစာမျက်နှာ ဝင်ကြည့်ရန်"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ဖွင့်ထားသောအက်ပ်များ အနှစ်ချုပ်"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"မကြာသေးမီကအက်ပ်များ ရှာဖွေကြည့်ရှုရန် (ရှေ့သို့)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"မကြာသေးမီကအက်ပ်များ ရှာဖွေကြည့်ရှုရန် (နောက်သို့)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"အက်ပ်အားလုံးစာရင်းကို ဝင်ကြည့်ပြီး ရှာပါ (ဥပမာ- Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"လုပ်ဆောင်စရာဘားကို ဖျောက်ထားပြီး ပြန်ပြရန်"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"စက်စနစ်ဆက်တင်များ ဝင်ကြည့်ရန်"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant သုံးရန်"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"အကြောင်းကြားချက်များ ကြည့်ရန်"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ဖန်သားပြင်ဓာတ်ပုံ ရိုက်ရန်"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ဖြတ်လမ်းလင့်ခ်များ ပြပါ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ပြန်သွားရန်"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ပင်မစာမျက်နှာသို့သွားရန်"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"မကြာသေးမီကအက်ပ်များ ကြည့်ရန်"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"မကြာသေးမီက အက်ပ်များကို အဝိုင်းပုံရှေ့သို့လှည့်ရန်"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"မကြာသေးမီက အက်ပ်များကို အဝိုင်းပုံနောက်ပြန်လှည့်ရန်"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"အက်ပ်ပြသမှု ဖွင့်ရန်"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Taskbar ပြပါ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ဆက်တင်များ ဖွင့်ရန်"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ဖွင့်ရန်"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"လော့ခ်မျက်နှာပြင်"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"အမြန်မှတ်သားရန် မှတ်စုရေးသောအက်ပ် ဖွင့်ပါ"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"မှတ်စုများ ဖွင့်ရန်"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"စနစ်က တစ်ပြိုင်နက် များစွာလုပ်ခြင်း"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"လက်ရှိအက်ပ်ဖြင့် ညာဘက်ရှိ ‘မျက်နှာပြင် ခွဲ၍ပြသခြင်း’ သို့ ဝင်ရန်"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"လက်ရှိအက်ပ်ဖြင့် ဘယ်ဘက်ရှိ ‘မျက်နှာပြင် ခွဲ၍ပြသခြင်း’ သို့ ဝင်ရန်"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"‘မျက်နှာပြင် ခွဲ၍ပြသခြင်း’ မှ မျက်နှာပြင်အပြည့်သို့ ပြောင်းရန်"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"‘မျက်နှာပြင်ခွဲ၍ပြသစဉ်’- အက်ပ်ကို တစ်ခုမှ နောက်တစ်ခုသို့ အစားထိုးရန်"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"လက်ရှိအက်ပ်ကို မျက်နှာပြင် ခွဲ၍ပြသမှု၏ ညာဘက်တွင်ထည့်ရန်"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"လက်ရှိအက်ပ်ကို မျက်နှာပြင် ခွဲ၍ပြသမှု၏ ဘယ်ဘက်တွင်ထည့်ရန်"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"မျက်နှာပြင် ခွဲ၍ပြသမှုမှ မျက်နှာပြင်အပြည့်သို့ ပြောင်းရန်"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"မျက်နှာပြင် ခွဲ၍ပြသစဉ်- အက်ပ်တစ်ခုကို နောက်တစ်ခုနှင့် အစားထိုးရန်"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"စာရိုက်ခြင်း"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"စာရိုက်မည့် ဘာသာစကား ပြောင်းရန် (နောက်ဘာသာစကား)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"စာရိုက်မည့် ဘာသာစကား ပြောင်းရန် (ယခင်ဘာသာစကား)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"နောက်ဘာသာစကားသို့ ပြောင်းရန်"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ယခင်ဘာသာစကားသို့ ပြောင်းရန်"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"အီမိုဂျီ သုံးရန်"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"အသံဖြင့်စာရိုက်ခြင်း သုံးရန်"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"အက်ပ်များ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"အထောက်အကူ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ဘရောင်ဇာ (Chrome ကို မူရင်းအဖြစ်)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ဘရောင်ဇာ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"အဆက်အသွယ်များ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"အီးမေးလ် (Gmail ကို မူရင်းအဖြစ်)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"အီးမေးလ်"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS စာတိုစနစ်"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ပြက္ခဒိန်"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index c654397a6fc3..9fc3625203ae 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -510,7 +510,7 @@
<string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiver"</string>
<string name="sound_settings" msgid="8874581353127418308">"Lyd og vibrering"</string>
<string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Innstillinger"</string>
- <string name="csd_lowered_title" product="default" msgid="2464112924151691129">"Senk volumet til et tryggere nivå"</string>
+ <string name="csd_lowered_title" product="default" msgid="2464112924151691129">"Volumet er senket til et tryggere nivå"</string>
<string name="csd_system_lowered_text" product="default" msgid="1250251883692996888">"Volumet på hodetelefonene har vært høyt lenger enn anbefalt"</string>
<string name="csd_500_system_lowered_text" product="default" msgid="7414943302186884124">"Volumet på hodetelefonene har overskredet sikkerhetsgrensen for denne uken"</string>
<string name="csd_button_keep_listening" product="default" msgid="4093794049149286784">"Fortsett å lytte"</string>
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g>-knappen"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Startskjerm"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Tilbake"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Opp"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Ned"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Venstre"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Høyre"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Midttasten"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Mellomrom"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Varsler"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Hurtigtaster"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Bytt tastaturoppsett"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Fjern teksten"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Hurtigtaster"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Søk etter hurtigtaster"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Fant ingen hurtigtaster"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Inndata"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Åpne apper"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktiv app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Åpne varselpanelet"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ta en skjermdump av hele skjermen"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Se hurtigtastene for systemet/apper"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Tilbake: Gå tilbake til forrige tilstand (tilbakeknapp)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Åpne startskjermen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Oversikt over åpne apper"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Bla gjennom nylige apper (fremover)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Bla gjennom nylige apper (bakover)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Se alle apper og søk (dvs. Søk/Appoversikt)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skjul og vis oppgavelinjen"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Åpne systeminnstillingene"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Aktiver Google-assistenten"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Se varsler"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ta skjermdump"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Vis snarveier"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Gå tilbake"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Gå til startskjermen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Se nylige apper"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Gå forover gjennom nylige apper"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Gå bakover gjennom nylige apper"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Åpne applisten"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Vis oppgavelinje"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Åpne innstillingene"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Åpne assistenten"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Låseskjerm"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Åpne Notes-appen for å ta notater raskt"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Åpne notatene"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking på systemet"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Åpne delt skjerm med den aktive appen til høyre"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Åpne delt skjerm med den aktive appen til venstre"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Bytt fra delt skjerm til fullskjerm"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"I delt skjerm: Bytt ut en app"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Åpne delt skjerm med den aktive appen til høyre"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Åpne delt skjerm med den aktive appen til venstre"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bytt fra delt skjerm til fullskjerm"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"I delt skjerm: Bytt ut en app"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Skrivespråk"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Bytt skrivespråk (neste språk)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Bytt skrivespråk (forrige språk)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Bytt til neste språk"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Bytt til forrige språk"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Se emojier"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Bruk stemmestyrt skriving"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Apper"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Nettleser (Chrome som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Nettleser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakter"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-post (Gmail som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-post"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musikk"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
@@ -1165,7 +1182,7 @@
<string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Trykk på og hold inne snarveien"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Avbryt"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Bytt skjerm nå"</string>
- <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Brett ut telefonen"</string>
+ <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Åpne telefonen"</string>
<string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Vil du bytte skjerm?"</string>
<string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Bruk baksidekameraet for å få høyere oppløsning"</string>
<string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Brett ut telefonen for å få høyere oppløsning"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 71fa4e56f9ed..79cb7037b5c8 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> बटन"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"पछाडि"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"माथि"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"तल"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"बायाँ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"दायाँ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"केन्द्र"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"स्पेस"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"सूचनाहरू"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"किबोर्ड सर्टकटहरू"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"किबोर्डको लेआउट बदल्नुहोस्"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"टेक्स्ट हटाउनुहोस्"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"सर्टकटहरू"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"सर्टकटहरू खोज्नुहोस्"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"कुनै पनि सर्टकट भेटिएन"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"इनपुट"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"खोलिएका एपहरू"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"हालको एप"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"सूचना कक्षमा जानुहोस्"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"पूरा स्क्रिनसट खिच्नुहोस्"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"सिस्टम / एपका सर्टकटहरूको सूची हेर्नुहोस्"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"पछाडि: अघिल्लो अवस्थामा फर्कनुहोस् (पछाडि बटन)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"होम स्क्रिनमा जानुहोस्"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"खोलिएका एपहरूको विवरण"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"हालसालै खोलिएका एपहरू हेर्नुहोस् (अगाडि)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"हालसालै खोलिएका एपहरू हेर्नुहोस् (पछाडि)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"सबै एप र खोज (अर्थात्, Search/लन्चर) को सूची हेर्नुहोस्"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"टास्कबार लुकाइयोस् र (पुनः) देखाइयोस्"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"सिस्टमका सेटिङमा जानुहोस्"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google सहायक प्रयोग गर्नुहोस्"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"सूचनाहरू हेर्नुहोस्"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"स्क्रिनसट खिच्नुहोस्"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"सर्टकटहरू देखाइऊन्"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"पछाडि जानुहोस्"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"होम स्क्रिनमा जानुहोस्"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"हालसालै चलाइएका एपहरू हेर्ने तरिका"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"हालसालै चलाइएका एपहरू अगाडिबाट हेर्दै जानुहोस्"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"हालसालै चलाइएका एपहरू पछाडिबाट हेर्दै जानुहोस्"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"एपहरूको सूची खोल्नुहोस्"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"टास्कबार देखाइयोस्"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"सेटिङ खोल्नुहोस्"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"एसिस्टेन्ट खोल्नुहोस्"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"स्क्रिन लक गर्नुहोस्"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"झट्टै कुनै टिपोट लेख्न Notes एप प्रयोग गर्नुहोस्"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"नोटहरू खोल्नुहोस्"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"सिस्टम मल्टिटास्किङ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"हालको एप दायाँतर्फ रहने गरी स्प्लिट स्क्रिनमा प्रवेश गर्नुहोस्"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"हालको एप बायाँतर्फ रहने गरी स्प्लिट स्क्रिनमा प्रवेश गर्नुहोस्"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"स्प्लिट स्क्रिनको साटो फुल स्क्रिन प्रयोग गर्नुहोस्"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"स्प्लिट स्क्रिन प्रयोग गरिएका बेला: एउटा स्क्रिनमा भएको एप अर्कोमा लैजानुहोस्"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"हालको एप दायाँतर्फ रहने गरी स्प्लिट स्क्रिन मोड सुरु गर्नुहोस्"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"हालको एप बायाँतर्फ रहने गरी स्प्लिट स्क्रिन मोड सुरु गर्नुहोस्"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रिनको साटो फुल स्क्रिन प्रयोग गर्नुहोस्"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रिन प्रयोग गरिएका बेला: एउटा स्क्रिनमा भएको एप अर्कोमा लैजानुहोस्"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"इनपुट भाषा बदल्नुहोस् (अर्को भाषा)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"इनपुट भाषा बदल्नुहोस् (अघिल्लो भाषा)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"अर्को भाषा प्रयोग गर्नुहोस्"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"अघिल्लो भाषा प्रयोग गर्नुहोस्"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"इमोजी प्रयोग गर्नुहोस्"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"भ्वाइस टाइपिङ प्रयोग गर्नुहोस्"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"एपहरू"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"सहायता"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ब्राउजर (डिफल्ट ब्राउजर: Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"एसिस्टेन्ट"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ब्राउजर"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"कन्ट्याक्टहरू"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"इमेल (डिफल्ट एप: Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"इमेल"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"सङ्गीत"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"पात्रो"</string>
diff --git a/packages/SystemUI/res/values-night/colors.xml b/packages/SystemUI/res/values-night/colors.xml
index d9385c7d24c4..bcc3c83b4560 100644
--- a/packages/SystemUI/res/values-night/colors.xml
+++ b/packages/SystemUI/res/values-night/colors.xml
@@ -104,4 +104,7 @@
<!-- Internet Dialog -->
<color name="connected_network_primary_color">@color/material_dynamic_primary80</color>
<color name="connected_network_secondary_color">@color/material_dynamic_secondary80</color>
+
+ <!-- Keyboard shortcut helper dialog -->
+ <color name="ksh_key_item_color">@*android:color/system_on_surface_variant_dark</color>
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index c8f6c583a50e..60ddb891ad5a 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Knop <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Terug"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Omhoog"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Omlaag"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Links"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Rechts"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Midden"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Spatiebalk"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Meldingen"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Sneltoetsen"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Toetsenbordindeling wisselen"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Tekst wissen"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Sneltoetsen"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Sneltoetsen zoeken"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Geen sneltoetsen gevonden"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Invoer"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps openen"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Huidige app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Het meldingenpaneel openen"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Een volledige schermafbeeldingen maken"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Lijst van snelkoppelingen voor systeem/apps openen"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Terug: terug naar de vorige status (terugknop)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Het startscherm openen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overzicht van geopende apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Door recente apps navigeren (vooruit)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Door recente apps navigeren (terug)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Toegangslijst van alle apps en zoekopties (bijv. Zoeken/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Taakbalk verbergen en (opnieuw) tonen"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Systeeminstellingen openen"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"De Google Assistent activeren"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Meldingen bekijken"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Screenshot maken"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Snelkoppelingen tonen"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Terug"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Naar het startscherm gaan"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Recente apps bekijken"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Vooruitbladeren door recente apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Terugbladeren door recente apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Lijst met apps openen"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Taakbalk tonen"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Instellingen openen"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistent openen"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Scherm vergrendelen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Notitie-app tevoorschijn halen voor snelle notitie"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notities openen"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Systeem-multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Gesplitst scherm openen met huidige app rechts"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Gesplitst scherm openen met huidige app links"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Van gesplitst scherm naar volledig scherm schakelen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Tijdens gesplitst scherm: een app vervangen door een andere"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Gesplitst scherm openen met huidige app rechts"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Gesplitst scherm openen met huidige app links"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Van gesplitst scherm naar volledig scherm schakelen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Tijdens gesplitst scherm: een app vervangen door een andere"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Invoer"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Invoertaal veranderen (volgende taal)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Invoertaal veranderen (vorige taal)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Overschakelen naar volgende taal"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Overschakelen naar vorige taal"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Emoji\'s openen"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Spraakgestuurd typen activeren"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Apps"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistentie"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome als standaard)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacten"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (Gmail als standaard)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sms"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muziek"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index c62519dad363..e02a5a72591b 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ବଟନ୍‍ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"ହୋମ"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ଫେରନ୍ତୁ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ଉପର"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ତଳ"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ବାମ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ଡାହାଣ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"କେନ୍ଦ୍ର"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"ସ୍ପେସ୍‍"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ବିଜ୍ଞପ୍ତି"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"କୀବୋର୍ଡ ସର୍ଟକଟ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"କୀ\'ବୋର୍ଡ୍‍ର ଲେଆଉଟ୍‍କୁ ବଦଳାନ୍ତୁ"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ଟେକ୍ସଟ ଖାଲି କରନ୍ତୁ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ସର୍ଟକଟଗୁଡ଼ିକ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ସର୍ଟକଟ ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"କୌଣସି ସର୍ଟକଟ ମିଳିଲା ନାହିଁ"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ଇନପୁଟ କରନ୍ତୁ"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ଆପ୍ସ ଖୋଲନ୍ତୁ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"ବର୍ତ୍ତମାନର ଆପ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"ବିଜ୍ଞପ୍ତି ସେଡକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ଏକ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନସଟ ନିଅନ୍ତୁ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ସିଷ୍ଟମ / ଆପ୍ସ ସର୍ଟକଟର ଆକ୍ସେସ ତାଲିକା"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ପଛକୁ: ପୂର୍ବ ସ୍ଥିତିକୁ ଫେରି ଯାଆନ୍ତୁ (ପଛକୁ ଯାଆନ୍ତୁ ବଟନ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ହୋମ ସ୍କ୍ରିନକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ଖୋଲାଥିବା ଆପ୍ସର ଓଭରଭିଉ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ବର୍ତ୍ତମାନର ଆପ୍ସ ମଧ୍ୟରେ ସ୍ଵିଚ କରନ୍ତୁ (ଆଗକୁ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ବର୍ତ୍ତମାନର ଆପ୍ସ ମଧ୍ୟରେ ସ୍ଵିଚ କରନ୍ତୁ (ପଛକୁ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ସମସ୍ତ ଆପ୍ସ ଏବଂ ସର୍ଚ୍ଚର ଆକ୍ସେସ ତାଲିକା (ଯଥା ସର୍ଚ୍ଚ/ଲଞ୍ଚର)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ଲୁଚାନ୍ତୁ ଏବଂ (ପୁଣି)ଦେଖାନ୍ତୁ ଟାସ୍କବାର"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ସିଷ୍ଟମ ସେଟିଂସର ଆକ୍ସେସ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistantକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଭ୍ୟୁ କରନ୍ତୁ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ସ୍କ୍ରିନସଟ ନିଅନ୍ତୁ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ସର୍ଟକଟଗୁଡ଼ିକ ଦେଖାନ୍ତୁ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ପଛକୁ ଫେରନ୍ତୁ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ହୋମ ସ୍କ୍ରିନକୁ ଯାଆନ୍ତୁ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ବର୍ତ୍ତମାନର ଆପ୍ସ ଭ୍ୟୁ କରନ୍ତୁ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"ବର୍ତ୍ତମାନର ଆପ୍ସ ମଧ୍ୟରେ ଆଗକୁ ଯାଆନ୍ତୁ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"ବର୍ତ୍ତମାନର ଆପ୍ସ ମଧ୍ୟରେ ପଛକୁ ଯାଆନ୍ତୁ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ଆପ୍ସ ତାଲିକା ଖୋଲନ୍ତୁ"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ଟାସ୍କବାର ଦେଖାନ୍ତୁ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ସେଟିଂସ ଖୋଲନ୍ତୁ"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ଖୋଲନ୍ତୁ"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ଲକ ସ୍କ୍ରିନ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"କ୍ୱିକ ମେମୋ ପାଇଁ Notes ଆପ ଖୋଲନ୍ତୁ"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notes ଖୋଲନ୍ତୁ"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ସିଷ୍ଟମ ମଲ୍ଟିଟାସ୍କିଂ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"RHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"LHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନରୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନକୁ ସ୍ଵିଚ କରନ୍ତୁ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ସମୟରେ: କୌଣସି ଆପକୁ ଗୋଟିଏରୁ ଅନ୍ୟ ଏକ ଆପରେ ବଦଳାନ୍ତୁ"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନରୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନକୁ ସୁଇଚ କରନ୍ତୁ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ସମୟରେ: କୌଣସି ଆପକୁ ଗୋଟିଏରୁ ଅନ୍ୟ ଏକ ଆପରେ ବଦଳାନ୍ତୁ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ଇନପୁଟ କରନ୍ତୁ"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ଇନପୁଟ ଭାଷା ସ୍ୱିଚ କରନ୍ତୁ (ପରବର୍ତ୍ତୀ ଭାଷା)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ଇନପୁଟ ଭାଷା ସ୍ୱିଚ କରନ୍ତୁ (ପୂର୍ବବର୍ତ୍ତୀ ଭାଷା)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ପରବର୍ତ୍ତୀ ଭାଷାକୁ ସୁଇଚ କରନ୍ତୁ"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ପୂର୍ବବର୍ତ୍ତୀ ଭାଷାକୁ ସୁଇଚ କରନ୍ତୁ"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ଇମୋଜି ଆକ୍ସେସ କରନ୍ତୁ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ଭଏସ ଟାଇପିଂ ଆକ୍ସେସ କରନ୍ତୁ"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ଆପ୍ଲିକେସନ୍‌"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ସହାୟତା"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ବ୍ରାଉଜର (ଡିଫଲ୍ଟ ଭାବେ Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ବ୍ରାଉଜର୍"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"କଣ୍ଟାକ୍ଟ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ଇମେଲ (ଡିଫଲ୍ଟ ଭାବେ Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ଇମେଲ୍"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ମ୍ୟୁଜିକ୍‍"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"କ୍ୟାଲେଣ୍ଡର"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 3f75dfe6f3e4..4ab6e8be44c7 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ਬਟਨ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ਸੂਚਨਾਵਾਂ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ਕੀ-ਬੋਰਡ ਖਾਕਾ ਬਦਲੋ"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ਲਿਖਤ ਕਲੀਅਰ ਕਰੋ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ਸ਼ਾਰਟਕੱਟ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ਸ਼ਾਰਟਕੱਟਾਂ ਨੂੰ ਖੋਜੋ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਨਹੀਂ ਮਿਲਿਆ"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ਇਨਪੁੱਟ"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ਐਪਾਂ ਖੋਲ੍ਹੋ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"ਮੌਜੂਦਾ ਐਪ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"ਸੂਚਨਾ ਸ਼ੇਡ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ਪੂਰਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਓ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ਸਿਸਟਮ / ਐਪ ਸ਼ਾਰਟਕੱਟਾਂ ਦੀ ਸੂਚੀ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ਪਿੱਛੇ ਜਾਓ: ਪਿਛਲੀ ਸਥਿਤੀ \'ਤੇ ਵਾਪਸ ਜਾਓ (\'ਪਿੱਛੇ ਜਾਓ\' ਬਟਨ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ਹੋਮ ਸਕ੍ਰੀਨ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ਐਪਾਂ ਖੋਲ੍ਹੋ ਦੀ ਰੂਪ-ਰੇਖਾ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ਹਾਲ ਹੀ ਵਿੱਚ ਖੋਲ੍ਹੀਆਂ ਐਪਾਂ ਦੇਖੋ (ਅੱਗੇ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ਹਾਲ ਹੀ ਵਿੱਚ ਖੋਲ੍ਹੀਆਂ ਐਪਾਂ ਦੇਖੋ (ਪਿੱਛੇ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ਸਾਰੀਆਂ ਐਪਾਂ ਦੀ ਸੂਚੀ ਤੱਕ ਪਹੁੰਚ ਕਰੋ ਅਤੇ ਖੋਜੋ (ਜਿਵੇਂ ਕਿ, Search/ਲਾਂਚਰ)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ਟਾਸਕਬਾਰ ਲੁਕਾਓ ਅਤੇ (ਮੁੜ)ਦਿਖਾਓ"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ਸੂਚਨਾਵਾਂ ਦੇਖੋ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਓ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ਸ਼ਾਰਟਕੱਟ ਦਿਖਾਓ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ਵਾਪਸ ਜਾਓ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਜਾਓ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ਹਾਲੀਆ ਐਪਾਂ ਦੇਖੋ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"ਹਾਲ ਹੀ ਵਿੱਚ ਖੋਲ੍ਹੀਆਂ ਗਈਆਂ ਐਪਾਂ \'ਤੇ ਅੱਗੇ ਜਾਓ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"ਹਾਲ ਹੀ ਵਿੱਚ ਖੋਲ੍ਹੀਆਂ ਗਈਆਂ ਐਪਾਂ \'ਤੇ ਵਾਪਸ ਜਾਓ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ਐਪਾਂ ਦੀ ਸੂਚੀ ਖੋਲ੍ਹੋ"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ਟਾਸਕਬਾਰ ਦਿਖਾਓ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ਖੋਲ੍ਹੋ"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ਲਾਕ ਸਕ੍ਰੀਨ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ਤੁਰੰਤ ਮੈਮੋ ਲਈ \'ਨੋਟ-ਕਥਨ\' ਐਪ ਨੂੰ ਉੱਪਰ ਵੱਲ ਖਿੱਚੋ"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"ਨੋਟਸ ਖੋਲ੍ਹੋ"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ਸਿਸਟਮ ਮਲਟੀਟਾਸਕਿੰਗ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"RHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"LHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਤੋਂ ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਸਵਿੱਚ ਕਰੋ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੌਰਾਨ: ਇੱਕ ਐਪ ਨਾਲ ਦੂਜੀ ਐਪ ਬਦਲੋ"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਤੋਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੌਰਾਨ: ਇੱਕ ਐਪ ਨਾਲ ਦੂਜੀ ਐਪ ਨੂੰ ਬਦਲੋ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ਇਨਪੁੱਟ"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ਇਨਪੁੱਟ ਭਾਸ਼ਾ ਨੂੰ ਸਵਿੱਚ ਕਰੋ (ਅਗਲੀ ਭਾਸ਼ਾ)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ਇਨਪੁੱਟ ਭਾਸ਼ਾ ਨੂੰ ਸਵਿੱਚ ਕਰੋ (ਪਿਛਲੀ ਭਾਸ਼ਾ)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ਅਗਲੀ ਭਾਸ਼ਾ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ਪਿਛਲੀ ਭਾਸ਼ਾ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ਇਮੋਜੀ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ਅਵਾਜ਼ੀ ਟਾਈਪਿੰਗ ਤੱਕ ਪਹੁੰਚ"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ਐਪਲੀਕੇਸ਼ਨਾਂ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ਸਹਾਇਕ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ਬ੍ਰਾਊਜ਼ਰ (ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਜੋਂ Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ਬ੍ਰਾਊਜ਼ਰ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"ਸੰਪਰਕ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ਈਮੇਲ (ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਜੋਂ Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ਈਮੇਲ"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ਸੰਗੀਤ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index a26a5b54443b..3647bd418c95 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Przycisk <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Wstecz"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"W górę"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"W dół"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"W lewo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"W prawo"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Do środka"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Spacja"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Powiadomienia"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Skróty klawiszowe"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Przełącz układ klawiatury"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Czyszczenie tekstu"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Skróty"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Wyszukiwanie skrótów"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nie znaleziono skrótów"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Wprowadzanie"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otwieranie aplikacji"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Bieżąca aplikacja"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Otwieranie obszaru powiadomień"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Robienie pełnego zrzutu ekranu"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Otwieranie listy skrótów do systemu/aplikacji"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Wstecz: powrót do poprzedniego stanu (przycisk Wstecz)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Otwieranie ekranu głównego"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Przegląd otwartych aplikacji"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Przełączanie się między ostatnimi aplikacjami (do przodu)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Przełączanie się między ostatnimi aplikacjami (wstecz)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Otwieranie listy wszystkich aplikacji i wyszukiwanie (tj. wyszukiwarka/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ukrywanie i ponowne pokazywanie paska aplikacji"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Otwieranie ustawień systemu"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Otwieranie Asystenta Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Wyświetlanie powiadomień"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Robienie zrzutu ekranu"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Pokazywanie skrótów"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Przechodzenie wstecz"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Wyświetlanie ekranu głównego"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Wyświetlanie ostatnich aplikacji"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Przełączanie się do przodu między ostatnimi aplikacjami"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Przełączanie się wstecz między ostatnimi aplikacjami"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otwieranie listy aplikacji"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Pokazywanie paska aplikacji"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otwieranie ustawień"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otwieranie asystenta"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Blokada ekranu"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Otwieranie aplikacji do notatek w przypadku szybkich notatek"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otwieranie notatek"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Wielozadaniowość w systemie"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Uruchamianie trybu podzielonego ekranu z bieżącą aplikacją po prawej"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Uruchamianie trybu podzielonego ekranu z bieżącą aplikacją po lewej"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Przełączanie podzielonego ekranu na pełny ekran"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Podczas podzielonego ekranu: zastępowanie aplikacji"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Uruchamianie trybu podzielonego ekranu z bieżącą aplikacją po prawej"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Uruchamianie trybu podzielonego ekranu z bieżącą aplikacją po lewej"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Przełącz podzielony ekran na pełny ekran"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Podczas podzielonego ekranu: zastępowanie aplikacji"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Wprowadzanie"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Przełączanie języka wprowadzania (następny język)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Przełączanie języka wprowadzania (poprzedni język)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Przełączanie na następny język"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Przełączanie na poprzedni język"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Otwieranie emotikonów"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Otwieranie pisania głosowego"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacje"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pomoc"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Przeglądarka (domyślnie Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asystent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Przeglądarka"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakty"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (domyślnie Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzyka"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendarz"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 4b560602fbfc..329f40a5739d 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Voltar"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Para cima"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Para baixo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Para a esquerda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Para a direita"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centralizar"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificações"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atalhos do teclado"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Alterar layout do teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Apagar texto"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Atalhos"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Atalhos de pesquisa"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nenhum atalho encontrado"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps abertos"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App atual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Acessar a aba de notificações"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Capturar toda a tela"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Acessar lista de atalhos do sistema / de apps"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Voltar ao estado anterior (botão \"Voltar\")"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Acessar a tela inicial"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Visão geral dos apps abertos"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Percorrer apps recentes (avançar)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Percorrer apps recentes (voltar)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Acessar lista de todos os apps e pesquisa (por exemplo, Pesquisa/Tela de início)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ocultar e mostrar a barra de tarefas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Acessar configurações do sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Acessar o Google Assistente"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Mostrar as notificações"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Fazer uma captura de tela"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar atalhos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Voltar"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir para a tela inicial"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Conferir os apps recentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Avançar pela lista de apps recentes"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Voltar pela lista de apps recentes"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar a Barra de tarefas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configurações"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir o Google Assistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Tela de bloqueio"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Fazer uma anotação rápida no app Notes"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir observações"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitarefa do sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Usar a tela dividida com o app atual à direita"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Usar a tela dividida com o app atual à esquerda"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Mudar de tela dividida para tela cheia"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Com a tela dividida: substituir um app por outro"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Usar a tela dividida com o app atual à direita"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Usar a tela dividida com o app atual à esquerda"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar da tela dividida para a tela cheia"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Com a tela dividida: substituir um app por outro"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Trocar o idioma de entrada (próximo)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Trocar o idioma de entrada (anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para o próximo idioma"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Mudar para o idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Acessar emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Acessar a digitação por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicativos"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistente"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome por padrão)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google Assistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contatos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (Gmail por padrão)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 09c48cbc4a08..1b2292943e87 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Início"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Anterior"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Para cima"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Para baixo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Para a esquerda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Para a direita"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Seta para cima"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Seta para baixo"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Seta para a esquerda"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Seta para a direita"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Ao centro"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espaço"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificações"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atalhos de teclado"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Alterar esquema de teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Limpar texto"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ou"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Limpar consulta de pesquisa"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Atalhos"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Pesquise atalhos"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nenhum atalho encontrado"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps abertas"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App atual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Aceda ao painel de notificações"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Faça uma captura de ecrã completa"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Aceda à lista dos atalhos de apps/sistema"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Anterior: volte ao estado anterior (botão anterior)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Aceda ao ecrã principal"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Vista geral das apps abertas"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Percorra as apps recentes (para a frente)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Percorra as apps recentes (para trás)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Aceda à lista de todas as apps e pesquise (por ex., Pesquisa/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Oculte e volte a apresentar a barra de tarefas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Aceda às definições do sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Aceda ao Assistente Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"A mostrar resultados da pesquisa"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"A mostrar atalhos do sistema"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"A mostrar atalhos de introdução"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"A mostrar atalhos que abrem apps"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"A mostrar atalhos para a app atual"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ver notificações"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Fazer captura de ecrã"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar atalhos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Voltar"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Aceder ao ecrã principal"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ver apps recentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Percorrer apps recentes para a frente"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Percorrer apps recentes para trás"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar barra de tarefas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir definições"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir Assistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Ecrã de bloqueio"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Inicie a app Notas para criar uma nota rápida"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir notas"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Execução de várias tarefas em simultâneo no sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Aceda ao ecrã dividido com a app atual para RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Aceda ao ecrã dividido com a app atual para LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Mude do ecrã dividido para o ecrã inteiro"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Durante o ecrã dividido: substitua uma app por outra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Aceder ao ecrã dividido com a app atual para RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Aceder ao ecrã dividido com a app atual para LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mude de ecrã dividido para ecrã inteiro"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Durante o ecrã dividido: substituir uma app por outra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Mude de idioma de entrada (idioma seguinte)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Mude de idioma de entrada (idioma anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para idioma seguinte"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Mudar para idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Aceda a emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Aceda à digitação por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Apps"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistência"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome como predefinição)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contactos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail como predefinição)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendário"</string>
@@ -1076,7 +1082,7 @@
<string name="person_available" msgid="2318599327472755472">"Disponível"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Ocorreu um problema ao ler o medidor da bateria"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toque para obter mais informações"</string>
- <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme defin."</string>
+ <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme definido"</string>
<string name="accessibility_bouncer" msgid="5896923685673320070">"introduzir bloqueio de ecrã"</string>
<string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensor de impressões digitais"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"autenticar"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 4b560602fbfc..329f40a5739d 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Voltar"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Para cima"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Para baixo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Para a esquerda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Para a direita"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centralizar"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificações"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atalhos do teclado"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Alterar layout do teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Apagar texto"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Atalhos"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Atalhos de pesquisa"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nenhum atalho encontrado"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps abertos"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App atual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Acessar a aba de notificações"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Capturar toda a tela"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Acessar lista de atalhos do sistema / de apps"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Voltar ao estado anterior (botão \"Voltar\")"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Acessar a tela inicial"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Visão geral dos apps abertos"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Percorrer apps recentes (avançar)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Percorrer apps recentes (voltar)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Acessar lista de todos os apps e pesquisa (por exemplo, Pesquisa/Tela de início)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ocultar e mostrar a barra de tarefas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Acessar configurações do sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Acessar o Google Assistente"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Mostrar as notificações"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Fazer uma captura de tela"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar atalhos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Voltar"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir para a tela inicial"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Conferir os apps recentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Avançar pela lista de apps recentes"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Voltar pela lista de apps recentes"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar a Barra de tarefas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configurações"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir o Google Assistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Tela de bloqueio"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Fazer uma anotação rápida no app Notes"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir observações"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitarefa do sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Usar a tela dividida com o app atual à direita"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Usar a tela dividida com o app atual à esquerda"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Mudar de tela dividida para tela cheia"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Com a tela dividida: substituir um app por outro"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Usar a tela dividida com o app atual à direita"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Usar a tela dividida com o app atual à esquerda"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar da tela dividida para a tela cheia"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Com a tela dividida: substituir um app por outro"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Trocar o idioma de entrada (próximo)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Trocar o idioma de entrada (anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para o próximo idioma"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Mudar para o idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Acessar emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Acessar a digitação por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicativos"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistente"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome por padrão)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google Assistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contatos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (Gmail por padrão)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index aaf20f3dfec0..73da4e7dd095 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -107,7 +107,7 @@
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Începe înregistrarea"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Înregistrează audio"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Conținutul audio de la dispozitiv"</string>
- <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sunetul de la dispozitiv, precum muzică, apeluri și tonuri de sonerie"</string>
+ <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sunetul de la dispozitiv, precum muzică, apeluri și tonuri de apel"</string>
<string name="screenrecord_mic_label" msgid="2111264835791332350">"Microfon"</string>
<string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Conținutul audio de la dispozitiv și microfon"</string>
<string name="screenrecord_continue" msgid="4055347133700593164">"Începe"</string>
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Butonul <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"La început"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Înapoi"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"În sus"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"În jos"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"La stânga"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"La dreapta"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Săgeată în sus"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Săgeată în jos"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Săgeată spre stânga"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Săgeată spre dreapta"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"În centru"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Spațiu"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificări"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Comenzi rapide de la tastatură"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Schimbă aspectul tastaturii"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Șterge textul"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"sau"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Șterge termenul de căutare"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Comenzi rapide"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Caută comenzi rapide"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nu există comenzi rapide"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Introducere"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Aplicații deschise"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aplicația actuală"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Accesează fereastra de notificări"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Fă o captură de ecran completă"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Accesează lista comenzilor rapide pentru sistem / aplicații"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Înapoi: revino la starea anterioară (butonul înapoi)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Accesează ecranul de pornire"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Prezentare generală a aplicațiilor deschise"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Parcurge aplicațiile recente (înainte)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Parcurge aplicațiile recente (înapoi)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Accesează lista tuturor aplicațiilor și caută (Căutare / Lansator)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ascunde și reafișează bara de activități"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Accesează setările de sistem"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Accesează Asistentul Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Se afișează rezultatele căutării"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Se afișează comenzile rapide de sistem"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Se afișează comenzile rapide pentru introducere"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Se afișează comenzile rapide care deschid aplicațiile"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Se afișează comenzile rapide pentru aplicația actuală"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Vezi notificările"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Fă o captură de ecran"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Afișează comenzile rapide"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Înapoi"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Accesează ecranul de pornire"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Vezi aplicațiile recente"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Parcurge aplicațiile recente înainte"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Parcurge aplicațiile recente înapoi"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Deschide lista de aplicații"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Afișează bara de activități"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Deschide setările"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Deschide Asistentul"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Ecranul de blocare"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Accesează aplicația Note pentru notițe rapide"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Deschide notele"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking pe sistem"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Accesează ecranul împărțit cu aplicația actuală în dreapta"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Accesează ecranul împărțit cu aplicația actuală în stânga"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Comută de la ecranul împărțit la ecranul complet"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"În modul ecran împărțit: înlocuiește o aplicație cu alta"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Accesează ecranul împărțit cu aplicația actuală în dreapta"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Accesează ecranul împărțit cu aplicația actuală în stânga"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Comută de la ecranul împărțit la ecranul complet"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"În modul ecran împărțit: înlocuiește o aplicație cu alta"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Introducere"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Schimbă limba de introducere a textului (limba următoare)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Schimbă limba de introducere a textului (limba anterioară)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Comută la următoarea limbă"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Comută la limba anterioară"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Accesează emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Accesează tastarea vocală"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicații"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistent"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome este setat ca prestabilit)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Agendă"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (aplicația Gmail este setată ca prestabilită)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzică"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 3836a2935f64..ee3945df6365 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Кнопка <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Главный экран"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Стрелка вверх"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Стрелка вниз"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Стрелка влево"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Стрелка вправо"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Центральная стрелка"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Пробел"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Уведомления"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Быстрые клавиши"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Переключение раскладки"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Очистить строку поиска"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Сочетания клавиш"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Поиск сочетаний клавиш"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Нет сочетаний клавиш."</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Ввод"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Запущенные приложения"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Это приложение"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Показать панель уведомлений"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Сделать скриншот всего экрана"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Открыть список сочетаний клавиш для системы и приложений"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Возврат к предыдущему состоянию (кнопка \"Назад\")"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Открыть главный экран"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Открыть список запущенных приложений"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Просмотреть недавние приложения (в обычном порядке)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Просмотреть недавние приложения (в обратном порядке)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Открыть список всех приложений и результатов поиска (Поиск/Панель запуска)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Скрыть/показать панель задач"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Открыть настройки системы"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Запустить Google Ассистента"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Посмотреть уведомления"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Сделать скриншот"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Показать сочетания клавиш"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Вернуться назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Перейти на главный экран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Посмотреть недавние приложения"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Прокрутить вперед список недавних приложений"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Прокрутить назад список недавних приложений"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Открыть список приложений"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Показать панель задач"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Открыть настройки"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Открыть Ассистента"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Заблокировать экран"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Создать быструю заметку"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Открыть заметки"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Режим многозадачности"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Включить разделение экрана с текущим приложением справа"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Включить разделение экрана с текущим приложением слева"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Переключиться из режима разделения экрана в полноэкранный режим"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"В режиме разделения экрана заменить одно приложение другим"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Включить разделение экрана с текущим приложением справа"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Включить разделение экрана с текущим приложением слева"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Изменить режим разделения экрана на полноэкранный режим"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"В режиме разделения экрана заменить одно приложение другим"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ввод"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Переключиться на следующий язык ввода"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Переключиться на предыдущий язык ввода"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Выбрать следующий язык"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Выбрать предыдущий язык"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Открыть список эмодзи"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Активировать голосовой ввод"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Приложения"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Помощник"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Браузер (по умолчанию Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Открыть Ассистента"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Браузер"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контакты"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Электронная почта (по умолчанию Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Эл. почта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календарь"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 409379c3b26d..e03c7c0f1c2d 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> බොත්තම"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home යතුර"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ආපසු"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"උඩු"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"යටි"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"වම්"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"දකුණු"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"මැද"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"ඉඩ යතුර"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"දැනුම්දීම්"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"යතුරු පුවරු කෙටිමං"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"යතුරුපුවරු පිරිසැලසුම මාරු කරන්න"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"පෙළ හිස් කරන්න"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"කෙටිමං"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"කෙටිමං සොයන්න"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"කෙටිමං හමු නොවුණි"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ආදානය"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"විවෘත යෙදුම්"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"වත්මන් යෙදුම"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"දැනුම්දීම් සෙවනට ප්‍රවේශ වන්න"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"පූර්ණ තිර රුවක් ගන්න"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"පද්ධති / යෙදුම් කෙටිමං ලැයිස්තුවට ප්‍රවේශ වන්න"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ආපසු: පෙර තත්ත්වයට ආපසු යන්න (ආපසු බොත්තම)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"මුල් තිරයට ප්‍රවේශ වන්න"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"විවෘත යෙදුම් පිළිබඳ දළ විශ්ලේෂණය"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"මෑත යෙදුම් හරහා කාලක්‍රම කරන්න (ඉදිරියට)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"මෑත යෙදුම් හරහා කාලක්‍රම කරන්න (ආපසු)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"සියලු යෙදුම් සහ සෙවීම් ලැයිස්තුවට ප්‍රවේශය (එනම් සෙවීම/දියත් කිරීම)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"කාර්ය තීරුව සඟවන්න සහ (යළි) පෙන්වන්න"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"පද්ධති සැකසීම් වෙත ප්‍රවේශ වන්න"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google සහායක වෙත ප්‍රවේශ වන්න"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"දැනුම්දීම් බලන්න"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"තිර රුව ගන්න"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"කෙටිමං පෙන්වන්න"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ආපසු යන්න"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"මුල් තිරය වෙත යන්න"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"මෑත යෙදුම් බලන්න"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"මෑත යෙදුම් හරහා ඉදිරියට කාලක්‍රම කරන්න"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"මෑත යෙදුම් හරහා ආපස්සට කාලක්‍රම කරන්න"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"යෙදුම් ලැයිස්තුව විවෘත කරන්න"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"කාර්ය තීරුව පෙන්වන්න"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"සැකසීම් විවෘත කරන්න"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"සහායක විවෘත කරන්න"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"තිරය අගුළු දමන්න"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ඉක්මන් සිහිපත සඳහා සටහන් යෙදුම අදින්න"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"සටහන් විවෘත කරන්න"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"පද්ධති බහු කාර්ය"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"RHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"LHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"බෙදුම් තිරයේ සිට පූර්ණ තිරයට මාරු වන්න"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"බෙදුම් තිරය අතරතුර: යෙදුමක් එකකින් තවත් එකක් ප්‍රතිස්ථාපනය කරන්න"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"බෙදුම් තිරයේ සිට පූර්ණ තිරයට මාරු වන්න"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"බෙදුම් තිරය අතරතුර: යෙදුමක් එකකින් තවත් එකක් ප්‍රතිස්ථාපනය කරන්න"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ආදානය"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ආදාන භාෂාව මාරු කරන්න (මීළඟ භාෂාව)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ආදාන භාෂාව මාරු කරන්න (පෙර භාෂාව)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"මීළඟ භාෂාවට මාරු වන්න"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"පෙර භාෂාවට මාරු වන්න"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ඉමොජි වෙත ප්‍රවේශ වන්න"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"හඬ ටයිප් කිරීමට ප්‍රවේශ වන්න"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"යෙදුම්"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"සහාය"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"බ්‍රව්සරය (Chrome පෙරනිමිය ලෙස)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"සහායක"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"බ්‍රවුසරය"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"සම්බන්ධතා"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ඉ-තැපෑල (Gmail පෙරනිමිය ලෙස)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ඊ-තැපෑල"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"සංගීතය"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"දින දර්ශනය"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index b4bf8d3b9429..ca49d66716d8 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Tlačidlo <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Domov"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Späť"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Nahor"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Nadol"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Doľava"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Doprava"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Do stredu"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Medzerník"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Upozornenia"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klávesové skratky"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Prepnúť rozloženie klávesnice"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Vymazať text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Skratky"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Hľadajte skratky"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nenašli sa žiadne skratky"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Vstup"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otvorenie apl."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuálna aplik."</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Prístup k panelu upozornení"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Vytvorenie snímky celej obrazovky"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Zoznam prístupov systému a odkazy do aplikácií"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Späť: prechod na predchádzajúci stav (tlačidlo Späť)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Prístup k ploche"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Prehľad otvorených aplikácií"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Cyklické prechádzanie nedávnymi aplikáciami (dopredu)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Cyklické prechádzanie nedávnymi aplikáciami (dozadu)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Zoznam prístupov všet. aplik. a vyhľad. (teda Vyhľadávanie a Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skrytie a opätovné zobrazenie panela úloh"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Prístup k nastaveniam systému"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Prístup k Asistentovi Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Zobrazenie upozornení"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Vytvorenie snímky obrazovky"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Zobrazenie skratiek"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Prechod späť"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Prechod na plochu"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Zobrazenie nedávnych aplikácií"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cyklické prechádzanie dopredu po nedávnych aplikáciách"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Cyklické prechádzanie dozadu po nedávnych aplikáciách"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvorenie zoznamu aplikácií"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Zobrazenie panela aplikácií"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvorenie nastavení"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvorenie Asistenta"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Zamknúť obrazovku"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Otvorenie aplikácie Poznámky na rýchle zapisovanie"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otvorenie poznámok"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking systému"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Rozdelenie obrazovky s aktuálnou aplikáciou vpravo"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Rozdelenie obrazovky s aktuálnou aplikáciou vľavo"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Prepnutie rozdelenej obrazovky na celú"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Počas rozdelenej obrazovky: nahradenie aplikácie inou"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Rozdelenie obrazovky s aktuálnou aplikáciou vpravo"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Rozdelenie obrazovky s aktuálnou aplikáciou vľavo"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prepnutie rozdelenej obrazovky na celú"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Počas rozdelenej obrazovky: nahradenie aplikácie inou"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vstup"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Prepnutie vstupného jazyka (ďalší jazyk)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Prepnutie vstupného jazyka (predchádzajúci jazyk)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Prepnutie na ďalší jazyk"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Prepnutie na predchádzajúci jazyk"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Prístup k emodži"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Prístup k hlasovému zadávaniu"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikácie"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pomocná aplikácia"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Prehliadač (Chrome ako predvolený)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Prehliadač"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakty"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Pošta (Gmail ako predvolená služba)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Hudba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendár"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 8c4bd73fe38b..b03d7ff2f89f 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Gumb <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Začetek"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Nazaj"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Gor"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Dol"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Levo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Desno"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Puščica gor"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Puščica dol"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Puščica levo"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Puščica desno"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Sredina"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Preslednica"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obvestila"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Bližnjične tipke"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Preklop postavitve tipkovnice"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Izbris besedila"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ali"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Čiščenje iskalne poizvedbe"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Bližnjice"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Iskanje bližnjic"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ni najdenih bližnjic."</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Vnos"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Odprte aplikacije"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Trenutna aplikacija"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Dostop do zaslona z obvestili"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ustvarjanje posnetka celotnega zaslona"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Dostop do seznama sistemskih bližnjic in bližnjic do aplikacij"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Nazaj: Vrnitev v prejšnje stanje (gumb za vrnitev)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Dostop do začetnega zaslona"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Pregled odprtih aplikacij"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Krožno preklapljanje med nedavnimi aplikacijami (naprej)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Krožno preklapljanje med nedavnimi aplikacijami (nazaj)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Dostop do seznama vseh aplikacij in iskanja (tj. iskanje/zaganjalnik)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skritje in (vnovični) prikaz opravilne vrstice"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Dostop do sistemskih nastavitev"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Dostop do Pomočnika Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Prikaz rezultatov iskanja"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Prikaz sistemskih bližnjic"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Prikaz bližnjic za vnos"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Prikaz bližnjic, s katerimi odprete aplikacije"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Prikaz bližnjic za trenutno aplikacijo"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ogled obvestil"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ustvarjanje posnetka zaslona"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Prikaz bližnjic"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Nazaj"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Pomik na začetni zaslon"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ogled nedavnih aplikacij"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Pomikanje naprej po nedavnih aplikacijah"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Pomikanje nazaj po nedavnih aplikacijah"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Odpiranje seznama aplikacij"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Prikaz opravilne vrstice"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Odpiranje nastavitev"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Odpiranje Pomočnika"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Zaklepanje zaslona"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Priklic aplikacije za zapiske za zapis hitre zabeležke"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Odpiranje zapiskov"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Sistemska večopravilnost"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Vklop razdeljenega zaslona s trenutno aplikacijo na desni"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Vklop razdeljenega zaslona s trenutno aplikacijo na levi"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Preklop iz razdeljenega zaslona v celozaslonski način"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Pri razdeljenem zaslonu: Medsebojna zamenjava aplikacij"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Vklop razdeljenega zaslona s trenutno aplikacijo na desni"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Vklop razdeljenega zaslona s trenutno aplikacijo na levi"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Preklop iz razdeljenega zaslona v celozaslonski način"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Pri razdeljenem zaslonu: medsebojna zamenjava aplikacij"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vnosna naprava"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Preklop jezika vnosa (naslednji jezik)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Preklop jezika vnosa (prejšnji jezik)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Preklop na naslednji jezik"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Preklop na prejšnji jezik"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Dostop do emodžijev"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Dostop do glasovnega tipkanja"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacije"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pomoč"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Brskalnik (privzeto Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Pomočnik"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Brskalnik"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Stiki"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-pošta (privzeto Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-pošta"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sporočila SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Glasba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Koledar"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 5a1cd597823c..c779b65c239f 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -401,11 +401,9 @@
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet ngadalë • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="communal_tutorial_indicator_text" msgid="4503010353591430123">"Rrëshqit shpejt majtas për të filluar udhëzuesin e përbashkët"</string>
- <!-- no translation found for button_to_open_widget_editor (5599945944349057600) -->
- <skip />
+ <string name="button_to_open_widget_editor" msgid="5599945944349057600">"Hap modifikuesin e miniaplikacionit"</string>
<string name="button_to_remove_widget" msgid="1511255853677835341">"Hiq një miniaplikacion"</string>
- <!-- no translation found for hub_mode_add_widget_button_text (3956587989338301487) -->
- <skip />
+ <string name="hub_mode_add_widget_button_text" msgid="3956587989338301487">"Shto miniaplikacionin"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Ndërro përdorues"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyja me tërheqje poshtë"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Të gjitha aplikacionet dhe të dhënat në këtë sesion do të fshihen."</string>
@@ -642,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Butoni <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Kreu"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Prapa"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Lart"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Poshtë"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Majtas"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Djathtas"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Qendror"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Hapësirë"</string>
@@ -673,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Njoftimet"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Shkurtoret e tastierës"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Ndërro strukturën e tastierës"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Pastro tekstin"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Shkurtoret"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Kërko shkurtoret"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nuk u gjet shkurtore"</string>
@@ -681,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Hyrja"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apl. e hapura"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Apl. aktual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Qasu te streha e njoftimeve"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Bëj një pamje të plotë ekrani"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Qasu te lista e sistemeve/shkurtoreve të aplikacioneve"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Pas: kthehu pas te gjendja e mëparshme (butoni pas)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Qasu tek ekrani bazë"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Përmbledhje e aplikacioneve të hapura"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Lëviz mes aplikacioneve të fundit (përpara)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Lëviz mes aplikacioneve të fundit (pas)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Qasu te lista e aplikacioneve dhe kërko (p.sh. Kërko/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Fshih dhe (ri)shfaq shiritin e detyrave"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Qasu te cilësimet e sistemit"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Qasu tek \"Asistenti i Google\""</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Shiko njoftimet"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Nxirr një pamje ekrani"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Shfaq shkurtoret"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Kthehu prapa"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Shko tek ekrani bazë"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Shiko aplikacionet e fundit"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Lëviz përpara përmes aplikacioneve të fundit"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Lëviz prapa përmes aplikacioneve të fundit"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Hap listën e aplikacioneve"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Shfaq shiritin e detyrave"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Hap cilësimet"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Hap \"Asistentin\""</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Ekrani i kyçjes"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Hap aplikacionin \"Shënimet\" për një memorandum të shpejtë"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Hap \"Shënimet\""</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Kryerja e shumë detyrave nga sistemi"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Fut ekranin e ndarë me aplikacionin aktual te RHS-ja"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Fut ekranin e ndarë me aplikacionin aktual te LHS-ja"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Kalo nga ekrani i ndarë në ekranin e plotë"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Gjatë ekranit të ndarë: zëvendëso një aplikacion nga një te një tjetër"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Hyr në ekranin e ndarë me aplikacionin aktual në anën e djathtë"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Hyr në ekranin e ndarë me aplikacionin aktual në anën e majtë"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Kalo nga ekrani i ndarë në ekranin e plotë"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Gjatë ekranit të ndarë: zëvendëso një aplikacion me një tjetër"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Hyrja"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Ndërro gjuhën e hyrjes (gjuha tjetër)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Ndërro gjuhën e hyrjes (gjuha e mëparshme)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Kalo te gjuha tjetër"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Kalo te gjuha e mëparshme"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Qasu te emoji-t"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Qasu te shkrimi me zë"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacionet"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistenti"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Shfletuesi (Chrome si i parazgjedhur)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistenti"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Shfletuesi"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktet"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail si i parazgjedhur)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email-i"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzikë"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendari"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 887f5c625f3e..48673b90ca8f 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Дугме <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Тастер Почетна"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Тастер Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Тастер са стрелицом нагоре"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Тастер са стрелицом надоле"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Тастер са стрелицом налево"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Тастер са стрелицом надесно"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Тастер са централном стрелицом"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Размак"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Обавештења"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Тастерске пречице"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Промени распоред тастатуре"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Обришите текст"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Пречице"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Претражите пречице"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Нису пронађене пречице"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Унос"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Отварање аплик"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Актуелна аплик"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Приступ траци са обавештењима"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Снимање екрана"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Приступ листи пречица за систем/апликације"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Назад: назад на претходно стање (дугме Назад)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Приступ почетном екрану"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Преглед отворених апликација"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Преглед недавних апликација (напред)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Преглед недавних апликација (назад)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Приступ листи свих алпикација и претрага (нпр. Претрага/Покретач)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Скривање и поновно приказивање траке задатака"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Приступ подешавањима система"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Приступ Google помоћнику"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Прикажи обавештења"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Направи снимак екрана"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Прикажи пречице"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Иди на почетни екран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Прегледај недавно коришћене апликације"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Прегледај недавно коришћене апликације унапред"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Прегледај недавно коришћене апликације уназад"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Отвори листу апликација"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Прикажи траку задатака"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Отвори подешавања"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Отвори помоћника"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Закључавање екрана"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Отварање апликације Белешке за брзо прављење белешке"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Отвори белешке"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Обављање више задатака система истовремено"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Покретање подељеног екрана за актуелну апликацију на десној страни"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Покретање подељеног екрана за актуелну апликацију на левој страни"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Прелазак са подељеног екрана на цео екран"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Током подељеног екрана: замена једне апликације другом"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Покрени подељени екран за актуелну апликацију на десној страни"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Покрени подељени екран за актуелну апликацију на левој страни"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Пређи са подељеног екрана на цео екран"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"У режиму подељеног екрана: замена једне апликације другом"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Унос"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Промена језика уноса (следећи језик)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Промена језика уноса (претходни језик)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Пређи на следећи језик"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Пређи на претходни језик"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Приступ емоџијима"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Приступ уносу текста гласом"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Апликације"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Апликација за помоћ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Прегледач (подразумевано Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Помоћник"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Прегледач"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контакти"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Имејл (Gmail као подразумевани)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Имејл"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 3f9e45c6bd0c..0b2cab0454f8 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Knappen <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Start"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Tillbaka"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Upp"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Ned"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vänster"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Höger"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centrera"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Blanksteg"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Aviseringar"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Kortkommandon"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Byt tangentbordslayout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Rensa text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Kortkommandon"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Sök efter kortkommando"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Inga resultat"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Inmatning"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Öppna appar"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuell app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Öppna meddelandepanelen"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ta en skärmbild av hela skärmen"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Öppna lista över system- och appgenvägar"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Bakåt: gå tillbaka till föregående läge (bakåtknapp)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Öppna startskärmen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Översikt över öppna appar"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Bläddra igenom de senaste apparna (framåt)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Bläddra igenom de senaste apparna (bakåt)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Öppna en lista över alla appar och sökningar (t.ex. Sök/Appstartaren)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Dölj och visa aktivitetsfältet"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Öppna systeminställningarna"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Öppna Google Assistent"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Se aviseringar"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ta skärmbild"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Se genvägar"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Tillbaka"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Öppna startskärmen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Se de senaste apparna"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Bläddra framåt bland de senaste apparna"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Bläddra bakåt bland de senaste apparna"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Öppna applistan"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Se aktivitetsfält"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Öppna inställningarna"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Öppna assistenten"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lås skärmen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Ta fram anteckningsappen för en snabb anteckning"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Öppna anteckningar"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Systemets multikörning"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Öppna delad skärm med aktuell app till höger"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Öppna delad skärm med aktuell app till vänster"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Byt mellan delad skärm och helskärm"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Med delad skärm: ersätt en app med en annan"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Öppna delad skärm med aktuell app till höger"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Öppna delad skärm med aktuell app till vänster"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Byt mellan delad skärm och helskärm"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Med delad skärm: ersätt en app med en annan"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Inmatning"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Byt inmatningsspråk (nästa språk)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Byt inmatningsspråk (föregående språk)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Byt till nästa språk"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Byt till föregående språk"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Öppna emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Öppna röststyrning"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Appar"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Hjälp"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Webbläsare (Chrome som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Webbläsare"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakter"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-post (Gmail som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-post"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sms"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 007f0d3ee039..3cd534559ee2 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Kitufe cha <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Mwanzo"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Nyuma"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Juu"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Chini"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Kushoto"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Kulia"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Kishale cha juu"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Kishale cha chini"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Kishale cha kushoto"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Kishale cha kulia"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Katikati"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Arifa"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Mikato ya Kibodi"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Badili mkao wa kibodi"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Futa maandishi"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"au"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Futa hoja ya utafutaji"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Njia za mkato"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Tafuta njia za mkato"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Hakuna njia za mkato zilizopatikana"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Vifaa vya kuingiza data"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Fungua programu"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Programu ya sasa"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Fikia sehemu ya arifa"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Piga picha kamili ya skrini"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Orodha ya ufikiaji ya mfumo / njia za mikato za programu"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Nyuma: rudi kwenye hali ya awali (kitufe cha nyuma)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Fikia skrini ya kwanza"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Muhtasari wa programu zilizofunguliwa"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Pitia programu za hivi karibuni (mbele)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Pitia programu za hivi karibuni (nyuma)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Orodha ya ufikiaji ya programu na utafutaji wote (k.m. Utafutaji/Kifungua programu)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ficha na uonyeshe upya upauzana"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Fikia mipangilio ya mfumo"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Fikia programu ya Mratibu wa Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Inaonyesha matokeo ya utafutaji"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Inaonyesha njia za mkato za mfumo"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Inaonyesha njia za mkato za kuingiza data"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Inaonyesha njia za mkato za kufungua programu"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Inaonyesha njia za mkato za programu unayotumia kwa sasa"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Tazama arifa"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Kupiga picha ya skrini"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Onyesha njia za mkato"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Rudi nyuma"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Nenda kwenye skrini ya kwanza"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Angalia programu ulizofungua hivi majuzi"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Nenda mbele kwenye programu ulizofungua awali"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Rudi nyuma kwenye programu ulizofungua awali"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Fungua orodha ya programu"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Onyesha upauzana"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Fungua mipangilio"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Fungua programu ya Mratibu wa Google"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Funga skrini"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Fungua programu ya Madokezo ili uandike taarifa"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Fungua madokezo"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Majukumu mengi ya mfumo"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Weka Skrini iliyogawanywa na programu ya sasa kwenye upande wa kulia"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Weka Skrini iliyogawanywa na programu ya sasa kwenye upande wa kushoto"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Badilisha kutoka Skrini iliyogawanywa utumie skrini nzima"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Wakati wa Skrini iliyogawanywa: badilisha kutoka programu moja hadi nyingine"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Tumia programu kwenye skrini iliyogawanywa upande wa kulia"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Tumia programu kwenye skrini iliyogawanywa upande wa kushoto"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Badilisha kutoka skrini iliyogawanywa utumie skrini nzima"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ukigawanya skrini: badilisha kutoka programu moja hadi nyingine"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vifaa vya kuingiza data"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Badilisha lugha ya kuweka data (lugha inayofuata)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Badilisha lugha ya kuweka data (lugha ya awali)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Badilisha utumie lugha inayofuata"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Badilisha utumie lugha iliyotangulia"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Fikia emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Fikia kuandika kwa kutamka"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Programu"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Programu ya usaidizi"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Kivinjari (Chrome iwe chaguomsingi)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Programu ya Mratibu"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Kivinjari"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Anwani"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Barua pepe (Gmail iwe chaguomsingi)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Barua pepe"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muziki"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalenda"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index e5cf3b2eeb1b..7989a3539cf5 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> பட்டன்"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"ஹோம்"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"பேக்"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"மேலே"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"கீழே"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"இடது"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"வலது"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"நடு"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"ஸ்பேஸ்"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"அறிவிப்புகள்"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"கீபோர்டு ஷார்ட்கட்கள்"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"கீபோர்டு லே அவுட்டை மாற்று"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"வார்த்தைகளை அழிக்கும்"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ஷார்ட்கட்கள்"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ஷார்ட்கட்களைத் தேடுக"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ஷார்ட்கட்கள் எதுவுமில்லை"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"உள்ளீடு"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"திறந்த ஆப்ஸ்"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"தற்போதைய ஆப்ஸ்"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"அறிவிப்பு விவரத்திற்கான அணுகல்"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"முழு ஸ்கிரீன்ஷாட் எடுத்தல்"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"சிஸ்டம் / ஆப்ஸ் ஷார்ட்கட்களுக்கான அணுகல் பட்டியல்"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"பின்செல்: முந்தைய நிலைக்குச் செல்லுதல் (பின்செல்வதற்கான பட்டன்)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"முகப்புத் திரைக்கான அணுகல்"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"திறந்திருக்கும் ஆப்ஸைப் பார்த்தல்"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"சமீபத்திய ஆப்ஸுக்கிடையில் (பிந்தையது) மாறுதல்"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"சமீபத்திய ஆப்ஸுக்கிடையில் (முந்தையது) மாறுதல்"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"அனைத்து ஆப்ஸ் மற்றும் தேடலுக்குமான (தேடல், தொடக்கி) அணுகல் பட்டியல்"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"செயல் பட்டியை மறைத்தல் மற்றும் (மீண்டும்) காட்டுதல்"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"சிஸ்டம் அமைப்புகளுக்கான அணுகல்"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistantடிற்கான அணுகல்"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"அறிவிப்புகளைக் காட்டுதல்"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ஸ்கிரீன்ஷாட் எடுத்தல்"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ஷார்ட்கட்களைக் காட்டுதல்"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"பின்செல்லுதல்"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"முகப்புத் திரைக்குச் செல்லுதல்"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"சமீபத்திய ஆப்ஸைக் காட்டுதல்"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"சமீபத்திய ஆப்ஸுக்கு முன்னோக்கிச் செல்லுதல்"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"சமீபத்திய ஆப்ஸுக்குப் பின்னோக்கிச் செல்லுதல்"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ஆப்ஸ் பட்டியலைத் திறத்தல்"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"செயல் பட்டியைக் காட்டுதல்"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"அமைப்புகளைத் திறத்தல்"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistantடைத் திறத்தல்"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"பூட்டுத் திரை"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"மெமோவை விரைவாகத் தயாரிக்க Notes ஆப்ஸைப் பயன்படுத்துதல்"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"குறிப்புகளைத் திறத்தல்"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"சிஸ்டம் பல வேலைகளைச் செய்தல்"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"வலதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"இடதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"திரைப் பிரிப்பு பயன்முறையிலிருந்து முழுத்திரைக்கு மாறுதல்"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"திரைப் பிரிப்பின்போது: ஓர் ஆப்ஸுக்குப் பதிலாக மற்றொன்றை மாற்றுதல்"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"வலதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"இடதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"திரைப் பிரிப்பு பயன்முறையிலிருந்து முழுத்திரைக்கு மாற்றுதல்"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"திரைப் பிரிப்பின்போது: ஓர் ஆப்ஸுக்குப் பதிலாக மற்றொன்றை மாற்றுதல்"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"உள்ளீடு"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"உள்ளீட்டு மொழியை மாற்றுதல் (அடுத்த மொழி)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"உள்ளீட்டு மொழியை மாற்றுதல் (முந்தைய மொழி)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"அடுத்த மொழிக்கு மாற்றுதல்"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"முந்தைய மொழிக்கு மாற்றுதல்"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ஈமோஜிக்கான அணுகல்"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"குரல் டைப்பிங்கிற்கான அணுகல்"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ஆப்ஸ்"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"அசிஸ்ட்"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"உலாவி (இயல்பாக Chrome இருக்கும்)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"உலாவி"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"தொடர்புகள்"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"மின்னஞ்சல் (இயல்பாக Gmail இருக்கும்)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"மின்னஞ்சல்"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"மியூசிக்"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 8ec3905e5756..6b2c032fcb22 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"బటన్ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"వెనుకకు"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"పైకి"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"కిందికి"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ఎడమ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"కుడి"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"మధ్య"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"అంతరం"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"నోటిఫికేషన్‌లు"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"కీబోర్డ్ షార్ట్‌కట్‌లు"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"కీబోర్డ్ లేఅవుట్‌ను మార్చండి"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"టెక్స్ట్‌ను క్లియర్ చేయండి"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"షార్ట్‌కట్‌లు"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"షార్ట్‌కట్స్ సెర్చ్ చేయండి"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"షార్ట్‌కట్‌లు ఏవీ లేవు"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ఇన్‌పుట్"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"యాప్స్ తెరవండి"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"ప్రస్తుత యాప్"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"నోటిఫికేషన్ తెరను యాక్సెస్ చేయండి"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"పూర్తి స్క్రీన్‌షాట్ తీసుకోండి"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"సిస్టమ్ / యాప్స్ షార్ట్‌కట్స్ లిస్ట్‌ను యాక్సెస్ చేయండి"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"వెనుకకు: మునుపటి స్థితికి తిరిగి వెళ్లండి (వెనుకకు బటన్)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"మొదటి స్క్రీన్‌ను యాక్సెస్ చేయండి"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overview of open apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ఇటీవలి యాప్‌లను ఒక్కొక్కటిగా చూడండి (ముందుకు)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ఇటీవలి యాప్‌లను ఒక్కొక్కటిగా చూడండి (వెనుకకు)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"అన్ని యాప్‌లు, సెర్చ్ లిస్ట్‌ను యాక్సెస్ చేయండి (అంటే సెర్చ్/లాంచర్)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"టాస్క్‌బార్‌ను దాచిపెట్టి (తిరిగి) చూపించండి"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"సిస్టమ్ సెట్టింగ్‌లను యాక్సెస్ చేయండి"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistantను యాక్సెస్ చేయండి"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"నోటిఫికేషన్‌లను చూడండి"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"స్క్రీన్‌షాట్‌ను తీయండి"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"షార్ట్‌కట్‌లను చూపించండి"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"వెనుకకు వెళ్లండి"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"మొదటి స్క్రీన్‌కు వెళ్లండి"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ఇటీవలి యాప్‌లను చూడండి"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"ఇటీవల ఉపయోగించిన యాప్‌ల తదుపరి పేజీకి వెళ్లండి"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"ఇటీవల ఉపయోగించిన యాప్‌ల మునుపటి పేజీకి వెళ్లండి"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"యాప్‌ల లిస్ట్‌ను తెరవండి"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"టాస్క్‌బార్‌ను చూపండి"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"సెట్టింగ్‌లను తెరవండి"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"అసిస్టెంట్‌ను తెరవండి"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"లాక్ స్క్రీన్"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"క్విక్ మెమో కోసం Notes యాప్‌ను లాగండి"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"నోట్స్‌ను తెరవండి"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"సిస్టమ్ మల్టీ-టాస్కింగ్"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"RHSకు ప్రస్తుత యాప్‌తో స్ప్లిట్ స్క్రీన్‌ను ఎంటర్ చేయండి"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"LHSకు ప్రస్తుత యాప్‌తో స్ప్లిట్ స్క్రీన్‌ను ఎంటర్ చేయండి"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"స్ప్లిట్ స్క్రీన్‌ను ఫుల్ స్క్రీన్‌కు మార్చండి"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"స్ప్లిట్ స్క్రీన్ సమయంలో: యాప్‌ను ఒకదాని నుండి మరొకదానికి రీప్లేస్ చేయండి"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHSకు ప్రస్తుత యాప్‌తో స్ప్లిట్ స్క్రీన్‌ను ఎంటర్ చేయండి"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHSకు ప్రస్తుత యాప్‌తో స్ప్లిట్ స్క్రీన్‌ను ఎంటర్ చేయండి"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"స్ప్లిట్ స్క్రీన్‌ను ఫుల్ స్క్రీన్‌కు మార్చండి"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"స్ప్లిట్ స్క్రీన్ సమయంలో: ఒక దాన్నుండి మరో దానికి యాప్ రీప్లేస్ చేయండి"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ఇన్‌పుట్"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ఇన్‌పుట్ భాషకు స్విచ్ అవ్వండి (తర్వాతి భాష)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ఇన్‌పుట్ భాషకు స్విచ్ అవ్వండి (మునుపటి భాష)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"తర్వాత భాషకు స్విచ్ అవ్వండి"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"మునుపటి భాషకు స్విచ్ అవ్వండి"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ఎమోజిని యాక్సెస్ చేయండి"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"వాయిస్ టైపింగ్‌ను యాక్సెస్ చేయండి"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"అప్లికేషన్‌లు"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"సహాయకం"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"బ్రౌజర్ (ఆటోమేటిక్ సెట్టింగ్‌గా Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"బ్రౌజర్"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"కాంటాక్ట్‌లు"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ఈమెయిల్ (ఆటోమేటిక్ సెట్టింగ్‌గా Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ఈమెయిల్‌"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"మ్యూజిక్"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 2f132807b243..3c5396fe4823 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ปุ่ม <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"กลับ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ขึ้น"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ลง"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ซ้าย"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ขวา"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"กึ่งกลาง"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"วรรค"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"การแจ้งเตือน"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"แป้นพิมพ์ลัด"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"สลับรูปแบบแป้นพิมพ์"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ล้างข้อความ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"แป้นพิมพ์ลัด"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ค้นหาแป้นพิมพ์ลัด"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ไม่พบแป้นพิมพ์ลัด"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"อินพุต"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"แอปที่เปิดอยู่"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"แอปปัจจุบัน"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"เข้าถึงหน้าต่างแจ้งเตือน"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ถ่ายภาพหน้าจอแบบเต็มจอ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"เข้าถึงรายการทางลัดของระบบ/แอปทั้งหมด"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ย้อนกลับ: กลับไปยังสถานะก่อนหน้า (ปุ่มย้อนกลับ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"เข้าถึงหน้าจอหลัก"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ภาพรวมของแอปที่เปิดอยู่"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"สลับระหว่างแอปล่าสุด (ไปข้างหน้า)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"สลับระหว่างแอปล่าสุด (กลับหลัง)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"เข้าถึงรายการแอปและการค้นหา (เช่น Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ซ่อนและแสดงแถบงาน (อีกครั้ง)"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"เข้าถึงการตั้งค่าระบบ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"เข้าถึง Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ดูการแจ้งเตือน"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ถ่ายภาพหน้าจอ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"แสดงแป้นพิมพ์ลัด"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ย้อนกลับ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ไปที่หน้าจอหลัก"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ดูแอปล่าสุด"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"สลับระหว่างแอปล่าสุดแบบไปข้างหน้า"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"สลับระหว่างแอปล่าสุดแบบกลับหลัง"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"เปิดรายชื่อแอป"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"แสดงแถบงาน"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"เปิดการตั้งค่า"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"เปิด Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ล็อกหน้าจอ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"เปิดแอปโน้ตเพื่อจดบันทึก"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"เปิดโน้ต"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"การทํางานหลายอย่างพร้อมกันของระบบ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านขวา"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านซ้าย"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"เปลี่ยนจากโหมดแยกหน้าจอเป็นเต็มหน้าจอ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ระหว่างใช้โหมดแยกหน้าจอ: เปลี่ยนแอปหนึ่งเป็นอีกแอปหนึ่ง"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านขวา"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านซ้าย"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"เปลี่ยนจากโหมดแยกหน้าจอเป็นเต็มหน้าจอ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ระหว่างใช้โหมดแยกหน้าจอ: เปลี่ยนแอปหนึ่งเป็นอีกแอปหนึ่ง"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"อินพุต"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"เปลี่ยนภาษาในการป้อนข้อมูล (ภาษาถัดไป)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"เปลี่ยนภาษาในการป้อนข้อมูล (ภาษาก่อนหน้า)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"เปลี่ยนเป็นภาษาถัดไป"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"เปลี่ยนเป็นภาษาก่อนหน้า"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"เข้าถึงอีโมจิ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"เข้าถึงการพิมพ์ด้วยเสียง"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"แอปพลิเคชัน"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ผู้ช่วย"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"เบราว์เซอร์ (Chrome เป็นค่าเริ่มต้น)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"เบราว์เซอร์"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"รายชื่อติดต่อ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"อีเมล (Gmail เป็นค่าเริ่มต้น)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"อีเมล"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"เพลง"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ปฏิทิน"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 11c75c62c989..21111a405308 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Button na <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Mga Notification"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Mga Keyboard Shortcut"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Magpalit ng layout ng keyboard"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"I-clear ang text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Mga Shortcut"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Maghanap ng mga shortcut"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Walang nakitang shortcut"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Buksan ang app"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Kasalukuyang app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"I-access ang notification shade"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Kumuha ng buong screenshot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"I-access ang listahan ng mga shortcut ng system / mga app"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Bumalik: bumalik sa nakaraang status (button na bumalik)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"I-access ang home screen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Pangkalahatang-ideya ng mga bukas na app"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Mag-cycle sa mga kamakailang app (sumulong)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Mag-cycle sa mga kamakailang app (bumalik)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"I-access ang listahan ng lahat ng app at paghahanap (ibig sabihin, Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Itago at ipakita (ulit) ang taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"I-access ang mga setting ng system"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"I-access ang Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Tumingin ng mga notification"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Kumuha ng screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Ipakita ang mga shortcut"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Bumalik"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Pumunta sa home screen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Tingnan ang mga kamakailang app"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Mag-cycle pasulong sa mga kamakailang app"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Mag-cycle pabalik sa mga kamakailang app"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Buksan ang listahan ng mga app"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Ipakita ang taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Buksan ang mga setting"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Buksan ang assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"I-lock ang screen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Buksan ang Notes app para sa mabilis na memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Buksan ang mga tala"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking ng system"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Lumipat sa Split screen nang nasa RHS ang kasalukuyang app"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Lumipat sa Split screen nang nasa LHS ang kasalukuyang app"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Lumipat sa full screen mula sa Split screen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Habang nasa Split screen: magpalit-palit ng app"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Lumipat sa split screen nang nasa RHS ang kasalukuyang app"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Lumipat sa split screen nang nasa LHS ang kasalukuyang app"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Lumipat sa full screen mula sa split screen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Habang nasa split screen: magpalit-palit ng app"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Magpalit ng wika ng pag-input (susunod na wika)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Magpalit ng wika ng pag-input (nakaraang wika)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Lumipat sa susunod na wika"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Lumipat sa dating wika"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"I-access ang emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"I-access ang voice typing"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Mga Application"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Tulong"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome bilang default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Mga Contact"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail bilang default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendaryo"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 3f578d26e581..08b0251d6438 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> düğmesi"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Geri"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Yukarı"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Aşağı"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Sol"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Sağ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Orta"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Boşluk"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Bildirimler"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klavye Kısayolları"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klavye düzenini değiştir"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Metni temizle"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Kısayollar"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Kısayol araması yapın"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Kısayol bulunamadı"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Giriş"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Uygulamaları açma"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Mevcut uygulama"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Bildirim gölgesine erişin"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Tam ekran görüntüsü alın"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Sistem/uygulama kısayolları listesine erişin"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Geri: Önceki duruma geri dönün (geri düğmesi)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Ana ekrana erişin"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Açık uygulamalara genel bakış"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Son uygulamalar arasında gezinin (ileri)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Son uygulamalar arasında gezinin (geri)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Tüm uygulama ve arama (ör. Arama/Launcher) listesine erişin"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Görev çubuğunu gizleyin ve (yeniden) gösterin"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Sistem ayarlarına erişin"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Asistan\'a erişin"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Bildirimleri görüntüle"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ekran görüntüsü al"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Kısayolları göster"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Geri dön"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ana ekrana git"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Son uygulamaları görüntüle"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Son uygulamalarda ileriye doğru git"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Son uygulamalarda geriye doğru git"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Uygulama listesini aç"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Görev çubuğunu göster"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ayarları aç"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Asistan\'ı aç"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Kilit ekranı"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Hızlıca not almak için Notlar uygulamasını açın"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notları aç"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Sistem çoklu görevi"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Mevcut uygulamayı sağ tarafa alarak bölünmüş ekrana geçin"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Mevcut uygulamayı sol tarafa alarak bölünmüş ekrana geçin"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Bölünmüş ekrandan tam ekrana geçin"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Bölünmüş ekran etkinken: Bir uygulamayı başkasıyla değiştirin"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Mevcut uygulamayı sağ tarafa alarak bölünmüş ekrana geç"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Mevcut uygulamayı sol tarafa alarak bölünmüş ekrana geç"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bölünmüş ekrandan tam ekrana geç"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Bölünmüş ekran etkinken: Bir uygulamayı başkasıyla değiştir"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Giriş"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Giriş dilini değiştirin (sonraki dil)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Giriş dilini değiştirin (önceki dil)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Sonraki dile geç"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Önceki dile geç"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Emojilere erişin"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Sesle yazma özelliğine erişin"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Uygulamalar"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistan"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Tarayıcı (varsayılan olarak Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistan"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Tarayıcı"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kişiler"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-posta (varsayılan olarak Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-posta"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Müzik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Takvim"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 90dc097919fa..9048b6326368 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -401,11 +401,9 @@
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Повільне заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string>
<string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string>
<string name="communal_tutorial_indicator_text" msgid="4503010353591430123">"Проведіть пальцем уліво, щоб відкрити спільний навчальний посібник"</string>
- <!-- no translation found for button_to_open_widget_editor (5599945944349057600) -->
- <skip />
+ <string name="button_to_open_widget_editor" msgid="5599945944349057600">"Відкрити редактор віджетів"</string>
<string name="button_to_remove_widget" msgid="1511255853677835341">"Вилучити віджет"</string>
- <!-- no translation found for hub_mode_add_widget_button_text (3956587989338301487) -->
- <skip />
+ <string name="hub_mode_add_widget_button_text" msgid="3956587989338301487">"Додати віджет"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Змінити користувача"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"спадне меню"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Усі додатки й дані з цього сеансу буде видалено."</string>
@@ -642,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Кнопка <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Стрілка вгору"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Стрілка вниз"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Стрілка вліво"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Стрілка вправо"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Центр"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Пробіл"</string>
@@ -673,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Сповіщення"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Комбінації клавіш"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Змінити розкладку клавіатури"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Видалити текст"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Швидкі команди"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Пошук швидких команд"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Швидк. команд не знайдено"</string>
@@ -681,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Метод введення"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Відкр. додатки"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Поточн. додаток"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Відкрити панель сповіщень"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Зробити знімок усього екрана"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Відкрити список системних ярликів і ярликів додатків"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Назад: повернутися до попереднього стану (кнопка \"Назад\")"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Перейти на головний екран"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Огляд відкритих додатків"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Перемикатися між останніми додатками (уперед)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Перемикатися між останніми додатками (назад)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Відкрити список усіх додатків і запитів (Пошук/Панель запуску)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Сховати або знову показати панель завдань"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Відкрити налаштування системи"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Відкрити Google Асистента"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Переглянути сповіщення"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Зробити знімок екрана"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Показати комбінації клавіш"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Перейти на головний екран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Переглянути нещодавні додатки"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Перемикатися між нещодавніми додатками вперед"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Перемикатися між нещодавніми додатками назад"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Відкрити список додатків"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Показати панель завдань"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Відкрити налаштування"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Відкрити додаток Асистент"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Заблокувати екран"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Відкривати додаток \"Нотатки\" для швидких приміток"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Відкрити нотатки"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Багатозадачність системи"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Розділити екран із поточним додатком праворуч"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Розділити екран із поточним додатком ліворуч"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Перемкнути з розділеного екрана на весь екран"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Під час розділення екрана: замінити додаток іншим"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Розділити екран із поточним додатком праворуч"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Розділити екран із поточним додатком ліворуч"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Перейти з розділення екрана на весь екран"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Під час розділення екрана: замінити додаток іншим"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Метод введення"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Змінити мову введення (наступна мова)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Змінити мову введення (попередня мова)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Вибрати наступну мову"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Вибрати попередню мову"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Відкрити смайли"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Відкрити голосовий ввід"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Додатки"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Помічник"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Веб-переглядач (за умовчанням – Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Асистент"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Веб-переглядач"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контакти"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Електронна пошта (за умовчанням – Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Електронна пошта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 137c8ab7424b..d9bb0aeb0abb 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"بٹن <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"پیچھے"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"اوپر"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"نیچے"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"بائیں"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"دائیں"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"سینٹر"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"اطلاعات"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"کی بورڈ شارٹ کٹس"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"کی بورڈ لے آؤٹ سوئچ کریں"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ٹیکسٹ صاف کریں"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"شارٹ کٹس"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"شارٹ کٹس تلاش کریں"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"کوئی شارٹ کٹ نہیں ملا"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ان پٹ"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ایپس کھولیں"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"موجودہ ایپ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"اطلاعاتی شیڈ تک رسائی حاصل کریں"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"پوری اسکرین شاٹ لیں"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"سسٹم / ایپس شارٹ کٹس کی فہرست تک رسائی حاصل کریں"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"پیچھے: گزشتہ حالت پر واپس جائیں (پیچھے جانے کا بٹن)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ہوم اسکرین تک رسائی حاصل کریں"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"کھلی ایپس کا مجموعی جائزہ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"حالیہ ایپس میں یکے بعد دیگرے جائیں (آگے جائیں)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"حالیہ ایپس میں یکے بعد دیگرے جائیں (پیچھے جائیں)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"تمام ایپس اور تلاش کی فہرست تک رسائی حاصل کریں (یعنی تلاش/لانچر)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ٹاسک بار کو چھپائیں اور (دوبارہ) دکھائیں"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"سسٹم کی ترتیبات تک رسائی"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"‏Google اسسٹنٹ تک رسائی حاصل کریں"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"اطلاعات دیکھیں"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"اسکرین شاٹ لیں"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"شارٹ کٹس دکھائيں"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"واپس جائیں"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ہوم اسکرین پر جائیں"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"حالیہ ایپس دیکھیں"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"حالیہ ایپس کے ذریعے آگے کی طرف سائیکل کریں"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"حالیہ ایپس کے ذریعے پیچھے کی طرف سائیکل کریں"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ایپس کی فہرست کھولیں"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ٹاسک بار دکھائیں"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ترتیبات کھولیں"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"اسسٹنٹ کھولیں"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"مقفل اسکرین"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"فوری میمو کے ليے نوٹس ایپ حاصل کریں"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"نوٹس کھولیں"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"سسٹم ملٹی ٹاسکنگ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"موجودہ ایپ کے ساتھ دائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"موجودہ ایپ کے ساتھ بائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"اسپلٹ اسکرین سے پوری سکرین پر سوئچ کریں"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"اسپلٹ اسکرین کے دوران: ایک ایپ کو دوسرے سے تبدیل کریں"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"موجودہ ایپ کے ساتھ دائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"موجودہ ایپ کے ساتھ بائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"اسپلٹ اسکرین سے پوری سکرین پر سوئچ کریں"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"اسپلٹ اسکرین کے دوران: ایک ایپ کو دوسرے سے تبدیل کریں"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ان پٹ"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ان پٹ زبان سوئچ کریں (اگلی زبان)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ان پٹ زبان سوئچ کریں (گزشتہ زبان)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"اگلی زبان پر سوئچ کریں"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"پچھلی زبان پر سوئچ کریں"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ایموجی تک رسائی"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"صوتی ٹائپنگ تک رسائی"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ایپلیکیشنز"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"اسسٹ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"‏براؤزر (بطور ڈیفالٹ Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"اسسٹنٹ"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"براؤزر"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"رابطے"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"‏ای میل (بطور ڈیفالٹ Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ای میل"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"موسیقی"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"کیلنڈر"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 601d773bc0ce..5696c61fba35 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> tugmasi"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Bosh ekran"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Orqaga"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Tepaga qaragan ko‘rsatkichli chiziq"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Pastga qaragan ko‘rsatkichli chiziq"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Chapga qaragan ko‘rsatkichli chiziq"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"O‘ngga qaragan ko‘rsatkichli chiziq"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Markaziy ko‘rsatkichli chiziq"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Probel"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Bildirishnomalar"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tezkor tugmalar"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klaviatura terilmasini almashtirish"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Matnni tozalash"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Tezkor tugmalar"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Tezkor tugmalar qidiruvi"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Tezkor tugmalar topilmadi"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Kiritish"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ochiq ilovalar"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Joriy ilova"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Bildirishnoma soyasiga ruxsat"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Butun skrinshot olish"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Tizim va ilovalar tezkor tugmalari roʻyxatiga ruxsat"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Orqaga: avvalgi holatga qaytish (orqaga tugmasi)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Bosh ekranga ruxsat"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Ochiq ilovalar bilan tanishish"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Oxirgi ilovalarni varaqlash (faol rejimda)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Oxirgi ilovalarni varaqlash (fonda)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Barcha ilovalar va qidiruv roʻyxatiga ruxsat (Qidiruv/Launcher kabi)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Vazifalar panelini ochish va yopish"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Tizim sozlamalariga ruxsat"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistentga ruxsat"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Bildirishnomalarni ochish"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Skrinshot olish"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Yorliqlarni ochish"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Orqaga"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Bosh ekranni ochish"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Oxirgi ilovalarni ochish"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Oxirgi ilovalarni oldinga varaqlash"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Oxirgi ilovalarni orqaga varaqlash"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ilovalar roʻyxatini ochish"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Vazifalar panelini chiqarish"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Sozlamalarni ochish"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistentni ochish"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Ekran qulfi"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Tezkor eslatma uchun Qaydlar ilovasini ochish"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Qaydlarni ochish"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Tizimdagi multi-vazifalik"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Oʻng tomondagi ajratilgan ekran rejimiga kirish"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Chap tomondagi ajratilgan ekran rejimiga kirish"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Ajratilgan ekran rejimidan butun ekranga qaytish"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Ajratilgan rejimda ilovalarni oʻzaro almashtirish"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Oʻng tomondagi ajratilgan ekran rejimiga kirish"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Chap tomondagi ajratilgan ekran rejimiga kirish"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Ajratilgan ekran rejimidan butun ekranga almashtirish"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ajratilgan rejimda ilovalarni oʻzaro almashtirish"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Kiritish"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Kiritish tili tugmasi (keyingi til)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Kiritish tili tugmasi (avvalgi til)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Keyingi tilga almashtirish"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Avvalgi tilga almashtirish"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Emojilarga ruxsat"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Ovoz bilan yozishga ruxsat"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Ilovalar"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Yordamchi"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Brauzer (birlamchisi Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Brauzer"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktlar"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (birlamchisi Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiqa"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Taqvim"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index b67c789342d9..c281d906b749 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Nút <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Quay lại"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Lên"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Xuống"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Trái"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Phải"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Giữa"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Dấu cách"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Thông báo"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Phím tắt"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Chuyển đổi bố cục bàn phím"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Xoá văn bản"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Lối tắt"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Lối tắt tìm kiếm"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Không tìm thấy lối tắt"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Đầu vào"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ứng dụng đang mở"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Ứng dụng hiện tại"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Truy cập ngăn thông báo"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Chụp toàn màn hình"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Danh sách truy cập lối tắt ứng dụng/hệ thống"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Quay lại: quay lại trạng thái trước đó (nút quay lại)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Truy cập màn hình khoá"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Tổng quan về những ứng dụng đang mở"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Xoay vòng qua các ứng dụng gần đây (xuôi)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Xoay vòng qua các ứng dụng gần đây (ngược)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"D.sách truy cập mọi ứng dụng/n.dung tìm kiếm (VD: Tìm kiếm/Trình chạy)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ẩn và hiện (lại) thanh tác vụ"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Truy cập chế độ cài đặt hệ thống"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Truy cập Trợ lý Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Xem thông báo"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Chụp ảnh màn hình"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Hiện phím tắt"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Quay lại"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Chuyển đến màn hình chính"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Xem các ứng dụng gần đây"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Di chuyển tiến trong danh sách các ứng dụng gần đây"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Di chuyển lùi trong danh sách các ứng dụng gần đây"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Mở danh sách ứng dụng"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Hiện thanh tác vụ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Mở phần cài đặt"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Mở Trợ lý"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Màn hình khoá"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Mở ứng dụng Ghi chú để ghi chú nhanh"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Mở ghi chú"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Xử lý đa nhiệm trong hệ thống"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Vào chế độ Chia đôi màn hình, ứng dụng hiện tại sang màn hình bên phải"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Vào chế độ Chia đôi màn hình, ứng dụng hiện tại sang màn hình bên trái"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Chuyển từ chế độ Chia đôi màn hình sang chế độ toàn màn hình"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Trong chế độ Chia đôi màn hình: thay ứng dụng này bằng ứng dụng khác"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Vào chế độ chia đôi màn hình, ứng dụng hiện tại ở màn hình bên phải"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Vào chế độ chia đôi màn hình, ứng dụng hiện tại ở màn hình bên trái"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Chuyển từ chế độ chia đôi màn hình sang chế độ toàn màn hình"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Trong chế độ chia đôi màn hình: thay ứng dụng này bằng ứng dụng khác"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Đầu vào"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Chuyển ngôn ngữ nhập (ngôn ngữ tiếp theo)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Chuyển ngôn ngữ nhập (ngôn ngữ trước đó)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Chuyển sang ngôn ngữ tiếp theo"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Chuyển sang ngôn ngữ trước"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Truy cập biểu tượng cảm xúc"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Truy cập tính năng nhập liệu bằng giọng nói"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Ứng dụng"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Trợ lý"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Trình duyệt (mặc định là Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Trợ lý"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Trình duyệt"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Danh bạ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (mặc định là Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Âm nhạc"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Lịch"</string>
@@ -826,7 +843,7 @@
<string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi đang tắt"</string>
- <string name="bt_is_off" msgid="7436344904889461591">"Bluetooth tắt"</string>
+ <string name="bt_is_off" msgid="7436344904889461591">"Bluetooth đang tắt"</string>
<string name="dnd_is_off" msgid="3185706903793094463">"Không làm phiền tắt"</string>
<string name="dnd_is_on" msgid="7009368176361546279">"Chế độ Không làm phiền đang bật"</string>
<string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Không làm phiền đã được một quy tắc tự động (<xliff:g id="ID_1">%s</xliff:g>) bật."</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 576cbc745e03..7cde292938e8 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g>按钮"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"返回"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"向上"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"向下"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"向左"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"向右"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"中心"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"空格"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"键盘快捷键"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"切换键盘布局"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"清除文字"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"快捷键"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"搜索快捷键"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"未找到任何快捷键"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"输入"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"已开应用"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"当前应用"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"访问通知栏"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"截取全屏"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"访问系统/应用快捷方式的列表"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"返回:返回到上一个状态(返回按钮)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"访问主屏幕"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"已开应用概览"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"循环浏览近期使用的应用(向前)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"循环浏览近期使用的应用(向后)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"访问所有应用的列表并搜索所需应用(即搜索/启动器)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"隐藏和重新显示任务栏"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"访问系统设置"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"访问 Google 助理"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"查看通知"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"截取屏幕截图"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"显示快捷键"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"返回"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"前往主屏幕"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"查看最近运行过的应用"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"向前循环浏览近期使用的应用"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"向后循环浏览近期使用的应用"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"打开应用列表"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"显示任务栏"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"打开设置"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"打开 Google 助理"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"锁定屏幕"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"调出记事应用快速做记录"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"打开笔记"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"系统多任务处理"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"进入分屏模式,当前应用显示于右侧"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"进入分屏模式,当前应用显示于左侧"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"从分屏模式切换为全屏"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"在分屏期间:将一个应用替换为另一个应用"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"进入分屏模式,当前应用显示于右侧"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"进入分屏模式,当前应用显示于左侧"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"从分屏模式切换为全屏"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"在分屏期间:将一个应用替换为另一个应用"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"输入"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"切换输入语言(下一种语言)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"切换输入语言(上一种语言)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"切换到下一种语言"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"切换到上一种语言"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"访问表情符号"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"访问语音输入"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"应用"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"助理"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"浏览器(默认为 Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google 助理"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"浏览器"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"通讯录"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"电子邮件(默认为 Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"电子邮件"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"短信"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音乐"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"日历"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index bcf7478d191c..a997d060ee38 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> 鍵"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"返回"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"向上"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"向下"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"向左"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"向右"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"箭咀中央"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"空格"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"鍵盤快速鍵"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"切換鍵盤配置"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"清除文字"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"快速鍵"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"搜尋快速鍵"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"找不到快速鍵"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"輸入"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"已開應用程式"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"目前的應用程式"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"存取通知欄"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"擷取全螢幕截圖"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"存取系統/應用程式捷徑清單"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"返回:回到先前的狀態 (返回按鈕)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"存取主畫面"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"「已開啟的應用程式」概覽"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"輪流切換最近使用的應用程式 (前進)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"輪流切換最近使用的應用程式 (返回)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"存取所有應用程式的清單並搜尋 (即搜尋/啟動器)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"隱藏和顯示/重新顯示工作列"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"存取系統設定"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"存取「Google 助理」"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"查看通知"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"擷取螢幕截圖"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"顯示快速鍵"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"返回"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"前往主畫面"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"查看最近使用的應用程式"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"輪流切換最近使用的應用程式 (向前)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"輪流切換最近使用的應用程式 (向後)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"開啟應用程式清單"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"顯示工作列"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"開啟設定"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"開啟「Google 助理」"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"上鎖畫面"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"開啟「筆記」應用程式快速寫筆記"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"開啟筆記"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"系統多工處理"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"進入分割螢幕模式,並將目前的應用程式顯示在右側"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"進入分割螢幕模式,並將目前的應用程式顯示在左側"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"將分割螢幕切換為全螢幕"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"使用分割螢幕期間:更換應用程式"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"進入分割螢幕模式,並將目前的應用程式顯示在右側"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"進入分割螢幕模式,並將目前的應用程式顯示在左側"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"將分割螢幕切換為全螢幕"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"使用分割螢幕期間:更換應用程式"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"輸入"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"切換輸入語言 (下一個語言)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"切換輸入語言 (上一個語言)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"切換至下一個語言"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"切換至上一個語言"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"存取 Emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"存取語音輸入內容"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"應用程式"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"小幫手"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"瀏覽器 (預設為 Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google 助理"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"瀏覽器"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"通訊錄"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"電郵 (預設為 Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"電郵"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"短訊"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音樂"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"日曆"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 76d11ece8eee..9900adf22da5 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -401,11 +401,9 @@
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 慢速充電中 • 將於 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充飽"</string>
<string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 充電中 • 將於 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充飽"</string>
<string name="communal_tutorial_indicator_text" msgid="4503010353591430123">"向左滑動即可啟動通用教學課程"</string>
- <!-- no translation found for button_to_open_widget_editor (5599945944349057600) -->
- <skip />
+ <string name="button_to_open_widget_editor" msgid="5599945944349057600">"開啟小工具編輯器"</string>
<string name="button_to_remove_widget" msgid="1511255853677835341">"移除小工具"</string>
- <!-- no translation found for hub_mode_add_widget_button_text (3956587989338301487) -->
- <skip />
+ <string name="hub_mode_add_widget_button_text" msgid="3956587989338301487">"新增小工具"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切換使用者"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"下拉式選單"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"這個工作階段中的所有應用程式和資料都會遭到刪除。"</string>
@@ -642,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> 按鈕"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home 鍵"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"返回"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"向上鍵"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"向下鍵"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"向左鍵"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"向右鍵"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"中央鍵"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"空格鍵"</string>
@@ -673,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"鍵盤快速鍵"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"切換鍵盤配置"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"清除文字"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"快速鍵"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"搜尋快速鍵"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"找不到快速鍵"</string>
@@ -681,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"輸入"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"已開啟的應用程式"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"目前的應用程式"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"存取通知欄"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"拍攝全螢幕截圖"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"存取系統/應用程式捷徑清單"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"返回:回到先前的狀態 (返回按鈕)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"存取主畫面"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"「已開啟的應用程式」總覽"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"循環切換最近使用的應用程式 (前進)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"循環切換最近使用的應用程式 (返回)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"存取所有應用程式的清單並進行搜尋 (即搜尋/啟動器)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"隱藏和顯示/重新顯示工作列"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"存取系統設定"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"存取 Google 助理"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"查看通知"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"拍攝螢幕截圖"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"顯示快速鍵"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"返回"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"前往主畫面"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"查看最近開啟的應用程式"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"前往最近開啟的應用程式"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"返回最近開啟的應用程式"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"開啟應用程式清單"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"顯示工作列"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"開啟設定"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"開啟 Google 助理"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"螢幕鎖定"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"打開「記事」應用程式快速做筆記"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"開啟記事"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"系統多工處理"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"進入分割畫面模式,並將目前的應用程式顯示於右側"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"進入分割畫面模式,並將目前的應用程式顯示於左側"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"從分割畫面切換到完整畫面"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"使用分割畫面期間:更換應用程式"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"進入分割畫面模式,並將目前的應用程式顯示於右側"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"進入分割畫面模式,並將目前的應用程式顯示於左側"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"從分割畫面切換到完整畫面"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"使用分割畫面期間:更換應用程式"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"輸入"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"切換輸入語言 (下一個語言)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"切換輸入語言 (上一個語言)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"切換到下一個語言"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"切換到上一個語言"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"存取表情符號"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"存取語音輸入內容"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"應用程式"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"小幫手"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"瀏覽器 (預設為 Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google 助理"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"瀏覽器"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"聯絡人"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"電子郵件 (預設為 Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"電子郵件"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"簡訊"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音樂"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"日曆"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 591a63e3f37f..42ddb35aa16a 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Inkinobho <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Ekhaya"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Emuva"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Phezulu"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Phansi"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Kwesobunxele"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Kwesokudla"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Maphakathi"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Isikhala"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Izaziso"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Izinqamulelo Zekhibhodi"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Shintsha isakhiwo sekhibhodi"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Sula umbhalo"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Izinqamuleli"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Sesha izinqamuleli"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Azikho izinqamuleli ezitholakele"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Okokufaka"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Vula ama-app"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"I-app yamanje"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Finyelela umthunzi wesaziso"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Thatha isithombe-skrini esigcwele"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Uhlu lokufinyelela lwezinqamuleli zesistimu / zama-app"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Emuva: buyela esimweni sangaphambilini (inkinobho yokubuyela emuva)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Finyelela isikrini sasekhaya"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Amazwibela ama-app avuliwe"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Zungeza ama-app akamuva (phambili)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Zungeza ama-app akamuva (emuva)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Uhlu lokufinyelela lawo wonke ama-app nokusesha (isb, Sesha/Isiqalisa)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Fihla futhi ubonise(kabusha) ibha yomsebenzi"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Finyelela amasethingi esistimu"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Finyelela ku-Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Buka izaziso"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Thatha isithombe-skrini"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Bonisa izinqamuleli"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Buyela emuva"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Iya kusikrini sasekhaya"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Buka ama-app akamuva"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Zungeza ubheke phambili ngama-app akamuva"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Zungeza ubuyele emuva ngama-app akamuva"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Vula uhlu lwama-app"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Bonisa i-taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Vula amasethingi"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Vula umsizi"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Khiya isikrini"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Donsela phezulu i-app yamanothi ukuze uthole imemo esheshayo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Vula amanothi"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Ukwenza imisebenzi eminingi yesistimu"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Faka Ukuhlukanisa isikrini nge-app yamanje kuya ku-RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Faka Ukuhlukanisa isikrini nge-app yamanje kuya ku-LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Shintsha usuka Ekuhlukaniseni isikrini uye kusikrini esigcwele"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Ngesikhathi sokuhlukaniswa kwesikrini: shintsha i-app ngenye"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Faka ukuhlukanisa isikrini nge-app yamanje kuya ku-RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Faka ukuhlukanisa isikrini nge-app yamanje kuya ku-LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Shintsha usuka ekuhlukaniseni isikrini uye kusikrini esigcwele"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ngesikhathi sokuhlukaniswa kwesikrini: shintsha i-app ngenye"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Okokufaka"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Shintsha ulimi lokokufaka (ulimi olulandelayo)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Shintsha ulimi lokokufaka (ulimi lwangaphambilini)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Shintshela olimini olulandelayo"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Shintshela olimini lwangaphambili"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Finyelela i-emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Finyelela ukuthayipha ngezwi"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Izinhlelo zokusebenza"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Siza"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Ibhrawuza (i-Chrome yokuzenzakalelayo)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Umsizi"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Isiphequluli"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Oxhumana nabo"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"I-imeyili (i-Gmail yokuzenzakalelayo)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"I-imeyili"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"I-SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Umculo"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Ikhalenda"</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index e124aa0eda37..5f6a39a91b8b 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -119,7 +119,7 @@
<!-- Keyboard shortcuts colors -->
<color name="ksh_application_group_color">#fff44336</color>
- <color name="ksh_key_item_color">?androidprv:attr/materialColorOnSurfaceVariant</color>
+ <color name="ksh_key_item_color">@*android:color/system_on_surface_variant_light</color>
<color name="ksh_key_item_background">?androidprv:attr/materialColorSurfaceContainerHighest</color>
<color name="instant_apps_color">#ff4d5a64</color>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 03960d522653..7db21b2be04d 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -37,6 +37,7 @@
<!-- Used while animating the navbar during a long press. -->
<dimen name="navigation_home_handle_additional_width_for_animation">20dp</dimen>
<dimen name="navigation_home_handle_additional_height_for_animation">4dp</dimen>
+ <dimen name="navigation_home_handle_shrink_width_for_animation">16dp</dimen>
<!-- Size of the nav bar edge panels, should be greater to the
edge sensitivity + the drag threshold -->
diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml
index 090346364d6c..763930db1d55 100644
--- a/packages/SystemUI/res/values/flags.xml
+++ b/packages/SystemUI/res/values/flags.xml
@@ -38,6 +38,4 @@
protected. -->
<bool name="flag_battery_shield_icon">false</bool>
- <!-- Whether we want to stop pulsing while running the face scanning animation -->
- <bool name="flag_stop_pulsing_face_scanning_animation">true</bool>
</resources>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
index 26e785d9a704..46329148a659 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
@@ -149,10 +149,11 @@ interface ISystemUiProxy {
*
* @param isTouchDown {@code true} if the button is starting to be pressed ({@code false} if
* released or canceled)
+ * @param shrink {@code true} if the handle should shrink, {@code false} if it should grow
* @param durationMs how long the animation should take (for the {@code isTouchDown} case, this
* should be the same as the amount of time to trigger a long-press)
*/
- oneway void animateNavBarLongPress(boolean isTouchDown, long durationMs) = 54;
+ oneway void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) = 54;
// Next id = 55
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
index b3094838452a..714fe64f1a8f 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
@@ -26,6 +26,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.view.inputmethod.InputMethodManager;
+import com.android.internal.logging.UiEventLogger;
import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -210,6 +211,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
private final KeyguardViewController mKeyguardViewController;
private final FeatureFlags mFeatureFlags;
private final SelectedUserInteractor mSelectedUserInteractor;
+ private final UiEventLogger mUiEventLogger;
@Inject
public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -222,7 +224,8 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
EmergencyButtonController.Factory emergencyButtonControllerFactory,
DevicePostureController devicePostureController,
KeyguardViewController keyguardViewController,
- FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor) {
+ FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor,
+ UiEventLogger uiEventLogger) {
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mLockPatternUtils = lockPatternUtils;
mLatencyTracker = latencyTracker;
@@ -238,6 +241,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
mKeyguardViewController = keyguardViewController;
mFeatureFlags = featureFlags;
mSelectedUserInteractor = selectedUserInteractor;
+ mUiEventLogger = uiEventLogger;
}
/** Create a new {@link KeyguardInputViewController}. */
@@ -265,7 +269,8 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView>
mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
mLiftToActivateListener, emergencyButtonController, mFalsingCollector,
- mDevicePostureController, mFeatureFlags, mSelectedUserInteractor);
+ mDevicePostureController, mFeatureFlags, mSelectedUserInteractor,
+ mUiEventLogger);
} else if (keyguardInputView instanceof KeyguardSimPinView) {
return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView,
mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
index 9764de1993e5..36fe75f69a45 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
@@ -168,6 +168,7 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView
// Set selected property on so the view can send accessibility events.
mPasswordEntry.setSelected(true);
+ mPasswordEntry.setDefaultFocusHighlightEnabled(false);
mOkButton = findViewById(R.id.key_enter);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
index 947d90f488d1..2aab1f189263 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
@@ -20,6 +20,8 @@ import static com.android.systemui.flags.Flags.LOCKSCREEN_ENABLE_LANDSCAPE;
import android.view.View;
+import com.android.internal.logging.UiEvent;
+import com.android.internal.logging.UiEventLogger;
import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -44,6 +46,7 @@ public class KeyguardPinViewController
private View mOkButton = mView.findViewById(R.id.key_enter);
private long mPinLength;
+ private final UiEventLogger mUiEventLogger;
private boolean mDisabledAutoConfirmation;
@@ -56,7 +59,8 @@ public class KeyguardPinViewController
EmergencyButtonController emergencyButtonController,
FalsingCollector falsingCollector,
DevicePostureController postureController,
- FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor) {
+ FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor,
+ UiEventLogger uiEventLogger) {
super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback,
messageAreaControllerFactory, latencyTracker, liftToActivateListener,
emergencyButtonController, falsingCollector, featureFlags, selectedUserInteractor);
@@ -67,6 +71,7 @@ public class KeyguardPinViewController
view.setIsLockScreenLandscapeEnabled(mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE));
mBackspaceKey = view.findViewById(R.id.delete_button);
mPinLength = mLockPatternUtils.getPinLength(selectedUserInteractor.getSelectedUserId());
+ mUiEventLogger = uiEventLogger;
}
@Override
@@ -95,6 +100,7 @@ public class KeyguardPinViewController
updateAutoConfirmationState();
if (mPasswordEntry.getText().length() == mPinLength
&& mOkButton.getVisibility() == View.INVISIBLE) {
+ mUiEventLogger.log(PinBouncerUiEvent.ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE);
verifyPasswordAndUnlock();
}
}
@@ -184,4 +190,21 @@ public class KeyguardPinViewController
mSelectedUserInteractor.getSelectedUserId())
&& mPinLength != LockPatternUtils.PIN_LENGTH_UNAVAILABLE;
}
+
+ /** UI Events for the auto confirmation feature in*/
+ enum PinBouncerUiEvent implements UiEventLogger.UiEventEnum {
+ @UiEvent(doc = "Attempting to unlock the device with the auto confirm feature.")
+ ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE(1547);
+
+ private final int mId;
+
+ PinBouncerUiEvent(int id) {
+ mId = id;
+ }
+
+ @Override
+ public int getId() {
+ return mId;
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java b/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java
index 9716d98cf5e0..ee35bb9dff84 100644
--- a/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java
+++ b/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java
@@ -20,7 +20,6 @@ import android.content.Context;
import android.content.res.Resources;
import android.view.LayoutInflater;
-import com.android.systemui.res.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Application;
import com.android.systemui.dagger.qualifiers.Background;
@@ -30,6 +29,7 @@ import com.android.systemui.flags.Flags;
import com.android.systemui.log.LogBuffer;
import com.android.systemui.log.dagger.KeyguardClockLog;
import com.android.systemui.plugins.PluginManager;
+import com.android.systemui.res.R;
import com.android.systemui.shared.clocks.ClockRegistry;
import com.android.systemui.shared.clocks.DefaultClockProvider;
@@ -67,7 +67,8 @@ public abstract class ClockRegistryModule {
context,
layoutInflater,
resources,
- featureFlags.isEnabled(Flags.STEP_CLOCK_ANIMATION)),
+ featureFlags.isEnabled(Flags.STEP_CLOCK_ANIMATION),
+ featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)),
context.getString(R.string.lockscreen_clock_id_fallback),
logBuffer,
/* keepAllLoaded = */ false,
diff --git a/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt b/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt
index c1871e09a791..71bac06dc842 100644
--- a/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt
+++ b/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt
@@ -209,11 +209,11 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
return result
}
- open fun enableShowProtection(show: Boolean) {
- if (showProtection == show) {
+ open fun enableShowProtection(isCameraActive: Boolean) {
+ if (showProtection == isCameraActive) {
return
}
- showProtection = show
+ showProtection = isCameraActive
updateProtectionBoundingPath()
// Delay the relayout until the end of the animation when hiding the cutout,
// otherwise we'd clip it.
diff --git a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
index 95e2dba88b90..3abcb139ab5c 100644
--- a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
@@ -28,16 +28,12 @@ import android.graphics.Matrix
import android.graphics.Paint
import android.graphics.Path
import android.graphics.RectF
-import android.hardware.biometrics.BiometricSourceType
import android.view.View
import androidx.core.graphics.ColorUtils
import com.android.app.animation.Interpolators
import com.android.keyguard.KeyguardUpdateMonitor
-import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.settingslib.Utils
import com.android.systemui.biometrics.AuthController
-import com.android.systemui.flags.FeatureFlags
-import com.android.systemui.flags.Flags
import com.android.systemui.log.ScreenDecorationsLogger
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.util.asIndenting
@@ -56,7 +52,6 @@ class FaceScanningOverlay(
val mainExecutor: Executor,
val logger: ScreenDecorationsLogger,
val authController: AuthController,
- val featureFlags: FeatureFlags,
) : ScreenDecorations.DisplayCutoutView(context, pos) {
private var showScanningAnim = false
private val rimPaint = Paint()
@@ -69,26 +64,11 @@ class FaceScanningOverlay(
com.android.internal.R.attr.materialColorPrimaryFixed)
private var cameraProtectionAnimator: ValueAnimator? = null
var hideOverlayRunnable: Runnable? = null
- var faceAuthSucceeded = false
init {
visibility = View.INVISIBLE // only show this view when face scanning is happening
}
- override fun onAttachedToWindow() {
- super.onAttachedToWindow()
- mainExecutor.execute {
- keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback)
- }
- }
-
- override fun onDetachedFromWindow() {
- super.onDetachedFromWindow()
- mainExecutor.execute {
- keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback)
- }
- }
-
override fun setColor(color: Int) {
cameraProtectionColor = color
invalidate()
@@ -106,18 +86,22 @@ class FaceScanningOverlay(
}
}
- override fun enableShowProtection(show: Boolean) {
- val animationRequired =
+ override fun enableShowProtection(isCameraActive: Boolean) {
+ val scanningAnimationRequiredWhenCameraActive =
keyguardUpdateMonitor.isFaceDetectionRunning || authController.isShowing
- val showScanningAnimNow = animationRequired && show
- if (showScanningAnimNow == showScanningAnim) {
+ val faceAuthSucceeded = keyguardUpdateMonitor.isFaceAuthenticated
+ val showScanningAnimationNow = scanningAnimationRequiredWhenCameraActive && isCameraActive
+ if (showScanningAnimationNow == showScanningAnim) {
return
}
- logger.cameraProtectionShownOrHidden(keyguardUpdateMonitor.isFaceDetectionRunning,
+ logger.cameraProtectionShownOrHidden(
+ showScanningAnimationNow,
+ keyguardUpdateMonitor.isFaceDetectionRunning,
authController.isShowing,
- show,
+ faceAuthSucceeded,
+ isCameraActive,
showScanningAnim)
- showScanningAnim = showScanningAnimNow
+ showScanningAnim = showScanningAnimationNow
updateProtectionBoundingPath()
// Delay the relayout until the end of the animation when hiding,
// otherwise we'd clip it.
@@ -128,7 +112,7 @@ class FaceScanningOverlay(
cameraProtectionAnimator?.cancel()
cameraProtectionAnimator = ValueAnimator.ofFloat(cameraProtectionProgress,
- if (showScanningAnimNow) SHOW_CAMERA_PROTECTION_SCALE
+ if (showScanningAnimationNow) SHOW_CAMERA_PROTECTION_SCALE
else HIDDEN_CAMERA_PROTECTION_SCALE).apply {
startDelay =
if (showScanningAnim) 0
@@ -297,20 +281,10 @@ class FaceScanningOverlay(
}
private fun createFaceScanningRimAnimator(): AnimatorSet {
- val dontPulse = featureFlags.isEnabled(Flags.STOP_PULSING_FACE_SCANNING_ANIMATION)
- if (dontPulse) {
- return AnimatorSet().apply {
- playSequentially(
- cameraProtectionAnimator,
- createRimAppearAnimator(),
- )
- }
- }
return AnimatorSet().apply {
playSequentially(
- cameraProtectionAnimator,
- createRimAppearAnimator(),
- createPulseAnimator()
+ cameraProtectionAnimator,
+ createRimAppearAnimator(),
)
}
}
@@ -348,81 +322,16 @@ class FaceScanningOverlay(
invalidate()
}
- private fun createPulseAnimator(): ValueAnimator {
- return ValueAnimator.ofFloat(
- PULSE_RADIUS_OUT, PULSE_RADIUS_IN).apply {
- duration = HALF_PULSE_DURATION
- interpolator = Interpolators.STANDARD
- repeatCount = 11 // Pulse inwards and outwards, reversing direction, 6 times
- repeatMode = ValueAnimator.REVERSE
- addUpdateListener(this@FaceScanningOverlay::updateRimProgress)
- }
- }
-
- private val keyguardUpdateMonitorCallback = object : KeyguardUpdateMonitorCallback() {
- override fun onBiometricAuthenticated(
- userId: Int,
- biometricSourceType: BiometricSourceType?,
- isStrongBiometric: Boolean
- ) {
- if (biometricSourceType == BiometricSourceType.FACE) {
- post {
- faceAuthSucceeded = true
- logger.biometricEvent("biometricAuthenticated")
- enableShowProtection(true)
- }
- }
- }
-
- override fun onBiometricAcquired(
- biometricSourceType: BiometricSourceType?,
- acquireInfo: Int
- ) {
- if (biometricSourceType == BiometricSourceType.FACE) {
- post {
- faceAuthSucceeded = false // reset
- }
- }
- }
-
- override fun onBiometricAuthFailed(biometricSourceType: BiometricSourceType?) {
- if (biometricSourceType == BiometricSourceType.FACE) {
- post {
- faceAuthSucceeded = false
- logger.biometricEvent("biometricFailed")
- enableShowProtection(false)
- }
- }
- }
-
- override fun onBiometricError(
- msgId: Int,
- errString: String?,
- biometricSourceType: BiometricSourceType?
- ) {
- if (biometricSourceType == BiometricSourceType.FACE) {
- post {
- faceAuthSucceeded = false
- logger.biometricEvent("biometricError")
- enableShowProtection(false)
- }
- }
- }
- }
-
companion object {
private const val HIDDEN_RIM_SCALE = HIDDEN_CAMERA_PROTECTION_SCALE
private const val SHOW_CAMERA_PROTECTION_SCALE = 1f
- private const val PULSE_RADIUS_IN = 1.1f
private const val PULSE_RADIUS_OUT = 1.125f
private const val PULSE_RADIUS_SUCCESS = 1.25f
private const val CAMERA_PROTECTION_APPEAR_DURATION = 250L
private const val PULSE_APPEAR_DURATION = 250L // without start delay
- private const val HALF_PULSE_DURATION = 500L
-
private const val PULSE_SUCCESS_DISAPPEAR_DURATION = 400L
private const val CAMERA_PROTECTION_SUCCESS_DISAPPEAR_DURATION = 500L // without start delay
diff --git a/packages/SystemUI/src/com/android/systemui/GuestResetOrExitSessionReceiver.java b/packages/SystemUI/src/com/android/systemui/GuestResetOrExitSessionReceiver.java
index 494efb7d3f87..45cc71ecebb9 100644
--- a/packages/SystemUI/src/com/android/systemui/GuestResetOrExitSessionReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/GuestResetOrExitSessionReceiver.java
@@ -36,7 +36,6 @@ import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.UserSwitcherController;
-import dagger.Lazy;
import dagger.assisted.Assisted;
import dagger.assisted.AssistedFactory;
import dagger.assisted.AssistedInject;
@@ -141,23 +140,23 @@ public final class GuestResetOrExitSessionReceiver extends BroadcastReceiver {
* reset and restart of guest user.
*/
public static final class ResetSessionDialogFactory {
- private final Lazy<SystemUIDialog> mDialogLazy;
+ private final SystemUIDialog.Factory mDialogFactory;
private final Resources mResources;
private final ResetSessionDialogClickListener.Factory mClickListenerFactory;
@Inject
public ResetSessionDialogFactory(
- Lazy<SystemUIDialog> dialogLazy,
+ SystemUIDialog.Factory dialogFactory,
@Main Resources resources,
ResetSessionDialogClickListener.Factory clickListenerFactory) {
- mDialogLazy = dialogLazy;
+ mDialogFactory = dialogFactory;
mResources = resources;
mClickListenerFactory = clickListenerFactory;
}
/** Create a guest reset dialog instance */
public AlertDialog create(int userId) {
- SystemUIDialog dialog = mDialogLazy.get();
+ SystemUIDialog dialog = mDialogFactory.create();
ResetSessionDialogClickListener listener = mClickListenerFactory.create(
userId, dialog);
dialog.setTitle(com.android.settingslib.R.string.guest_reset_and_restart_dialog_title);
@@ -216,22 +215,22 @@ public final class GuestResetOrExitSessionReceiver extends BroadcastReceiver {
* exit of guest user.
*/
public static final class ExitSessionDialogFactory {
- private final Lazy<SystemUIDialog> mDialogLazy;
+ private final SystemUIDialog.Factory mDialogFactory;
private final ExitSessionDialogClickListener.Factory mClickListenerFactory;
private final Resources mResources;
@Inject
public ExitSessionDialogFactory(
- Lazy<SystemUIDialog> dialogLazy,
+ SystemUIDialog.Factory dialogFactory,
ExitSessionDialogClickListener.Factory clickListenerFactory,
@Main Resources resources) {
- mDialogLazy = dialogLazy;
+ mDialogFactory = dialogFactory;
mClickListenerFactory = clickListenerFactory;
mResources = resources;
}
public AlertDialog create(boolean isEphemeral, int userId) {
- SystemUIDialog dialog = mDialogLazy.get();
+ SystemUIDialog dialog = mDialogFactory.create();
ExitSessionDialogClickListener clickListener = mClickListenerFactory.create(
isEphemeral, userId, dialog);
if (isEphemeral) {
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java
index b704f3c89330..1edb551eb944 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java
@@ -71,7 +71,7 @@ public class Magnification implements CoreStartable, CommandQueue.Callbacks {
private final DisplayTracker mDisplayTracker;
private final AccessibilityLogger mA11yLogger;
- private WindowMagnificationConnectionImpl mWindowMagnificationConnectionImpl;
+ private MagnificationConnectionImpl mMagnificationConnectionImpl;
private SysUiState mSysUiState;
@VisibleForTesting
@@ -220,7 +220,7 @@ public class Magnification implements CoreStartable, CommandQueue.Callbacks {
}
@MainThread
- void setScale(int displayId, float scale) {
+ void setScaleForWindowMagnification(int displayId, float scale) {
final WindowMagnificationController windowMagnificationController =
mMagnificationControllerSupplier.get(displayId);
if (windowMagnificationController != null) {
@@ -321,37 +321,37 @@ public class Magnification implements CoreStartable, CommandQueue.Callbacks {
final WindowMagnifierCallback mWindowMagnifierCallback = new WindowMagnifierCallback() {
@Override
public void onWindowMagnifierBoundsChanged(int displayId, Rect frame) {
- if (mWindowMagnificationConnectionImpl != null) {
- mWindowMagnificationConnectionImpl.onWindowMagnifierBoundsChanged(displayId, frame);
+ if (mMagnificationConnectionImpl != null) {
+ mMagnificationConnectionImpl.onWindowMagnifierBoundsChanged(displayId, frame);
}
}
@Override
public void onSourceBoundsChanged(int displayId, Rect sourceBounds) {
- if (mWindowMagnificationConnectionImpl != null) {
- mWindowMagnificationConnectionImpl.onSourceBoundsChanged(displayId, sourceBounds);
+ if (mMagnificationConnectionImpl != null) {
+ mMagnificationConnectionImpl.onSourceBoundsChanged(displayId, sourceBounds);
}
}
@Override
public void onPerformScaleAction(int displayId, float scale, boolean updatePersistence) {
- if (mWindowMagnificationConnectionImpl != null) {
- mWindowMagnificationConnectionImpl.onPerformScaleAction(
+ if (mMagnificationConnectionImpl != null) {
+ mMagnificationConnectionImpl.onPerformScaleAction(
displayId, scale, updatePersistence);
}
}
@Override
public void onAccessibilityActionPerformed(int displayId) {
- if (mWindowMagnificationConnectionImpl != null) {
- mWindowMagnificationConnectionImpl.onAccessibilityActionPerformed(displayId);
+ if (mMagnificationConnectionImpl != null) {
+ mMagnificationConnectionImpl.onAccessibilityActionPerformed(displayId);
}
}
@Override
public void onMove(int displayId) {
- if (mWindowMagnificationConnectionImpl != null) {
- mWindowMagnificationConnectionImpl.onMove(displayId);
+ if (mMagnificationConnectionImpl != null) {
+ mMagnificationConnectionImpl.onMove(displayId);
}
}
@@ -394,8 +394,8 @@ public class Magnification implements CoreStartable, CommandQueue.Callbacks {
@Override
public void onMagnifierScale(int displayId, float scale,
boolean updatePersistence) {
- if (mWindowMagnificationConnectionImpl != null) {
- mWindowMagnificationConnectionImpl.onPerformScaleAction(
+ if (mMagnificationConnectionImpl != null) {
+ mMagnificationConnectionImpl.onPerformScaleAction(
displayId, scale, updatePersistence);
}
mA11yLogger.logThrottled(
@@ -454,8 +454,8 @@ public class Magnification implements CoreStartable, CommandQueue.Callbacks {
if (magnificationSettingsController != null) {
magnificationSettingsController.closeMagnificationSettings();
}
- if (mWindowMagnificationConnectionImpl != null) {
- mWindowMagnificationConnectionImpl.onChangeMagnificationMode(displayId, newMode);
+ if (mMagnificationConnectionImpl != null) {
+ mMagnificationConnectionImpl.onChangeMagnificationMode(displayId, newMode);
}
}
}
@@ -500,12 +500,12 @@ public class Magnification implements CoreStartable, CommandQueue.Callbacks {
}
private void setWindowMagnificationConnection() {
- if (mWindowMagnificationConnectionImpl == null) {
- mWindowMagnificationConnectionImpl = new WindowMagnificationConnectionImpl(this,
+ if (mMagnificationConnectionImpl == null) {
+ mMagnificationConnectionImpl = new MagnificationConnectionImpl(this,
mHandler);
}
mAccessibilityManager.setWindowMagnificationConnection(
- mWindowMagnificationConnectionImpl);
+ mMagnificationConnectionImpl);
}
private void clearWindowMagnificationConnection() {
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationConnectionImpl.java
index 5666851f560f..5f0d496dd5d1 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationConnectionImpl.java
@@ -32,7 +32,7 @@ import com.android.systemui.dagger.qualifiers.Main;
*
* @see IWindowMagnificationConnection
*/
-class WindowMagnificationConnectionImpl extends IWindowMagnificationConnection.Stub {
+class MagnificationConnectionImpl extends IWindowMagnificationConnection.Stub {
private static final String TAG = "WindowMagnificationConnectionImpl";
@@ -40,7 +40,7 @@ class WindowMagnificationConnectionImpl extends IWindowMagnificationConnection.S
private final Magnification mMagnification;
private final Handler mHandler;
- WindowMagnificationConnectionImpl(@NonNull Magnification magnification,
+ MagnificationConnectionImpl(@NonNull Magnification magnification,
@Main Handler mainHandler) {
mMagnification = magnification;
mHandler = mainHandler;
@@ -57,8 +57,8 @@ class WindowMagnificationConnectionImpl extends IWindowMagnificationConnection.S
}
@Override
- public void setScale(int displayId, float scale) {
- mHandler.post(() -> mMagnification.setScale(displayId, scale));
+ public void setScaleForWindowMagnification(int displayId, float scale) {
+ mHandler.post(() -> mMagnification.setScaleForWindowMagnification(displayId, scale));
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
index 7ccf70427327..685ea81fe40d 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
@@ -5,6 +5,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.SearchManager;
import android.app.StatusBarManager;
@@ -146,6 +147,7 @@ public class AssistManager {
private final DisplayTracker mDisplayTracker;
private final SecureSettings mSecureSettings;
private final SelectedUserInteractor mSelectedUserInteractor;
+ private final ActivityManager mActivityManager;
private final DeviceProvisionedController mDeviceProvisionedController;
@@ -186,7 +188,8 @@ public class AssistManager {
UserTracker userTracker,
DisplayTracker displayTracker,
SecureSettings secureSettings,
- SelectedUserInteractor selectedUserInteractor) {
+ SelectedUserInteractor selectedUserInteractor,
+ ActivityManager activityManager) {
mContext = context;
mDeviceProvisionedController = controller;
mCommandQueue = commandQueue;
@@ -199,6 +202,7 @@ public class AssistManager {
mDisplayTracker = displayTracker;
mSecureSettings = secureSettings;
mSelectedUserInteractor = selectedUserInteractor;
+ mActivityManager = activityManager;
registerVoiceInteractionSessionListener();
registerVisualQueryRecognitionStatusListener();
@@ -270,6 +274,9 @@ public class AssistManager {
}
public void startAssist(Bundle args) {
+ if (mActivityManager.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_LOCKED) {
+ return;
+ }
if (shouldOverrideAssist(args)) {
try {
if (mOverviewProxyService.getProxy() == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index 8fe42b536b1e..877afce7fe65 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -86,6 +86,8 @@ import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.concurrency.Execution;
+import dagger.Lazy;
+
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
@@ -133,7 +135,7 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
@NonNull private final Provider<PromptSelectorInteractor> mPromptSelectorInteractor;
@NonNull private final Provider<CredentialViewModel> mCredentialViewModelProvider;
@NonNull private final Provider<PromptViewModel> mPromptViewModelProvider;
- @NonNull private final LogContextInteractor mLogContextInteractor;
+ @NonNull private final Lazy<LogContextInteractor> mLogContextInteractor;
private final Display mDisplay;
private float mScaleFactor = 1f;
@@ -156,7 +158,7 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
@Nullable private UdfpsOverlayParams mUdfpsOverlayParams;
@Nullable private IUdfpsRefreshRateRequestCallback mUdfpsRefreshRateRequestCallback;
@Nullable private SideFpsController mSideFpsController;
- @NonNull private UdfpsLogger mUdfpsLogger;
+ @NonNull private Lazy<UdfpsLogger> mUdfpsLogger;
@VisibleForTesting IBiometricSysuiReceiver mReceiver;
@VisibleForTesting @NonNull final BiometricDisplayListener mOrientationListener;
@Nullable private final List<FaceSensorPropertiesInternal> mFaceProps;
@@ -309,7 +311,7 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
});
mUdfpsController.setAuthControllerUpdateUdfpsLocation(this::updateUdfpsLocation);
mUdfpsController.setUdfpsDisplayMode(new UdfpsDisplayMode(mContext, mExecution,
- this, mUdfpsLogger));
+ this, mUdfpsLogger.get()));
mUdfpsBounds = mUdfpsProps.get(0).getLocation().getRect();
}
@@ -755,8 +757,8 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
@NonNull AuthDialogPanelInteractionDetector panelInteractionDetector,
@NonNull UserManager userManager,
@NonNull LockPatternUtils lockPatternUtils,
- @NonNull UdfpsLogger udfpsLogger,
- @NonNull LogContextInteractor logContextInteractor,
+ @NonNull Lazy<UdfpsLogger> udfpsLogger,
+ @NonNull Lazy<LogContextInteractor> logContextInteractor,
@NonNull Provider<PromptCredentialInteractor> promptCredentialInteractorProvider,
@NonNull Provider<PromptSelectorInteractor> promptSelectorInteractorProvider,
@NonNull Provider<CredentialViewModel> credentialViewModelProvider,
@@ -903,7 +905,7 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
@Override
public void setBiometricContextListener(IBiometricContextListener listener) {
- mLogContextInteractor.addBiometricContextListener(listener);
+ mLogContextInteractor.get().addBiometricContextListener(listener);
}
/**
@@ -932,14 +934,14 @@ public class AuthController implements CoreStartable, CommandQueue.Callbacks,
*/
public void requestMaxRefreshRate(boolean request) throws RemoteException {
if (mUdfpsRefreshRateRequestCallback == null) {
- mUdfpsLogger.log(
+ mUdfpsLogger.get().log(
"PreAuthRefreshRate",
"skip request - refreshRateCallback is null",
LogLevel.DEBUG
);
return;
}
- mUdfpsLogger.requestMaxRefreshRate(request);
+ mUdfpsLogger.get().requestMaxRefreshRate(request);
mUdfpsRefreshRateRequestCallback.onAuthenticationPossible(mContext.getDisplayId(), request);
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt
index 8d1d90588fc3..04c2351c1a3e 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt
@@ -37,17 +37,25 @@ constructor(
@MainThread
fun enable(onShadeInteraction: Runnable) {
- if (shadeExpansionCollectorJob == null) {
- shadeExpansionCollectorJob =
- scope.launch {
- // wait for it to emit true once
- shadeInteractorLazy.get().isUserInteracting.first { it }
- onShadeInteraction.run()
- }
- shadeExpansionCollectorJob?.invokeOnCompletion { shadeExpansionCollectorJob = null }
- } else {
+ if (shadeExpansionCollectorJob != null) {
Log.e(TAG, "Already enabled")
+ return
}
+ //TODO(b/313957306) delete this check
+ if (shadeInteractorLazy.get().isUserInteracting.value) {
+ // Workaround for b/311266890. This flow is in an error state that breaks this.
+ Log.e(TAG, "isUserInteracting already true, skipping enable")
+ return
+ }
+ shadeExpansionCollectorJob =
+ scope.launch {
+ Log.i(TAG, "Enable detector")
+ // wait for it to emit true once
+ shadeInteractorLazy.get().isUserInteracting.first { it }
+ Log.i(TAG, "Detector detected shade interaction")
+ onShadeInteraction.run()
+ }
+ shadeExpansionCollectorJob?.invokeOnCompletion { shadeExpansionCollectorJob = null }
}
@MainThread
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java
index c22a66b210cb..df27cbb070b6 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java
@@ -22,7 +22,6 @@ import android.content.Intent;
import android.hardware.biometrics.BiometricSourceType;
import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.statusbar.phone.SystemUIDialog;
import javax.inject.Inject;
@@ -41,7 +40,8 @@ public class BiometricNotificationBroadcastReceiver extends BroadcastReceiver {
private final Context mContext;
private final BiometricNotificationDialogFactory mNotificationDialogFactory;
@Inject
- BiometricNotificationBroadcastReceiver(Context context,
+ BiometricNotificationBroadcastReceiver(
+ Context context,
BiometricNotificationDialogFactory notificationDialogFactory) {
mContext = context;
mNotificationDialogFactory = notificationDialogFactory;
@@ -53,15 +53,16 @@ public class BiometricNotificationBroadcastReceiver extends BroadcastReceiver {
switch (action) {
case ACTION_SHOW_FACE_REENROLL_DIALOG:
- mNotificationDialogFactory.createReenrollDialog(mContext,
- new SystemUIDialog(mContext),
+ mNotificationDialogFactory.createReenrollDialog(
+ mContext.getUserId(),
+ mContext::startActivity,
BiometricSourceType.FACE)
.show();
break;
case ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG:
mNotificationDialogFactory.createReenrollDialog(
- mContext,
- new SystemUIDialog(mContext),
+ mContext.getUserId(),
+ mContext::startActivity,
BiometricSourceType.FINGERPRINT)
.show();
break;
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationDialogFactory.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationDialogFactory.java
index 2962be8e55a2..fd0feef7689b 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationDialogFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationDialogFactory.java
@@ -16,9 +16,11 @@
package com.android.systemui.biometrics;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
import android.app.Dialog;
-import android.content.Context;
import android.content.Intent;
+import android.content.res.Resources;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.face.Face;
import android.hardware.face.FaceManager;
@@ -29,9 +31,11 @@ import android.util.Log;
import com.android.systemui.res.R;
import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import javax.inject.Inject;
+import javax.inject.Provider;
/**
* Manages the creation of dialogs to be shown for biometric re enroll notifications.
@@ -39,44 +43,56 @@ import javax.inject.Inject;
@SysUISingleton
public class BiometricNotificationDialogFactory {
private static final String TAG = "BiometricNotificationDialogFactory";
+ private final Resources mResources;
+ private final SystemUIDialog.Factory mSystemUIDialogFactory;
+ @Nullable private final FingerprintManager mFingerprintManager;
+ @Nullable private final FaceManager mFaceManager;
@Inject
- BiometricNotificationDialogFactory() {}
+ BiometricNotificationDialogFactory(
+ @Main Resources resources,
+ SystemUIDialog.Factory systemUIDialogFactory,
+ @Nullable FingerprintManager fingerprintManager,
+ @Nullable FaceManager faceManager) {
+ mResources = resources;
+ mSystemUIDialogFactory = systemUIDialogFactory;
+ mFingerprintManager = fingerprintManager;
+ mFaceManager = faceManager;
+ }
- Dialog createReenrollDialog(final Context context, final SystemUIDialog sysuiDialog,
- BiometricSourceType biometricSourceType) {
+ Dialog createReenrollDialog(
+ int userId, ActivityStarter activityStarter, BiometricSourceType biometricSourceType) {
+ SystemUIDialog sysuiDialog = mSystemUIDialogFactory.create();
if (biometricSourceType == BiometricSourceType.FACE) {
- sysuiDialog.setTitle(context.getString(R.string.face_re_enroll_dialog_title));
- sysuiDialog.setMessage(context.getString(R.string.face_re_enroll_dialog_content));
+ sysuiDialog.setTitle(mResources.getString(R.string.face_re_enroll_dialog_title));
+ sysuiDialog.setMessage(mResources.getString(R.string.face_re_enroll_dialog_content));
} else if (biometricSourceType == BiometricSourceType.FINGERPRINT) {
- FingerprintManager fingerprintManager = context.getSystemService(
- FingerprintManager.class);
- sysuiDialog.setTitle(context.getString(R.string.fingerprint_re_enroll_dialog_title));
- if (fingerprintManager.getEnrolledFingerprints().size() == 1) {
- sysuiDialog.setMessage(context.getString(
+ sysuiDialog.setTitle(mResources.getString(R.string.fingerprint_re_enroll_dialog_title));
+ if (mFingerprintManager.getEnrolledFingerprints().size() == 1) {
+ sysuiDialog.setMessage(mResources.getString(
R.string.fingerprint_re_enroll_dialog_content_singular));
} else {
- sysuiDialog.setMessage(context.getString(
+ sysuiDialog.setMessage(mResources.getString(
R.string.fingerprint_re_enroll_dialog_content));
}
}
sysuiDialog.setPositiveButton(R.string.biometric_re_enroll_dialog_confirm,
- (dialog, which) -> onReenrollDialogConfirm(context, biometricSourceType));
+ (dialog, which) -> onReenrollDialogConfirm(
+ userId, biometricSourceType, activityStarter));
sysuiDialog.setNegativeButton(R.string.biometric_re_enroll_dialog_cancel,
(dialog, which) -> {});
return sysuiDialog;
}
- private static Dialog createReenrollFailureDialog(Context context,
- BiometricSourceType biometricType) {
- final SystemUIDialog sysuiDialog = new SystemUIDialog(context);
+ private Dialog createReenrollFailureDialog(BiometricSourceType biometricType) {
+ final SystemUIDialog sysuiDialog = mSystemUIDialogFactory.create();
if (biometricType == BiometricSourceType.FACE) {
- sysuiDialog.setMessage(context.getString(
+ sysuiDialog.setMessage(mResources.getString(
R.string.face_reenroll_failure_dialog_content));
} else if (biometricType == BiometricSourceType.FINGERPRINT) {
- sysuiDialog.setMessage(context.getString(
+ sysuiDialog.setMessage(mResources.getString(
R.string.fingerprint_reenroll_failure_dialog_content));
}
@@ -84,41 +100,41 @@ public class BiometricNotificationDialogFactory {
return sysuiDialog;
}
- private static void onReenrollDialogConfirm(final Context context,
- BiometricSourceType biometricType) {
+ private void onReenrollDialogConfirm(
+ int userId, BiometricSourceType biometricType, ActivityStarter activityStarter) {
if (biometricType == BiometricSourceType.FACE) {
- reenrollFace(context);
+ reenrollFace(userId, activityStarter);
} else if (biometricType == BiometricSourceType.FINGERPRINT) {
- reenrollFingerprint(context);
+ reenrollFingerprint(userId, activityStarter);
}
}
- private static void reenrollFingerprint(Context context) {
- FingerprintManager fingerprintManager = context.getSystemService(FingerprintManager.class);
- if (fingerprintManager == null) {
+ @SuppressLint("MissingPermission")
+ private void reenrollFingerprint(int userId, ActivityStarter activityStarter) {
+ if (mFingerprintManager == null) {
Log.e(TAG, "Not launching enrollment. Fingerprint manager was null!");
- createReenrollFailureDialog(context, BiometricSourceType.FINGERPRINT).show();
+ createReenrollFailureDialog(BiometricSourceType.FINGERPRINT).show();
return;
}
- if (!fingerprintManager.hasEnrolledTemplates(context.getUserId())) {
- createReenrollFailureDialog(context, BiometricSourceType.FINGERPRINT).show();
+ if (!mFingerprintManager.hasEnrolledTemplates(userId)) {
+ createReenrollFailureDialog(BiometricSourceType.FINGERPRINT).show();
return;
}
// Remove all enrolled fingerprint. Launch enrollment if successful.
- fingerprintManager.removeAll(context.getUserId(),
+ mFingerprintManager.removeAll(userId,
new FingerprintManager.RemovalCallback() {
boolean mDidShowFailureDialog;
@Override
- public void onRemovalError(Fingerprint fingerprint, int errMsgId,
- CharSequence errString) {
+ public void onRemovalError(
+ Fingerprint fingerprint, int errMsgId, CharSequence errString) {
Log.e(TAG, "Not launching enrollment."
+ "Failed to remove existing face(s).");
if (!mDidShowFailureDialog) {
mDidShowFailureDialog = true;
- createReenrollFailureDialog(context, BiometricSourceType.FINGERPRINT)
+ createReenrollFailureDialog(BiometricSourceType.FINGERPRINT)
.show();
}
}
@@ -129,27 +145,27 @@ public class BiometricNotificationDialogFactory {
Intent intent = new Intent(Settings.ACTION_FINGERPRINT_ENROLL);
intent.setPackage("com.android.settings");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
+ activityStarter.startActivity(intent);
}
}
});
}
- private static void reenrollFace(Context context) {
- FaceManager faceManager = context.getSystemService(FaceManager.class);
- if (faceManager == null) {
+ @SuppressLint("MissingPermission")
+ private void reenrollFace(int userId, ActivityStarter activityStarter) {
+ if (mFaceManager == null) {
Log.e(TAG, "Not launching enrollment. Face manager was null!");
- createReenrollFailureDialog(context, BiometricSourceType.FACE).show();
+ createReenrollFailureDialog(BiometricSourceType.FACE).show();
return;
}
- if (!faceManager.hasEnrolledTemplates(context.getUserId())) {
- createReenrollFailureDialog(context, BiometricSourceType.FACE).show();
+ if (!mFaceManager.hasEnrolledTemplates(userId)) {
+ createReenrollFailureDialog(BiometricSourceType.FACE).show();
return;
}
// Remove all enrolled faces. Launch enrollment if successful.
- faceManager.removeAll(context.getUserId(),
+ mFaceManager.removeAll(userId,
new FaceManager.RemovalCallback() {
boolean mDidShowFailureDialog;
@@ -159,7 +175,7 @@ public class BiometricNotificationDialogFactory {
+ "Failed to remove existing face(s).");
if (!mDidShowFailureDialog) {
mDidShowFailureDialog = true;
- createReenrollFailureDialog(context, BiometricSourceType.FACE).show();
+ createReenrollFailureDialog(BiometricSourceType.FACE).show();
}
}
@@ -169,9 +185,13 @@ public class BiometricNotificationDialogFactory {
Intent intent = new Intent("android.settings.FACE_ENROLL");
intent.setPackage("com.android.settings");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
+ activityStarter.startActivity(intent);
}
}
});
}
+
+ interface ActivityStarter {
+ void startActivity(Intent intent);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 72d14ba543e2..bb6ef41bdfd3 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -74,6 +74,8 @@ import com.android.systemui.biometrics.udfps.NormalizedTouchData;
import com.android.systemui.biometrics.udfps.SinglePointerTouchProcessor;
import com.android.systemui.biometrics.udfps.TouchProcessor;
import com.android.systemui.biometrics.udfps.TouchProcessorResult;
+import com.android.systemui.biometrics.ui.viewmodel.DefaultUdfpsTouchOverlayViewModel;
+import com.android.systemui.biometrics.ui.viewmodel.DeviceEntryUdfpsTouchOverlayViewModel;
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
import com.android.systemui.dagger.SysUISingleton;
@@ -102,6 +104,8 @@ import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.concurrency.Execution;
import com.android.systemui.util.time.SystemClock;
+import dagger.Lazy;
+
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
@@ -164,6 +168,10 @@ public class UdfpsController implements DozeReceiver, Dumpable {
@NonNull private final PrimaryBouncerInteractor mPrimaryBouncerInteractor;
@Nullable private final TouchProcessor mTouchProcessor;
@NonNull private final SessionTracker mSessionTracker;
+ @NonNull private final Lazy<DeviceEntryUdfpsTouchOverlayViewModel>
+ mDeviceEntryUdfpsTouchOverlayViewModel;
+ @NonNull private final Lazy<DefaultUdfpsTouchOverlayViewModel>
+ mDefaultUdfpsTouchOverlayViewModel;
@NonNull private final AlternateBouncerInteractor mAlternateBouncerInteractor;
@NonNull private final InputManager mInputManager;
@NonNull private final UdfpsKeyguardAccessibilityDelegate mUdfpsKeyguardAccessibilityDelegate;
@@ -284,7 +292,9 @@ public class UdfpsController implements DozeReceiver, Dumpable {
mAlternateBouncerInteractor,
mUdfpsKeyguardAccessibilityDelegate,
mKeyguardTransitionInteractor,
- mSelectedUserInteractor
+ mSelectedUserInteractor,
+ mDeviceEntryUdfpsTouchOverlayViewModel,
+ mDefaultUdfpsTouchOverlayViewModel
)));
}
@@ -501,11 +511,13 @@ public class UdfpsController implements DozeReceiver, Dumpable {
+ mOverlay.getRequestId());
return false;
}
- if ((mLockscreenShadeTransitionController.getQSDragProgress() != 0f
- && !mAlternateBouncerInteractor.isVisibleState())
- || mPrimaryBouncerInteractor.isInTransit()) {
- Log.w(TAG, "ignoring touch due to qsDragProcess or primaryBouncerInteractor");
- return false;
+ if (!DeviceEntryUdfpsRefactor.isEnabled()) {
+ if ((mLockscreenShadeTransitionController.getQSDragProgress() != 0f
+ && !mAlternateBouncerInteractor.isVisibleState())
+ || mPrimaryBouncerInteractor.isInTransit()) {
+ Log.w(TAG, "ignoring touch due to qsDragProcess or primaryBouncerInteractor");
+ return false;
+ }
}
if (event.getAction() == MotionEvent.ACTION_DOWN
|| event.getAction() == MotionEvent.ACTION_HOVER_ENTER) {
@@ -657,7 +669,9 @@ public class UdfpsController implements DozeReceiver, Dumpable {
@NonNull Provider<UdfpsKeyguardViewModels> udfpsKeyguardViewModelsProvider,
@NonNull SelectedUserInteractor selectedUserInteractor,
@NonNull FpsUnlockTracker fpsUnlockTracker,
- @NonNull KeyguardTransitionInteractor keyguardTransitionInteractor) {
+ @NonNull KeyguardTransitionInteractor keyguardTransitionInteractor,
+ Lazy<DeviceEntryUdfpsTouchOverlayViewModel> deviceEntryUdfpsTouchOverlayViewModel,
+ Lazy<DefaultUdfpsTouchOverlayViewModel> defaultUdfpsTouchOverlayViewModel) {
mContext = context;
mExecution = execution;
mVibrator = vibrator;
@@ -706,6 +720,8 @@ public class UdfpsController implements DozeReceiver, Dumpable {
mTouchProcessor = singlePointerTouchProcessor;
mSessionTracker = sessionTracker;
+ mDeviceEntryUdfpsTouchOverlayViewModel = deviceEntryUdfpsTouchOverlayViewModel;
+ mDefaultUdfpsTouchOverlayViewModel = defaultUdfpsTouchOverlayViewModel;
mDumpManager.registerDumpable(TAG, this);
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
index 2d54f7ac8e7d..452cd6a7c4df 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
@@ -46,7 +46,10 @@ import androidx.annotation.VisibleForTesting
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams
+import com.android.systemui.biometrics.ui.binder.UdfpsTouchOverlayBinder
import com.android.systemui.biometrics.ui.view.UdfpsTouchOverlay
+import com.android.systemui.biometrics.ui.viewmodel.DefaultUdfpsTouchOverlayViewModel
+import com.android.systemui.biometrics.ui.viewmodel.DeviceEntryUdfpsTouchOverlayViewModel
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
@@ -62,6 +65,7 @@ import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
+import dagger.Lazy
import kotlinx.coroutines.ExperimentalCoroutinesApi
private const val TAG = "UdfpsControllerOverlay"
@@ -102,6 +106,8 @@ class UdfpsControllerOverlay @JvmOverloads constructor(
private val udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate,
private val transitionInteractor: KeyguardTransitionInteractor,
private val selectedUserInteractor: SelectedUserInteractor,
+ private val deviceEntryUdfpsTouchOverlayViewModel: Lazy<DeviceEntryUdfpsTouchOverlayViewModel>,
+ private val defaultUdfpsTouchOverlayViewModel: Lazy<DefaultUdfpsTouchOverlayViewModel>,
) {
private var overlayViewLegacy: UdfpsView? = null
private set
@@ -184,12 +190,19 @@ class UdfpsControllerOverlay @JvmOverloads constructor(
importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
}
windowManager.addView(this, coreLayoutParams.updateDimensions(null))
+ when (requestReason) {
+ REASON_AUTH_KEYGUARD ->
+ UdfpsTouchOverlayBinder.bind(
+ view = this,
+ viewModel = deviceEntryUdfpsTouchOverlayViewModel.get(),
+ )
+ else ->
+ UdfpsTouchOverlayBinder.bind(
+ view = this,
+ viewModel = defaultUdfpsTouchOverlayViewModel.get(),
+ )
+ }
}
- // TODO (b/305234447): Bind view model to UdfpsTouchOverlay here to control
- // the visibility (sometimes, even if UDFPS is running, the UDFPS UI can be
- // obscured and we don't want to accept touches. ie: for enrollment don't accept
- // touches when the shade is expanded and for keyguard: don't accept touches
- // depending on the keyguard & shade state
} else {
overlayViewLegacy = (inflater.inflate(
R.layout.udfps_view, null, false
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt
index 6954eb66cfa6..a2ac66f6d831 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt
@@ -26,11 +26,13 @@ import com.android.app.animation.Interpolators
import com.android.keyguard.BouncerPanelExpansionCalculator.aboutToShowBouncerProgress
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.animation.ActivityLaunchAnimator
-import com.android.systemui.biometrics.UdfpsKeyguardViewLegacy.ANIMATION_UNLOCKED_SCREEN_OFF
+import com.android.systemui.biometrics.UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.ui.adapter.UdfpsKeyguardViewControllerAdapter
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.plugins.statusbar.StatusBarStateController
@@ -49,7 +51,7 @@ import java.io.PrintWriter
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job
-import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
/** Class that coordinates non-HBM animations during keyguard authentication. */
@@ -191,39 +193,84 @@ open class UdfpsKeyguardViewControllerLegacy(
repeatOnLifecycle(Lifecycle.State.CREATED) {
listenForBouncerExpansion(this)
listenForAlternateBouncerVisibility(this)
+ listenForOccludedToAodTransition(this)
listenForGoneToAodTransition(this)
listenForLockscreenAodTransitions(this)
+ listenForAodToOccludedTransitions(this)
}
}
}
@VisibleForTesting
- suspend fun listenForGoneToAodTransition(scope: CoroutineScope): Job {
+ suspend fun listenForAodToOccludedTransitions(scope: CoroutineScope): Job {
return scope.launch {
- transitionInteractor.goneToAodTransition.collect { transitionStep ->
+ transitionInteractor.transition(KeyguardState.AOD, KeyguardState.OCCLUDED).collect {
+ transitionStep ->
+ view.onDozeAmountChanged(
+ 1f - transitionStep.value,
+ 1f - transitionStep.value,
+ UdfpsKeyguardViewLegacy.ANIMATION_NONE,
+ )
+ }
+ }
+ }
+
+ @VisibleForTesting
+ suspend fun listenForOccludedToAodTransition(scope: CoroutineScope): Job {
+ return scope.launch {
+ transitionInteractor.transition(KeyguardState.OCCLUDED, KeyguardState.AOD).collect {
+ transitionStep ->
view.onDozeAmountChanged(
transitionStep.value,
transitionStep.value,
- ANIMATION_UNLOCKED_SCREEN_OFF,
+ ANIMATE_APPEAR_ON_SCREEN_OFF,
)
}
}
}
@VisibleForTesting
- suspend fun listenForLockscreenAodTransitions(scope: CoroutineScope): Job {
+ suspend fun listenForGoneToAodTransition(scope: CoroutineScope): Job {
return scope.launch {
- transitionInteractor.dozeAmountTransition.collect { transitionStep ->
+ transitionInteractor.goneToAodTransition.collect { transitionStep ->
view.onDozeAmountChanged(
transitionStep.value,
transitionStep.value,
- UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN,
+ ANIMATE_APPEAR_ON_SCREEN_OFF,
)
}
}
}
@VisibleForTesting
+ suspend fun listenForLockscreenAodTransitions(scope: CoroutineScope): Job {
+ return scope.launch {
+ transitionInteractor.dozeAmountTransition.collect { transitionStep ->
+ if (transitionStep.transitionState == TransitionState.CANCELED) {
+ if (
+ transitionInteractor.startedKeyguardTransitionStep.first().to !=
+ KeyguardState.AOD
+ ) {
+ // If the next started transition isn't transitioning back to AOD, force
+ // doze amount to be 0f (as if the transition to the lockscreen completed).
+ view.onDozeAmountChanged(
+ 0f,
+ 0f,
+ UdfpsKeyguardViewLegacy.ANIMATION_NONE,
+ )
+ }
+ } else {
+ view.onDozeAmountChanged(
+ transitionStep.value,
+ transitionStep.value,
+ UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN,
+ )
+ }
+ }
+ }
+ }
+
+ @VisibleForTesting
override suspend fun listenForBouncerExpansion(scope: CoroutineScope): Job {
return scope.launch {
primaryBouncerInteractor.bouncerExpansion.collect { bouncerExpansion: Float ->
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java
index f4ed8cef7bb8..6d4eea852d26 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java
@@ -133,7 +133,7 @@ public class UdfpsKeyguardViewLegacy extends UdfpsAnimationView {
// if we're animating from screen off, we can immediately place the icon in the
// AoD-burn in location, else we need to translate the icon from LS => AoD.
- final float darkAmountForAnimation = mAnimationType == ANIMATION_UNLOCKED_SCREEN_OFF
+ final float darkAmountForAnimation = mAnimationType == ANIMATE_APPEAR_ON_SCREEN_OFF
? 1f : mInterpolatedDarkAmount;
final float burnInOffsetX = MathUtils.lerp(0f,
getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */)
@@ -171,7 +171,7 @@ public class UdfpsKeyguardViewLegacy extends UdfpsAnimationView {
mAnimationType == ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN
&& (mInterpolatedDarkAmount == 0f || mInterpolatedDarkAmount == 1f);
final boolean doneAnimatingUnlockedScreenOff =
- mAnimationType == ANIMATION_UNLOCKED_SCREEN_OFF
+ mAnimationType == ANIMATE_APPEAR_ON_SCREEN_OFF
&& (mInterpolatedDarkAmount == 1f);
if (doneAnimatingBetweenAodAndLS || doneAnimatingUnlockedScreenOff) {
mAnimationType = ANIMATION_NONE;
@@ -243,10 +243,10 @@ public class UdfpsKeyguardViewLegacy extends UdfpsAnimationView {
static final int ANIMATION_NONE = 0;
static final int ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN = 1;
- static final int ANIMATION_UNLOCKED_SCREEN_OFF = 2;
+ static final int ANIMATE_APPEAR_ON_SCREEN_OFF = 2;
@Retention(RetentionPolicy.SOURCE)
- @IntDef({ANIMATION_NONE, ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN, ANIMATION_UNLOCKED_SCREEN_OFF})
+ @IntDef({ANIMATION_NONE, ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN, ANIMATE_APPEAR_ON_SCREEN_OFF})
private @interface AnimationType {}
void onDozeAmountChanged(float linear, float eased, @AnimationType int animationType) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt
new file mode 100644
index 000000000000..bb6a68b7aa2c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt
@@ -0,0 +1,52 @@
+/*
+ * 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 com.android.systemui.biometrics.ui.binder
+
+import androidx.core.view.isInvisible
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.repeatOnLifecycle
+import com.android.systemui.biometrics.ui.view.UdfpsTouchOverlay
+import com.android.systemui.biometrics.ui.viewmodel.UdfpsTouchOverlayViewModel
+import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
+import com.android.systemui.lifecycle.repeatWhenAttached
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.launch
+
+@ExperimentalCoroutinesApi
+object UdfpsTouchOverlayBinder {
+
+ /**
+ * Updates visibility for the UdfpsTouchOverlay which controls whether the view will receive
+ * touches or not.
+ */
+ @JvmStatic
+ fun bind(
+ view: UdfpsTouchOverlay,
+ viewModel: UdfpsTouchOverlayViewModel,
+ ) {
+ if (DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode()) return
+ view.repeatWhenAttached {
+ repeatOnLifecycle(Lifecycle.State.CREATED) {
+ launch {
+ viewModel.shouldHandleTouches.collect { shouldHandleTouches ->
+ view.isInvisible = !shouldHandleTouches
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModel.kt
new file mode 100644
index 000000000000..f8338aea4150
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModel.kt
@@ -0,0 +1,49 @@
+/*
+ * 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 com.android.systemui.biometrics.ui.viewmodel
+
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.statusbar.phone.SystemUIDialogManager
+import com.android.systemui.statusbar.phone.hideAffordancesRequest
+import javax.inject.Inject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+
+/**
+ * Default view model for the UdfpsTouchOverlay.
+ *
+ * By default, don't handle touches if any of the following are true:
+ * - shade is fully or partially expanded
+ * - any SysUI dialogs are obscuring the display
+ */
+@ExperimentalCoroutinesApi
+class DefaultUdfpsTouchOverlayViewModel
+@Inject
+constructor(
+ shadeInteractor: ShadeInteractor,
+ systemUIDialogManager: SystemUIDialogManager,
+) : UdfpsTouchOverlayViewModel {
+ private val shadeExpandedOrExpanding: Flow<Boolean> = shadeInteractor.isAnyExpanded
+ override val shouldHandleTouches: Flow<Boolean> =
+ combine(
+ shadeExpandedOrExpanding,
+ systemUIDialogManager.hideAffordancesRequest,
+ ) { shadeExpandedOrExpanding, dialogRequestingHideAffordances ->
+ !shadeExpandedOrExpanding && !dialogRequestingHideAffordances
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModel.kt
new file mode 100644
index 000000000000..c19ea19833d2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModel.kt
@@ -0,0 +1,51 @@
+/*
+ * 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 com.android.systemui.biometrics.ui.viewmodel
+
+import com.android.systemui.keyguard.ui.viewmodel.DeviceEntryIconViewModel
+import com.android.systemui.statusbar.phone.SystemUIDialogManager
+import com.android.systemui.statusbar.phone.hideAffordancesRequest
+import javax.inject.Inject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+
+/**
+ * View model for the UdfpsTouchOverlay for when UDFPS is being requested for device entry. Handles
+ * touches as long as the device entry views are visible.
+ */
+@ExperimentalCoroutinesApi
+class DeviceEntryUdfpsTouchOverlayViewModel
+@Inject
+constructor(
+ deviceEntryIconViewModel: DeviceEntryIconViewModel,
+ systemUIDialogManager: SystemUIDialogManager,
+) : UdfpsTouchOverlayViewModel {
+ // TODO (b/305234447): AlternateBouncer showing overrides sysuiDialogHideAffordancesRequest
+ override val shouldHandleTouches: Flow<Boolean> =
+ combine(
+ deviceEntryIconViewModel.deviceEntryViewAlpha,
+ systemUIDialogManager.hideAffordancesRequest,
+ ) { deviceEntryViewAlpha, dialogRequestingHideAffordances ->
+ deviceEntryViewAlpha > ALLOW_TOUCH_ALPHA_THRESHOLD && !dialogRequestingHideAffordances
+ }
+
+ companion object {
+ // only allow touches if the view is still mostly visible
+ const val ALLOW_TOUCH_ALPHA_THRESHOLD = .9f
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/UdfpsTouchOverlayViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/UdfpsTouchOverlayViewModel.kt
new file mode 100644
index 000000000000..3943fc44de50
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/UdfpsTouchOverlayViewModel.kt
@@ -0,0 +1,25 @@
+/*
+ * 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 com.android.systemui.biometrics.ui.viewmodel
+
+import kotlinx.coroutines.flow.Flow
+
+/** Models the UI state for the UdfpsTouchOverlay. */
+interface UdfpsTouchOverlayViewModel {
+ /** Whether the UDFPS touch overlay should allow touches to be handled. */
+ val shouldHandleTouches: Flow<Boolean>
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java
index 17bf1a716944..b78b1f128376 100644
--- a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java
@@ -16,16 +16,11 @@
package com.android.systemui.bluetooth;
-import android.annotation.Nullable;
-import android.content.Context;
import android.view.View;
-import com.android.internal.logging.UiEventLogger;
-import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.systemui.animation.DialogLaunchAnimator;
-import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.media.dialog.MediaOutputDialogFactory;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
import javax.inject.Inject;
@@ -35,25 +30,15 @@ import javax.inject.Inject;
@SysUISingleton
public class BroadcastDialogController {
- private Context mContext;
- private UiEventLogger mUiEventLogger;
- private DialogLaunchAnimator mDialogLaunchAnimator;
- private MediaOutputDialogFactory mMediaOutputDialogFactory;
- private final LocalBluetoothManager mLocalBluetoothManager;
- private BroadcastSender mBroadcastSender;
+ private final DialogLaunchAnimator mDialogLaunchAnimator;
+ private final BroadcastDialogDelegate.Factory mBroadcastDialogFactory;
@Inject
- public BroadcastDialogController(Context context, UiEventLogger uiEventLogger,
+ public BroadcastDialogController(
DialogLaunchAnimator dialogLaunchAnimator,
- MediaOutputDialogFactory mediaOutputDialogFactory,
- @Nullable LocalBluetoothManager localBluetoothManager,
- BroadcastSender broadcastSender) {
- mContext = context;
- mUiEventLogger = uiEventLogger;
+ BroadcastDialogDelegate.Factory broadcastDialogFactory) {
mDialogLaunchAnimator = dialogLaunchAnimator;
- mMediaOutputDialogFactory = mediaOutputDialogFactory;
- mLocalBluetoothManager = localBluetoothManager;
- mBroadcastSender = broadcastSender;
+ mBroadcastDialogFactory = broadcastDialogFactory;
}
/** Creates a [BroadcastDialog] for the user to switch broadcast or change the output device
@@ -61,11 +46,10 @@ public class BroadcastDialogController {
* @param currentBroadcastAppName Indicates the APP name currently broadcasting
* @param outputPkgName Indicates the output media package name to be switched
*/
- public void createBroadcastDialog(String currentBroadcastAppName, String outputPkgName,
- boolean aboveStatusBar, View view) {
- BroadcastDialog broadcastDialog = new BroadcastDialog(mContext, mMediaOutputDialogFactory,
- mLocalBluetoothManager, currentBroadcastAppName, outputPkgName, mUiEventLogger,
- mBroadcastSender);
+ public void createBroadcastDialog(
+ String currentBroadcastAppName, String outputPkgName, View view) {
+ SystemUIDialog broadcastDialog = mBroadcastDialogFactory.create(
+ currentBroadcastAppName, outputPkgName).createDialog();
if (view != null) {
mDialogLaunchAnimator.showFromView(broadcastDialog, view);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialog.java b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java
index 00e952718436..00bbb20ed4f9 100644
--- a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java
@@ -5,7 +5,7 @@
* 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
+ * 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,
@@ -18,6 +18,8 @@ package com.android.systemui.bluetooth;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.Dialog;
import android.bluetooth.BluetoothLeBroadcast;
import android.bluetooth.BluetoothLeBroadcastMetadata;
import android.content.Context;
@@ -26,7 +28,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
-import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.Button;
@@ -38,39 +39,47 @@ import com.android.internal.logging.UiEventLogger;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.MediaOutputConstants;
-import com.android.systemui.res.R;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.media.controls.util.MediaDataUtils;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
+import com.android.systemui.res.R;
import com.android.systemui.statusbar.phone.SystemUIDialog;
+import dagger.assisted.Assisted;
+import dagger.assisted.AssistedFactory;
+import dagger.assisted.AssistedInject;
+
+import java.util.HashSet;
+import java.util.Set;
import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
/**
* Dialog for showing le audio broadcasting dialog.
*/
-public class BroadcastDialog extends SystemUIDialog {
+public class BroadcastDialogDelegate implements SystemUIDialog.Delegate {
private static final String TAG = "BroadcastDialog";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private static final int HANDLE_BROADCAST_FAILED_DELAY = 3000;
+ private static final String CURRENT_BROADCAST_APP = "current_broadcast_app";
+ private static final String OUTPUT_PKG_NAME = "output_pkg_name";
private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
- private Context mContext;
- private UiEventLogger mUiEventLogger;
- @VisibleForTesting
- protected View mDialogView;
- private MediaOutputDialogFactory mMediaOutputDialogFactory;
- private LocalBluetoothManager mLocalBluetoothManager;
- private BroadcastSender mBroadcastSender;
- private String mCurrentBroadcastApp;
- private String mOutputPackageName;
- private Executor mExecutor;
+ private final Context mContext;
+ private final UiEventLogger mUiEventLogger;
+ private final MediaOutputDialogFactory mMediaOutputDialogFactory;
+ private final LocalBluetoothManager mLocalBluetoothManager;
+ private final BroadcastSender mBroadcastSender;
+ private final SystemUIDialog.Factory mSystemUIDialogFactory;
+ private final String mCurrentBroadcastApp;
+ private final String mOutputPackageName;
+ private final Executor mExecutor;
private boolean mShouldLaunchLeBroadcastDialog;
private Button mSwitchBroadcast;
+ private final Set<SystemUIDialog> mDialogs = new HashSet<>();
+
private final BluetoothLeBroadcast.Callback mBroadcastCallback =
new BluetoothLeBroadcast.Callback() {
@Override
@@ -136,43 +145,64 @@ public class BroadcastDialog extends SystemUIDialog {
}
};
- public BroadcastDialog(Context context, MediaOutputDialogFactory mediaOutputDialogFactory,
- LocalBluetoothManager localBluetoothManager, String currentBroadcastApp,
- String outputPkgName, UiEventLogger uiEventLogger, BroadcastSender broadcastSender) {
- super(context);
- if (DEBUG) {
- Log.d(TAG, "Init BroadcastDialog");
- }
+ @AssistedFactory
+ public interface Factory {
+ BroadcastDialogDelegate create(
+ @Assisted(CURRENT_BROADCAST_APP) String currentBroadcastApp,
+ @Assisted(OUTPUT_PKG_NAME) String outputPkgName
+ );
+ }
- mContext = getContext();
+ @AssistedInject
+ BroadcastDialogDelegate(
+ Context context,
+ MediaOutputDialogFactory mediaOutputDialogFactory,
+ @Nullable LocalBluetoothManager localBluetoothManager,
+ UiEventLogger uiEventLogger,
+ Executor executor,
+ BroadcastSender broadcastSender,
+ SystemUIDialog.Factory systemUIDialogFactory,
+ @Assisted(CURRENT_BROADCAST_APP) String currentBroadcastApp,
+ @Assisted(OUTPUT_PKG_NAME) String outputPkgName) {
+ mContext = context;
mMediaOutputDialogFactory = mediaOutputDialogFactory;
mLocalBluetoothManager = localBluetoothManager;
+ mSystemUIDialogFactory = systemUIDialogFactory;
mCurrentBroadcastApp = currentBroadcastApp;
mOutputPackageName = outputPkgName;
mUiEventLogger = uiEventLogger;
- mExecutor = Executors.newSingleThreadExecutor();
+ mExecutor = executor;
mBroadcastSender = broadcastSender;
+
+ if (DEBUG) {
+ Log.d(TAG, "Init BroadcastDialog");
+ }
+ }
+
+ @Override
+ public SystemUIDialog createDialog() {
+ return mSystemUIDialogFactory.create(this);
}
@Override
- public void start() {
+ public void onStart(SystemUIDialog dialog) {
+ mDialogs.add(dialog);
registerBroadcastCallBack(mExecutor, mBroadcastCallback);
}
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ public void onCreate(SystemUIDialog dialog, Bundle savedInstanceState) {
if (DEBUG) {
Log.d(TAG, "onCreate");
}
mUiEventLogger.log(BroadcastDialogEvent.BROADCAST_DIALOG_SHOW);
- mDialogView = LayoutInflater.from(mContext).inflate(R.layout.broadcast_dialog, null);
- final Window window = getWindow();
- window.setContentView(mDialogView);
+ View dialogView = dialog.getLayoutInflater().inflate(R.layout.broadcast_dialog, null);
+ final Window window = dialog.getWindow();
+ window.setContentView(dialogView);
- TextView title = mDialogView.requireViewById(R.id.dialog_title);
- TextView subTitle = mDialogView.requireViewById(R.id.dialog_subtitle);
+ TextView title = dialogView.requireViewById(R.id.dialog_title);
+ TextView subTitle = dialogView.requireViewById(R.id.dialog_subtitle);
title.setText(mContext.getString(
R.string.bt_le_audio_broadcast_dialog_title, mCurrentBroadcastApp));
String switchBroadcastApp = MediaDataUtils.getAppLabel(mContext, mOutputPackageName,
@@ -180,27 +210,28 @@ public class BroadcastDialog extends SystemUIDialog {
subTitle.setText(mContext.getString(
R.string.bt_le_audio_broadcast_dialog_sub_title, switchBroadcastApp));
- mSwitchBroadcast = mDialogView.requireViewById(R.id.switch_broadcast);
- Button changeOutput = mDialogView.requireViewById(R.id.change_output);
- Button cancelBtn = mDialogView.requireViewById(R.id.cancel);
+ mSwitchBroadcast = dialogView.requireViewById(R.id.switch_broadcast);
+ Button changeOutput = dialogView.requireViewById(R.id.change_output);
+ Button cancelBtn = dialogView.requireViewById(R.id.cancel);
mSwitchBroadcast.setText(mContext.getString(
R.string.bt_le_audio_broadcast_dialog_switch_app, switchBroadcastApp), null);
mSwitchBroadcast.setOnClickListener((view) -> startSwitchBroadcast());
changeOutput.setOnClickListener((view) -> {
mMediaOutputDialogFactory.create(mOutputPackageName, true, null);
- dismiss();
+ dialog.dismiss();
});
cancelBtn.setOnClickListener((view) -> {
if (DEBUG) {
Log.d(TAG, "BroadcastDialog dismiss.");
}
- dismiss();
+ dialog.dismiss();
});
}
@Override
- public void stop() {
+ public void onStop(SystemUIDialog dialog) {
unregisterBroadcastCallBack(mBroadcastCallback);
+ mDialogs.remove(dialog);
}
void refreshSwitchBroadcastButton() {
@@ -271,10 +302,9 @@ public class BroadcastDialog extends SystemUIDialog {
}
@Override
- public void onWindowFocusChanged(boolean hasFocus) {
- super.onWindowFocusChanged(hasFocus);
- if (!hasFocus && isShowing()) {
- dismiss();
+ public void onWindowFocusChanged(SystemUIDialog dialog, boolean hasFocus) {
+ if (!hasFocus && dialog.isShowing()) {
+ dialog.dismiss();
}
}
@@ -333,6 +363,6 @@ public class BroadcastDialog extends SystemUIDialog {
.setPackage(mContext.getPackageName())
.setAction(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_BROADCAST_DIALOG)
.putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME, mOutputPackageName));
- dismiss();
+ mDialogs.forEach(Dialog::dismiss);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt
index a7211007e5e3..84f7dd5edecf 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt
@@ -18,7 +18,6 @@ package com.android.systemui.bouncer.domain.interactor
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository
-import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
@@ -30,10 +29,9 @@ import com.android.systemui.util.time.SystemClock
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.flow.asStateFlow
/** Encapsulates business logic for interacting with the lock-screen alternate bouncer. */
@SysUISingleton
@@ -54,15 +52,19 @@ constructor(
private val alternateBouncerUiAvailableFromSource: HashSet<String> = HashSet()
private val alternateBouncerSupported: StateFlow<Boolean> =
if (DeviceEntryUdfpsRefactor.isEnabled) {
- fingerprintPropertyRepository.sensorType
- .map { sensorType ->
- sensorType.isUdfps() || sensorType == FingerprintSensorType.POWER_BUTTON
- }
- .stateIn(
- scope = scope,
- started = SharingStarted.Eagerly,
- initialValue = false,
- )
+ // The device entry udfps refactor doesn't currently support the alternate bouncer.
+ // TODO: Re-enable when b/287599719 is ready.
+ MutableStateFlow(false).asStateFlow()
+ // fingerprintPropertyRepository.sensorType
+ // .map { sensorType ->
+ // sensorType.isUdfps() || sensorType ==
+ // FingerprintSensorType.POWER_BUTTON
+ // }
+ // .stateIn(
+ // scope = scope,
+ // started = SharingStarted.Eagerly,
+ // initialValue = false,
+ // )
} else {
bouncerRepository.alternateBouncerUIAvailable
}
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt
index b598631c3b57..7c46339ec103 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt
@@ -105,9 +105,9 @@ constructor(
val isUserSwitcherVisible: Boolean
get() = repository.isUserSwitcherVisible
- private val _onImeHidden = MutableSharedFlow<Unit>()
- /** Provide the onImeHidden events from the bouncer */
- val onImeHidden: SharedFlow<Unit> = _onImeHidden
+ private val _onImeHiddenByUser = MutableSharedFlow<Unit>()
+ /** Emits a [Unit] each time the IME (keyboard) is hidden by the user. */
+ val onImeHiddenByUser: SharedFlow<Unit> = _onImeHiddenByUser
init {
if (flags.isEnabled()) {
@@ -230,9 +230,9 @@ constructor(
repository.setMessage(errorMessage(authenticationInteractor.getAuthenticationMethod()))
}
- /** Notifies the interactor that the input method editor has been hidden. */
- suspend fun onImeHidden() {
- _onImeHidden.emit(Unit)
+ /** Notifies that the input method editor (software keyboard) has been hidden by the user. */
+ suspend fun onImeHiddenByUser() {
+ _onImeHiddenByUser.emit(Unit)
}
private fun promptMessage(authMethod: AuthenticationMethodModel): String {
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt
index 80248744c25a..e379dab918ef 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/AuthMethodBouncerViewModel.kt
@@ -46,9 +46,6 @@ sealed class AuthMethodBouncerViewModel(
*/
val animateFailure: StateFlow<Boolean> = _animateFailure.asStateFlow()
- /** Whether the input method editor (for example, the software keyboard) is visible. */
- private var isImeVisible: Boolean = false
-
/** The authentication method that corresponds to this view model. */
abstract val authenticationMethod: AuthenticationMethodModel
@@ -68,7 +65,7 @@ sealed class AuthMethodBouncerViewModel(
/**
* Notifies that the UI has been hidden from the user (after any transitions have completed).
*/
- fun onHidden() {
+ open fun onHidden() {
clearInput()
interactor.resetMessage()
}
@@ -79,18 +76,6 @@ sealed class AuthMethodBouncerViewModel(
}
/**
- * Notifies that the input method editor (for example, the software keyboard) has been shown or
- * hidden.
- */
- suspend fun onImeVisibilityChanged(isVisible: Boolean) {
- if (isImeVisible && !isVisible) {
- interactor.onImeHidden()
- }
-
- isImeVisible = isVisible
- }
-
- /**
* Notifies that the failure animation has been shown. This should be called to consume a `true`
* value in [animateFailure].
*/
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt
index a15698e1f90c..45d181285df7 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt
@@ -21,8 +21,11 @@ import com.android.systemui.bouncer.domain.interactor.BouncerInteractor
import com.android.systemui.res.R
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.stateIn
/** Holds UI state and handles user input for the password bouncer UI. */
class PasswordBouncerViewModel(
@@ -45,6 +48,32 @@ class PasswordBouncerViewModel(
override val throttlingMessageId = R.string.kg_too_many_failed_password_attempts_dialog_message
+ /** Whether the input method editor (for example, the software keyboard) is visible. */
+ private var isImeVisible: Boolean = false
+
+ /** Whether the text field element currently has focus. */
+ private val isTextFieldFocused = MutableStateFlow(false)
+
+ /** Whether the UI should request focus on the text field element. */
+ val isTextFieldFocusRequested =
+ combine(
+ interactor.isThrottled,
+ isTextFieldFocused,
+ ) { isThrottled, hasFocus ->
+ !isThrottled && !hasFocus
+ }
+ .stateIn(
+ scope = viewModelScope,
+ started = SharingStarted.WhileSubscribed(),
+ initialValue = !interactor.isThrottled.value && !isTextFieldFocused.value,
+ )
+
+ override fun onHidden() {
+ super.onHidden()
+ isImeVisible = false
+ isTextFieldFocused.value = false
+ }
+
override fun clearInput() {
_password.value = ""
}
@@ -72,4 +101,21 @@ class PasswordBouncerViewModel(
tryAuthenticate()
}
}
+
+ /**
+ * Notifies that the input method editor (for example, the software keyboard) has been shown or
+ * hidden.
+ */
+ suspend fun onImeVisibilityChanged(isVisible: Boolean) {
+ if (isImeVisible && !isVisible && !interactor.isThrottled.value) {
+ interactor.onImeHiddenByUser()
+ }
+
+ isImeVisible = isVisible
+ }
+
+ /** Notifies that the password text field has gained or lost focus. */
+ fun onTextFieldFocusChanged(isFocused: Boolean) {
+ isTextFieldFocused.value = isFocused
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
index 12df96e41b2c..5b1082acd59f 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
@@ -380,7 +380,7 @@ class FalsingCollectorImpl implements FalsingCollector {
static void logDebug(String msg) {
if (DEBUG) {
- logDebug(msg);
+ Log.d(TAG, msg);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
index 63b4288ce055..e0ce3db39403 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
@@ -27,7 +27,7 @@ import static com.google.android.setupcompat.util.WizardManagerHelper.SETTINGS_S
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
-import android.os.SystemProperties;
+import android.os.Build;
import android.provider.Settings;
import android.util.Log;
@@ -87,7 +87,7 @@ public class ClipboardListener implements
String clipSource = mClipboardManager.getPrimaryClipSource();
ClipData clipData = mClipboardManager.getPrimaryClip();
- if (shouldSuppressOverlay(clipData, clipSource, isEmulator())) {
+ if (shouldSuppressOverlay(clipData, clipSource, Build.IS_EMULATOR)) {
Log.i(TAG, "Clipboard overlay suppressed.");
return;
}
@@ -141,10 +141,6 @@ public class ClipboardListener implements
return true;
}
- private static boolean isEmulator() {
- return SystemProperties.getBoolean("ro.boot.qemu", false);
- }
-
private boolean isUserSetupComplete() {
return Settings.Secure.getInt(mContext.getContentResolver(),
SETTINGS_SECURE_USER_SETUP_COMPLETE, 0) == 1;
diff --git a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt
index 70d713845f00..4e40042a49b0 100644
--- a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt
@@ -16,31 +16,19 @@
package com.android.systemui.contrast
import android.app.Activity
-import android.app.UiModeManager
-import android.content.Context
import android.os.Bundle
-import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.settings.UserTracker
-import com.android.systemui.util.settings.SecureSettings
-import java.util.concurrent.Executor
import javax.inject.Inject
-/** Trampoline activity responsible for creating a [ContrastDialog] */
+/** Trampoline activity responsible for creating a [ContrastDialogDelegate] */
class ContrastDialogActivity
@Inject
constructor(
- private val context: Context,
- @Main private val mainExecutor: Executor,
- private val uiModeManager: UiModeManager,
- private val userTracker: UserTracker,
- private val secureSettings: SecureSettings
+ private val contrastDialogDelegate : ContrastDialogDelegate
) : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- val contrastDialog =
- ContrastDialog(context, mainExecutor, uiModeManager, userTracker, secureSettings)
- contrastDialog.show()
+ contrastDialogDelegate.createDialog().show()
finish()
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogDelegate.kt
index e9b59306c552..63b01edb01fa 100644
--- a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogDelegate.kt
@@ -21,54 +21,58 @@ import android.app.UiModeManager.ContrastUtils.CONTRAST_LEVEL_MEDIUM
import android.app.UiModeManager.ContrastUtils.CONTRAST_LEVEL_STANDARD
import android.app.UiModeManager.ContrastUtils.fromContrastLevel
import android.app.UiModeManager.ContrastUtils.toContrastLevel
-import android.content.Context
import android.os.Bundle
import android.provider.Settings
-import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import com.android.internal.annotations.VisibleForTesting
-import com.android.systemui.res.R
import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.res.R
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.util.settings.SecureSettings
import java.util.concurrent.Executor
+import javax.inject.Inject
/** Dialog to select contrast options */
-class ContrastDialog(
- context: Context?,
+class ContrastDialogDelegate @Inject constructor(
+ private val sysuiDialogFactory : SystemUIDialog.Factory,
@Main private val mainExecutor: Executor,
private val uiModeManager: UiModeManager,
private val userTracker: UserTracker,
private val secureSettings: SecureSettings,
-) : SystemUIDialog(context), UiModeManager.ContrastChangeListener {
+) : SystemUIDialog.Delegate, UiModeManager.ContrastChangeListener {
+
+ override fun createDialog(): SystemUIDialog {
+ return sysuiDialogFactory.create(this)
+ }
@VisibleForTesting lateinit var contrastButtons: Map<Int, FrameLayout>
lateinit var dialogView: View
@VisibleForTesting var initialContrast: Float = fromContrastLevel(CONTRAST_LEVEL_STANDARD)
- public override fun onCreate(savedInstanceState: Bundle?) {
- dialogView = LayoutInflater.from(context).inflate(R.layout.contrast_dialog, null)
- setView(dialogView)
+ override fun onCreate(dialog: SystemUIDialog, savedInstanceState: Bundle?) {
+ dialogView = dialog.layoutInflater.inflate(R.layout.contrast_dialog, null)
+ with(dialog) {
+ setView(dialogView)
- setTitle(R.string.quick_settings_contrast_label)
- setNeutralButton(R.string.cancel) { _, _ ->
- secureSettings.putFloatForUser(
- Settings.Secure.CONTRAST_LEVEL,
- initialContrast,
- userTracker.userId
- )
- dismiss()
+ setTitle(R.string.quick_settings_contrast_label)
+ setNeutralButton(R.string.cancel) { _, _ ->
+ secureSettings.putFloatForUser(
+ Settings.Secure.CONTRAST_LEVEL,
+ initialContrast,
+ userTracker.userId
+ )
+ dialog.dismiss()
+ }
+ setPositiveButton(com.android.settingslib.R.string.done) { _, _ -> dialog.dismiss() }
}
- setPositiveButton(com.android.settingslib.R.string.done) { _, _ -> dismiss() }
- super.onCreate(savedInstanceState)
-
contrastButtons =
mapOf(
- CONTRAST_LEVEL_STANDARD to requireViewById(R.id.contrast_button_standard),
- CONTRAST_LEVEL_MEDIUM to requireViewById(R.id.contrast_button_medium),
- CONTRAST_LEVEL_HIGH to requireViewById(R.id.contrast_button_high)
+ CONTRAST_LEVEL_STANDARD to dialogView.requireViewById(
+ R.id.contrast_button_standard),
+ CONTRAST_LEVEL_MEDIUM to dialogView.requireViewById(R.id.contrast_button_medium),
+ CONTRAST_LEVEL_HIGH to dialogView.requireViewById(R.id.contrast_button_high)
)
contrastButtons.forEach { (contrastLevel, contrastButton) ->
@@ -86,11 +90,11 @@ class ContrastDialog(
highlightContrast(toContrastLevel(initialContrast))
}
- override fun start() {
+ override fun onStart(dialog: SystemUIDialog) {
uiModeManager.addContrastChangeListener(mainExecutor, this)
}
- override fun stop() {
+ override fun onStop(dialog: SystemUIDialog) {
uiModeManager.removeContrastChangeListener(this)
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
index e7b87730f94b..9672facb8610 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
@@ -36,8 +36,6 @@ import com.android.systemui.unfold.FoldStateLogger;
import com.android.systemui.unfold.FoldStateLoggingProvider;
import com.android.systemui.unfold.SysUIUnfoldComponent;
import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
-import com.android.systemui.unfold.dagger.UnfoldBg;
-import com.android.systemui.unfold.progress.UnfoldTransitionProgressForwarder;
import com.android.wm.shell.back.BackAnimation;
import com.android.wm.shell.bubbles.Bubbles;
import com.android.wm.shell.desktopmode.DesktopMode;
@@ -139,26 +137,19 @@ public interface SysUIComponent {
c.getUnfoldHapticsPlayer();
c.getNaturalRotationUnfoldProgressProvider().init();
c.getUnfoldLatencyTracker().init();
+ c.getFoldStateLoggingProvider()
+ .ifPresent(FoldStateLoggingProvider::init);
+ c.getFoldStateLogger().ifPresent(FoldStateLogger::init);
+ final UnfoldTransitionProgressProvider progressProvider =
+ Flags.unfoldAnimationBackgroundProgress()
+ ? c.getBgUnfoldTransitionProgressProvider()
+ : c.getUnfoldTransitionProgressProvider();
+ progressProvider.addCallback(c.getUnfoldTransitionProgressForwarder());
});
// No init method needed, just needs to be gotten so that it's created.
getMediaMuteAwaitConnectionCli();
getNearbyMediaDevicesManager();
getConnectingDisplayViewModel().init();
- getFoldStateLoggingProvider().ifPresent(FoldStateLoggingProvider::init);
- getFoldStateLogger().ifPresent(FoldStateLogger::init);
-
- Optional<UnfoldTransitionProgressProvider> unfoldTransitionProgressProvider;
-
- if (Flags.unfoldAnimationBackgroundProgress()) {
- unfoldTransitionProgressProvider = getBgUnfoldTransitionProgressProvider();
- } else {
- unfoldTransitionProgressProvider = getUnfoldTransitionProgressProvider();
- }
- unfoldTransitionProgressProvider
- .ifPresent(
- (progressProvider) ->
- getUnfoldTransitionProgressForwarder()
- .ifPresent(progressProvider::addCallback));
}
/**
@@ -180,37 +171,6 @@ public interface SysUIComponent {
ContextComponentHelper getContextComponentHelper();
/**
- * Creates a UnfoldTransitionProgressProvider that calculates progress in the background.
- */
- @SysUISingleton
- @UnfoldBg
- Optional<UnfoldTransitionProgressProvider> getBgUnfoldTransitionProgressProvider();
-
- /**
- * Creates a UnfoldTransitionProgressProvider that calculates progress in the main thread.
- */
- @SysUISingleton
- Optional<UnfoldTransitionProgressProvider> getUnfoldTransitionProgressProvider();
-
- /**
- * Creates a UnfoldTransitionProgressForwarder.
- */
- @SysUISingleton
- Optional<UnfoldTransitionProgressForwarder> getUnfoldTransitionProgressForwarder();
-
- /**
- * Creates a FoldStateLoggingProvider.
- */
- @SysUISingleton
- Optional<FoldStateLoggingProvider> getFoldStateLoggingProvider();
-
- /**
- * Creates a FoldStateLogger.
- */
- @SysUISingleton
- Optional<FoldStateLogger> getFoldStateLogger();
-
- /**
* Main dependency providing module.
*/
@SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt b/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt
index 4bfc9484f733..615b503b9fae 100644
--- a/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt
+++ b/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt
@@ -34,7 +34,6 @@ import com.android.systemui.FaceScanningOverlay
import com.android.systemui.biometrics.AuthController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.flags.FeatureFlags
import com.android.systemui.log.ScreenDecorationsLogger
import com.android.systemui.plugins.statusbar.StatusBarStateController
import java.util.concurrent.Executor
@@ -48,7 +47,6 @@ class FaceScanningProviderFactory @Inject constructor(
private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
@Main private val mainExecutor: Executor,
private val logger: ScreenDecorationsLogger,
- private val featureFlags: FeatureFlags,
) : DecorProviderFactory() {
private val display = context.display
private val displayInfo = DisplayInfo()
@@ -88,7 +86,6 @@ class FaceScanningProviderFactory @Inject constructor(
keyguardUpdateMonitor,
mainExecutor,
logger,
- featureFlags,
)
)
}
@@ -113,7 +110,6 @@ class FaceScanningOverlayProviderImpl(
private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
private val mainExecutor: Executor,
private val logger: ScreenDecorationsLogger,
- private val featureFlags: FeatureFlags,
) : BoundDecorProvider() {
override val viewId: Int = com.android.systemui.res.R.id.face_scanning_anim
@@ -148,7 +144,6 @@ class FaceScanningOverlayProviderImpl(
mainExecutor,
logger,
authController,
- featureFlags
)
view.id = viewId
view.setColor(tintColor)
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt
index c3aaef76cb2f..cd764c0cc1a4 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt
@@ -2,7 +2,9 @@ package com.android.systemui.deviceentry
import com.android.systemui.deviceentry.data.repository.DeviceEntryHapticsRepositoryModule
import com.android.systemui.deviceentry.data.repository.DeviceEntryRepositoryModule
+import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import dagger.Module
+import dagger.multibindings.Multibinds
@Module(
includes =
@@ -11,4 +13,9 @@ import dagger.Module
DeviceEntryHapticsRepositoryModule::class,
],
)
-object DeviceEntryModule
+abstract class DeviceEntryModule {
+ /**
+ * A set of DeviceEntryIconTransitions. Ensures that this can be injected even if it's empty.
+ */
+ @Multibinds abstract fun deviceEntryIconTransitionSet(): Set<DeviceEntryIconTransition>
+}
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
index 2a0d6a8a77d9..7cb2c6e1fcff 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
@@ -240,11 +240,6 @@ object Flags {
@JvmField
val WALLPAPER_PICKER_PREVIEW_ANIMATION = releasedFlag("wallpaper_picker_preview_animation")
- /** Flag to enable rest to unlock feature. */
- // TODO(b/303672286): Tracking bug
- @JvmField
- val REST_TO_UNLOCK: UnreleasedFlag = unreleasedFlag("rest_to_unlock")
-
/**
* TODO(b/278086361): Tracking bug
* Complete rewrite of the interactions between System UI and Window Manager involving keyguard
@@ -258,12 +253,6 @@ object Flags {
val KEYGUARD_WM_STATE_REFACTOR: UnreleasedFlag =
unreleasedFlag("keyguard_wm_state_refactor")
- /** Flag to disable the face scanning animation pulsing. */
- // TODO(b/295245791): Tracking bug.
- @JvmField val STOP_PULSING_FACE_SCANNING_ANIMATION = resourceBooleanFlag(
- R.bool.flag_stop_pulsing_face_scanning_animation,
- "stop_pulsing_face_scanning_animation")
-
// 300 - power menu
// TODO(b/254512600): Tracking Bug
@JvmField val POWER_MENU_LITE = releasedFlag("power_menu_lite")
@@ -545,28 +534,12 @@ object Flags {
unreleasedFlag("clipboard_shared_transitions", teamfood = true)
/**
- * Whether the scene container (Flexiglass) is enabled. Note that [SCENE_CONTAINER] should be
- * checked and toggled together with [SCENE_CONTAINER_ENABLED] so that ProGuard can remove
- * unused code from our APK at compile time.
+ * Whether the scene container (Flexiglass) is enabled. Note that SceneContainerFlags#isEnabled
+ * should be checked and toggled together with [SCENE_CONTAINER_ENABLED] so that ProGuard can
+ * remove unused code from our APK at compile time.
*/
// TODO(b/283300105): Tracking Bug
@JvmField val SCENE_CONTAINER_ENABLED = false
- @Deprecated(
- message = """
- Do not use this flag directly. Please use
- [com.android.systemui.scene.shared.flag.SceneContainerFlags#isEnabled].
-
- (Not really deprecated but using this as a simple way to bring attention to the above).
- """,
- replaceWith = ReplaceWith(
- "com.android.systemui.scene.shared.flag.SceneContainerFlags#isEnabled",
- ),
- level = DeprecationLevel.WARNING,
- )
- @JvmField val SCENE_CONTAINER = resourceBooleanFlag(
- R.bool.config_sceneContainerFrameworkEnabled,
- "scene_container",
- )
// 1900
@JvmField val NOTE_TASKS = releasedFlag("keycode_flag")
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
index c8c06ae65d45..01ba0d214a97 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
@@ -41,6 +41,7 @@ import com.android.keyguard.KeyguardViewController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
+import com.android.systemui.Flags.fastUnlockTransition
import com.android.systemui.plugins.BcSmartspaceDataPlugin
import com.android.systemui.shared.recents.utilities.Utilities
import com.android.systemui.shared.system.ActivityManagerWrapper
@@ -98,7 +99,8 @@ const val DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD = 0.3f
* from a tap on the unlock icon, or from the bouncer. This is not relevant if the lockscreen is
* swiped away via a touch gesture, or when it's flinging expanded/collapsed after a swipe.
*/
-const val UNLOCK_ANIMATION_DURATION_MS = 200L
+const val LEGACY_UNLOCK_ANIMATION_DURATION_MS = 200L
+const val UNLOCK_ANIMATION_DURATION_MS = 167L
/**
* How long the in-window launcher icon animation takes. This is used if the launcher is underneath
@@ -112,19 +114,22 @@ const val LAUNCHER_ICONS_ANIMATION_DURATION_MS = 633L
/**
* How long to wait for the shade to get out of the way before starting the canned unlock animation.
*/
-const val CANNED_UNLOCK_START_DELAY = 100L
+const val LEGACY_CANNED_UNLOCK_START_DELAY = 100L
+const val CANNED_UNLOCK_START_DELAY = 67L
/**
* Duration for the alpha animation on the surface behind. This plays to fade in the surface during
* a swipe to unlock (and to fade it back out if the swipe is cancelled).
*/
-const val SURFACE_BEHIND_SWIPE_FADE_DURATION_MS = 175L
+const val LEGACY_SURFACE_BEHIND_SWIPE_FADE_DURATION_MS = 175L
+const val SURFACE_BEHIND_FADE_OUT_DURATION_MS = 83L
/**
* Start delay for the surface behind animation, used so that the lockscreen can get out of the way
* before the surface begins appearing.
*/
-const val UNLOCK_ANIMATION_SURFACE_BEHIND_START_DELAY_MS = 75L
+const val LEGACY_UNLOCK_ANIMATION_SURFACE_BEHIND_START_DELAY_MS = 75L
+const val SURFACE_BEHIND_FADE_OUT_START_DELAY_MS = 0L
/**
* Initiates, controls, and ends the keyguard unlock animation.
@@ -327,7 +332,7 @@ class KeyguardUnlockAnimationController @Inject constructor(
init {
with(surfaceBehindAlphaAnimator) {
- duration = SURFACE_BEHIND_SWIPE_FADE_DURATION_MS
+ duration = surfaceBehindFadeOutDurationMs()
interpolator = Interpolators.LINEAR
addUpdateListener { valueAnimator: ValueAnimator ->
surfaceBehindAlpha = valueAnimator.animatedValue as Float
@@ -355,8 +360,10 @@ class KeyguardUnlockAnimationController @Inject constructor(
}
with(wallpaperCannedUnlockAnimator) {
- duration = LAUNCHER_ICONS_ANIMATION_DURATION_MS
- interpolator = Interpolators.ALPHA_OUT
+ duration = if (fastUnlockTransition()) UNLOCK_ANIMATION_DURATION_MS
+ else LAUNCHER_ICONS_ANIMATION_DURATION_MS
+ interpolator = if (fastUnlockTransition()) Interpolators.LINEAR
+ else Interpolators.ALPHA_OUT
addUpdateListener { valueAnimator: ValueAnimator ->
setWallpaperAppearAmount(valueAnimator.animatedValue as Float)
}
@@ -370,8 +377,8 @@ class KeyguardUnlockAnimationController @Inject constructor(
}
with(surfaceBehindEntryAnimator) {
- duration = UNLOCK_ANIMATION_DURATION_MS
- startDelay = UNLOCK_ANIMATION_SURFACE_BEHIND_START_DELAY_MS
+ duration = unlockAnimationDurationMs()
+ startDelay = surfaceBehindFadeOutStartDelayMs()
interpolator = Interpolators.TOUCH_RESPONSE
addUpdateListener { valueAnimator: ValueAnimator ->
surfaceBehindAlpha = valueAnimator.animatedValue as Float
@@ -573,7 +580,7 @@ class KeyguardUnlockAnimationController @Inject constructor(
try {
launcherUnlockController?.playUnlockAnimation(
true,
- UNLOCK_ANIMATION_DURATION_MS + CANNED_UNLOCK_START_DELAY,
+ unlockAnimationDurationMs() + cannedUnlockStartDelayMs(),
0 /* startDelay */)
} catch (e: DeadObjectException) {
// Hello! If you are here investigating a bug where Launcher is blank (no icons)
@@ -602,12 +609,15 @@ class KeyguardUnlockAnimationController @Inject constructor(
// Notify if waking from AOD only
val isWakeAndUnlockNotFromDream = biometricUnlockControllerLazy.get().isWakeAndUnlock &&
biometricUnlockControllerLazy.get().mode != MODE_WAKE_AND_UNLOCK_FROM_DREAM
+
+ val duration = if (fastUnlockTransition()) UNLOCK_ANIMATION_DURATION_MS
+ else LAUNCHER_ICONS_ANIMATION_DURATION_MS
listeners.forEach {
it.onUnlockAnimationStarted(
playingCannedUnlockAnimation /* playingCannedAnimation */,
isWakeAndUnlockNotFromDream /* isWakeAndUnlockNotFromDream */,
- CANNED_UNLOCK_START_DELAY /* unlockStartDelay */,
- LAUNCHER_ICONS_ANIMATION_DURATION_MS /* unlockAnimationDuration */) }
+ cannedUnlockStartDelayMs() /* unlockStartDelay */,
+ duration /* unlockAnimationDuration */) }
// Finish the keyguard remote animation if the dismiss amount has crossed the threshold.
// Check it here in case there is no more change to the dismiss amount after the last change
@@ -675,7 +685,7 @@ class KeyguardUnlockAnimationController @Inject constructor(
launcherUnlockController?.playUnlockAnimation(
true /* unlocked */,
LAUNCHER_ICONS_ANIMATION_DURATION_MS /* duration */,
- CANNED_UNLOCK_START_DELAY /* startDelay */)
+ cannedUnlockStartDelayMs() /* startDelay */)
} catch (e: DeadObjectException) {
// Hello! If you are here investigating a bug where Launcher is blank (no icons)
// then the below assumption about Launcher's destruction was incorrect. This
@@ -696,9 +706,10 @@ class KeyguardUnlockAnimationController @Inject constructor(
lockscreenSmartspace?.visibility = View.INVISIBLE
}
- // As soon as the shade has animated out of the way, start the canned unlock animation,
+ // As soon as the shade starts animating out of the way, start the canned unlock animation,
// which will finish keyguard exit when it completes. The in-window animations in the
// Launcher window will end on their own.
+ if (fastUnlockTransition()) hideKeyguardViewAfterRemoteAnimation()
handler.postDelayed({
if (keyguardViewMediator.get().isShowingAndNotOccluded &&
!keyguardStateController.isKeyguardGoingAway) {
@@ -709,12 +720,12 @@ class KeyguardUnlockAnimationController @Inject constructor(
if ((wallpaperTargets?.isNotEmpty() == true)) {
fadeInWallpaper()
- hideKeyguardViewAfterRemoteAnimation()
+ if (!fastUnlockTransition()) hideKeyguardViewAfterRemoteAnimation()
} else {
keyguardViewMediator.get().exitKeyguardAndFinishSurfaceBehindRemoteAnimation(
false /* cancelled */)
}
- }, CANNED_UNLOCK_START_DELAY)
+ }, cannedUnlockStartDelayMs())
}
/**
@@ -1130,6 +1141,43 @@ class KeyguardUnlockAnimationController @Inject constructor(
?: false
}
+ /**
+ * Temporary method for b/298186160
+ * TODO (b/298186160) replace references with the constant itself when flag is removed
+ */
+ private fun cannedUnlockStartDelayMs(): Long {
+ return if (fastUnlockTransition()) CANNED_UNLOCK_START_DELAY
+ else LEGACY_CANNED_UNLOCK_START_DELAY
+ }
+
+ /**
+ * Temporary method for b/298186160
+ * TODO (b/298186160) replace references with the constant itself when flag is removed
+ */
+ private fun unlockAnimationDurationMs(): Long {
+ return if (fastUnlockTransition()) UNLOCK_ANIMATION_DURATION_MS
+ else LEGACY_UNLOCK_ANIMATION_DURATION_MS
+ }
+
+ /**
+ * Temporary method for b/298186160
+ * TODO (b/298186160) replace references with the constant itself when flag is removed
+ */
+ private fun surfaceBehindFadeOutDurationMs(): Long {
+ return if (fastUnlockTransition()) SURFACE_BEHIND_FADE_OUT_DURATION_MS
+ else LEGACY_SURFACE_BEHIND_SWIPE_FADE_DURATION_MS
+ }
+
+ /**
+ * Temporary method for b/298186160
+ * TODO (b/298186160) replace references with the constant itself when flag is removed
+ */
+ private fun surfaceBehindFadeOutStartDelayMs(): Long {
+ return if (fastUnlockTransition()) SURFACE_BEHIND_FADE_OUT_START_DELAY_MS
+ else LEGACY_UNLOCK_ANIMATION_SURFACE_BEHIND_START_DELAY_MS
+ }
+
+
companion object {
fun isFoldable(context: Context): Boolean {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/Lifecycle.java b/packages/SystemUI/src/com/android/systemui/keyguard/Lifecycle.java
index b870f589b746..4f5a6fe124ca 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/Lifecycle.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/Lifecycle.java
@@ -18,6 +18,10 @@ package com.android.systemui.keyguard;
import androidx.annotation.NonNull;
+import com.android.app.tracing.TraceUtils;
+
+import kotlin.Unit;
+
import java.util.ArrayList;
import java.util.Objects;
import java.util.function.BiConsumer;
@@ -28,7 +32,7 @@ import java.util.function.Consumer;
*/
public class Lifecycle<T> {
- private ArrayList<T> mObservers = new ArrayList<>();
+ private final ArrayList<T> mObservers = new ArrayList<>();
public void addObserver(@NonNull T observer) {
mObservers.add(Objects.requireNonNull(observer));
@@ -40,7 +44,11 @@ public class Lifecycle<T> {
public void dispatch(Consumer<T> consumer) {
for (int i = 0; i < mObservers.size(); i++) {
- consumer.accept(mObservers.get(i));
+ final T observer = mObservers.get(i);
+ TraceUtils.trace(() -> "dispatch#" + consumer.toString(), () -> {
+ consumer.accept(observer);
+ return Unit.INSTANCE;
+ });
}
}
@@ -49,7 +57,11 @@ public class Lifecycle<T> {
*/
public <U> void dispatch(BiConsumer<T, U> biConsumer, U arg) {
for (int i = 0; i < mObservers.size(); i++) {
- biConsumer.accept(mObservers.get(i), arg);
+ final T observer = mObservers.get(i);
+ TraceUtils.trace(() -> "dispatch#" + biConsumer.toString(), () -> {
+ biConsumer.accept(observer, arg);
+ return Unit.INSTANCE;
+ });
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt
index 7337292a9ac5..a988a5c2d67a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt
@@ -32,13 +32,19 @@ import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.wallet.controller.QuickAccessWalletController
import com.android.systemui.wallet.util.getPaymentCards
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import javax.inject.Inject
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.suspendCancellableCoroutine
+import kotlinx.coroutines.withContext
/** Quick access wallet quick affordance data source. */
@SysUISingleton
@@ -46,6 +52,7 @@ class QuickAccessWalletKeyguardQuickAffordanceConfig
@Inject
constructor(
@Application private val context: Context,
+ @Background private val backgroundDispatcher: CoroutineDispatcher,
private val walletController: QuickAccessWalletController,
private val activityStarter: ActivityStarter,
) : KeyguardQuickAffordanceConfig {
@@ -56,6 +63,7 @@ constructor(
override val pickerIconResourceId = R.drawable.ic_wallet_lockscreen
+ @OptIn(ExperimentalCoroutinesApi::class)
override val lockScreenState: Flow<KeyguardQuickAffordanceConfig.LockScreenState> =
conflatedCallbackFlow {
val callback =
@@ -63,11 +71,7 @@ constructor(
override fun onWalletCardsRetrieved(response: GetWalletCardsResponse) {
val hasCards = getPaymentCards(response.walletCards)?.isNotEmpty() == true
trySendWithFailureLogging(
- state(
- isFeatureEnabled = isWalletAvailable(),
- hasCard = hasCards,
- tileIcon = walletController.walletClient.tileIcon,
- ),
+ hasCards,
TAG,
)
}
@@ -75,7 +79,7 @@ constructor(
override fun onWalletCardRetrievalError(error: GetWalletCardsError) {
Log.e(TAG, "Wallet card retrieval error, message: \"${error?.message}\"")
trySendWithFailureLogging(
- KeyguardQuickAffordanceConfig.LockScreenState.Hidden,
+ null,
TAG,
)
}
@@ -86,8 +90,12 @@ constructor(
QuickAccessWalletController.WalletChangeEvent.WALLET_PREFERENCE_CHANGE,
QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE
)
- walletController.updateWalletPreference()
- walletController.queryWalletCards(callback)
+
+ withContext(backgroundDispatcher) {
+ // Both must be called on background thread
+ walletController.updateWalletPreference()
+ walletController.queryWalletCards(callback)
+ }
awaitClose {
walletController.unregisterWalletChangeObservers(
@@ -95,6 +103,19 @@ constructor(
QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE
)
}
+ }.flatMapLatest { hasCards ->
+ // If hasCards is null, this indicates an error occurred upon card retrieval
+ val state =
+ if (hasCards == null) {
+ KeyguardQuickAffordanceConfig.LockScreenState.Hidden
+ } else {
+ state(
+ isWalletAvailable(),
+ hasCards,
+ walletController.walletClient.tileIcon,
+ )
+ }
+ flowOf(state)
}
override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState {
@@ -131,25 +152,33 @@ constructor(
}
private suspend fun queryCards(): List<WalletCard> {
- return suspendCancellableCoroutine { continuation ->
- val callback =
- object : QuickAccessWalletClient.OnWalletCardsRetrievedCallback {
- override fun onWalletCardsRetrieved(response: GetWalletCardsResponse) {
- continuation.resumeWith(
- Result.success(getPaymentCards(response.walletCards) ?: emptyList())
- )
+ return withContext(backgroundDispatcher) {
+ suspendCancellableCoroutine { continuation ->
+ val callback =
+ object : QuickAccessWalletClient.OnWalletCardsRetrievedCallback {
+ override fun onWalletCardsRetrieved(response: GetWalletCardsResponse) {
+ continuation.resumeWith(
+ Result.success(getPaymentCards(response.walletCards))
+ )
+ }
+
+ override fun onWalletCardRetrievalError(error: GetWalletCardsError) {
+ continuation.resumeWith(Result.success(emptyList()))
+ }
}
-
- override fun onWalletCardRetrievalError(error: GetWalletCardsError) {
- continuation.resumeWith(Result.success(emptyList()))
- }
- }
- walletController.queryWalletCards(callback)
+ // Must be called on background thread
+ walletController.queryWalletCards(callback)
+ }
}
}
- private fun isWalletAvailable() =
- with(walletController.walletClient) { isWalletServiceAvailable && isWalletFeatureAvailable }
+ private suspend fun isWalletAvailable() =
+ withContext(backgroundDispatcher) {
+ with(walletController.walletClient) {
+ // Must be called on background thread
+ isWalletServiceAvailable && isWalletFeatureAvailable
+ }
+ }
private fun state(
isFeatureEnabled: Boolean,
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt
index 36412e31e7c0..e47c44863980 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt
@@ -187,8 +187,7 @@ constructor(
faceManager?.sensorPropertiesInternal?.firstOrNull()?.supportsFaceDetection ?: false
private val _isAuthRunning = MutableStateFlow(false)
- override val isAuthRunning: StateFlow<Boolean>
- get() = _isAuthRunning
+ override val isAuthRunning: StateFlow<Boolean> = _isAuthRunning
private val keyguardSessionId: InstanceId?
get() = sessionTracker.getSessionId(StatusBarManager.SESSION_KEYGUARD)
@@ -254,6 +253,13 @@ constructor(
)
.andAllFlows("canFaceAuthRun", faceAuthLog)
.flowOn(backgroundDispatcher)
+ .onEach {
+ faceAuthLogger.canFaceAuthRunChanged(it)
+ if (!it) {
+ // Cancel currently running auth if any of the gating checks are false.
+ cancel()
+ }
+ }
.stateIn(applicationScope, SharingStarted.Eagerly, false)
// Face detection can run only when lockscreen bypass is enabled
@@ -281,9 +287,12 @@ constructor(
)
.andAllFlows("canFaceDetectRun", faceDetectLog)
.flowOn(backgroundDispatcher)
+ .onEach {
+ if (!it) {
+ cancelDetection()
+ }
+ }
.stateIn(applicationScope, SharingStarted.Eagerly, false)
- observeFaceAuthGatingChecks()
- observeFaceDetectGatingChecks()
observeFaceAuthResettingConditions()
listenForSchedulingWatchdog()
processPendingAuthRequests()
@@ -317,6 +326,7 @@ constructor(
it.selectionStatus == SelectionStatus.SELECTION_IN_PROGRESS
},
)
+ .flowOn(backgroundDispatcher)
.onEach { anyOfThemIsTrue ->
if (anyOfThemIsTrue) {
clearPendingAuthRequest("Resetting auth status")
@@ -337,17 +347,6 @@ constructor(
pendingAuthenticateRequest.value = null
}
- private fun observeFaceDetectGatingChecks() {
- canRunDetection
- .onEach {
- if (!it) {
- cancelDetection()
- }
- }
- .flowOn(mainDispatcher)
- .launchIn(applicationScope)
- }
-
private fun isUdfps() =
deviceEntryFingerprintAuthRepository.availableFpSensorType.map {
it == BiometricType.UNDER_DISPLAY_FINGERPRINT
@@ -406,20 +405,6 @@ constructor(
)
}
- private fun observeFaceAuthGatingChecks() {
- canRunFaceAuth
- .onEach {
- faceAuthLogger.canFaceAuthRunChanged(it)
- if (!it) {
- // Cancel currently running auth if any of the gating checks are false.
- faceAuthLogger.cancellingFaceAuth()
- cancel()
- }
- }
- .flowOn(mainDispatcher)
- .launchIn(applicationScope)
- }
-
private val faceAuthCallback =
object : FaceManager.AuthenticationCallback() {
override fun onAuthenticationFailed() {
@@ -554,7 +539,7 @@ constructor(
authenticate(it.uiEvent, it.fallbackToDetection)
}
}
- .flowOn(mainDispatcher)
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
}
@@ -650,6 +635,7 @@ constructor(
override fun cancel() {
if (authCancellationSignal == null) return
+ faceAuthLogger.cancellingFaceAuth()
authCancellationSignal?.cancel()
cancelNotReceivedHandlerJob?.cancel()
cancelNotReceivedHandlerJob =
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt
index d1c62188d3fc..8d5e6c391e6e 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt
@@ -19,34 +19,71 @@ package com.android.systemui.keyguard.data.repository
import android.os.UserHandle
import android.provider.Settings
import androidx.annotation.VisibleForTesting
-import com.android.keyguard.KeyguardClockSwitch.SMALL
+import com.android.keyguard.ClockEventController
+import com.android.keyguard.KeyguardClockSwitch.ClockSize
+import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.keyguard.shared.model.SettingsClockSize
+import com.android.systemui.plugins.ClockController
import com.android.systemui.plugins.ClockId
import com.android.systemui.shared.clocks.ClockRegistry
import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.settings.SettingsProxyExt.observerFlow
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.withContext
+interface KeyguardClockRepository {
+ /** clock size determined by notificationPanelViewController, LARGE or SMALL */
+ val clockSize: StateFlow<Int>
+
+ /** clock size selected in picker, DYNAMIC or SMALL */
+ val selectedClockSize: Flow<SettingsClockSize>
+
+ /** clock id, selected from clock carousel in wallpaper picker */
+ val currentClockId: Flow<ClockId>
+
+ val currentClock: StateFlow<ClockController?>
+
+ val clockEventController: ClockEventController
+ fun setClockSize(@ClockSize size: Int)
+}
+
@SysUISingleton
-class KeyguardClockRepository
+class KeyguardClockRepositoryImpl
@Inject
constructor(
private val secureSettings: SecureSettings,
private val clockRegistry: ClockRegistry,
+ override val clockEventController: ClockEventController,
@Background private val backgroundDispatcher: CoroutineDispatcher,
-) {
+ @Application private val applicationScope: CoroutineScope,
+) : KeyguardClockRepository {
+
+ /** Receive SMALL or LARGE clock should be displayed on keyguard. */
+ private val _clockSize: MutableStateFlow<Int> = MutableStateFlow(LARGE)
+ override val clockSize: StateFlow<Int> = _clockSize.asStateFlow()
- val selectedClockSize: Flow<SettingsClockSize> =
+ override fun setClockSize(size: Int) {
+ _clockSize.value = size
+ }
+
+ override val selectedClockSize: Flow<SettingsClockSize> =
secureSettings
.observerFlow(
names = arrayOf(Settings.Secure.LOCKSCREEN_USE_DOUBLE_LINE_CLOCK),
@@ -55,7 +92,7 @@ constructor(
.onStart { emit(Unit) } // Forces an initial update.
.map { getClockSize() }
- val currentClockId: Flow<ClockId> =
+ override val currentClockId: Flow<ClockId> =
callbackFlow {
fun send() {
trySend(clockRegistry.currentClockId)
@@ -72,8 +109,16 @@ constructor(
awaitClose { clockRegistry.unregisterClockChangeListener(listener) }
}
.mapNotNull { it }
+ .distinctUntilChanged()
- val currentClock = currentClockId.map { clockRegistry.createCurrentClock() }
+ override val currentClock: StateFlow<ClockController?> =
+ currentClockId
+ .map { clockRegistry.createCurrentClock() }
+ .stateIn(
+ scope = applicationScope,
+ started = SharingStarted.WhileSubscribed(),
+ initialValue = clockRegistry.createCurrentClock()
+ )
@VisibleForTesting
suspend fun getClockSize(): SettingsClockSize {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
index 6ff446edca38..791ac07db5cf 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
@@ -18,8 +18,6 @@ package com.android.systemui.keyguard.data.repository
import android.graphics.Point
import android.hardware.biometrics.BiometricSourceType
-import com.android.keyguard.KeyguardClockSwitch.ClockSize
-import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.systemui.biometrics.AuthController
@@ -192,9 +190,6 @@ interface KeyguardRepository {
/** Observable updated when keyguardDone should be called either now or soon. */
val keyguardDone: Flow<KeyguardDone>
- /** Receive SMALL or LARGE clock should be displayed on keyguard. */
- val clockSize: Flow<Int>
-
/** Receive whether clock should be centered on lockscreen. */
val clockShouldBeCentered: Flow<Boolean>
@@ -247,8 +242,6 @@ interface KeyguardRepository {
suspend fun setKeyguardDone(keyguardDoneType: KeyguardDone)
- fun setClockSize(@ClockSize size: Int)
-
fun setClockShouldBeCentered(shouldBeCentered: Boolean)
}
@@ -293,9 +286,6 @@ constructor(
private val _clockPosition = MutableStateFlow(Position(0, 0))
override val clockPosition = _clockPosition.asStateFlow()
- private val _clockSize = MutableStateFlow(LARGE)
- override val clockSize: Flow<Int> = _clockSize.asStateFlow()
-
private val _clockShouldBeCentered = MutableStateFlow(true)
override val clockShouldBeCentered: Flow<Boolean> = _clockShouldBeCentered.asStateFlow()
@@ -681,10 +671,6 @@ constructor(
_isActiveDreamLockscreenHosted.value = isLockscreenHosted
}
- override fun setClockSize(@ClockSize size: Int) {
- _clockSize.value = size
- }
-
override fun setClockShouldBeCentered(shouldBeCentered: Boolean) {
_clockShouldBeCentered.value = shouldBeCentered
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt
index 565962394db1..6138330c2e76 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt
@@ -74,4 +74,6 @@ interface KeyguardRepositoryModule {
fun bind(impl: BouncerMessageAuditLogger): CoreStartable
@Binds fun trustRepository(impl: TrustRepositoryImpl): TrustRepository
+
+ @Binds fun keyguardClockRepository(impl: KeyguardClockRepositoryImpl): KeyguardClockRepository
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt
index bd73d60cda29..62a0b0ebc08c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt
@@ -131,13 +131,16 @@ constructor(
when (toState) {
KeyguardState.DREAMING -> TO_DREAMING_DURATION
KeyguardState.AOD -> TO_AOD_DURATION
+ KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION
else -> DEFAULT_DURATION
}.inWholeMilliseconds
}
}
+
companion object {
private val DEFAULT_DURATION = 500.milliseconds
val TO_DREAMING_DURATION = 933.milliseconds
val TO_AOD_DURATION = 1300.milliseconds
+ val TO_LOCKSCREEN_DURATION = DEFAULT_DURATION
}
}
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 152d2172ee4c..cbfd17ff7ae4 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
@@ -380,6 +380,8 @@ constructor(
KeyguardState.DREAMING -> TO_DREAMING_DURATION
KeyguardState.OCCLUDED -> TO_OCCLUDED_DURATION
KeyguardState.AOD -> TO_AOD_DURATION
+ KeyguardState.DOZING -> TO_DOZING_DURATION
+ KeyguardState.DREAMING_LOCKSCREEN_HOSTED -> TO_DREAMING_HOSTED_DURATION
else -> DEFAULT_DURATION
}.inWholeMilliseconds
}
@@ -388,7 +390,9 @@ constructor(
companion object {
const val TAG = "FromLockscreenTransitionInteractor"
private val DEFAULT_DURATION = 400.milliseconds
+ val TO_DOZING_DURATION = 500.milliseconds
val TO_DREAMING_DURATION = 933.milliseconds
+ val TO_DREAMING_HOSTED_DURATION = 933.milliseconds
val TO_OCCLUDED_DURATION = 450.milliseconds
val TO_AOD_DURATION = 500.milliseconds
val TO_PRIMARY_BOUNCER_DURATION = DEFAULT_DURATION
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
index 2f103f612563..3887e69a47a2 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
@@ -18,6 +18,7 @@
package com.android.systemui.keyguard.domain.interactor
import com.android.keyguard.ClockEventController
+import com.android.keyguard.KeyguardClockSwitch.ClockSize
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.data.repository.KeyguardClockRepository
import com.android.systemui.keyguard.shared.model.SettingsClockSize
@@ -25,6 +26,7 @@ import com.android.systemui.plugins.ClockController
import com.android.systemui.plugins.ClockId
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.StateFlow
private val TAG = KeyguardClockInteractor::class.simpleName
/** Manages keyguard clock for the lockscreen root view. */
@@ -33,7 +35,6 @@ private val TAG = KeyguardClockInteractor::class.simpleName
class KeyguardClockInteractor
@Inject
constructor(
- val eventController: ClockEventController,
private val keyguardClockRepository: KeyguardClockRepository,
) {
@@ -41,11 +42,17 @@ constructor(
val currentClockId: Flow<ClockId> = keyguardClockRepository.currentClockId
- val currentClock: Flow<ClockController> = keyguardClockRepository.currentClock
+ val currentClock: StateFlow<ClockController?> = keyguardClockRepository.currentClock
- var clock: ClockController?
- get() = eventController.clock
- set(value) {
- eventController.clock = value
+ var clock: ClockController? by keyguardClockRepository.clockEventController::clock
+
+ val clockSize: StateFlow<Int> = keyguardClockRepository.clockSize
+ fun setClockSize(@ClockSize size: Int) {
+ keyguardClockRepository.setClockSize(size)
+ }
+
+ val clockEventController: ClockEventController
+ get() {
+ return keyguardClockRepository.clockEventController
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
index e58d7710877b..c0e8e2b60f33 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
@@ -23,7 +23,6 @@ import android.app.StatusBarManager
import android.graphics.Point
import android.util.MathUtils
import com.android.app.animation.Interpolators
-import com.android.keyguard.KeyguardClockSwitch.ClockSize
import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository
import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
@@ -243,8 +242,6 @@ constructor(
}
}
- val clockSize: Flow<Int> = repository.clockSize.distinctUntilChanged()
-
val clockShouldBeCentered: Flow<Boolean> = repository.clockShouldBeCentered
/** Whether to animate the next doze mode transition. */
@@ -321,10 +318,6 @@ constructor(
repository.setAnimateDozingTransitions(animate)
}
- fun setClockSize(@ClockSize size: Int) {
- repository.setClockSize(size)
- }
-
fun setClockShouldBeCentered(shouldBeCentered: Boolean) {
repository.setClockShouldBeCentered(shouldBeCentered)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt
index 706aba3c0505..f7d1543e4650 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt
@@ -72,6 +72,10 @@ constructor(
val fromDreamingTransition: Flow<TransitionStep> =
repository.transitions.filter { step -> step.from == DREAMING }
+ /** LOCKSCREEN->(any) transition information. */
+ val fromLockscreenTransition: Flow<TransitionStep> =
+ repository.transitions.filter { step -> step.from == LOCKSCREEN }
+
/** (any)->Lockscreen transition information */
val anyStateToLockscreenTransition: Flow<TransitionStep> =
repository.transitions.filter { step -> step.to == LOCKSCREEN }
@@ -113,9 +117,16 @@ constructor(
val goneToDreamingLockscreenHostedTransition: Flow<TransitionStep> =
repository.transition(GONE, DREAMING_LOCKSCREEN_HOSTED)
+ /** GONE->LOCKSCREEN transition information. */
+ val goneToLockscreenTransition: Flow<TransitionStep> = repository.transition(GONE, LOCKSCREEN)
+
/** LOCKSCREEN->AOD transition information. */
val lockscreenToAodTransition: Flow<TransitionStep> = repository.transition(LOCKSCREEN, AOD)
+ /** LOCKSCREEN->DOZING transition information. */
+ val lockscreenToDozingTransition: Flow<TransitionStep> =
+ repository.transition(LOCKSCREEN, DOZING)
+
/** LOCKSCREEN->DREAMING transition information. */
val lockscreenToDreamingTransition: Flow<TransitionStep> =
repository.transition(LOCKSCREEN, DREAMING)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt
index ae356cd94350..532df4afebf7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt
@@ -29,6 +29,7 @@ import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
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.keyguard.data.repository.BiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthRepository
@@ -69,6 +70,7 @@ constructor(
private val context: Context,
@Application private val applicationScope: CoroutineScope,
@Main private val mainDispatcher: CoroutineDispatcher,
+ @Background private val backgroundDispatcher: CoroutineDispatcher,
private val repository: DeviceEntryFaceAuthRepository,
private val primaryBouncerInteractor: Lazy<PrimaryBouncerInteractor>,
private val alternateBouncerInteractor: AlternateBouncerInteractor,
@@ -104,6 +106,7 @@ constructor(
fallbackToDetect = false
)
}
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
alternateBouncerInteractor.isVisible
@@ -115,6 +118,7 @@ constructor(
fallbackToDetect = false
)
}
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
merge(
@@ -143,6 +147,7 @@ constructor(
fallbackToDetect = true
)
}
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
deviceEntryFingerprintAuthRepository.isLockedOut
@@ -155,6 +160,7 @@ constructor(
}
}
}
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
// User switching should stop face auth and then when it is complete we should trigger face
@@ -178,6 +184,7 @@ constructor(
)
}
}
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
index 594865d38600..d1d323fff87f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
@@ -49,7 +49,7 @@ object AlternateBouncerViewBinder {
swipeUpAnywhereGestureHandler: SwipeUpAnywhereGestureHandler,
tapGestureDetector: TapGestureDetector,
) {
- DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode()
+ if (DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode()) return
scope.launch {
// forcePluginOpen is necessary to show over occluded apps.
// This cannot be tied to the view's lifecycle because setting this allows the view
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt
index c688cfff2bf9..48f6092fd570 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt
@@ -17,15 +17,16 @@
package com.android.systemui.keyguard.ui.binder
import android.transition.TransitionManager
+import androidx.annotation.VisibleForTesting
+import androidx.constraintlayout.helper.widget.Layer
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.systemui.flags.FeatureFlagsClassic
import com.android.systemui.flags.Flags
-import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
-import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
+import com.android.systemui.keyguard.ui.view.layout.sections.ClockSection
import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.plugins.ClockController
@@ -40,13 +41,12 @@ object KeyguardClockViewBinder {
clockSection: ClockSection,
keyguardRootView: ConstraintLayout,
viewModel: KeyguardClockViewModel,
- keyguardBlueprintInteractor: KeyguardBlueprintInteractor,
keyguardClockInteractor: KeyguardClockInteractor,
featureFlags: FeatureFlagsClassic,
) {
keyguardRootView.repeatWhenAttached {
repeatOnLifecycle(Lifecycle.State.CREATED) {
- keyguardClockInteractor.eventController.registerListeners(keyguardRootView)
+ keyguardClockInteractor.clockEventController.registerListeners(keyguardRootView)
}
}
keyguardRootView.repeatWhenAttached {
@@ -54,10 +54,11 @@ object KeyguardClockViewBinder {
launch {
if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) return@launch
viewModel.currentClock.collect { currentClock ->
- viewModel.clock?.let { clock -> cleanupClockViews(clock, keyguardRootView) }
+ cleanupClockViews(viewModel.clock, keyguardRootView, viewModel.burnInLayer)
viewModel.clock = currentClock
- addClockViews(currentClock, keyguardRootView)
- keyguardBlueprintInteractor.refreshBlueprint()
+ addClockViews(currentClock, keyguardRootView, viewModel.burnInLayer)
+ viewModel.burnInLayer?.updatePostLayout(keyguardRootView)
+ applyConstraints(clockSection, keyguardRootView, true)
}
}
// TODO: Weather clock dozing animation
@@ -71,13 +72,61 @@ object KeyguardClockViewBinder {
}
launch {
if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) return@launch
- viewModel.clockShouldBeCentered.collect { shouldBeCentered ->
- clockSection.setClockShouldBeCentered(
- viewModel.useLargeClock && shouldBeCentered
- )
+ viewModel.clockShouldBeCentered.collect {
applyConstraints(clockSection, keyguardRootView, true)
}
}
+ launch {
+ if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) return@launch
+ viewModel.hasCustomWeatherDataDisplay.collect {
+ applyConstraints(clockSection, keyguardRootView, true)
+ }
+ }
+ }
+ }
+ }
+
+ private fun cleanupClockViews(
+ clockController: ClockController?,
+ rootView: ConstraintLayout,
+ burnInLayer: Layer?
+ ) {
+ clockController?.let { clock ->
+ clock.smallClock.layout.views.forEach {
+ burnInLayer?.removeView(it)
+ rootView.removeView(it)
+ }
+ // add large clock to burn in layer only when it will have same transition with other
+ // components in AOD
+ // otherwise, it will have a separate scale transition while other components only have
+ // translate transition
+ if (clock.config.useAlternateSmartspaceAODTransition) {
+ clock.largeClock.layout.views.forEach { burnInLayer?.removeView(it) }
+ }
+ clock.largeClock.layout.views.forEach { rootView.removeView(it) }
+ }
+ }
+
+ @VisibleForTesting
+ fun addClockViews(
+ clockController: ClockController?,
+ rootView: ConstraintLayout,
+ burnInLayer: Layer?
+ ) {
+ clockController?.let { clock ->
+ clock.smallClock.layout.views[0].id = R.id.lockscreen_clock_view
+ if (clock.largeClock.layout.views.size == 1) {
+ clock.largeClock.layout.views[0].id = R.id.lockscreen_clock_view_large
+ }
+ // small clock should either be a single view or container with id
+ // `lockscreen_clock_view`
+ clock.smallClock.layout.views.forEach {
+ rootView.addView(it)
+ burnInLayer?.addView(it)
+ }
+ clock.largeClock.layout.views.forEach { rootView.addView(it) }
+ if (clock.config.useAlternateSmartspaceAODTransition) {
+ clock.largeClock.layout.views.forEach { burnInLayer?.addView(it) }
}
}
}
@@ -92,22 +141,6 @@ object KeyguardClockViewBinder {
if (animated) {
TransitionManager.beginDelayedTransition(rootView)
}
-
constraintSet.applyTo(rootView)
}
-
- private fun cleanupClockViews(clock: ClockController, rootView: ConstraintLayout) {
- clock.smallClock.layout.views.forEach { rootView.removeView(it) }
- clock.largeClock.layout.views.forEach { rootView.removeView(it) }
- }
-
- private fun addClockViews(clock: ClockController, rootView: ConstraintLayout) {
- clock.smallClock.layout.views[0].id = R.id.lockscreen_clock_view
- if (clock.largeClock.layout.views.size == 1) {
- clock.largeClock.layout.views[0].id = R.id.lockscreen_clock_view_large
- }
- // small clock should either be a single view or container with id `lockscreen_clock_view`
- clock.smallClock.layout.views.forEach { rootView.addView(it) }
- clock.largeClock.layout.views.forEach { rootView.addView(it) }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
index 1a8f62597037..4efd9ef5f21c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
@@ -23,10 +23,10 @@ import android.widget.TextView
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.systemui.Flags.keyguardBottomAreaRefactor
-import com.android.systemui.res.R
import com.android.systemui.keyguard.ui.viewmodel.KeyguardIndicationAreaViewModel
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.res.R
import com.android.systemui.statusbar.KeyguardIndicationController
import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.ExperimentalCoroutinesApi
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
index 99025acef70d..abd79ab793d5 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardQuickAffordanceViewBinder.kt
@@ -30,9 +30,7 @@ import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
-import com.android.app.animation.Interpolators
import com.android.settingslib.Utils
-import com.android.systemui.res.R
import com.android.systemui.animation.Expandable
import com.android.systemui.animation.view.LaunchableImageView
import com.android.systemui.common.shared.model.Icon
@@ -40,6 +38,7 @@ import com.android.systemui.common.ui.binder.IconViewBinder
import com.android.systemui.keyguard.ui.viewmodel.KeyguardQuickAffordanceViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.plugins.FalsingManager
+import com.android.systemui.res.R
import com.android.systemui.statusbar.VibratorHelper
import com.android.systemui.util.doOnEnd
import kotlinx.coroutines.flow.Flow
@@ -48,9 +47,7 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
-/**
- * This is only for a SINGLE Quick affordance
- */
+/** This is only for a SINGLE Quick affordance */
object KeyguardQuickAffordanceViewBinder {
private const val EXIT_DOZE_BUTTON_REVEAL_ANIMATION_DURATION_MS = 250L
@@ -135,28 +132,12 @@ object KeyguardQuickAffordanceViewBinder {
vibratorHelper: VibratorHelper?,
) {
if (!viewModel.isVisible) {
- view.alpha = 1f
- view
- .animate()
- .alpha(0f)
- .setInterpolator(Interpolators.FAST_OUT_LINEAR_IN)
- .setDuration(EXIT_DOZE_BUTTON_REVEAL_ANIMATION_DURATION_MS)
- .withEndAction { view.isInvisible = true }
- .start()
+ view.isInvisible = true
return
}
if (!view.isVisible) {
view.isVisible = true
- if (viewModel.animateReveal) {
- view.alpha = 0f
- view
- .animate()
- .alpha(1f)
- .setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN)
- .setDuration(EXIT_DOZE_BUTTON_REVEAL_ANIMATION_DURATION_MS)
- .start()
- }
}
IconViewBinder.bind(viewModel.icon, view)
@@ -216,13 +197,14 @@ object KeyguardQuickAffordanceViewBinder {
view.isClickable = viewModel.isClickable
if (viewModel.isClickable) {
if (viewModel.useLongPress) {
- val onTouchListener = KeyguardQuickAffordanceOnTouchListener(
- view,
- viewModel,
- messageDisplayer,
- vibratorHelper,
- falsingManager,
- )
+ val onTouchListener =
+ KeyguardQuickAffordanceOnTouchListener(
+ view,
+ viewModel,
+ messageDisplayer,
+ vibratorHelper,
+ falsingManager,
+ )
view.setOnTouchListener(onTouchListener)
view.setOnClickListener {
messageDisplayer.invoke(R.string.keyguard_affordance_press_too_short)
@@ -241,9 +223,7 @@ object KeyguardQuickAffordanceViewBinder {
KeyguardBottomAreaVibrations.ShakeAnimationDuration.inWholeMilliseconds
shakeAnimator.interpolator =
CycleInterpolator(KeyguardBottomAreaVibrations.ShakeAnimationCycles)
- shakeAnimator.doOnEnd {
- view.translationX = 0f
- }
+ shakeAnimator.doOnEnd { view.translationX = 0f }
shakeAnimator.start()
vibratorHelper?.vibrate(KeyguardBottomAreaVibrations.Shake)
@@ -268,18 +248,18 @@ object KeyguardQuickAffordanceViewBinder {
alphaFlow: Flow<Float>,
) {
combine(viewModel.map { it.isDimmed }, alphaFlow) { isDimmed, alpha ->
- if (isDimmed) DIM_ALPHA else alpha
- }
+ if (isDimmed) DIM_ALPHA else alpha
+ }
.collect { view.alpha = it }
}
private fun loadFromResources(view: View): ConfigurationBasedDimensions {
return ConfigurationBasedDimensions(
buttonSizePx =
- Size(
- view.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_width),
- view.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_height),
- ),
+ Size(
+ view.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_width),
+ view.resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_height),
+ ),
)
}
@@ -337,11 +317,9 @@ object KeyguardQuickAffordanceViewBinder {
}
override fun onLongClickUseDefaultHapticFeedback(view: View) = false
-
}
private data class ConfigurationBasedDimensions(
val buttonSizePx: Size,
)
-
-} \ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
index c0d3d336719e..51e1f60acd64 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
@@ -41,6 +41,7 @@ import com.android.systemui.common.shared.model.TintedIcon
import com.android.systemui.common.ui.ConfigurationState
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryHapticsInteractor
import com.android.systemui.flags.FeatureFlagsClassic
+import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.shared.KeyguardShadeMigrationNssl
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
@@ -140,25 +141,35 @@ object KeyguardRootViewBinder {
}
launch {
+ // When translation happens in burnInLayer, it won't be weather clock
+ // large clock isn't added to burnInLayer due to its scale transition
+ // so we also need to add translation to it here
+ // same as translationX
viewModel.translationY.collect { y ->
childViews[burnInLayerId]?.translationY = y
+ childViews[largeClockId]?.translationY = y
}
}
launch {
viewModel.translationX.collect { x ->
childViews[burnInLayerId]?.translationX = x
+ childViews[largeClockId]?.translationX = x
}
}
launch {
viewModel.scale.collect { (scale, scaleClockOnly) ->
if (scaleClockOnly) {
+ // For clocks except weather clock, we have scale transition
+ // besides translate
childViews[largeClockId]?.let {
it.scaleX = scale
it.scaleY = scale
}
} else {
+ // For weather clock, large clock should have only scale
+ // transition with other parts in burnInLayer
childViews[burnInLayerId]?.scaleX = scale
childViews[burnInLayerId]?.scaleY = scale
}
@@ -247,7 +258,10 @@ object KeyguardRootViewBinder {
}
}
}
- viewModel.clockControllerProvider = clockControllerProvider
+
+ if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ viewModel.clockControllerProvider = clockControllerProvider
+ }
onLayoutChangeListener = OnLayoutChange(viewModel)
view.addOnLayoutChangeListener(onLayoutChangeListener)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
index 41a2e509b5d0..954d2cf6ed8a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
@@ -1,3 +1,19 @@
+/*
+ * 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 com.android.systemui.keyguard.ui.binder
import androidx.constraintlayout.widget.ConstraintLayout
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt
index 0bee48a63a28..560e4adf956a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt
@@ -19,11 +19,10 @@ package com.android.systemui.keyguard.ui.binder
import android.animation.ValueAnimator
import android.graphics.Point
import com.android.systemui.CoreStartable
+import com.android.systemui.Flags
import com.android.systemui.biometrics.SideFpsController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.flags.FeatureFlagsClassic
-import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.ui.view.SideFpsProgressBar
import com.android.systemui.keyguard.ui.viewmodel.SideFpsProgressBarViewModel
import com.android.systemui.log.SideFpsLogger
@@ -50,11 +49,10 @@ constructor(
private val sfpsController: dagger.Lazy<SideFpsController>,
private val logger: SideFpsLogger,
private val commandRegistry: CommandRegistry,
- private val featureFlagsClassic: FeatureFlagsClassic,
) : CoreStartable {
override fun start() {
- if (!featureFlagsClassic.isEnabled(Flags.REST_TO_UNLOCK)) {
+ if (!Flags.restToUnlock()) {
return
}
// When the rest to unlock feature is disabled by the user, stop any coroutines that are
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
index a2e930c49511..11872d90cc34 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
@@ -84,6 +84,7 @@ import dagger.assisted.AssistedInject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
/** Renders the preview of the lock screen. */
@@ -118,7 +119,6 @@ constructor(
private val screenOffAnimationController: ScreenOffAnimationController,
private val shadeInteractor: ShadeInteractor,
) {
-
val hostToken: IBinder? = bundle.getBinder(KEY_HOST_TOKEN)
private val width: Int = bundle.getInt(KEY_VIEW_WIDTH)
private val height: Int = bundle.getInt(KEY_VIEW_HEIGHT)
@@ -158,7 +158,6 @@ constructor(
init {
if (keyguardBottomAreaRefactor()) {
- keyguardRootViewModel.enablePreviewMode()
quickAffordancesCombinedViewModel.enablePreviewMode(
initiallySelectedSlotId =
bundle.getString(
@@ -287,6 +286,10 @@ constructor(
return
}
+ if (smartSpaceView != null) {
+ parentView.removeView(smartSpaceView)
+ }
+
smartSpaceView = lockscreenSmartspaceController.buildAndConnectDateView(parentView)
val topPadding: Int =
@@ -334,26 +337,27 @@ constructor(
),
)
}
-
@OptIn(ExperimentalCoroutinesApi::class)
private fun setupKeyguardRootView(previewContext: Context, rootView: FrameLayout) {
val keyguardRootView = KeyguardRootView(previewContext, null)
- disposables.add(
- KeyguardRootViewBinder.bind(
- keyguardRootView,
- keyguardRootViewModel,
- configuration,
- featureFlags,
- occludingAppDeviceEntryMessageViewModel,
- chipbarCoordinator,
- screenOffAnimationController,
- shadeInteractor,
- null, // clock provider only needed for burn in
- null, // jank monitor not required for preview mode
- null, // device entry haptics not required for preview mode
- null, // device entry haptics not required for preview mode
+ if (!keyguardBottomAreaRefactor()) {
+ disposables.add(
+ KeyguardRootViewBinder.bind(
+ keyguardRootView,
+ keyguardRootViewModel,
+ configuration,
+ featureFlags,
+ occludingAppDeviceEntryMessageViewModel,
+ chipbarCoordinator,
+ screenOffAnimationController,
+ shadeInteractor,
+ null, // clock provider only needed for burn in
+ null, // jank monitor not required for preview mode
+ null, // device entry haptics not required preview mode
+ null, // device entry haptics not required for preview mode
+ )
)
- )
+ }
rootView.addView(
keyguardRootView,
FrameLayout.LayoutParams(
@@ -362,12 +366,13 @@ constructor(
),
)
+ setUpUdfps(previewContext, rootView)
+
disposables.add(
PreviewKeyguardBlueprintViewBinder.bind(keyguardRootView, keyguardBlueprintViewModel) {
if (keyguardBottomAreaRefactor()) {
setupShortcuts(keyguardRootView)
}
- setUpUdfps(previewContext, rootView)
if (!shouldHideClock) {
setUpClock(previewContext, rootView)
@@ -387,30 +392,30 @@ constructor(
}
private fun setupShortcuts(keyguardRootView: ConstraintLayout) {
- keyguardRootView.findViewById<LaunchableImageView?>(R.id.start_button)?.let {
+ keyguardRootView.findViewById<LaunchableImageView?>(R.id.start_button)?.let { imageView ->
shortcutsBindings.add(
KeyguardQuickAffordanceViewBinder.bind(
- it,
- quickAffordancesCombinedViewModel.startButton,
- keyguardRootViewModel.alpha,
- falsingManager,
- vibratorHelper,
- ) {
- indicationController.showTransientIndication(it)
+ view = imageView,
+ viewModel = quickAffordancesCombinedViewModel.startButton,
+ alpha = flowOf(1f),
+ falsingManager = falsingManager,
+ vibratorHelper = vibratorHelper,
+ ) { message ->
+ indicationController.showTransientIndication(message)
}
)
}
- keyguardRootView.findViewById<LaunchableImageView?>(R.id.end_button)?.let {
+ keyguardRootView.findViewById<LaunchableImageView?>(R.id.end_button)?.let { imageView ->
shortcutsBindings.add(
KeyguardQuickAffordanceViewBinder.bind(
- it,
- quickAffordancesCombinedViewModel.endButton,
- keyguardRootViewModel.alpha,
- falsingManager,
- vibratorHelper,
- ) {
- indicationController.showTransientIndication(it)
+ view = imageView,
+ viewModel = quickAffordancesCombinedViewModel.endButton,
+ alpha = flowOf(1f),
+ falsingManager = falsingManager,
+ vibratorHelper = vibratorHelper,
+ ) { message ->
+ indicationController.showTransientIndication(message)
}
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
index fa27442707a3..1c6a2abdcbe7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
@@ -21,9 +21,9 @@ import com.android.systemui.communal.ui.view.layout.sections.CommunalTutorialInd
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.shared.model.KeyguardBlueprint
import com.android.systemui.keyguard.shared.model.KeyguardSection
-import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection
+import com.android.systemui.keyguard.ui.view.layout.sections.ClockSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultNotificationStackScrollLayoutSection
@@ -75,10 +75,10 @@ constructor(
defaultStatusBarSection,
defaultNotificationStackScrollLayoutSection,
aodNotificationIconsSection,
+ smartspaceSection,
aodBurnInSection,
communalTutorialIndicatorSection,
clockSection,
- smartspaceSection,
defaultDeviceEntrySection, // Add LAST: Intentionally has z-order above other views.
)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AlignShortcutsToUdfpsSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AlignShortcutsToUdfpsSection.kt
index 55df46679f6d..cd46d6cf2188 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AlignShortcutsToUdfpsSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AlignShortcutsToUdfpsSection.kt
@@ -61,7 +61,7 @@ constructor(
KeyguardQuickAffordanceViewBinder.bind(
constraintLayout.requireViewById(R.id.start_button),
keyguardQuickAffordancesCombinedViewModel.startButton,
- keyguardRootViewModel.alpha,
+ keyguardQuickAffordancesCombinedViewModel.transitionAlpha,
falsingManager,
vibratorHelper,
) {
@@ -71,7 +71,7 @@ constructor(
KeyguardQuickAffordanceViewBinder.bind(
constraintLayout.requireViewById(R.id.end_button),
keyguardQuickAffordancesCombinedViewModel.endButton,
- keyguardRootViewModel.alpha,
+ keyguardQuickAffordancesCombinedViewModel.transitionAlpha,
falsingManager,
vibratorHelper,
) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodBurnInSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodBurnInSection.kt
index 484d351a362e..df9ae41ed970 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodBurnInSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodBurnInSection.kt
@@ -22,8 +22,12 @@ import android.view.View
import androidx.constraintlayout.helper.widget.Layer
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
+import com.android.systemui.flags.FeatureFlagsClassic
+import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.shared.KeyguardShadeMigrationNssl
import com.android.systemui.keyguard.shared.model.KeyguardSection
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel
import com.android.systemui.res.R
import javax.inject.Inject
@@ -32,21 +36,31 @@ class AodBurnInSection
@Inject
constructor(
private val context: Context,
+ private val clockViewModel: KeyguardClockViewModel,
+ private val smartspaceViewModel: KeyguardSmartspaceViewModel,
+ private val featureFlags: FeatureFlagsClassic,
) : KeyguardSection() {
+ lateinit var burnInLayer: Layer
override fun addViews(constraintLayout: ConstraintLayout) {
if (!KeyguardShadeMigrationNssl.isEnabled) {
return
}
- val statusView = constraintLayout.requireViewById<View>(R.id.keyguard_status_view)
val nic = constraintLayout.requireViewById<View>(R.id.aod_notification_icon_container)
- val burnInLayer =
+ burnInLayer =
Layer(context).apply {
id = R.id.burn_in_layer
addView(nic)
- addView(statusView)
+ if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ val statusView =
+ constraintLayout.requireViewById<View>(R.id.keyguard_status_view)
+ addView(statusView)
+ }
}
+ if (featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ addSmartspaceViews(constraintLayout)
+ }
constraintLayout.addView(burnInLayer)
}
@@ -54,6 +68,9 @@ constructor(
if (!KeyguardShadeMigrationNssl.isEnabled) {
return
}
+ if (featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ clockViewModel.burnInLayer = burnInLayer
+ }
}
override fun applyConstraints(constraintSet: ConstraintSet) {
@@ -65,4 +82,22 @@ constructor(
override fun removeViews(constraintLayout: ConstraintLayout) {
constraintLayout.removeView(R.id.burn_in_layer)
}
+
+ private fun addSmartspaceViews(constraintLayout: ConstraintLayout) {
+ burnInLayer.apply {
+ if (smartspaceViewModel.isSmartspaceEnabled) {
+ val smartspaceView =
+ constraintLayout.requireViewById<View>(smartspaceViewModel.smartspaceViewId)
+ addView(smartspaceView)
+ if (smartspaceViewModel.isDateWeatherDecoupled) {
+ val dateView =
+ constraintLayout.requireViewById<View>(smartspaceViewModel.dateId)
+ val weatherView =
+ constraintLayout.requireViewById<View>(smartspaceViewModel.weatherId)
+ addView(weatherView)
+ addView(dateView)
+ }
+ }
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt
index 941c295ab86a..021f06434e80 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt
@@ -15,7 +15,7 @@
*
*/
-package com.android.systemui.keyguard.ui.view.layout.items
+package com.android.systemui.keyguard.ui.view.layout.sections
import android.content.Context
import android.view.View
@@ -28,7 +28,6 @@ import androidx.constraintlayout.widget.ConstraintSet.START
import androidx.constraintlayout.widget.ConstraintSet.TOP
import androidx.constraintlayout.widget.ConstraintSet.WRAP_CONTENT
import com.android.systemui.flags.FeatureFlagsClassic
-import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
import com.android.systemui.keyguard.shared.model.KeyguardSection
import com.android.systemui.keyguard.ui.binder.KeyguardClockViewBinder
@@ -39,7 +38,6 @@ import com.android.systemui.plugins.ClockFaceLayout
import com.android.systemui.res.R
import com.android.systemui.statusbar.policy.SplitShadeStateController
import com.android.systemui.util.Utils
-import dagger.Lazy
import javax.inject.Inject
internal fun ConstraintSet.setVisibility(
@@ -60,7 +58,6 @@ constructor(
val smartspaceViewModel: KeyguardSmartspaceViewModel,
private val context: Context,
private val splitShadeStateController: SplitShadeStateController,
- private val keyguardBlueprintInteractor: Lazy<KeyguardBlueprintInteractor>,
private val featureFlags: FeatureFlagsClassic,
) : KeyguardSection() {
override fun addViews(constraintLayout: ConstraintLayout) {}
@@ -70,7 +67,6 @@ constructor(
this,
constraintLayout,
keyguardClockViewModel,
- keyguardBlueprintInteractor.get(),
clockInteractor,
featureFlags
)
@@ -109,15 +105,15 @@ constructor(
return previousValue != largeClockEndGuideline
}
- fun getTargetClockFace(clock: ClockController): ClockFaceLayout =
+ private fun getTargetClockFace(clock: ClockController): ClockFaceLayout =
if (keyguardClockViewModel.useLargeClock) getLargeClockFace(clock)
else getSmallClockFace(clock)
- fun getNonTargetClockFace(clock: ClockController): ClockFaceLayout =
+ private fun getNonTargetClockFace(clock: ClockController): ClockFaceLayout =
if (keyguardClockViewModel.useLargeClock) getSmallClockFace(clock)
else getLargeClockFace(clock)
- fun getLargeClockFace(clock: ClockController): ClockFaceLayout = clock.largeClock.layout
- fun getSmallClockFace(clock: ClockController): ClockFaceLayout = clock.smallClock.layout
+ private fun getLargeClockFace(clock: ClockController): ClockFaceLayout = clock.largeClock.layout
+ private fun getSmallClockFace(clock: ClockController): ClockFaceLayout = clock.smallClock.layout
fun applyDefaultConstraints(constraints: ConstraintSet) {
constraints.apply {
connect(R.id.lockscreen_clock_view_large, START, PARENT_ID, START)
@@ -138,6 +134,7 @@ constructor(
)
}
connect(R.id.lockscreen_clock_view_large, TOP, PARENT_ID, TOP, largeClockTopMargin)
+ constrainHeight(R.id.lockscreen_clock_view_large, WRAP_CONTENT)
constrainWidth(R.id.lockscreen_clock_view_large, WRAP_CONTENT)
constrainWidth(R.id.lockscreen_clock_view, WRAP_CONTENT)
constrainHeight(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultIndicationAreaSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultIndicationAreaSection.kt
index 8aef7c23b45d..56f717d7e4ef 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultIndicationAreaSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultIndicationAreaSection.kt
@@ -22,12 +22,12 @@ import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import com.android.systemui.Flags.keyguardBottomAreaRefactor
-import com.android.systemui.res.R
import com.android.systemui.keyguard.shared.model.KeyguardSection
import com.android.systemui.keyguard.ui.binder.KeyguardIndicationAreaBinder
import com.android.systemui.keyguard.ui.view.KeyguardIndicationArea
import com.android.systemui.keyguard.ui.viewmodel.KeyguardIndicationAreaViewModel
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
+import com.android.systemui.res.R
import com.android.systemui.statusbar.KeyguardIndicationController
import javax.inject.Inject
import kotlinx.coroutines.DisposableHandle
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultShortcutsSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultShortcutsSection.kt
index 0f6a966aad2e..2a68f26d3ae7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultShortcutsSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultShortcutsSection.kt
@@ -25,14 +25,12 @@ import androidx.constraintlayout.widget.ConstraintSet.LEFT
import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
import androidx.constraintlayout.widget.ConstraintSet.RIGHT
import com.android.systemui.Flags.keyguardBottomAreaRefactor
-import com.android.systemui.res.R
import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.flags.FeatureFlags
-import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.ui.binder.KeyguardQuickAffordanceViewBinder
import com.android.systemui.keyguard.ui.viewmodel.KeyguardQuickAffordancesCombinedViewModel
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
import com.android.systemui.plugins.FalsingManager
+import com.android.systemui.res.R
import com.android.systemui.statusbar.KeyguardIndicationController
import com.android.systemui.statusbar.VibratorHelper
import javax.inject.Inject
@@ -61,7 +59,7 @@ constructor(
KeyguardQuickAffordanceViewBinder.bind(
constraintLayout.requireViewById(R.id.start_button),
keyguardQuickAffordancesCombinedViewModel.startButton,
- keyguardRootViewModel.alpha,
+ keyguardQuickAffordancesCombinedViewModel.transitionAlpha,
falsingManager,
vibratorHelper,
) {
@@ -71,7 +69,7 @@ constructor(
KeyguardQuickAffordanceViewBinder.bind(
constraintLayout.requireViewById(R.id.end_button),
keyguardQuickAffordancesCombinedViewModel.endButton,
- keyguardRootViewModel.alpha,
+ keyguardQuickAffordancesCombinedViewModel.transitionAlpha,
falsingManager,
vibratorHelper,
) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt
index 4abcca9d1151..851a45f31705 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt
@@ -53,7 +53,7 @@ constructor(
private val keyguardViewConfigurator: Lazy<KeyguardViewConfigurator>,
private val notificationPanelViewController: Lazy<NotificationPanelViewController>,
private val keyguardMediaController: KeyguardMediaController,
- private val splitShadeStateController: SplitShadeStateController
+ private val splitShadeStateController: SplitShadeStateController,
) : KeyguardSection() {
private val statusViewId = R.id.keyguard_status_view
@@ -76,6 +76,9 @@ constructor(
keyguardStatusView.findViewById<View>(R.id.left_aligned_notification_icon_container)?.let {
it.setVisibility(View.GONE)
}
+ // Should keep this even if flag, migrating clocks to blueprint, is on
+ // cause some events in clockEventController rely on keyguardStatusViewController
+ // TODO(b/313499340): clean up
constraintLayout.addView(keyguardStatusView)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt
index 25931a654cd2..a005692c6dbf 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt
@@ -47,9 +47,9 @@ constructor(
val keyguardUnlockAnimationController: KeyguardUnlockAnimationController,
val featureFlags: FeatureFlagsClassic,
) : KeyguardSection() {
- var smartspaceView: View? = null
- var weatherView: View? = null
- var dateView: View? = null
+ private var smartspaceView: View? = null
+ private var weatherView: View? = null
+ private var dateView: View? = null
override fun addViews(constraintLayout: ConstraintLayout) {
if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
@@ -65,16 +65,11 @@ constructor(
constraintLayout.addView(dateView)
}
}
-
keyguardUnlockAnimationController.lockscreenSmartspace = smartspaceView
}
override fun bindData(constraintLayout: ConstraintLayout) {
- KeyguardSmartspaceViewBinder.bind(
- this,
- constraintLayout,
- keyguardClockViewModel,
- )
+ KeyguardSmartspaceViewBinder.bind(this, constraintLayout, keyguardClockViewModel)
}
override fun applyConstraints(constraintSet: ConstraintSet) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
index 14de01b41867..1864437a7d11 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
@@ -55,6 +55,14 @@ constructor(
onStep = { 1f },
)
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 167.milliseconds,
+ startTime = 67.milliseconds,
+ onStep = { it },
+ onCancel = { 0f },
+ )
+
val deviceEntryBackgroundViewAlpha: Flow<Float> =
deviceEntryUdfpsInteractor.isUdfpsSupported.flatMapLatest { isUdfps ->
if (isUdfps) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModel.kt
index 27fb8a3d2473..a728a2810916 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModel.kt
@@ -22,6 +22,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac
import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import javax.inject.Inject
+import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
@@ -41,6 +42,13 @@ constructor(
transitionFlow = interactor.dozingToLockscreenTransition,
)
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 150.milliseconds,
+ onStep = { it },
+ onCancel = { 0f },
+ )
+
override val deviceEntryParentViewAlpha: Flow<Float> =
transitionAnimation.immediatelyTransitionTo(1f)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingHostedToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingHostedToLockscreenTransitionViewModel.kt
new file mode 100644
index 000000000000..58235ae02abe
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingHostedToLockscreenTransitionViewModel.kt
@@ -0,0 +1,46 @@
+/*
+ * 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 com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.domain.interactor.FromDreamingLockscreenHostedTransitionInteractor.Companion.TO_LOCKSCREEN_DURATION
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
+import javax.inject.Inject
+import kotlin.time.Duration.Companion.milliseconds
+import kotlinx.coroutines.flow.Flow
+
+@SysUISingleton
+class DreamingHostedToLockscreenTransitionViewModel
+@Inject
+constructor(
+ interactor: KeyguardTransitionInteractor,
+) {
+
+ private val transitionAnimation =
+ KeyguardTransitionAnimationFlow(
+ transitionDuration = TO_LOCKSCREEN_DURATION,
+ transitionFlow = interactor.dreamingLockscreenHostedToLockscreenTransition
+ )
+
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 250.milliseconds,
+ onStep = { it },
+ onCancel = { 0f },
+ )
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt
index a3b8b85fc53d..f943bdfa7550 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt
@@ -96,6 +96,14 @@ constructor(
onStep = { it },
)
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ startTime = 233.milliseconds,
+ duration = 250.milliseconds,
+ onStep = { it },
+ onCancel = { 0f },
+ )
+
val deviceEntryBackgroundViewAlpha =
deviceEntryUdfpsInteractor.isUdfpsSupported.flatMapLatest { isUdfps ->
if (isUdfps) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModel.kt
new file mode 100644
index 000000000000..5804a205445c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModel.kt
@@ -0,0 +1,46 @@
+/*
+ * 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 com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.domain.interactor.FromGoneTransitionInteractor.Companion.TO_LOCKSCREEN_DURATION
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
+import javax.inject.Inject
+import kotlin.time.Duration.Companion.milliseconds
+import kotlinx.coroutines.flow.Flow
+
+@SysUISingleton
+class GoneToLockscreenTransitionViewModel
+@Inject
+constructor(
+ interactor: KeyguardTransitionInteractor,
+) {
+
+ private val transitionAnimation =
+ KeyguardTransitionAnimationFlow(
+ transitionDuration = TO_LOCKSCREEN_DURATION,
+ transitionFlow = interactor.goneToLockscreenTransition
+ )
+
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 250.milliseconds,
+ onStep = { it },
+ onCancel = { 0f },
+ )
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt
index c54f47b48745..7ffa149d7dd9 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt
@@ -16,6 +16,7 @@
package com.android.systemui.keyguard.ui.viewmodel
+import androidx.constraintlayout.helper.widget.Layer
import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.keyguard.KeyguardClockSwitch.SMALL
import com.android.systemui.dagger.SysUISingleton
@@ -29,7 +30,6 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.stateIn
@SysUISingleton
@@ -40,19 +40,14 @@ constructor(
val keyguardClockInteractor: KeyguardClockInteractor,
@Application private val applicationScope: CoroutineScope,
) {
+ var burnInLayer: Layer? = null
val useLargeClock: Boolean
get() = clockSize.value == LARGE
- var clock: ClockController?
- set(value) {
- keyguardClockInteractor.clock = value
- }
- get() {
- return keyguardClockInteractor.clock
- }
+ var clock: ClockController? by keyguardClockInteractor::clock
val clockSize =
- combine(keyguardClockInteractor.selectedClockSize, keyguardInteractor.clockSize) {
+ combine(keyguardClockInteractor.selectedClockSize, keyguardClockInteractor.clockSize) {
selectedSize,
clockSize ->
if (selectedSize == SettingsClockSize.SMALL) {
@@ -61,7 +56,6 @@ constructor(
clockSize
}
}
- .distinctUntilChanged()
.stateIn(
scope = applicationScope,
started = SharingStarted.WhileSubscribed(),
@@ -72,16 +66,23 @@ constructor(
val hasCustomWeatherDataDisplay =
combine(clockSize, currentClock) { size, clock ->
- (if (size == LARGE) clock.largeClock.config.hasCustomWeatherDataDisplay
- else clock.smallClock.config.hasCustomWeatherDataDisplay)
+ clock?.let {
+ (if (size == LARGE) clock.largeClock.config.hasCustomWeatherDataDisplay
+ else clock.smallClock.config.hasCustomWeatherDataDisplay)
+ }
+ ?: false
}
- .distinctUntilChanged()
.stateIn(
scope = applicationScope,
started = SharingStarted.WhileSubscribed(),
- initialValue = false
+ initialValue = currentClock.value?.largeClock?.config?.hasCustomWeatherDataDisplay
+ ?: false
)
val clockShouldBeCentered: Flow<Boolean> =
- keyguardInteractor.clockShouldBeCentered.distinctUntilChanged()
+ keyguardInteractor.clockShouldBeCentered.stateIn(
+ scope = applicationScope,
+ started = SharingStarted.WhileSubscribed(),
+ initialValue = true
+ )
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt
index 02ea5508f34f..188be244be4a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt
@@ -23,6 +23,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceIn
import com.android.systemui.keyguard.domain.model.KeyguardQuickAffordanceModel
import com.android.systemui.keyguard.shared.quickaffordance.ActivationState
import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
import javax.inject.Inject
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -32,6 +33,7 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.merge
@OptIn(ExperimentalCoroutinesApi::class)
class KeyguardQuickAffordancesCombinedViewModel
@@ -39,6 +41,22 @@ class KeyguardQuickAffordancesCombinedViewModel
constructor(
private val quickAffordanceInteractor: KeyguardQuickAffordanceInteractor,
private val keyguardInteractor: KeyguardInteractor,
+ shadeInteractor: ShadeInteractor,
+ aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel,
+ dozingToLockscreenTransitionViewModel: DozingToLockscreenTransitionViewModel,
+ dreamingHostedToLockscreenTransitionViewModel: DreamingHostedToLockscreenTransitionViewModel,
+ dreamingToLockscreenTransitionViewModel: DreamingToLockscreenTransitionViewModel,
+ goneToLockscreenTransitionViewModel: GoneToLockscreenTransitionViewModel,
+ occludedToLockscreenTransitionViewModel: OccludedToLockscreenTransitionViewModel,
+ offToLockscreenTransitionViewModel: OffToLockscreenTransitionViewModel,
+ primaryBouncerToLockscreenTransitionViewModel: PrimaryBouncerToLockscreenTransitionViewModel,
+ lockscreenToAodTransitionViewModel: LockscreenToAodTransitionViewModel,
+ lockscreenToDozingTransitionViewModel: LockscreenToDozingTransitionViewModel,
+ lockscreenToDreamingHostedTransitionViewModel: LockscreenToDreamingHostedTransitionViewModel,
+ lockscreenToDreamingTransitionViewModel: LockscreenToDreamingTransitionViewModel,
+ lockscreenToGoneTransitionViewModel: LockscreenToGoneTransitionViewModel,
+ lockscreenToOccludedTransitionViewModel: LockscreenToOccludedTransitionViewModel,
+ lockscreenToPrimaryBouncerTransitionViewModel: LockscreenToPrimaryBouncerTransitionViewModel,
) {
data class PreviewMode(
@@ -60,6 +78,39 @@ constructor(
private val selectedPreviewSlotId =
MutableStateFlow(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START)
+ /** alpha while fading the quick affordances out */
+ private val fadeInAlpha: Flow<Float> =
+ merge(
+ aodToLockscreenTransitionViewModel.shortcutsAlpha,
+ dozingToLockscreenTransitionViewModel.shortcutsAlpha,
+ dreamingHostedToLockscreenTransitionViewModel.shortcutsAlpha,
+ dreamingToLockscreenTransitionViewModel.shortcutsAlpha,
+ goneToLockscreenTransitionViewModel.shortcutsAlpha,
+ occludedToLockscreenTransitionViewModel.shortcutsAlpha,
+ offToLockscreenTransitionViewModel.shortcutsAlpha,
+ primaryBouncerToLockscreenTransitionViewModel.shortcutsAlpha,
+ )
+
+ /** alpha while fading the quick affordances in */
+ private val fadeOutAlpha: Flow<Float> =
+ merge(
+ lockscreenToAodTransitionViewModel.shortcutsAlpha,
+ lockscreenToDozingTransitionViewModel.shortcutsAlpha,
+ lockscreenToDreamingHostedTransitionViewModel.shortcutsAlpha,
+ lockscreenToDreamingTransitionViewModel.shortcutsAlpha,
+ lockscreenToGoneTransitionViewModel.shortcutsAlpha,
+ lockscreenToOccludedTransitionViewModel.shortcutsAlpha,
+ lockscreenToPrimaryBouncerTransitionViewModel.shortcutsAlpha,
+ shadeInteractor.qsExpansion.map { 1 - it },
+ )
+
+ /** The source of truth of alpha for all of the quick affordances on lockscreen */
+ val transitionAlpha: Flow<Float> =
+ merge(
+ fadeInAlpha,
+ fadeOutAlpha,
+ )
+
/**
* Whether quick affordances are "opaque enough" to be considered visible to and interactive by
* the user. If they are not interactive, user input should not be allowed on them.
@@ -73,7 +124,7 @@ constructor(
* interactive/clickable unless "fully opaque" to avoid issues like in b/241830987.
*/
private val areQuickAffordancesFullyOpaque: Flow<Boolean> =
- keyguardInteractor.keyguardAlpha
+ transitionAlpha
.map { alpha -> alpha >= AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD }
.distinctUntilChanged()
@@ -89,7 +140,7 @@ constructor(
* Notifies that a slot with the given ID has been selected in the preview experience that is
* rendering in the wallpaper picker. This is ignored for the real lock screen experience.
*
- * @see [KeyguardRootViewModel.enablePreviewMode]
+ * @see [enablePreviewMode]
*/
fun onPreviewSlotSelected(slotId: String) {
selectedPreviewSlotId.value = slotId
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
index 524fa1ede90a..af1705369dbb 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
@@ -21,10 +21,13 @@ import android.content.Context
import android.util.MathUtils
import android.view.View.VISIBLE
import com.android.app.animation.Interpolators
+import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.systemui.Flags.newAodTransition
import com.android.systemui.common.shared.model.NotificationContainerBounds
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
+import com.android.systemui.flags.FeatureFlagsClassic
+import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.domain.interactor.BurnInInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
@@ -47,13 +50,11 @@ import javax.inject.Inject
import javax.inject.Provider
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flatMapLatest
-import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onStart
@@ -70,21 +71,21 @@ constructor(
private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
private val notificationsKeyguardInteractor: NotificationsKeyguardInteractor,
private val burnInInteractor: BurnInInteractor,
+ private val keyguardClockViewModel: KeyguardClockViewModel,
private val goneToAodTransitionViewModel: GoneToAodTransitionViewModel,
private val aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel,
screenOffAnimationController: ScreenOffAnimationController,
+ // TODO(b/310989341): remove after changing migrate_clocks_to_blueprint to aconfig
+ private val featureFlags: FeatureFlagsClassic,
) {
-
- data class PreviewMode(val isInPreviewMode: Boolean = false)
-
- /**
- * Whether this view-model instance is powering the preview experience that renders exclusively
- * in the wallpaper picker application. This should _always_ be `false` for the real lock screen
- * experience.
- */
- private val previewMode = MutableStateFlow(PreviewMode())
-
var clockControllerProvider: Provider<ClockController>? = null
+ get() {
+ if (featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ return Provider { keyguardClockViewModel.clock }
+ } else {
+ return field
+ }
+ }
/** System insets that keyguard needs to stay out of */
var topInset: Int = 0
@@ -103,14 +104,7 @@ constructor(
keyguardInteractor.notificationContainerBounds
/** An observable for the alpha level for the entire keyguard root view. */
- val alpha: Flow<Float> =
- previewMode.flatMapLatest {
- if (it.isInPreviewMode) {
- flowOf(1f)
- } else {
- keyguardInteractor.keyguardAlpha.distinctUntilChanged()
- }
- }
+ val alpha: Flow<Float> = keyguardInteractor.keyguardAlpha.distinctUntilChanged()
private fun burnIn(): Flow<BurnInModel> {
val dozingAmount: Flow<Float> =
@@ -122,7 +116,8 @@ constructor(
return combine(dozingAmount, burnInInteractor.keyguardBurnIn) { dozeAmount, burnIn ->
val interpolation = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(dozeAmount)
val useScaleOnly =
- clockControllerProvider?.get()?.config?.useAlternateSmartspaceAODTransition ?: false
+ (clockControllerProvider?.get()?.config?.useAlternateSmartspaceAODTransition
+ ?: false) && keyguardClockViewModel.clockSize.value == LARGE
if (useScaleOnly) {
BurnInModel(
translationX = 0,
@@ -132,7 +127,12 @@ constructor(
} else {
// Ensure the desired translation doesn't encroach on the top inset
val burnInY = MathUtils.lerp(0, burnIn.translationY, interpolation).toInt()
- val translationY = -(statusViewTop - Math.max(topInset, statusViewTop + burnInY))
+ val translationY =
+ if (featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ burnInY
+ } else {
+ -(statusViewTop - Math.max(topInset, statusViewTop + burnInY))
+ }
BurnInModel(
translationX = MathUtils.lerp(0, burnIn.translationX, interpolation).toInt(),
translationY = translationY,
@@ -147,55 +147,29 @@ constructor(
val lockscreenStateAlpha: Flow<Float> = aodToLockscreenTransitionViewModel.lockscreenAlpha
/** For elements that appear and move during the animation -> AOD */
- val burnInLayerAlpha: Flow<Float> =
- previewMode.flatMapLatest {
- if (it.isInPreviewMode) {
- flowOf(1f)
- } else {
- goneToAodTransitionViewModel.enterFromTopAnimationAlpha
- }
- }
+ val burnInLayerAlpha: Flow<Float> = goneToAodTransitionViewModel.enterFromTopAnimationAlpha
val translationY: Flow<Float> =
- previewMode.flatMapLatest {
- if (it.isInPreviewMode) {
- flowOf(0f)
- } else {
- keyguardInteractor.configurationChange.flatMapLatest { _ ->
- val enterFromTopAmount =
- context.resources.getDimensionPixelSize(
- R.dimen.keyguard_enter_from_top_translation_y
- )
- combine(
- keyguardInteractor.keyguardTranslationY.onStart { emit(0f) },
- burnIn().map { it.translationY.toFloat() }.onStart { emit(0f) },
- goneToAodTransitionViewModel
- .enterFromTopTranslationY(enterFromTopAmount)
- .onStart { emit(0f) },
- ) { keyguardTransitionY, burnInTranslationY, goneToAodTransitionTranslationY ->
- // All 3 values need to be combined for a smooth translation
- keyguardTransitionY + burnInTranslationY + goneToAodTransitionTranslationY
- }
- }
+ keyguardInteractor.configurationChange.flatMapLatest { _ ->
+ val enterFromTopAmount =
+ context.resources.getDimensionPixelSize(
+ R.dimen.keyguard_enter_from_top_translation_y
+ )
+ combine(
+ keyguardInteractor.keyguardTranslationY.onStart { emit(0f) },
+ burnIn().map { it.translationY.toFloat() }.onStart { emit(0f) },
+ goneToAodTransitionViewModel.enterFromTopTranslationY(enterFromTopAmount).onStart {
+ emit(0f)
+ },
+ ) { keyguardTransitionY, burnInTranslationY, goneToAodTransitionTranslationY ->
+ // All 3 values need to be combined for a smooth translation
+ keyguardTransitionY + burnInTranslationY + goneToAodTransitionTranslationY
}
}
- val translationX: Flow<Float> =
- previewMode.flatMapLatest {
- if (it.isInPreviewMode) {
- flowOf(0f)
- } else {
- burnIn().map { it.translationX.toFloat() }
- }
- }
+ val translationX: Flow<Float> = burnIn().map { it.translationX.toFloat() }
- val scale: Flow<Pair<Float, Boolean>> =
- previewMode.flatMapLatest { previewMode ->
- burnIn().map {
- val scale = if (previewMode.isInPreviewMode) 1f else it.scale
- Pair(scale, it.scaleClockOnly)
- }
- }
+ val scale: Flow<Pair<Float, Boolean>> = burnIn().map { Pair(it.scale, it.scaleClockOnly) }
/** Is the notification icon container visible? */
val isNotifIconContainerVisible: Flow<AnimatedValue<Boolean>> =
@@ -238,21 +212,7 @@ constructor(
}
.distinctUntilChanged()
- /**
- * Puts this view-model in "preview mode", which means it's being used for UI that is rendering
- * the lock screen preview in wallpaper picker / settings and not the real experience on the
- * lock screen.
- */
- fun enablePreviewMode() {
- previewMode.value = PreviewMode(true)
- }
-
fun onNotificationContainerBoundsChanged(top: Float, bottom: Float) {
- // Notifications should not be visible in preview mode
- if (previewMode.value.isInPreviewMode) {
- return
- }
-
keyguardInteractor.setNotificationContainerBounds(NotificationContainerBounds(top, bottom))
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt
index 8e33651ced6a..4541458892bb 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt
@@ -30,16 +30,21 @@ constructor(val context: Context, smartspaceController: LockscreenSmartspaceCont
val isWeatherEnabled: Boolean = smartspaceController.isWeatherEnabled()
val isDateWeatherDecoupled: Boolean = smartspaceController.isDateWeatherDecoupled()
val smartspaceViewId: Int
- get() {
- return context.resources
- .getIdentifier("bc_smartspace_view", "id", context.packageName)
- .also {
- if (it == 0) {
- Log.d(TAG, "Cannot resolve id bc_smartspace_view")
- }
- }
- }
+ get() = getId("bc_smartspace_view")
+
+ val dateId: Int
+ get() = getId("date_smartspace_view")
+
+ val weatherId: Int
+ get() = getId("weather_smartspace_view")
+ private fun getId(name: String): Int {
+ return context.resources.getIdentifier(name, "id", context.packageName).also {
+ if (it == 0) {
+ Log.d(TAG, "Cannot resolve id $name")
+ }
+ }
+ }
fun getDimen(name: String): Int {
val res = context.packageManager.getResourcesForApplication(context.packageName)
val id = res.getIdentifier(name, "dimen", context.packageName)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt
index 2bf12e8e33b2..8e8fd75cc1c0 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt
@@ -57,6 +57,15 @@ constructor(
onFinish = { 0f },
),
)
+
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 250.milliseconds,
+ onStep = { 1 - it },
+ onFinish = { 0f },
+ onCancel = { 1f },
+ )
+
override val deviceEntryParentViewAlpha: Flow<Float> =
deviceEntryUdfpsInteractor.isUdfpsEnrolledAndEnabled.flatMapLatest {
isUdfpsEnrolledAndEnabled ->
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
new file mode 100644
index 000000000000..263ed11503ba
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
@@ -0,0 +1,47 @@
+/*
+ * 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 com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor.Companion.TO_DOZING_DURATION
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
+import javax.inject.Inject
+import kotlin.time.Duration.Companion.milliseconds
+import kotlinx.coroutines.flow.Flow
+
+@SysUISingleton
+class LockscreenToDozingTransitionViewModel
+@Inject
+constructor(
+ interactor: KeyguardTransitionInteractor,
+) {
+
+ private val transitionAnimation =
+ KeyguardTransitionAnimationFlow(
+ transitionDuration = TO_DOZING_DURATION,
+ transitionFlow = interactor.lockscreenToDozingTransition
+ )
+
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 250.milliseconds,
+ onStep = { 1 - it },
+ onFinish = { 0f },
+ onCancel = { 1f },
+ )
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingHostedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingHostedTransitionViewModel.kt
new file mode 100644
index 000000000000..17015056bda0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingHostedTransitionViewModel.kt
@@ -0,0 +1,47 @@
+/*
+ * 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 com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor.Companion.TO_DREAMING_HOSTED_DURATION
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
+import javax.inject.Inject
+import kotlin.time.Duration.Companion.milliseconds
+import kotlinx.coroutines.flow.Flow
+
+@SysUISingleton
+class LockscreenToDreamingHostedTransitionViewModel
+@Inject
+constructor(
+ interactor: KeyguardTransitionInteractor,
+) {
+
+ private val transitionAnimation =
+ KeyguardTransitionAnimationFlow(
+ transitionDuration = TO_DREAMING_HOSTED_DURATION,
+ transitionFlow = interactor.lockscreenToDreamingLockscreenHostedTransition
+ )
+
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 250.milliseconds,
+ onStep = { 1 - it },
+ onFinish = { 0f },
+ onCancel = { 1f },
+ )
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt
index 52296137a3d6..401c0ff76c29 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt
@@ -62,6 +62,14 @@ constructor(
onStep = { 1f - it },
)
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 250.milliseconds,
+ onStep = { 1 - it },
+ onFinish = { 0f },
+ onCancel = { 1f },
+ )
+
override val deviceEntryParentViewAlpha: Flow<Float> =
shadeDependentFlows.transitionFlow(
flowWhenShadeIsNotExpanded = lockscreenAlpha,
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt
index 59e5aa845051..cfb4bf59c8a8 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt
@@ -23,6 +23,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import javax.inject.Inject
+import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
@@ -43,6 +44,14 @@ constructor(
transitionFlow = interactor.transition(KeyguardState.LOCKSCREEN, KeyguardState.GONE),
)
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 250.milliseconds,
+ onStep = { 1 - it },
+ onFinish = { 0f },
+ onCancel = { 1f },
+ )
+
override val deviceEntryParentViewAlpha: Flow<Float> =
transitionAnimation.immediatelyTransitionTo(0f)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
index d49bc4994b0f..a6136f95d0f6 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
@@ -50,6 +50,14 @@ constructor(
onStep = { 1f - it },
)
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 250.milliseconds,
+ onStep = { 1 - it },
+ onFinish = { 0f },
+ onCancel = { 1f },
+ )
+
/** Lockscreen views y-translation */
fun lockscreenTranslationY(translatePx: Int): Flow<Float> {
return transitionAnimation.createFlow(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
index f04b67a1d4d4..07dd4ef49c5d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
@@ -26,6 +26,7 @@ import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.map
/**
* Breaks down LOCKSCREEN->PRIMARY BOUNCER transition into discrete steps for corresponding views to
@@ -46,6 +47,11 @@ constructor(
interactor.transition(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER),
)
+ val shortcutsAlpha: Flow<Float> =
+ interactor.transition(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER).map {
+ 1 - it.value
+ }
+
override val deviceEntryParentViewAlpha: Flow<Float> =
shadeDependentFlows.transitionFlow(
flowWhenShadeIsNotExpanded =
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
index 0bdc85d05106..58be0934beca 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
@@ -58,6 +58,13 @@ constructor(
)
}
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 250.milliseconds,
+ onStep = { it },
+ onCancel = { 0f },
+ )
+
/** Lockscreen views alpha */
val lockscreenAlpha: Flow<Float> =
transitionAnimation.createFlow(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt
new file mode 100644
index 000000000000..c3bc799435a8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt
@@ -0,0 +1,45 @@
+/*
+ * 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 com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
+import javax.inject.Inject
+import kotlin.time.Duration.Companion.milliseconds
+import kotlinx.coroutines.flow.Flow
+
+@SysUISingleton
+class OffToLockscreenTransitionViewModel
+@Inject
+constructor(
+ interactor: KeyguardTransitionInteractor,
+) {
+
+ private val transitionAnimation =
+ KeyguardTransitionAnimationFlow(
+ transitionDuration = 250.milliseconds,
+ transitionFlow = interactor.offToLockscreenTransition
+ )
+
+ val shortcutsAlpha: Flow<Float> =
+ transitionAnimation.createFlow(
+ duration = 250.milliseconds,
+ onStep = { it },
+ onCancel = { 0f },
+ )
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt
index 3cf793ab9dc8..7ef8374023fb 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt
@@ -28,6 +28,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.map
/**
* Breaks down PRIMARY BOUNCER->LOCKSCREEN transition into discrete steps for corresponding views to
@@ -57,6 +58,11 @@ constructor(
}
}
+ val shortcutsAlpha: Flow<Float> =
+ interactor.transition(KeyguardState.PRIMARY_BOUNCER, KeyguardState.LOCKSCREEN).map {
+ it.value
+ }
+
override val deviceEntryParentViewAlpha: Flow<Float> =
transitionAnimation.immediatelyTransitionTo(1f)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt
index a0f5baff29ba..2d0712c7f9cc 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt
@@ -20,14 +20,13 @@ import android.animation.ValueAnimator
import android.content.Context
import android.graphics.Point
import androidx.core.animation.doOnEnd
+import com.android.systemui.Flags
import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
import com.android.systemui.biometrics.domain.interactor.SideFpsSensorInteractor
import com.android.systemui.biometrics.shared.model.DisplayRotation
import com.android.systemui.biometrics.shared.model.isDefaultOrientation
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.flags.FeatureFlagsClassic
-import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.shared.model.AcquiredFingerprintAuthenticationStatus
import com.android.systemui.keyguard.shared.model.ErrorFingerprintAuthenticationStatus
@@ -58,7 +57,6 @@ constructor(
private val sfpsSensorInteractor: SideFpsSensorInteractor,
displayStateInteractor: DisplayStateInteractor,
@Application private val applicationScope: CoroutineScope,
- private val featureFlagsClassic: FeatureFlagsClassic,
) {
private val _progress = MutableStateFlow(0.0f)
private val _visible = MutableStateFlow(false)
@@ -155,7 +153,7 @@ constructor(
sfpsSensorInteractor.isProlongedTouchRequiredForAuthentication
init {
- if (featureFlagsClassic.isEnabled(Flags.REST_TO_UNLOCK)) {
+ if (Flags.restToUnlock()) {
launchAnimator()
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt b/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt
index 702a23ea5ebc..e1c6f41033cc 100644
--- a/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt
@@ -35,7 +35,7 @@ private const val TAG = "ScreenDecorationsLog"
*
* To enable logcat echoing for an entire buffer:
* ```
- * adb shell settings put global systemui/buffer/ScreenDecorationsLog <logLevel>
+ * adb shell cmd statusbar echo -b ScreenDecorationsLog:<logLevel>
*
* ```
*/
@@ -134,33 +134,35 @@ constructor(
}
fun cameraProtectionShownOrHidden(
+ showAnimationNow: Boolean,
faceDetectionRunning: Boolean,
biometricPromptShown: Boolean,
- requestedState: Boolean,
+ faceAuthenticated: Boolean,
+ isCameraActive: Boolean,
currentlyShowing: Boolean
) {
logBuffer.log(
TAG,
DEBUG,
{
+ str1 = "$showAnimationNow"
bool1 = faceDetectionRunning
bool2 = biometricPromptShown
- bool3 = requestedState
+ str2 = "$faceAuthenticated"
+ bool3 = isCameraActive
bool4 = currentlyShowing
},
{
- "isFaceDetectionRunning: $bool1, " +
+ "cameraProtectionShownOrHidden showAnimationNow: $str1, " +
+ "isFaceDetectionRunning: $bool1, " +
"isBiometricPromptShowing: $bool2, " +
- "requestedState: $bool3, " +
+ "faceAuthenticated: $str2, " +
+ "isCameraActive: $bool3, " +
"currentState: $bool4"
}
)
}
- fun biometricEvent(@CompileTimeConstant info: String) {
- logBuffer.log(TAG, DEBUG, info)
- }
-
fun cameraProtectionEvent(@CompileTimeConstant cameraProtectionEvent: String) {
logBuffer.log(TAG, DEBUG, cameraProtectionEvent)
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt
index a2524709b8bc..9cdf85794088 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt
@@ -271,6 +271,10 @@ constructor(
private val isReorderingAllowed: Boolean
get() = visualStabilityProvider.isReorderingAllowed
+ /** Size provided by the scene framework container */
+ private var widthInSceneContainerPx = 0
+ private var heightInSceneContainerPx = 0
+
init {
dumpManager.registerDumpable(TAG, this)
mediaFrame = inflateMediaCarousel()
@@ -581,6 +585,15 @@ constructor(
}
}
+ fun setSceneContainerSize(width: Int, height: Int) {
+ if (width == widthInSceneContainerPx && height == heightInSceneContainerPx) {
+ return
+ }
+ widthInSceneContainerPx = width
+ heightInSceneContainerPx = height
+ updatePlayers(recreateMedia = true)
+ }
+
private fun reorderAllPlayers(
previousVisiblePlayerKey: MediaPlayerData.MediaSortKey?,
key: String? = null
@@ -638,6 +651,11 @@ constructor(
.elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex)
if (existingPlayer == null) {
val newPlayer = mediaControlPanelFactory.get()
+ if (mediaFlags.isSceneContainerEnabled()) {
+ newPlayer.mediaViewController.widthInSceneContainerPx = widthInSceneContainerPx
+ newPlayer.mediaViewController.heightInSceneContainerPx =
+ heightInSceneContainerPx
+ }
newPlayer.attachPlayer(
MediaViewHolder.create(LayoutInflater.from(context), mediaContent)
)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java
index cce4cda8af8a..2551da8e7795 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java
@@ -81,7 +81,6 @@ import com.android.internal.logging.InstanceId;
import com.android.internal.widget.CachingIconView;
import com.android.settingslib.widget.AdaptiveIcon;
import com.android.systemui.ActivityIntentHelper;
-import com.android.systemui.res.R;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.GhostedViewLaunchAnimatorController;
import com.android.systemui.bluetooth.BroadcastDialogController;
@@ -102,6 +101,7 @@ import com.android.systemui.media.controls.models.recommendation.RecommendationV
import com.android.systemui.media.controls.models.recommendation.SmartspaceMediaData;
import com.android.systemui.media.controls.pipeline.MediaDataManager;
import com.android.systemui.media.controls.util.MediaDataUtils;
+import com.android.systemui.media.controls.util.MediaFlags;
import com.android.systemui.media.controls.util.MediaUiEventLogger;
import com.android.systemui.media.controls.util.SmallHash;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
@@ -109,6 +109,7 @@ import com.android.systemui.monet.ColorScheme;
import com.android.systemui.monet.Style;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.res.R;
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -190,6 +191,7 @@ public class MediaControlPanel {
@VisibleForTesting static final long TURBULENCE_NOISE_PLAY_DURATION = 7500L;
private final SeekBarViewModel mSeekBarViewModel;
+ private final MediaFlags mMediaFlags;
private SeekBarObserver mSeekBarObserver;
protected final Executor mBackgroundExecutor;
private final DelayableExecutor mMainExecutor;
@@ -280,7 +282,8 @@ public class MediaControlPanel {
NotificationLockscreenUserManager lockscreenUserManager,
BroadcastDialogController broadcastDialogController,
FeatureFlags featureFlags,
- GlobalSettings globalSettings
+ GlobalSettings globalSettings,
+ MediaFlags mediaFlags
) {
mContext = context;
mBackgroundExecutor = backgroundExecutor;
@@ -299,6 +302,7 @@ public class MediaControlPanel {
mActivityIntentHelper = activityIntentHelper;
mLockscreenUserManager = lockscreenUserManager;
mBroadcastDialogController = broadcastDialogController;
+ mMediaFlags = mediaFlags;
mSeekBarViewModel.setLogSeek(() -> {
if (mPackageName != null && mInstanceId != null) {
@@ -575,7 +579,10 @@ public class MediaControlPanel {
// to something which might impact the measurement
// State refresh interferes with the translation animation, only run it if it's not running.
if (!mMetadataAnimationHandler.isRunning()) {
- mMediaViewController.refreshState();
+ // Don't refresh in scene framework, because it will calculate with invalid layout sizes
+ if (!mMediaFlags.isSceneContainerEnabled()) {
+ mMediaViewController.refreshState();
+ }
}
// Turbulence noise
@@ -669,7 +676,7 @@ public class MediaControlPanel {
mLogger.logOpenBroadcastDialog(mUid, mPackageName, mInstanceId);
mCurrentBroadcastApp = device.getName().toString();
mBroadcastDialogController.createBroadcastDialog(mCurrentBroadcastApp,
- mPackageName, true, mMediaViewHolder.getSeamlessButton());
+ mPackageName, mMediaViewHolder.getSeamlessButton());
} else {
mLogger.logOpenOutputSwitcher(mUid, mPackageName, mInstanceId);
mMediaOutputDialogFactory.create(mPackageName, true,
@@ -805,7 +812,14 @@ public class MediaControlPanel {
// Capture width & height from views in foreground for artwork scaling in background
int width = mMediaViewHolder.getAlbumView().getMeasuredWidth();
int height = mMediaViewHolder.getAlbumView().getMeasuredHeight();
+ if (mMediaFlags.isSceneContainerEnabled() && (width <= 0 || height <= 0)) {
+ // TODO(b/312714128): ensure we have a valid size before setting background
+ width = mMediaViewController.getWidthInSceneContainerPx();
+ height = mMediaViewController.getHeightInSceneContainerPx();
+ }
+ final int finalWidth = width;
+ final int finalHeight = height;
mBackgroundExecutor.execute(() -> {
// Album art
ColorScheme mutableColorScheme = null;
@@ -815,7 +829,8 @@ public class MediaControlPanel {
WallpaperColors wallpaperColors = getWallpaperColor(artworkIcon);
if (wallpaperColors != null) {
mutableColorScheme = new ColorScheme(wallpaperColors, true, Style.CONTENT);
- artwork = addGradientToPlayerAlbum(artworkIcon, mutableColorScheme, width, height);
+ artwork = addGradientToPlayerAlbum(artworkIcon, mutableColorScheme, finalWidth,
+ finalHeight);
isArtworkBound = true;
} else {
// If there's no artwork, use colors from the app icon
@@ -857,8 +872,10 @@ public class MediaControlPanel {
TransitionDrawable transitionDrawable = new TransitionDrawable(
new Drawable[]{mPrevArtwork, artwork});
- scaleTransitionDrawableLayer(transitionDrawable, 0, width, height);
- scaleTransitionDrawableLayer(transitionDrawable, 1, width, height);
+ scaleTransitionDrawableLayer(transitionDrawable, 0, finalWidth,
+ finalHeight);
+ scaleTransitionDrawableLayer(transitionDrawable, 1, finalWidth,
+ finalHeight);
transitionDrawable.setLayerGravity(0, Gravity.CENTER);
transitionDrawable.setLayerGravity(1, Gravity.CENTER);
transitionDrawable.setCrossFadeEnabled(true);
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt
index 9d6e9b4f3ed5..0385aeba32b7 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt
@@ -43,6 +43,7 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dreams.DreamOverlayStateController
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.util.MediaFlags
import com.android.systemui.media.dream.MediaDreamComplication
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.res.R
@@ -108,6 +109,7 @@ constructor(
@Application private val coroutineScope: CoroutineScope,
private val splitShadeStateController: SplitShadeStateController,
private val logger: MediaViewLogger,
+ private val mediaFlags: MediaFlags,
) {
/** Track the media player setting status on lock screen. */
@@ -215,6 +217,7 @@ constructor(
}
private val mediaHosts = arrayOfNulls<MediaHost>(LOCATION_COMMUNAL_HUB + 1)
+
/**
* The last location where this view was at before going to the desired location. This is useful
* for guided transitions.
@@ -458,6 +461,15 @@ constructor(
// the
// location of the previous state to still be up to date when the animation
// starts
+ if (
+ newState == StatusBarState.SHADE_LOCKED &&
+ oldState == StatusBarState.KEYGUARD &&
+ fullShadeTransitionProgress < 1.0f
+ ) {
+ // Since the new state is SHADE_LOCKED, we need to set the transition amount
+ // to maximum if the progress is not 1f.
+ setTransitionToFullShadeAmount(distanceForFullShadeTransition.toFloat())
+ }
statusbarState = newState
updateDesiredLocation()
}
@@ -1041,6 +1053,17 @@ constructor(
private fun updateHostAttachment() =
traceSection("MediaHierarchyManager#updateHostAttachment") {
+ if (mediaFlags.isSceneContainerEnabled()) {
+ // No need to manage transition states - just update the desired location directly
+ logger.logMediaHostAttachment(desiredLocation)
+ mediaCarouselController.onDesiredLocationChanged(
+ desiredLocation = desiredLocation,
+ desiredHostState = getHost(desiredLocation),
+ animate = false,
+ )
+ return
+ }
+
var newLocation = resolveLocationForFading()
// Don't use the overlay when fading or when we don't have active media
var canUseOverlay = !isCurrentlyFading() && hasActiveMediaOrRecommendation
@@ -1124,6 +1147,7 @@ constructor(
(!bypassController.bypassEnabled && (statusbarState == StatusBarState.KEYGUARD))
val location =
when {
+ mediaFlags.isSceneContainerEnabled() -> desiredLocation
dreamOverlayActive && dreamMediaComplicationActive -> LOCATION_DREAM_OVERLAY
(qsExpansion > 0.0f || inSplitShade) && !onLockscreen -> LOCATION_QS
qsExpansion > 0.4f && onLockscreen -> LOCATION_QS
@@ -1282,7 +1306,7 @@ private annotation class TransformationType
MediaHierarchyManager.LOCATION_QQS,
MediaHierarchyManager.LOCATION_LOCKSCREEN,
MediaHierarchyManager.LOCATION_DREAM_OVERLAY,
- MediaHierarchyManager.LOCATION_COMMUNAL_HUB
+ MediaHierarchyManager.LOCATION_COMMUNAL_HUB,
]
)
@Retention(AnnotationRetention.SOURCE)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewController.kt
index d277f32d5e54..a99c51c2e557 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewController.kt
@@ -28,6 +28,7 @@ import com.android.systemui.media.controls.ui.MediaCarouselController.Companion.
import com.android.systemui.media.controls.util.MediaFlags
import com.android.systemui.res.R
import com.android.systemui.statusbar.policy.ConfigurationController
+import com.android.systemui.util.animation.MeasurementInput
import com.android.systemui.util.animation.MeasurementOutput
import com.android.systemui.util.animation.TransitionLayout
import com.android.systemui.util.animation.TransitionLayoutController
@@ -207,6 +208,10 @@ constructor(
var isGutsVisible = false
private set
+ /** Size provided by the scene framework container */
+ var widthInSceneContainerPx = 0
+ var heightInSceneContainerPx = 0
+
init {
mediaHostStatesManager.addController(this)
layoutController.sizeChangedListener = { width: Int, height: Int ->
@@ -420,6 +425,10 @@ constructor(
state: MediaHostState?,
isGutsAnimation: Boolean = false
): TransitionViewState? {
+ if (mediaFlags.isSceneContainerEnabled()) {
+ return obtainSceneContainerViewState()
+ }
+
if (state == null || state.measurementInput == null) {
return null
}
@@ -670,6 +679,24 @@ constructor(
refreshState()
}
+ /** Get a view state based on the width and height set by the scene */
+ private fun obtainSceneContainerViewState(): TransitionViewState? {
+ logger.logMediaSize("scene container", widthInSceneContainerPx, heightInSceneContainerPx)
+
+ // Similar to obtainViewState: Let's create a new measurement
+ val result =
+ transitionLayout?.calculateViewState(
+ MeasurementInput(widthInSceneContainerPx, heightInSceneContainerPx),
+ expandedLayout,
+ TransitionViewState()
+ )
+ result?.let {
+ // And then ensure the guts visibility is set correctly
+ setGutsViewState(it)
+ }
+ return result
+ }
+
/**
* Retrieves the [TransitionViewState] and [MediaHostState] of a [@MediaLocation]. In the event
* of [location] not being visible, [locationWhenHidden] will be used instead.
@@ -681,6 +708,10 @@ constructor(
*/
private fun obtainViewStateForLocation(@MediaLocation location: Int): TransitionViewState? {
val mediaHostState = mediaHostStatesManager.mediaHostStates[location] ?: return null
+ if (mediaFlags.isSceneContainerEnabled()) {
+ return obtainSceneContainerViewState()
+ }
+
val viewState = obtainViewState(mediaHostState)
if (viewState != null) {
// update the size of the viewstate for the location with the override
@@ -708,6 +739,21 @@ constructor(
/** Clear all existing measurements and refresh the state to match the view. */
fun refreshState() =
traceSection("MediaViewController#refreshState") {
+ if (mediaFlags.isSceneContainerEnabled()) {
+ // We don't need to recreate measurements for scene container, since it's a known
+ // size. Just get the view state and update the layout controller
+ obtainSceneContainerViewState()?.let {
+ // Get scene container state, then setCurrentState
+ layoutController.setState(
+ state = it,
+ applyImmediately = true,
+ animate = false,
+ isGuts = false,
+ )
+ }
+ return
+ }
+
// Let's clear all of our measurements and recreate them!
viewStates.clear()
if (firstRefresh) {
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt
index 44232ffb3ad7..15747b9eb515 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt
@@ -55,7 +55,7 @@ constructor(
/** Check whether we allow remote media to generate resume controls */
fun isRemoteResumeAllowed() = featureFlags.isEnabled(Flags.MEDIA_REMOTE_RESUME)
- /** Check whether to use flexiglass layout */
- fun isFlexiglassEnabled() =
+ /** Check whether to use scene framework */
+ fun isSceneContainerEnabled() =
sceneContainerFlags.isEnabled() && MediaInSceneContainerFlag.isEnabled
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index e2e94dae900a..0a72a2f15e95 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -400,8 +400,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
}
@Override
- public void animateNavBarLongPress(boolean isTouchDown, long durationMs) {
- mView.getHomeHandle().animateLongPress(isTouchDown, durationMs);
+ public void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) {
+ mView.getHomeHandle().animateLongPress(isTouchDown, shrink, durationMs);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
index 5fe830e6e442..5739abcae7eb 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
@@ -247,10 +247,10 @@ public class ButtonDispatcher {
}
}
- public void animateLongPress(boolean isTouchDown, long durationMs) {
+ public void animateLongPress(boolean isTouchDown, boolean shrink, long durationMs) {
for (int i = 0; i < mViews.size(); i++) {
if (mViews.get(i) instanceof ButtonInterface) {
- ((ButtonInterface) mViews.get(i)).animateLongPress(isTouchDown, durationMs);
+ ((ButtonInterface) mViews.get(i)).animateLongPress(isTouchDown, shrink, durationMs);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java
index 356b2f7c7cb8..5f8fafd4ae4c 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java
@@ -35,9 +35,10 @@ public interface ButtonInterface {
* Animate the button being long-pressed.
*
* @param isTouchDown {@code true} if the button is starting to be pressed ({@code false} if
- * released or canceled)
- * @param durationMs how long the animation should take (for the {@code isTouchDown} case, this
- * should be the same as the amount of time to trigger a long-press)
+ * released or canceled)
+ * @param shrink {@code true} if the handle should shrink, {@code false} if it should grow
+ * @param durationMs how long the animation should take (for the {@code isTouchDown} case, this
+ * should be the same as the amount of time to trigger a long-press)
*/
- default void animateLongPress(boolean isTouchDown, long durationMs) {}
+ default void animateLongPress(boolean isTouchDown, boolean shrink, long durationMs) {}
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java
index 5bfc7dc5f7ae..d1ce1f613044 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java
@@ -44,7 +44,9 @@ public class NavigationHandle extends View implements ButtonInterface {
protected final float mBottom;
private final float mAdditionalWidthForAnimation;
private final float mAdditionalHeightForAnimation;
+ private final float mShrinkWidthForAnimation;
private boolean mRequiresInvalidate;
+ private boolean mShrink;
private ObjectAnimator mPulseAnimator = null;
private float mPulseAnimationProgress;
@@ -75,6 +77,8 @@ public class NavigationHandle extends View implements ButtonInterface {
res.getDimension(R.dimen.navigation_home_handle_additional_width_for_animation);
mAdditionalHeightForAnimation =
res.getDimension(R.dimen.navigation_home_handle_additional_height_for_animation);
+ mShrinkWidthForAnimation =
+ res.getDimension(R.dimen.navigation_home_handle_shrink_width_for_animation);
final int dualToneDarkTheme = Utils.getThemeAttr(context, R.attr.darkIconTheme);
final int dualToneLightTheme = Utils.getThemeAttr(context, R.attr.lightIconTheme);
@@ -101,12 +105,20 @@ public class NavigationHandle extends View implements ButtonInterface {
// Draw that bar
int navHeight = getHeight();
- float additionalHeight = mAdditionalHeightForAnimation * mPulseAnimationProgress;
+ float additionalHeight;
+ float additionalWidth;
+ if (mShrink) {
+ additionalHeight = 0;
+ additionalWidth = -mShrinkWidthForAnimation * mPulseAnimationProgress;
+ } else {
+ additionalHeight = mAdditionalHeightForAnimation * mPulseAnimationProgress;
+ additionalWidth = mAdditionalWidthForAnimation * mPulseAnimationProgress;
+ }
+
float height = mRadius * 2 + additionalHeight;
- float additionalWidth = mAdditionalWidthForAnimation * mPulseAnimationProgress;
float width = getWidth() + additionalWidth;
- float x = -(additionalWidth / 2);
- float y = navHeight - mBottom - height - (additionalHeight / 2);
+ float x = -additionalWidth;
+ float y = navHeight - mBottom - height + (additionalHeight / 2);
float adjustedRadius = height / 2;
canvas.drawRoundRect(x, y, width, y + height, adjustedRadius, adjustedRadius, mPaint);
}
@@ -138,26 +150,32 @@ public class NavigationHandle extends View implements ButtonInterface {
public void setDelayTouchFeedback(boolean shouldDelay) {}
@Override
- public void animateLongPress(boolean isTouchDown, long durationMs) {
+ public void animateLongPress(boolean isTouchDown, boolean shrink, long durationMs) {
if (mPulseAnimator != null) {
mPulseAnimator.cancel();
}
+ mShrink = shrink;
Interpolator interpolator;
- if (isTouchDown) {
- // For now we animate the navbar expanding and contracting so that the navbar is the
- // original size by the end of {@code duration}. This is because a screenshot is taken
- // at that point and we don't want to capture the larger navbar.
- // TODO(b/306400785): Determine a way to exclude navbar from the screenshot.
-
- // Fraction of the touch down animation to expand; remaining is used to contract again.
- float expandFraction = 0.9f;
- interpolator = t -> t <= expandFraction
+ if (shrink) {
+ interpolator = Interpolators.LEGACY_DECELERATE;
+ } else {
+ if (isTouchDown) {
+ // For now we animate the navbar expanding and contracting so that the navbar is
+ // the original size by the end of {@code duration}. This is because a screenshot
+ // is taken at that point and we don't want to capture the larger navbar.
+ // TODO(b/306400785): Determine a way to exclude navbar from the screenshot.
+
+ // Fraction of the touch down animation to expand; remaining is used to contract
+ // again.
+ float expandFraction = 0.9f;
+ interpolator = t -> t <= expandFraction
? Interpolators.clampToProgress(Interpolators.LEGACY, t, 0, expandFraction)
: 1 - Interpolators.clampToProgress(
Interpolators.LINEAR, t, expandFraction, 1);
- } else {
- interpolator = Interpolators.LEGACY_DECELERATE;
+ } else {
+ interpolator = Interpolators.LEGACY_DECELERATE;
+ }
}
mPulseAnimator =
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index eba1c25d0e74..0cb695cc3553 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -36,11 +36,11 @@ import com.android.systemui.qs.TouchAnimator.Builder;
import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.qs.tileimpl.HeightOverrideable;
import com.android.systemui.tuner.TunerService;
+import com.android.systemui.util.concurrency.DelayableExecutor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-import java.util.concurrent.Executor;
import javax.inject.Inject;
@@ -64,6 +64,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
private static final String TAG = "QSAnimator";
+ private static final int ANIMATORS_UPDATE_DELAY_MS = 100;
private static final float EXPANDED_TILE_DELAY = .86f;
//Non first page delays
private static final float QS_TILE_LABEL_FADE_OUT_START = 0.15f;
@@ -133,7 +134,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
private int mLastQQSTileHeight;
private float mLastPosition;
private final QSHost mHost;
- private final Executor mExecutor;
+ private final DelayableExecutor mExecutor;
private boolean mShowCollapsedOnKeyguard;
private int mQQSTop;
@@ -144,7 +145,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
public QSAnimator(@RootView View rootView, QuickQSPanel quickPanel,
QSPanelController qsPanelController,
QuickQSPanelController quickQSPanelController, QSHost qsTileHost,
- @Main Executor executor, TunerService tunerService,
+ @Main DelayableExecutor executor, TunerService tunerService,
QSExpansionPathInterpolator qsExpansionPathInterpolator) {
mQsRootView = rootView;
mQuickQsPanel = quickPanel;
@@ -170,6 +171,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
public void onRtlChanged() {
updateAnimators();
+ setCurrentPosition();
}
/**
@@ -209,6 +211,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
@Override
public void onViewAttachedToWindow(@NonNull View view) {
updateAnimators();
+ setCurrentPosition();
}
@Override
@@ -753,7 +756,10 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
public void onTilesChanged() {
// Give the QS panels a moment to generate their new tiles, then create all new animators
// hooked up to the new views.
- mExecutor.execute(mUpdateAnimators);
+ mExecutor.executeDelayed(mUpdateAnimators, ANIMATORS_UPDATE_DELAY_MS);
+
+ // Also requests a lazy animators update in case the animation starts before the executor.
+ requestAnimatorUpdate();
}
private final TouchAnimator.Listener mNonFirstPageListener =
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
index 11db69b69f13..6c930b1f3d17 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
@@ -255,6 +255,10 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
for (QSTile tile : tiles) {
addTile(tile, collapsedView);
}
+ } else {
+ for (QSPanelControllerBase.TileRecord record : mRecords) {
+ record.tile.addCallback(record.callback);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index 69fe46aa9009..529d68407ce9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -109,7 +109,7 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy
// Only read and modified in main thread (where click events come through).
private int mClickEventId = 0;
- private final ArrayList<Callback> mCallbacks = new ArrayList<>();
+ private final ArraySet<Callback> mCallbacks = new ArraySet<>();
private final Object mStaleListener = new Object();
protected TState mState;
private TState mTmpState;
@@ -444,9 +444,9 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy
}
private void handleStateChanged() {
- if (mCallbacks.size() != 0) {
+ if (!mCallbacks.isEmpty()) {
for (int i = 0; i < mCallbacks.size(); i++) {
- mCallbacks.get(i).onStateChanged(mState);
+ mCallbacks.valueAt(i).onStateChanged(mState);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt
index 5e19439cd643..9fe316f99136 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt
@@ -17,6 +17,7 @@
package com.android.systemui.qs.tiles.base.viewmodel
import android.os.UserHandle
+import com.android.systemui.Dumpable
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.tiles.base.analytics.QSTileAnalytics
import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger
@@ -34,6 +35,7 @@ import com.android.systemui.qs.tiles.viewmodel.QSTileViewModel
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.util.kotlin.throttle
import com.android.systemui.util.time.SystemClock
+import java.io.PrintWriter
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -81,7 +83,7 @@ class QSTileViewModelImpl<DATA_TYPE>(
private val systemClock: SystemClock,
private val backgroundDispatcher: CoroutineDispatcher,
private val tileScope: CoroutineScope = CoroutineScope(SupervisorJob()),
-) : QSTileViewModel {
+) : QSTileViewModel, Dumpable {
private val users: MutableStateFlow<UserHandle> =
MutableStateFlow(userRepository.getSelectedUserInfo().userHandle)
@@ -137,6 +139,13 @@ class QSTileViewModelImpl<DATA_TYPE>(
tileScope.cancel()
}
+ override fun dump(pw: PrintWriter, args: Array<out String>) =
+ with(pw) {
+ println("${config.tileSpec.spec}:")
+ print(" ")
+ println(state.replayCache.lastOrNull().toString())
+ }
+
private fun createTileDataFlow(): SharedFlow<DATA_TYPE> =
users
.flatMapLatest { user ->
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/airplane/domain/AirplaneModeMapper.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/airplane/domain/AirplaneModeMapper.kt
index c390695b1911..cfb544226c83 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/airplane/domain/AirplaneModeMapper.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/airplane/domain/AirplaneModeMapper.kt
@@ -16,8 +16,9 @@
package com.android.systemui.qs.tiles.impl.airplane.domain
-import android.content.Context
+import android.content.res.Resources
import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper
import com.android.systemui.qs.tiles.impl.airplane.domain.model.AirplaneModeTileModel
import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
@@ -26,29 +27,27 @@ import com.android.systemui.res.R
import javax.inject.Inject
/** Maps [AirplaneModeTileModel] to [QSTileState]. */
-class AirplaneModeMapper @Inject constructor(private val context: Context) :
+class AirplaneModeMapper @Inject constructor(@Main private val resources: Resources) :
QSTileDataToStateMapper<AirplaneModeTileModel> {
override fun map(config: QSTileConfig, data: AirplaneModeTileModel): QSTileState =
- QSTileState.build(context, config.uiConfig) {
+ QSTileState.build(resources, config.uiConfig) {
val icon =
- Icon.Loaded(
- context.getDrawable(
- if (data.isEnabled) {
- R.drawable.qs_airplane_icon_on
- } else {
- R.drawable.qs_airplane_icon_off
- }
- )!!,
+ Icon.Resource(
+ if (data.isEnabled) {
+ R.drawable.qs_airplane_icon_on
+ } else {
+ R.drawable.qs_airplane_icon_off
+ },
contentDescription = null
)
this.icon = { icon }
if (data.isEnabled) {
activationState = QSTileState.ActivationState.ACTIVE
- secondaryLabel = context.resources.getStringArray(R.array.tile_states_airplane)[2]
+ secondaryLabel = resources.getStringArray(R.array.tile_states_airplane)[2]
} else {
activationState = QSTileState.ActivationState.INACTIVE
- secondaryLabel = context.resources.getStringArray(R.array.tile_states_airplane)[1]
+ secondaryLabel = resources.getStringArray(R.array.tile_states_airplane)[1]
}
contentDescription = label
supportedActions =
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/flashlight/domain/FlashlightMapper.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/flashlight/domain/FlashlightMapper.kt
index b2b226464ee5..881a6bd156d2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/flashlight/domain/FlashlightMapper.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/flashlight/domain/FlashlightMapper.kt
@@ -16,8 +16,9 @@
package com.android.systemui.qs.tiles.impl.flashlight.domain
-import android.content.Context
+import android.content.res.Resources
import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper
import com.android.systemui.qs.tiles.impl.flashlight.domain.model.FlashlightTileModel
import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
@@ -26,30 +27,28 @@ import com.android.systemui.res.R
import javax.inject.Inject
/** Maps [FlashlightTileModel] to [QSTileState]. */
-class FlashlightMapper @Inject constructor(private val context: Context) :
+class FlashlightMapper @Inject constructor(@Main private val resources: Resources) :
QSTileDataToStateMapper<FlashlightTileModel> {
override fun map(config: QSTileConfig, data: FlashlightTileModel): QSTileState =
- QSTileState.build(context, config.uiConfig) {
+ QSTileState.build(resources, config.uiConfig) {
val icon =
- Icon.Loaded(
- context.resources.getDrawable(
- if (data.isEnabled) {
- R.drawable.qs_flashlight_icon_on
- } else {
- R.drawable.qs_flashlight_icon_off
- }
- ),
+ Icon.Resource(
+ if (data.isEnabled) {
+ R.drawable.qs_flashlight_icon_on
+ } else {
+ R.drawable.qs_flashlight_icon_off
+ },
contentDescription = null
)
this.icon = { icon }
if (data.isEnabled) {
activationState = QSTileState.ActivationState.ACTIVE
- secondaryLabel = context.resources.getStringArray(R.array.tile_states_flashlight)[2]
+ secondaryLabel = resources.getStringArray(R.array.tile_states_flashlight)[2]
} else {
activationState = QSTileState.ActivationState.INACTIVE
- secondaryLabel = context.resources.getStringArray(R.array.tile_states_flashlight)[1]
+ secondaryLabel = resources.getStringArray(R.array.tile_states_flashlight)[1]
}
contentDescription = label
supportedActions =
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/LocationTileMapper.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/LocationTileMapper.kt
index 8e53723a5a6b..7e7034d65efd 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/LocationTileMapper.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/LocationTileMapper.kt
@@ -16,8 +16,9 @@
package com.android.systemui.qs.tiles.impl.location.domain
-import android.content.Context
+import android.content.res.Resources
import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper
import com.android.systemui.qs.tiles.impl.location.domain.model.LocationTileModel
import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
@@ -26,32 +27,30 @@ import com.android.systemui.res.R
import javax.inject.Inject
/** Maps [LocationTileModel] to [QSTileState]. */
-class LocationTileMapper @Inject constructor(private val context: Context) :
+class LocationTileMapper @Inject constructor(@Main private val resources: Resources) :
QSTileDataToStateMapper<LocationTileModel> {
override fun map(config: QSTileConfig, data: LocationTileModel): QSTileState =
- QSTileState.build(context, config.uiConfig) {
+ QSTileState.build(resources, config.uiConfig) {
val icon =
- Icon.Loaded(
- context.resources.getDrawable(
- if (data.isEnabled) {
- R.drawable.qs_location_icon_on
- } else {
- R.drawable.qs_location_icon_off
- }
- ),
+ Icon.Resource(
+ if (data.isEnabled) {
+ R.drawable.qs_location_icon_on
+ } else {
+ R.drawable.qs_location_icon_off
+ },
contentDescription = null
)
this.icon = { icon }
- this.label = context.resources.getString(R.string.quick_settings_location_label)
+ this.label = resources.getString(R.string.quick_settings_location_label)
if (data.isEnabled) {
activationState = QSTileState.ActivationState.ACTIVE
- secondaryLabel = context.resources.getStringArray(R.array.tile_states_location)[2]
+ secondaryLabel = resources.getStringArray(R.array.tile_states_location)[2]
} else {
activationState = QSTileState.ActivationState.INACTIVE
- secondaryLabel = context.resources.getStringArray(R.array.tile_states_location)[1]
+ secondaryLabel = resources.getStringArray(R.array.tile_states_location)[1]
}
contentDescription = label
supportedActions =
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileState.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileState.kt
index f9e0b160acd6..23e0cb66bb6a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileState.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileState.kt
@@ -16,7 +16,7 @@
package com.android.systemui.qs.tiles.viewmodel
-import android.content.Context
+import android.content.res.Resources
import android.service.quicksettings.Tile
import android.view.View
import android.widget.Switch
@@ -46,13 +46,13 @@ data class QSTileState(
companion object {
fun build(
- context: Context,
+ resources: Resources,
config: QSTileUIConfig,
build: Builder.() -> Unit
): QSTileState =
build(
{ Icon.Resource(config.iconRes, null) },
- context.getString(config.labelRes),
+ resources.getString(config.labelRes),
build,
)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt
index e8623f9f7664..977df81a0783 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt
@@ -22,6 +22,7 @@ import android.util.Log
import android.view.View
import androidx.annotation.GuardedBy
import com.android.internal.logging.InstanceId
+import com.android.systemui.Dumpable
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.plugins.qs.QSTile
@@ -31,6 +32,7 @@ import com.android.systemui.qs.tileimpl.QSTileImpl.ResourceIcon
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
+import java.io.PrintWriter
import java.util.function.Supplier
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
@@ -47,7 +49,7 @@ constructor(
@Application private val applicationScope: CoroutineScope,
private val qsHost: QSHost,
@Assisted private val qsTileViewModel: QSTileViewModel,
-) : QSTile {
+) : QSTile, Dumpable {
private val context
get() = qsHost.context
@@ -201,6 +203,10 @@ constructor(
override fun getTileSpec(): String = qsTileViewModel.config.tileSpec.spec
+ override fun dump(pw: PrintWriter, args: Array<out String>) =
+ (qsTileViewModel as? Dumpable)?.dump(pw, args)
+ ?: pw.println("${getTileSpec()}: QSTileViewModel isn't dumpable")
+
private companion object {
const val DEBUG = false
diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
index b4340f5d59d8..ce840eec29d9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
@@ -19,7 +19,6 @@ package com.android.systemui.qs.ui.adapter
import android.content.Context
import android.os.Bundle
import android.view.View
-import android.view.ViewGroup
import androidx.annotation.VisibleForTesting
import androidx.asynclayoutinflater.view.AsyncLayoutInflater
import com.android.systemui.dagger.SysUISingleton
@@ -30,6 +29,10 @@ import com.android.systemui.qs.QSImpl
import com.android.systemui.qs.dagger.QSSceneComponent
import com.android.systemui.res.R
import com.android.systemui.util.kotlin.sample
+import javax.inject.Inject
+import javax.inject.Provider
+import kotlin.coroutines.resume
+import kotlin.coroutines.suspendCoroutine
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
@@ -40,10 +43,6 @@ import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-import javax.inject.Inject
-import javax.inject.Provider
-import kotlin.coroutines.resume
-import kotlin.coroutines.suspendCoroutine
// TODO(307945185) Split View concerns into a ViewBinder
/** Adapter to use between Scene system and [QSImpl] */
@@ -61,9 +60,9 @@ interface QSSceneAdapter {
* Inflate an instance of [QSImpl] for this context. Once inflated, it will be available in
* [qsView]
*/
- suspend fun inflate(context: Context, parent: ViewGroup? = null)
+ suspend fun inflate(context: Context)
- /** Set the current state for QS. [state] must not be [State.INITIAL]. */
+ /** Set the current state for QS. [state]. */
fun setState(state: State)
sealed class State(
@@ -71,8 +70,15 @@ interface QSSceneAdapter {
val expansion: Float,
) {
data object CLOSED : State(false, 0f)
- data object QQS : State(true, 0f)
- data object QS : State(true, 1f)
+ data class Expanding(val progress: Float) : State(true, progress)
+
+ companion object {
+ // These are special cases of the expansion.
+ val QQS = Expanding(0f)
+ val QS = Expanding(1f)
+
+ fun Collapsing(progress: Float) = Expanding(1f - progress)
+ }
}
}
@@ -128,11 +134,11 @@ constructor(
override fun setDetailShowing(showing: Boolean) {}
- override suspend fun inflate(context: Context, parent: ViewGroup?) {
+ override suspend fun inflate(context: Context) {
withContext(mainDispatcher) {
val inflater = asyncLayoutInflaterFactory(context)
val view = suspendCoroutine { continuation ->
- inflater.inflate(R.layout.qs_panel, parent) { view, _, _ ->
+ inflater.inflate(R.layout.qs_panel, null) { view, _, _ ->
continuation.resume(view)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 377803fa6639..45917e85d80e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -248,9 +248,9 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
}
@Override
- public void animateNavBarLongPress(boolean isTouchDown, long durationMs) {
+ public void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) {
verifyCallerAndClearCallingIdentityPostMain("animateNavBarLongPress", () ->
- notifyAnimateNavBarLongPress(isTouchDown, durationMs));
+ notifyAnimateNavBarLongPress(isTouchDown, shrink, durationMs));
}
@Override
@@ -929,9 +929,10 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
}
}
- private void notifyAnimateNavBarLongPress(boolean isTouchDown, long durationMs) {
+ private void notifyAnimateNavBarLongPress(boolean isTouchDown, boolean shrink,
+ long durationMs) {
for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
- mConnectionCallbacks.get(i).animateNavBarLongPress(isTouchDown, durationMs);
+ mConnectionCallbacks.get(i).animateNavBarLongPress(isTouchDown, shrink, durationMs);
}
}
@@ -1079,7 +1080,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
default void onAssistantGestureCompletion(float velocity) {}
default void startAssistant(Bundle bundle) {}
default void setAssistantOverridesRequested(int[] invocationTypes) {}
- default void animateNavBarLongPress(boolean isTouchDown, long durationMs) {}
+ default void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) {}
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt
index 1c5330ecd24f..d42fde617394 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt
@@ -128,7 +128,7 @@ constructor(
private fun automaticallySwitchScenes() {
applicationScope.launch {
// TODO (b/308001302): Move this to a bouncer specific interactor.
- bouncerInteractor.onImeHidden.collectLatest {
+ bouncerInteractor.onImeHiddenByUser.collectLatest {
if (sceneInteractor.desiredScene.value.key == SceneKey.Bouncer) {
sceneInteractor.changeScene(
scene = SceneModel(SceneKey.Lockscreen),
diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt
index d14ef35027a3..dbb58a329272 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt
@@ -16,12 +16,14 @@
package com.android.systemui.scene.shared.flag
+import android.content.Context
import androidx.annotation.VisibleForTesting
import com.android.systemui.Flags as AConfigFlags
import com.android.systemui.Flags.keyguardBottomAreaRefactor
import com.android.systemui.Flags.sceneContainer
import com.android.systemui.compose.ComposeFacade
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.flags.FeatureFlagsClassic
import com.android.systemui.flags.Flag
import com.android.systemui.flags.Flags
@@ -29,6 +31,7 @@ import com.android.systemui.flags.ReleasedFlag
import com.android.systemui.flags.ResourceBooleanFlag
import com.android.systemui.flags.UnreleasedFlag
import com.android.systemui.keyguard.shared.KeyguardShadeMigrationNssl
+import com.android.systemui.res.R
import dagger.Module
import dagger.Provides
import dagger.assisted.Assisted
@@ -51,6 +54,7 @@ interface SceneContainerFlags {
class SceneContainerFlagsImpl
@AssistedInject
constructor(
+ @Application private val context: Context,
private val featureFlagsClassic: FeatureFlagsClassic,
@Assisted private val isComposeAvailable: Boolean,
) : SceneContainerFlags {
@@ -80,7 +84,11 @@ constructor(
),
) +
classicFlagTokens.map { flagToken -> FlagMustBeEnabled(flagToken) } +
- listOf(ComposeMustBeAvailable(), CompileTimeFlagMustBeEnabled())
+ listOf(
+ ComposeMustBeAvailable(),
+ CompileTimeFlagMustBeEnabled(),
+ ResourceConfigMustBeEnabled()
+ )
override fun isEnabled(): Boolean {
// SCENE_CONTAINER_ENABLED is an explicit static flag check that helps with downstream
@@ -146,6 +154,14 @@ constructor(
}
}
+ private inner class ResourceConfigMustBeEnabled : Requirement {
+ override val name: String = "R.bool.config_sceneContainerFrameworkEnabled must be true"
+
+ override fun isMet(): Boolean {
+ return context.resources.getBoolean(R.bool.config_sceneContainerFrameworkEnabled)
+ }
+ }
+
@AssistedFactory
interface Factory {
fun create(isComposeAvailable: Boolean): SceneContainerFlagsImpl
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
index bff0b93dccb0..62d8fb99603e 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
@@ -177,7 +177,8 @@ public class RecordingController
activityStarter,
mUserContextProvider,
onStartRecordingClicked,
- mMediaProjectionMetricsLogger))
+ mMediaProjectionMetricsLogger,
+ mDialogFactory))
: new ScreenRecordDialog(
context,
/* controller= */ this,
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java
index e7481ccd0efd..b98093e50920 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java
@@ -32,13 +32,16 @@ import android.os.Handler;
import android.os.Looper;
import android.os.ResultReceiver;
import android.view.Gravity;
+import android.view.View;
import android.view.Window;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Switch;
import android.widget.TextView;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.systemui.mediaprojection.MediaProjectionCaptureTarget;
@@ -115,6 +118,17 @@ public class ScreenRecordDialog extends SystemUIDialog {
mOptions.setOnItemClickListenerInt((parent, view, position, id) -> {
mAudioSwitch.setChecked(true);
});
+
+ // disable redundant Touch & Hold accessibility action for Switch Access
+ mOptions.setAccessibilityDelegate(new View.AccessibilityDelegate() {
+ @Override
+ public void onInitializeAccessibilityNodeInfo(@NonNull View host,
+ @NonNull AccessibilityNodeInfo info) {
+ info.removeAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK);
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ }
+ });
+ mOptions.setLongClickable(false);
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
index 3f6c58d73346..56ada3a9f6e8 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
@@ -54,6 +54,7 @@ class ScreenRecordPermissionDialogDelegate(
private val userContextProvider: UserContextProvider,
private val onStartRecordingClicked: Runnable?,
mediaProjectionMetricsLogger: MediaProjectionMetricsLogger,
+ private val systemUIDialogFactory: SystemUIDialog.Factory
) :
BaseMediaProjectionPermissionDialogDelegate<SystemUIDialog>(
createOptionList(),
@@ -62,14 +63,18 @@ class ScreenRecordPermissionDialogDelegate(
mediaProjectionMetricsLogger,
R.drawable.ic_screenrecord,
R.color.screenrecord_icon_color
- ) {
+ ), SystemUIDialog.Delegate {
private lateinit var tapsSwitch: Switch
private lateinit var tapsView: View
private lateinit var audioSwitch: Switch
private lateinit var options: Spinner
+ override fun createDialog(): SystemUIDialog {
+ return systemUIDialogFactory.create(this)
+ }
+
override fun onCreate(dialog: SystemUIDialog, savedInstanceState: Bundle?) {
- super.onCreate(dialog, savedInstanceState)
+ super<BaseMediaProjectionPermissionDialogDelegate>.onCreate(dialog, savedInstanceState)
setDialogTitle(R.string.screenrecord_permission_dialog_title)
dialog.setTitle(R.string.screenrecord_title)
setStartButtonText(R.string.screenrecord_permission_dialog_continue)
diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java
index 9f4ea27b9ee6..d13edf01cc4a 100644
--- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessDialog.java
@@ -39,6 +39,7 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.res.R;
+import com.android.systemui.shade.domain.interactor.ShadeInteractor;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.util.concurrency.DelayableExecutor;
@@ -58,18 +59,21 @@ public class BrightnessDialog extends Activity {
private final DelayableExecutor mMainExecutor;
private final AccessibilityManagerWrapper mAccessibilityMgr;
private Runnable mCancelTimeoutRunnable;
+ private final ShadeInteractor mShadeInteractor;
@Inject
public BrightnessDialog(
BrightnessSliderController.Factory brightnessSliderfactory,
BrightnessController.Factory brightnessControllerFactory,
@Main DelayableExecutor mainExecutor,
- AccessibilityManagerWrapper accessibilityMgr
+ AccessibilityManagerWrapper accessibilityMgr,
+ ShadeInteractor shadeInteractor
) {
mToggleSliderFactory = brightnessSliderfactory;
mBrightnessControllerFactory = brightnessControllerFactory;
mMainExecutor = mainExecutor;
mAccessibilityMgr = accessibilityMgr;
+ mShadeInteractor = shadeInteractor;
}
@@ -79,6 +83,10 @@ public class BrightnessDialog extends Activity {
setWindowAttributes();
setContentView(R.layout.brightness_mirror_container);
setBrightnessDialogViewAttributes();
+
+ if (mShadeInteractor.isQsExpanded().getValue()) {
+ finish();
+ }
}
private void setWindowAttributes() {
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index 67ec03fc3d0a..66d70e6ee2a2 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -130,6 +130,7 @@ import com.android.systemui.fragments.FragmentService;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.KeyguardViewConfigurator;
import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor;
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
@@ -542,6 +543,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
private final NPVCDownEventState.Buffer mLastDownEvents;
private final KeyguardBottomAreaViewModel mKeyguardBottomAreaViewModel;
private final KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor;
+ private final KeyguardClockInteractor mKeyguardClockInteractor;
private float mMinExpandHeight;
private boolean mPanelUpdateWhenAnimatorEnds;
private boolean mHasVibratedOnOpen = false;
@@ -760,6 +762,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
SystemClock systemClock,
KeyguardBottomAreaViewModel keyguardBottomAreaViewModel,
KeyguardBottomAreaInteractor keyguardBottomAreaInteractor,
+ KeyguardClockInteractor keyguardClockInteractor,
AlternateBouncerInteractor alternateBouncerInteractor,
DreamingToLockscreenTransitionViewModel dreamingToLockscreenTransitionViewModel,
OccludedToLockscreenTransitionViewModel occludedToLockscreenTransitionViewModel,
@@ -964,6 +967,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
updateUserSwitcherFlags();
mKeyguardBottomAreaViewModel = keyguardBottomAreaViewModel;
mKeyguardBottomAreaInteractor = keyguardBottomAreaInteractor;
+ mKeyguardClockInteractor = keyguardClockInteractor;
KeyguardLongPressViewBinder.bind(
mView.requireViewById(R.id.keyguard_long_press),
keyguardLongPressViewModel,
@@ -1610,7 +1614,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
boolean bypassEnabled = mKeyguardBypassController.getBypassEnabled();
boolean shouldAnimateClockChange = mScreenOffAnimationController.shouldAnimateClockChange();
if (mFeatureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
- mKeyguardInteractor.setClockSize(computeDesiredClockSize());
+ mKeyguardClockInteractor.setClockSize(computeDesiredClockSize());
} else {
mKeyguardStatusViewController.displayClock(computeDesiredClockSize(),
shouldAnimateClockChange);
@@ -4834,7 +4838,9 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
- mCentralSurfaces.userActivity();
+ if (!KeyguardShadeMigrationNssl.isEnabled()) {
+ mCentralSurfaces.userActivity();
+ }
mAnimatingOnDown = mHeightAnimator != null && !mIsSpringBackAnimation;
mMinExpandHeight = 0.0f;
mDownTime = mSystemClock.uptimeMillis();
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
index cf1dfdc3f701..73537edcc94a 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
@@ -311,6 +311,9 @@ public class NotificationShadeWindowViewController implements Dumpable {
mTouchActive = true;
mTouchCancelled = false;
mDownEvent = ev;
+ if (KeyguardShadeMigrationNssl.isEnabled()) {
+ mService.userActivity();
+ }
} else if (ev.getActionMasked() == MotionEvent.ACTION_UP
|| ev.getActionMasked() == MotionEvent.ACTION_CANCEL) {
mTouchActive = false;
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
index 6a9757f3adfd..31a4de4d630e 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
@@ -39,7 +39,7 @@ interface ShadeInteractor : BaseShadeInteractor {
* input (i.e. dragging a pointer). This will be true even if the user's input gesture had ended
* but a transition they initiated is still animating.
*/
- val isUserInteracting: Flow<Boolean>
+ val isUserInteracting: StateFlow<Boolean>
/** Are touches allowed on the notification panel? */
val isShadeTouchable: Flow<Boolean>
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt
index d41c5a66ad82..6defbcf29a6c 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt
@@ -39,7 +39,7 @@ class ShadeInteractorEmptyImpl @Inject constructor() : ShadeInteractor {
override val isAnyExpanded: StateFlow<Boolean> = inactiveFlowBoolean
override val isUserInteractingWithShade: Flow<Boolean> = inactiveFlowBoolean
override val isUserInteractingWithQs: Flow<Boolean> = inactiveFlowBoolean
- override val isUserInteracting: Flow<Boolean> = inactiveFlowBoolean
+ override val isUserInteracting: StateFlow<Boolean> = inactiveFlowBoolean
override val isShadeTouchable: Flow<Boolean> = inactiveFlowBoolean
override val isExpandToQsEnabled: Flow<Boolean> = inactiveFlowBoolean
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
index 68600e9d6918..7a340d2f0268 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
@@ -65,9 +65,10 @@ constructor(
override val isShadeFullyExpanded: Flow<Boolean> =
baseShadeInteractor.shadeExpansion.map { it >= 1f }.distinctUntilChanged()
- override val isUserInteracting: Flow<Boolean> =
+ override val isUserInteracting: StateFlow<Boolean> =
combine(isUserInteractingWithShade, isUserInteractingWithQs) { shade, qs -> shade || qs }
.distinctUntilChanged()
+ .stateIn(scope, SharingStarted.Eagerly, false)
override val isShadeTouchable: Flow<Boolean> =
combine(
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
index 0065db370b12..d0da945ca7d0 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
@@ -19,10 +19,16 @@ package com.android.systemui.shade.ui.viewmodel
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
+import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.ui.MediaHierarchyManager
+import com.android.systemui.media.controls.ui.MediaHost
+import com.android.systemui.media.controls.ui.MediaHostState
+import com.android.systemui.media.dagger.MediaModule
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
import javax.inject.Inject
+import javax.inject.Named
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
@@ -39,6 +45,8 @@ constructor(
val qsSceneAdapter: QSSceneAdapter,
val shadeHeaderViewModel: ShadeHeaderViewModel,
val notifications: NotificationsPlaceholderViewModel,
+ val mediaDataManager: MediaDataManager,
+ @Named(MediaModule.QUICK_QS_PANEL) private val mediaHost: MediaHost,
) {
/** The key of the scene we should switch to when swiping up. */
val upDestinationSceneKey: StateFlow<SceneKey> =
@@ -74,4 +82,15 @@ constructor(
else -> SceneKey.Lockscreen
}
}
+
+ init {
+ mediaHost.expansion = MediaHostState.EXPANDED
+ mediaHost.showsOnlyActiveMedia = true
+ mediaHost.init(MediaHierarchyManager.LOCATION_QQS)
+ }
+
+ fun isMediaVisible(): Boolean {
+ // TODO(b/296122467): handle updates to carousel visibility while scene is still visible
+ return mediaDataManager.hasActiveMediaOrRecommendation()
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
index 1b096b592a4a..909cff37b67d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
@@ -493,11 +493,11 @@ public final class KeyboardShortcutListSearch {
Arrays.asList(
Pair.create(KeyEvent.KEYCODE_SLASH, KeyEvent.META_META_ON))),
/* Back: go back to previous state (back button) */
- /* Meta + Grave, Meta + backspace, Meta + left arrow */
+ /* Meta + Escape, Meta + Grave, Meta + backspace, Meta + left arrow */
new ShortcutKeyGroupMultiMappingInfo(
context.getString(R.string.group_system_go_back),
Arrays.asList(
- Pair.create(KeyEvent.KEYCODE_GRAVE, KeyEvent.META_META_ON),
+ Pair.create(KeyEvent.KEYCODE_ESCAPE, KeyEvent.META_META_ON),
Pair.create(KeyEvent.KEYCODE_DEL, KeyEvent.META_META_ON),
Pair.create(KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.META_META_ON))),
/* Access home screen: Meta + H, Meta + Enter */
@@ -612,7 +612,7 @@ public final class KeyboardShortcutListSearch {
private static KeyboardShortcutMultiMappingGroup getMultiMappingInputShortcuts(
Context context) {
List<ShortcutMultiMappingInfo> shortcutMultiMappingInfoList = Arrays.asList(
- /* Switch input language (next language): Ctrl + Space or Meta + Space */
+ /* Switch input language (next language): Ctrl + Space */
new ShortcutMultiMappingInfo(
context.getString(R.string.input_switch_input_language_next),
null,
@@ -621,14 +621,9 @@ public final class KeyboardShortcutListSearch {
context.getString(
R.string.input_switch_input_language_next),
KeyEvent.KEYCODE_SPACE, KeyEvent.META_CTRL_ON),
- null),
- new ShortcutKeyGroup(new KeyboardShortcutInfo(
- context.getString(
- R.string.input_switch_input_language_next),
- KeyEvent.KEYCODE_SPACE, KeyEvent.META_META_ON),
null))),
/* Switch input language (previous language): */
- /* Ctrl + Shift + Space or Meta + Shift + Space */
+ /* Ctrl + Shift + Space */
new ShortcutMultiMappingInfo(
context.getString(R.string.input_switch_input_language_previous),
null,
@@ -638,12 +633,6 @@ public final class KeyboardShortcutListSearch {
R.string.input_switch_input_language_previous),
KeyEvent.KEYCODE_SPACE,
KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON),
- null),
- new ShortcutKeyGroup(new KeyboardShortcutInfo(
- context.getString(
- R.string.input_switch_input_language_previous),
- KeyEvent.KEYCODE_SPACE,
- KeyEvent.META_META_ON | KeyEvent.META_SHIFT_ON),
null)))
);
return new KeyboardShortcutMultiMappingGroup(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
index 0e83c78edb1d..e486457b89bf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
@@ -530,16 +530,12 @@ public class NotificationLockscreenUserManagerImpl implements
userHandle = mCurrentUserId;
}
if (mUsersUsersAllowingPrivateNotifications.indexOfKey(userHandle) < 0) {
- // TODO(b/301955929): STOP_SHIP (stop flag flip): remove this read and use a safe
- // default value before moving to 'released'
- Log.wtf(TAG, "Asking for redact notifs setting too early", new Throwable());
- updateUserShowPrivateSettings(userHandle);
+ Log.i(TAG, "Asking for redact notifs setting too early", new Throwable());
+ return false;
}
if (mUsersDpcAllowingPrivateNotifications.indexOfKey(userHandle) < 0) {
- // TODO(b/301955929): STOP_SHIP (stop flag flip): remove this read and use a safe
- // default value before moving to 'released'
- Log.wtf(TAG, "Asking for redact notifs dpm override too early", new Throwable());
- updateDpcSettings(userHandle);
+ Log.i(TAG, "Asking for redact notifs dpm override too early", new Throwable());
+ return false;
}
return mUsersUsersAllowingPrivateNotifications.get(userHandle)
&& mUsersDpcAllowingPrivateNotifications.get(userHandle);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/ActiveNotificationsInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/ActiveNotificationsInteractor.kt
index 31893b402e3c..e90ddf98db00 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/ActiveNotificationsInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/ActiveNotificationsInteractor.kt
@@ -15,37 +15,48 @@
package com.android.systemui.statusbar.notification.domain.interactor
+import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.statusbar.notification.collection.render.NotifStats
import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationListRepository
import com.android.systemui.statusbar.notification.shared.ActiveNotificationGroupModel
import com.android.systemui.statusbar.notification.shared.ActiveNotificationModel
import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
class ActiveNotificationsInteractor
@Inject
constructor(
private val repository: ActiveNotificationListRepository,
+ @Background private val backgroundDispatcher: CoroutineDispatcher,
) {
/** Notifications actively presented to the user in the notification stack, in order. */
val topLevelRepresentativeNotifications: Flow<List<ActiveNotificationModel>> =
- repository.activeNotifications.map { store ->
- store.renderList.map { key ->
- val entry =
- store[key]
- ?: error("Could not find notification with key $key in active notif store.")
- when (entry) {
- is ActiveNotificationGroupModel -> entry.summary
- is ActiveNotificationModel -> entry
+ repository.activeNotifications
+ .map { store ->
+ store.renderList.map { key ->
+ val entry =
+ store[key]
+ ?: error(
+ "Could not find notification with key $key in active notif store."
+ )
+ when (entry) {
+ is ActiveNotificationGroupModel -> entry.summary
+ is ActiveNotificationModel -> entry
+ }
}
}
- }
+ .flowOn(backgroundDispatcher)
/** Are any notifications being actively presented in the notification stack? */
val areAnyNotificationsPresent: Flow<Boolean> =
- repository.activeNotifications.map { it.renderList.isNotEmpty() }.distinctUntilChanged()
+ repository.activeNotifications
+ .map { it.renderList.isNotEmpty() }
+ .distinctUntilChanged()
+ .flowOn(backgroundDispatcher)
/**
* The same as [areAnyNotificationsPresent], but without flows, for easy access in synchronous
@@ -59,6 +70,7 @@ constructor(
repository.notifStats
.map { it.hasClearableAlertingNotifs || it.hasClearableSilentNotifs }
.distinctUntilChanged()
+ .flowOn(backgroundDispatcher)
fun setNotifStats(notifStats: NotifStats) {
repository.notifStats.value = notifStats
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/NotificationsKeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/NotificationsKeyguardInteractor.kt
index 87b8e55dbd1a..73341dbc4999 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/NotificationsKeyguardInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/domain/interactor/NotificationsKeyguardInteractor.kt
@@ -15,19 +15,24 @@
*/
package com.android.systemui.statusbar.notification.domain.interactor
+import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.statusbar.notification.data.repository.NotificationsKeyguardViewStateRepository
import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.flowOn
/** Domain logic pertaining to notifications on the keyguard. */
class NotificationsKeyguardInteractor
@Inject
constructor(
repository: NotificationsKeyguardViewStateRepository,
+ @Background backgroundDispatcher: CoroutineDispatcher,
) {
/** Is a pulse expansion occurring? */
- val isPulseExpanding: Flow<Boolean> = repository.isPulseExpanding
+ val isPulseExpanding: Flow<Boolean> = repository.isPulseExpanding.flowOn(backgroundDispatcher)
/** Are notifications fully hidden from view? */
- val areNotificationsFullyHidden: Flow<Boolean> = repository.areNotificationsFullyHidden
+ val areNotificationsFullyHidden: Flow<Boolean> =
+ repository.areNotificationsFullyHidden.flowOn(backgroundDispatcher)
}
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 3184d5efe5cf..3616fd6d8cd1 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
@@ -18,6 +18,8 @@ package com.android.systemui.statusbar.notification.footer.ui.view;
import static android.graphics.PorterDuff.Mode.SRC_ATOP;
+import static com.android.systemui.Flags.notificationBackgroundTintOptimization;
+
import android.annotation.ColorInt;
import android.annotation.DrawableRes;
import android.annotation.StringRes;
@@ -313,15 +315,16 @@ public class FooterView extends StackScrollerDecorView {
Resources.Theme theme = mContext.getTheme();
final @ColorInt int onSurface = Utils.getColorAttrDefaultColor(mContext,
com.android.internal.R.attr.materialColorOnSurface);
- final @ColorInt int scHigh = Utils.getColorAttrDefaultColor(mContext,
- com.android.internal.R.attr.materialColorSurfaceContainerHigh);
final Drawable clearAllBg = theme.getDrawable(R.drawable.notif_footer_btn_background);
final Drawable manageBg = theme.getDrawable(R.drawable.notif_footer_btn_background);
- // TODO(b/282173943): Remove redundant tinting once Resources are thread-safe
- final ColorFilter bgColorFilter = new PorterDuffColorFilter(scHigh, SRC_ATOP);
- if (scHigh != 0) {
- clearAllBg.setColorFilter(bgColorFilter);
- manageBg.setColorFilter(bgColorFilter);
+ if (!notificationBackgroundTintOptimization()) {
+ final @ColorInt int scHigh = Utils.getColorAttrDefaultColor(mContext,
+ com.android.internal.R.attr.materialColorSurfaceContainerHigh);
+ if (scHigh != 0) {
+ final ColorFilter bgColorFilter = new PorterDuffColorFilter(scHigh, SRC_ATOP);
+ clearAllBg.setColorFilter(bgColorFilter);
+ manageBg.setColorFilter(bgColorFilter);
+ }
}
mClearAllButton.setBackground(clearAllBg);
mClearAllButton.setTextColor(onSurface);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
index 7c8d76208e5e..4fe05ec9990c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.notification.row;
+import static com.android.systemui.Flags.notificationBackgroundTintOptimization;
+
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
@@ -309,8 +311,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
protected void setBackgroundTintColor(int color) {
if (color != mCurrentBackgroundTint) {
mCurrentBackgroundTint = color;
- // TODO(282173943): re-enable this tinting optimization when Resources are thread-safe
- if (false && color == mNormalColor) {
+ if (notificationBackgroundTintOptimization() && color == mNormalColor) {
// We don't need to tint a normal notification
color = 0;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
index 8eda96f62257..f6431a2e65ad 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
@@ -156,7 +156,7 @@ public class NotificationBackgroundView extends View implements Dumpable {
new int[]{com.android.internal.R.attr.state_hovered},
new int[]{}},
- new int[]{tintColor, tintColor, tintColor}
+ new int[]{tintColor, 0, tintColor}
);
mBackground.setTintMode(PorterDuff.Mode.SRC_ATOP);
mBackground.setTintList(stateList);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
index 6d8ec44ad55e..c615887d5c25 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java
@@ -67,6 +67,7 @@ public final class StatusBarTouchableRegionManager implements Dumpable {
private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
private boolean mIsStatusBarExpanded = false;
+ private boolean mIsSceneContainerVisible = false;
private boolean mShouldAdjustInsets = false;
private View mNotificationShadeWindowView;
private View mNotificationPanelView;
@@ -128,11 +129,14 @@ public final class StatusBarTouchableRegionManager implements Dumpable {
});
mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController;
- javaAdapter.alwaysCollectFlow(shadeInteractor.isAnyExpanded(), this::onShadeOrQsExpanded);
if (sceneContainerFlags.isEnabled()) {
javaAdapter.alwaysCollectFlow(
sceneInteractor.get().isVisible(),
+ this::onSceneContainerVisibilityChanged);
+ } else {
+ javaAdapter.alwaysCollectFlow(
+ shadeInteractor.isAnyExpanded(),
this::onShadeOrQsExpanded);
}
@@ -164,6 +168,17 @@ public final class StatusBarTouchableRegionManager implements Dumpable {
}
}
+ private void onSceneContainerVisibilityChanged(Boolean isVisible) {
+ if (isVisible != mIsSceneContainerVisible) {
+ mIsSceneContainerVisible = isVisible;
+ if (isVisible) {
+ // make sure our state is sensible
+ mForceCollapsedUntilLayout = false;
+ }
+ updateTouchableRegion();
+ }
+ }
+
/**
* Calculates the touch region needed for heads up notifications, taking into consideration
* any existing display cutouts (notch)
@@ -267,6 +282,7 @@ public final class StatusBarTouchableRegionManager implements Dumpable {
// since we don't want stray touches to go through the light reveal scrim to whatever is
// underneath.
return mIsStatusBarExpanded
+ || mIsSceneContainerVisible
|| mPrimaryBouncerInteractor.isShowing().getValue()
|| mAlternateBouncerInteractor.isVisibleState()
|| mUnlockedScreenOffAnimationController.isAnimationPlaying();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
index 824de01ca59f..2df30dccb13d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
@@ -90,8 +90,13 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
private int mLastConfigurationWidthDp = -1;
private int mLastConfigurationHeightDp = -1;
- private List<Runnable> mOnCreateRunnables = new ArrayList<>();
+ private final List<Runnable> mOnCreateRunnables = new ArrayList<>();
+ /**
+ * @deprecated Don't subclass SystemUIDialog. Please subclass {@link Delegate} and pass it to
+ * {@link Factory#create(DialogDelegate)} to create a custom dialog.
+ */
+ @Deprecated
public SystemUIDialog(Context context) {
this(context, DEFAULT_THEME, DEFAULT_DISMISS_ON_DEVICE_LOCK);
}
@@ -109,27 +114,7 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
Dependency.get(SystemUIDialogManager.class),
Dependency.get(SysUiState.class),
Dependency.get(BroadcastDispatcher.class),
- Dependency.get(DialogLaunchAnimator.class),
- new DialogDelegate<>() {});
- }
-
- @Inject
- public SystemUIDialog(
- @Application Context context,
- FeatureFlags featureFlags,
- SystemUIDialogManager systemUIDialogManager,
- SysUiState sysUiState,
- BroadcastDispatcher broadcastDispatcher,
- DialogLaunchAnimator dialogLaunchAnimator) {
- this(context,
- DEFAULT_THEME,
- DEFAULT_DISMISS_ON_DEVICE_LOCK,
- featureFlags,
- systemUIDialogManager,
- sysUiState,
- broadcastDispatcher,
- dialogLaunchAnimator,
- new DialogDelegate<>(){});
+ Dependency.get(DialogLaunchAnimator.class));
}
public static class Factory {
@@ -156,11 +141,25 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
mDialogLaunchAnimator = dialogLaunchAnimator;
}
+ /** Creates a new instance of {@link SystemUIDialog} with no customized behavior.
+ *
+ * When you just need a dialog, call this.
+ */
+ public SystemUIDialog create() {
+ return create(new DialogDelegate<>(){});
+ }
+
/**
* Creates a new instance of {@link SystemUIDialog} with {@code delegate} as the {@link
- * DialogDelegate}.
+ * Delegate}.
+ *
+ * When you need to customize the dialog, pass it a delegate.
*/
- public SystemUIDialog create(DialogDelegate<SystemUIDialog> delegate) {
+ public SystemUIDialog create(Delegate delegate) {
+ return create((DialogDelegate<SystemUIDialog>) delegate);
+ }
+
+ private SystemUIDialog create(DialogDelegate<SystemUIDialog> dialogDelegate) {
return new SystemUIDialog(
mContext,
DEFAULT_THEME,
@@ -170,7 +169,7 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
mSysUiState,
mBroadcastDispatcher,
mDialogLaunchAnimator,
- delegate);
+ dialogDelegate);
}
}
@@ -588,4 +587,18 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
mDialog.dismiss();
}
}
+
+ /**
+ * A delegate class that should be implemented in place of sublcassing {@link SystemUIDialog}.
+ *
+ * Implement this interface and then pass an instance of your implementation to
+ * {@link SystemUIDialog.Factory#create(Delegate)}.
+ */
+ public interface Delegate extends DialogDelegate<SystemUIDialog> {
+ /**
+ * Returns a new {@link SystemUIDialog} which has been passed this Delegate in its
+ * construction.
+ */
+ SystemUIDialog createDialog();
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureController.java
index bbba19d61b5a..87df180353b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureController.java
@@ -73,7 +73,11 @@ public interface DevicePostureController extends CallbackController<Callback> {
/** Callback to be notified about device posture changes. */
interface Callback {
- /** Called when the posture changes. */
+ /**
+ * Called when the posture changes. If there are multiple active displays ("concurrent"),
+ * this will report the physical posture of the device (also known as the base device
+ * state).
+ */
void onPostureChanged(@DevicePostureInt int posture);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java
index 8f1ac812da71..422aa4d4aa60 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DevicePostureControllerImpl.java
@@ -39,8 +39,11 @@ import javax.inject.Inject;
/** Implementation of {@link DevicePostureController} using the DeviceStateManager. */
@SysUISingleton
public class DevicePostureControllerImpl implements DevicePostureController {
+ /** From androidx.window.common.COMMON_STATE_USE_BASE_STATE */
+ private static final int COMMON_STATE_USE_BASE_STATE = 1000;
private final List<Callback> mListeners = new ArrayList<>();
private int mCurrentDevicePosture = DEVICE_POSTURE_UNKNOWN;
+ private int mCurrentBasePosture = DEVICE_POSTURE_UNKNOWN;
private final SparseIntArray mDeviceStateToPostureMap = new SparseIntArray();
@@ -73,16 +76,32 @@ public class DevicePostureControllerImpl implements DevicePostureController {
mDeviceStateToPostureMap.put(deviceState, posture);
}
- deviceStateManager.registerCallback(executor, state -> {
- Assert.isMainThread();
- mCurrentDevicePosture =
- mDeviceStateToPostureMap.get(state, DEVICE_POSTURE_UNKNOWN);
+ deviceStateManager.registerCallback(executor, new DeviceStateManager.DeviceStateCallback() {
+ @Override
+ public void onStateChanged(int state) {
+ Assert.isMainThread();
+ mCurrentDevicePosture =
+ mDeviceStateToPostureMap.get(state, DEVICE_POSTURE_UNKNOWN);
+ sendUpdatePosture();
+ }
+
+ @Override
+ public void onBaseStateChanged(int state) {
+ Assert.isMainThread();
+ mCurrentBasePosture = mDeviceStateToPostureMap.get(state, DEVICE_POSTURE_UNKNOWN);
+
+ if (useBaseState()) {
+ sendUpdatePosture();
+ }
+ }
- ListenersTracing.INSTANCE.forEachTraced(mListeners, "DevicePostureControllerImpl",
+ private void sendUpdatePosture() {
+ ListenersTracing.INSTANCE.forEachTraced(mListeners, "DevicePostureControllerImpl",
l -> {
- l.onPostureChanged(mCurrentDevicePosture);
+ l.onPostureChanged(getDevicePosture());
return Unit.INSTANCE;
});
+ }
});
}
@@ -100,6 +119,14 @@ public class DevicePostureControllerImpl implements DevicePostureController {
@Override
public int getDevicePosture() {
- return mCurrentDevicePosture;
+ if (useBaseState()) {
+ return mCurrentBasePosture;
+ } else {
+ return mCurrentDevicePosture;
+ }
+ }
+
+ private boolean useBaseState() {
+ return mCurrentDevicePosture == COMMON_STATE_USE_BASE_STATE;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java
index e576f36d573a..279e5ef1f38c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java
@@ -16,6 +16,7 @@ package com.android.systemui.statusbar.policy;
import com.android.systemui.Dumpable;
import com.android.systemui.statusbar.policy.FlashlightController.FlashlightListener;
+import com.android.systemui.util.annotations.WeaklyReferencedCallback;
public interface FlashlightController extends CallbackController<FlashlightListener>, Dumpable {
@@ -24,6 +25,7 @@ public interface FlashlightController extends CallbackController<FlashlightListe
boolean isAvailable();
boolean isEnabled();
+ @WeaklyReferencedCallback
public interface FlashlightListener {
/**
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt b/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt
index 10fc83c8b82c..ff73e0e2ab3f 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt
@@ -21,6 +21,7 @@ import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.shade.NotificationPanelUnfoldAnimationController
import com.android.systemui.statusbar.phone.StatusBarMoveFromCenterAnimationController
import com.android.systemui.unfold.dagger.UnfoldBg
+import com.android.systemui.unfold.progress.UnfoldTransitionProgressForwarder
import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
import com.android.systemui.unfold.util.UnfoldKeyguardVisibilityManager
@@ -106,4 +107,20 @@ interface SysUIUnfoldComponent {
fun getUnfoldLatencyTracker(): UnfoldLatencyTracker
fun getNaturalRotationUnfoldProgressProvider(): NaturalRotationUnfoldProgressProvider
+
+ /** Creates a UnfoldTransitionProgressProvider that calculates progress in the main thread. */
+ fun getUnfoldTransitionProgressProvider(): UnfoldTransitionProgressProvider
+
+ /** Creates a UnfoldTransitionProgressProvider that calculates progress in the background. */
+ @UnfoldBg
+ fun getBgUnfoldTransitionProgressProvider(): UnfoldTransitionProgressProvider
+
+ /** Creates a UnfoldTransitionProgressForwarder. */
+ fun getUnfoldTransitionProgressForwarder(): UnfoldTransitionProgressForwarder
+
+ /** Creates a FoldStateLoggingProvider. */
+ fun getFoldStateLoggingProvider(): Optional<FoldStateLoggingProvider>
+
+ /** Creates a FoldStateLogger. */
+ fun getFoldStateLogger(): Optional<FoldStateLogger>
}
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt
index 053148709e69..968981197b83 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt
@@ -20,10 +20,12 @@ import android.content.Context
import android.hardware.devicestate.DeviceStateManager
import android.os.SystemProperties
import com.android.systemui.CoreStartable
+import com.android.systemui.Flags
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.LifecycleScreenStatusProvider
import com.android.systemui.unfold.config.UnfoldTransitionConfig
+import com.android.systemui.unfold.dagger.UnfoldBgProgressFlag
import com.android.systemui.unfold.dagger.UnfoldMain
import com.android.systemui.unfold.data.repository.UnfoldTransitionRepository
import com.android.systemui.unfold.data.repository.UnfoldTransitionRepositoryImpl
@@ -64,6 +66,10 @@ class UnfoldTransitionModule {
@Provides @UnfoldTransitionATracePrefix fun tracingTagPrefix() = "systemui"
+ @Provides
+ @UnfoldBgProgressFlag
+ fun unfoldBgProgressFlag() = Flags.unfoldAnimationBackgroundProgress()
+
/** A globally available FoldStateListener that allows one to query the fold state. */
@Provides
@Singleton
diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
index e7e907a90d34..e4f1c87fc305 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
@@ -25,6 +25,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.debug.IAdbManager;
import android.hardware.usb.UsbManager;
+import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.os.ServiceManager;
@@ -69,8 +70,7 @@ public class UsbDebuggingActivity extends AlertActivity
super.onCreate(icicle);
// Emulator does not support reseating the usb cable to reshow the dialog.
- boolean isEmulator = SystemProperties.get("ro.boot.qemu").equals("1");
- if (SystemProperties.getInt("service.adb.tcp.port", 0) == 0 && !isEmulator) {
+ if (SystemProperties.getInt("service.adb.tcp.port", 0) == 0 && !Build.IS_EMULATOR) {
mDisconnectedReceiver = new UsbDisconnectedReceiver(this);
IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter);
diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
index 0e6df6b11e7b..e031be2a72dd 100644
--- a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
+++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java
@@ -19,6 +19,7 @@ package com.android.systemui.wallet.controller;
import static com.android.systemui.wallet.controller.QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE;
import static com.android.systemui.wallet.controller.QuickAccessWalletController.WalletChangeEvent.WALLET_PREFERENCE_CHANGE;
+import android.annotation.WorkerThread;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
@@ -146,7 +147,9 @@ public class QuickAccessWalletController {
/**
* Update the "show wallet" preference.
+ * This should not be called on the main thread.
*/
+ @WorkerThread
public void updateWalletPreference() {
mWalletEnabled = mQuickAccessWalletClient.isWalletServiceAvailable()
&& mQuickAccessWalletClient.isWalletFeatureAvailable()
@@ -155,10 +158,12 @@ public class QuickAccessWalletController {
/**
* Query the wallet cards from {@link QuickAccessWalletClient}.
+ * This should not be called on the main thread.
*
* @param cardsRetriever a callback to retrieve wallet cards.
* @param maxCards the maximum number of cards requested from the QuickAccessWallet
*/
+ @WorkerThread
public void queryWalletCards(
QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever, int maxCards) {
if (mClock.elapsedRealtime() - mQawClientCreatedTimeMillis
@@ -182,9 +187,11 @@ public class QuickAccessWalletController {
/**
* Query the wallet cards from {@link QuickAccessWalletClient}.
+ * This should not be called on the main thread.
*
* @param cardsRetriever a callback to retrieve wallet cards.
*/
+ @WorkerThread
public void queryWalletCards(
QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) {
queryWalletCards(cardsRetriever, /* maxCards= */ 1);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt
index 6c91c987f327..2d5c2ab981b6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt
@@ -27,8 +27,6 @@ import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.biometrics.AuthController
import com.android.systemui.decor.FaceScanningProviderFactory
import com.android.systemui.dump.logcatLogBuffer
-import com.android.systemui.flags.FakeFeatureFlags
-import com.android.systemui.flags.Flags
import com.android.systemui.log.ScreenDecorationsLogger
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.util.mockito.whenever
@@ -55,8 +53,6 @@ class FaceScanningProviderFactoryTest : SysuiTestCase() {
@Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
- @Mock private lateinit var display: Display
-
private val displayId = 2
@Before
@@ -82,8 +78,6 @@ class FaceScanningProviderFactoryTest : SysuiTestCase() {
R.bool.config_fillMainBuiltInDisplayCutout,
true
)
- val featureFlags = FakeFeatureFlags()
- featureFlags.set(Flags.STOP_PULSING_FACE_SCANNING_ANIMATION, true)
underTest =
FaceScanningProviderFactory(
authController,
@@ -92,7 +86,6 @@ class FaceScanningProviderFactoryTest : SysuiTestCase() {
keyguardUpdateMonitor,
mock(Executor::class.java),
ScreenDecorationsLogger(logcatLogBuffer("FaceScanningProviderFactoryTest")),
- featureFlags,
)
whenever(authController.faceSensorLocation).thenReturn(Point(10, 10))
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
index af88df79be87..639276e302a7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
@@ -78,7 +78,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.test.filters.SmallTest;
-import com.android.systemui.res.R;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.biometrics.AuthController;
import com.android.systemui.decor.CornerDecorProvider;
@@ -93,10 +92,9 @@ import com.android.systemui.decor.OverlayWindow;
import com.android.systemui.decor.PrivacyDotCornerDecorProviderImpl;
import com.android.systemui.decor.PrivacyDotDecorProviderFactory;
import com.android.systemui.decor.RoundedCornerResDelegate;
-import com.android.systemui.flags.FakeFeatureFlags;
-import com.android.systemui.flags.Flags;
import com.android.systemui.log.ScreenDecorationsLogger;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.res.R;
import com.android.systemui.settings.FakeDisplayTracker;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.commandline.CommandRegistry;
@@ -229,16 +227,13 @@ public class ScreenDecorationsTest extends SysuiTestCase {
doAnswer(it -> !(mMockCutoutList.isEmpty())).when(mCutoutFactory).getHasProviders();
doReturn(mMockCutoutList).when(mCutoutFactory).getProviders();
- FakeFeatureFlags featureFlags = new FakeFeatureFlags();
- featureFlags.set(Flags.STOP_PULSING_FACE_SCANNING_ANIMATION, true);
mFaceScanningDecorProvider = spy(new FaceScanningOverlayProviderImpl(
BOUNDS_POSITION_TOP,
mAuthController,
mStatusBarStateController,
mKeyguardUpdateMonitor,
mExecutor,
- new ScreenDecorationsLogger(logcatLogBuffer("TestLogBuffer")),
- featureFlags));
+ new ScreenDecorationsLogger(logcatLogBuffer("TestLogBuffer"))));
mScreenDecorations = spy(new ScreenDecorations(mContext, mSecureSettings,
mCommandRegistry, mUserTracker, mDisplayTracker, mDotViewController,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java
index d8799e16ebdb..43952824f9a7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java
@@ -133,8 +133,8 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase {
}
@Test
- public void setScale() throws RemoteException {
- mIWindowMagnificationConnection.setScale(TEST_DISPLAY, 3.0f);
+ public void setScaleForWindowMagnification() throws RemoteException {
+ mIWindowMagnificationConnection.setScaleForWindowMagnification(TEST_DISPLAY, 3.0f);
waitForIdleSync();
verify(mWindowMagnificationController).setScale(3.0f);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt
index 993dbac747e8..54d6b53d58f8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt
@@ -95,6 +95,18 @@ class AuthDialogPanelInteractionDetectorTest : SysuiTestCase() {
}
@Test
+ fun enableDetector_isUserInteractingTrue_shouldNotPostRunnable() =
+ testComponent.runTest {
+ // GIVEN isInteracting starts true
+ shadeRepository.setLegacyShadeTracking(true)
+ runCurrent()
+ detector.enable(action)
+
+ // THEN action was not run
+ verifyZeroInteractions(action)
+ }
+
+ @Test
fun enableDetector_shadeExpandImmediate_shouldNotPostRunnable() =
testComponent.runTest {
// GIVEN shade is closed and detector is enabled
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationDialogFactoryTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationDialogFactoryTest.java
index 0ff8da5dfba7..8c8544cd6e5b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationDialogFactoryTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationDialogFactoryTest.java
@@ -20,16 +20,14 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assume.assumeTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.res.Resources;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
@@ -60,14 +58,13 @@ public class BiometricNotificationDialogFactoryTest extends SysuiTestCase {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
- @Mock
- FingerprintManager mFingerprintManager;
- @Mock
- FaceManager mFaceManager;
- @Mock
- SystemUIDialog mDialog;
+ @Mock Resources mResources;
+ @Mock FingerprintManager mFingerprintManager;
+ @Mock FaceManager mFaceManager;
+ @Mock SystemUIDialog.Factory mSystemUIDialogFactory;
+ @Mock SystemUIDialog mDialog;
+ @Mock BiometricNotificationDialogFactory.ActivityStarter mActivityStarter;
- private Context mContextSpy;
private final ArgumentCaptor<DialogInterface.OnClickListener> mOnClickListenerArgumentCaptor =
ArgumentCaptor.forClass(DialogInterface.OnClickListener.class);
private final ArgumentCaptor<Intent> mIntentArgumentCaptor =
@@ -76,15 +73,16 @@ public class BiometricNotificationDialogFactoryTest extends SysuiTestCase {
@Before
public void setUp() throws ExecutionException, InterruptedException {
- mContext.addMockSystemService(FingerprintManager.class, mFingerprintManager);
- mContext.addMockSystemService(FaceManager.class, mFaceManager);
- mContextSpy = spy(mContext);
-
when(mFingerprintManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
- doNothing().when(mContextSpy).startActivity(any());
-
- mDialogFactory = new BiometricNotificationDialogFactory();
+ when(mSystemUIDialogFactory.create()).thenReturn(mDialog);
+
+ mDialogFactory = new BiometricNotificationDialogFactory(
+ mResources,
+ mSystemUIDialogFactory,
+ mFingerprintManager,
+ mFaceManager
+ );
}
@Test
@@ -92,8 +90,7 @@ public class BiometricNotificationDialogFactoryTest extends SysuiTestCase {
assumeTrue(getContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT));
- mDialogFactory.createReenrollDialog(mContextSpy, mDialog,
- BiometricSourceType.FINGERPRINT);
+ mDialogFactory.createReenrollDialog(0, mActivityStarter, BiometricSourceType.FINGERPRINT);
verify(mDialog).setPositiveButton(anyInt(), mOnClickListenerArgumentCaptor.capture());
@@ -108,7 +105,7 @@ public class BiometricNotificationDialogFactoryTest extends SysuiTestCase {
removalCallbackArgumentCaptor.getValue().onRemovalSucceeded(null /* fp */,
0 /* remaining */);
- verify(mContextSpy).startActivity(mIntentArgumentCaptor.capture());
+ verify(mActivityStarter).startActivity(mIntentArgumentCaptor.capture());
assertThat(mIntentArgumentCaptor.getValue().getAction()).isEqualTo(
Settings.ACTION_FINGERPRINT_ENROLL);
}
@@ -118,8 +115,7 @@ public class BiometricNotificationDialogFactoryTest extends SysuiTestCase {
assumeTrue(getContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT));
- mDialogFactory.createReenrollDialog(mContextSpy, mDialog,
- BiometricSourceType.FINGERPRINT);
+ mDialogFactory.createReenrollDialog(0, mActivityStarter, BiometricSourceType.FINGERPRINT);
verify(mDialog).setPositiveButton(anyInt(), mOnClickListenerArgumentCaptor.capture());
@@ -134,7 +130,7 @@ public class BiometricNotificationDialogFactoryTest extends SysuiTestCase {
removalCallbackArgumentCaptor.getValue().onRemovalError(null /* fp */,
0 /* errmsgId */, "Error" /* errString */);
- verify(mContextSpy, never()).startActivity(any());
+ verify(mActivityStarter, never()).startActivity(any());
}
@Test
@@ -142,8 +138,7 @@ public class BiometricNotificationDialogFactoryTest extends SysuiTestCase {
assumeTrue(getContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_FACE));
- mDialogFactory.createReenrollDialog(mContextSpy, mDialog,
- BiometricSourceType.FACE);
+ mDialogFactory.createReenrollDialog(0, mActivityStarter, BiometricSourceType.FACE);
verify(mDialog).setPositiveButton(anyInt(), mOnClickListenerArgumentCaptor.capture());
@@ -158,7 +153,7 @@ public class BiometricNotificationDialogFactoryTest extends SysuiTestCase {
removalCallbackArgumentCaptor.getValue().onRemovalSucceeded(null /* fp */,
0 /* remaining */);
- verify(mContextSpy).startActivity(mIntentArgumentCaptor.capture());
+ verify(mActivityStarter).startActivity(mIntentArgumentCaptor.capture());
assertThat(mIntentArgumentCaptor.getValue().getAction()).isEqualTo(
"android.settings.FACE_ENROLL");
}
@@ -168,8 +163,7 @@ public class BiometricNotificationDialogFactoryTest extends SysuiTestCase {
assumeTrue(getContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_FACE));
- mDialogFactory.createReenrollDialog(mContextSpy, mDialog,
- BiometricSourceType.FACE);
+ mDialogFactory.createReenrollDialog(0, mActivityStarter, BiometricSourceType.FACE);
verify(mDialog).setPositiveButton(anyInt(), mOnClickListenerArgumentCaptor.capture());
@@ -184,6 +178,6 @@ public class BiometricNotificationDialogFactoryTest extends SysuiTestCase {
removalCallbackArgumentCaptor.getValue().onRemovalError(null /* face */,
0 /* errmsgId */, "Error" /* errString */);
- verify(mContextSpy, never()).startActivity(any());
+ verify(mActivityStarter, never()).startActivity(any());
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationServiceTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationServiceTest.java
index 3c106789290d..c6771b262114 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationServiceTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationServiceTest.java
@@ -18,9 +18,7 @@ package com.android.systemui.biometrics;
import static com.android.systemui.biometrics.BiometricNotificationBroadcastReceiver.ACTION_SHOW_FACE_REENROLL_DIALOG;
import static com.android.systemui.biometrics.BiometricNotificationBroadcastReceiver.ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG;
-
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.never;
@@ -71,6 +69,8 @@ public class BiometricNotificationServiceTest extends SysuiTestCase {
@Mock
NotificationManager mNotificationManager;
@Mock
+ BiometricNotificationDialogFactory mNotificationDialogFactory;
+ @Mock
Optional<FingerprintReEnrollNotification> mFingerprintReEnrollNotificationOptional;
@Mock
FingerprintReEnrollNotification mFingerprintReEnrollNotification;
@@ -103,9 +103,8 @@ public class BiometricNotificationServiceTest extends SysuiTestCase {
mLooper = TestableLooper.get(this);
Handler handler = new Handler(mLooper.getLooper());
- BiometricNotificationDialogFactory dialogFactory = new BiometricNotificationDialogFactory();
BiometricNotificationBroadcastReceiver broadcastReceiver =
- new BiometricNotificationBroadcastReceiver(mContext, dialogFactory);
+ new BiometricNotificationBroadcastReceiver(mContext, mNotificationDialogFactory);
mBiometricNotificationService =
new BiometricNotificationService(mContext,
mKeyguardUpdateMonitor, mKeyguardStateController, handler,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModelTest.kt
new file mode 100644
index 000000000000..575d8bf8248c
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModelTest.kt
@@ -0,0 +1,157 @@
+/*
+ * 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 com.android.systemui.biometrics.ui.viewmodel
+
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysUITestComponent
+import com.android.systemui.SysUITestModule
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.TestMocksModule
+import com.android.systemui.collectLastValue
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.flags.FakeFeatureFlagsClassicModule
+import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
+import com.android.systemui.keyguard.shared.model.StatusBarState
+import com.android.systemui.runCurrent
+import com.android.systemui.runTest
+import com.android.systemui.shade.data.repository.FakeShadeRepository
+import com.android.systemui.shade.domain.model.ShadeModel
+import com.android.systemui.statusbar.phone.SystemUIDialogManager
+import com.android.systemui.user.domain.UserDomainLayerModule
+import com.android.systemui.util.mockito.mock
+import com.google.common.truth.Truth.assertThat
+import dagger.BindsInstance
+import dagger.Component
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(JUnit4::class)
+class DefaultUdfpsTouchOverlayViewModelTest : SysuiTestCase() {
+ @Captor
+ private lateinit var sysuiDialogListenerCaptor: ArgumentCaptor<SystemUIDialogManager.Listener>
+ private var systemUIDialogManager: SystemUIDialogManager = mock()
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ }
+
+ @SysUISingleton
+ @Component(
+ modules =
+ [
+ SysUITestModule::class,
+ UserDomainLayerModule::class,
+ ]
+ )
+ interface TestComponent : SysUITestComponent<DefaultUdfpsTouchOverlayViewModel> {
+ val keyguardRepository: FakeKeyguardRepository
+ val shadeRepository: FakeShadeRepository
+ @Component.Factory
+ interface Factory {
+ fun create(
+ @BindsInstance test: SysuiTestCase,
+ featureFlags: FakeFeatureFlagsClassicModule,
+ mocks: TestMocksModule,
+ ): TestComponent
+ }
+ }
+
+ private fun TestComponent.shadeExpanded(expanded: Boolean) {
+ if (expanded) {
+ shadeRepository.setShadeModel(
+ ShadeModel(
+ expansionAmount = 1f,
+ isExpanded = true,
+ isUserDragging = false,
+ )
+ )
+ shadeRepository.setLegacyExpandedOrAwaitingInputTransfer(true)
+ } else {
+ keyguardRepository.setStatusBarState(StatusBarState.SHADE)
+ shadeRepository.setShadeModel(
+ ShadeModel(
+ expansionAmount = 0f,
+ isExpanded = false,
+ isUserDragging = false,
+ )
+ )
+ shadeRepository.setLegacyExpandedOrAwaitingInputTransfer(false)
+ }
+ }
+
+ private val testComponent: TestComponent =
+ DaggerDefaultUdfpsTouchOverlayViewModelTest_TestComponent.factory()
+ .create(
+ test = this,
+ featureFlags =
+ FakeFeatureFlagsClassicModule { set(Flags.FULL_SCREEN_USER_SWITCHER, true) },
+ mocks = TestMocksModule(systemUIDialogManager = systemUIDialogManager),
+ )
+
+ @Test
+ fun shadeNotExpanded_noDialogShowing_shouldHandleTouchesTrue() =
+ testComponent.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+ runCurrent()
+
+ shadeExpanded(false)
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(false)
+ runCurrent()
+
+ assertThat(shouldHandleTouches).isTrue()
+ }
+
+ @Test
+ fun shadeNotExpanded_dialogShowing_shouldHandleTouchesFalse() =
+ testComponent.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+ runCurrent()
+
+ shadeExpanded(false)
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(true)
+ runCurrent()
+
+ assertThat(shouldHandleTouches).isFalse()
+ }
+
+ @Test
+ fun shadeExpanded_noDialogShowing_shouldHandleTouchesFalse() =
+ testComponent.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+ runCurrent()
+
+ shadeExpanded(true)
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(false)
+ runCurrent()
+
+ assertThat(shouldHandleTouches).isFalse()
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelTest.kt
new file mode 100644
index 000000000000..dfb18b9cdc79
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelTest.kt
@@ -0,0 +1,150 @@
+/*
+ * 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 com.android.systemui.biometrics.ui.viewmodel
+
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysUITestComponent
+import com.android.systemui.SysUITestModule
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.TestMocksModule
+import com.android.systemui.collectLastValue
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.flags.FakeFeatureFlagsClassicModule
+import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
+import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
+import com.android.systemui.runCurrent
+import com.android.systemui.runTest
+import com.android.systemui.shade.data.repository.FakeShadeRepository
+import com.android.systemui.statusbar.phone.SystemUIDialogManager
+import com.android.systemui.user.domain.UserDomainLayerModule
+import com.android.systemui.util.mockito.mock
+import com.google.common.truth.Truth.assertThat
+import dagger.BindsInstance
+import dagger.Component
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(JUnit4::class)
+class DeviceEntryUdfpsTouchOverlayViewModelTest : SysuiTestCase() {
+ @Captor
+ private lateinit var sysuiDialogListenerCaptor: ArgumentCaptor<SystemUIDialogManager.Listener>
+ private var systemUIDialogManager: SystemUIDialogManager = mock()
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ }
+
+ @SysUISingleton
+ @Component(
+ modules =
+ [
+ SysUITestModule::class,
+ UserDomainLayerModule::class,
+ ]
+ )
+ interface TestComponent : SysUITestComponent<DeviceEntryUdfpsTouchOverlayViewModel> {
+ val keyguardRepository: FakeKeyguardRepository
+ val shadeRepository: FakeShadeRepository
+ @Component.Factory
+ interface Factory {
+ fun create(
+ @BindsInstance test: SysuiTestCase,
+ featureFlags: FakeFeatureFlagsClassicModule,
+ mocks: TestMocksModule,
+ ): TestComponent
+ }
+ }
+
+ private val testDeviceEntryIconTransitionAlpha = MutableStateFlow(0f)
+ private val testDeviceEntryIconTransition: DeviceEntryIconTransition
+ get() =
+ object : DeviceEntryIconTransition {
+ override val deviceEntryParentViewAlpha: Flow<Float> =
+ testDeviceEntryIconTransitionAlpha.asStateFlow()
+ }
+ private val testComponent: TestComponent =
+ DaggerDeviceEntryUdfpsTouchOverlayViewModelTest_TestComponent.factory()
+ .create(
+ test = this,
+ featureFlags =
+ FakeFeatureFlagsClassicModule { set(Flags.FULL_SCREEN_USER_SWITCHER, true) },
+ mocks =
+ TestMocksModule(
+ systemUIDialogManager = systemUIDialogManager,
+ deviceEntryIconTransitions =
+ setOf(
+ testDeviceEntryIconTransition,
+ )
+ ),
+ )
+
+ @Test
+ fun dialogShowing_shouldHandleTouchesFalse() =
+ testComponent.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+ runCurrent()
+
+ testDeviceEntryIconTransitionAlpha.value = 1f
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(true)
+ runCurrent()
+
+ assertThat(shouldHandleTouches).isFalse()
+ }
+
+ @Test
+ fun transitionAlphaIsSmall_shouldHandleTouchesFalse() =
+ testComponent.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+ runCurrent()
+
+ testDeviceEntryIconTransitionAlpha.value = .3f
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(false)
+ runCurrent()
+
+ assertThat(shouldHandleTouches).isFalse()
+ }
+
+ @Test
+ fun alphaFullyShowing_noDialog_shouldHandleTouchesTrue() =
+ testComponent.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+ runCurrent()
+
+ testDeviceEntryIconTransitionAlpha.value = 1f
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(false)
+ runCurrent()
+
+ assertThat(shouldHandleTouches).isTrue()
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogDelegateTest.java
index eee0ed45345d..4022d4388ab1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogDelegateTest.java
@@ -16,8 +16,10 @@
package com.android.systemui.bluetooth;
+import static com.android.systemui.statusbar.phone.SystemUIDialog.DEFAULT_DISMISS_ON_DEVICE_LOCK;
import static com.google.common.truth.Truth.assertThat;
-
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
@@ -26,31 +28,41 @@ import static org.mockito.Mockito.when;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.test.filters.SmallTest;
-import com.android.internal.logging.UiEventLogger;
+import com.android.internal.logging.testing.UiEventLoggerFake;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
-import com.android.systemui.res.R;
-import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.DialogLaunchAnimator;
+import com.android.systemui.broadcast.BroadcastSender;
+import com.android.systemui.flags.FakeFeatureFlags;
+import com.android.systemui.flags.Flags;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
+import com.android.systemui.model.SysUiState;
+import com.android.systemui.res.R;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
+import com.android.systemui.statusbar.phone.SystemUIDialogManager;
+import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.time.FakeSystemClock;
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;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
-public class BroadcastDialogTest extends SysuiTestCase {
+public class BroadcastDialogDelegateTest extends SysuiTestCase {
private static final String CURRENT_BROADCAST_APP = "Music";
private static final String SWITCH_APP = "System UI";
@@ -61,33 +73,64 @@ public class BroadcastDialogTest extends SysuiTestCase {
private final LocalBluetoothLeBroadcast mLocalBluetoothLeBroadcast = mock(
LocalBluetoothLeBroadcast.class);
private final BroadcastSender mBroadcastSender = mock(BroadcastSender.class);
- private BroadcastDialog mBroadcastDialog;
- private View mDialogView;
+ private BroadcastDialogDelegate mBroadcastDialogDelegate;
+ private FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();
+ @Mock SystemUIDialog.Factory mSystemUIDialogFactory;
+ @Mock SystemUIDialogManager mDialogManager;
+ @Mock SysUiState mSysUiState;
+ @Mock DialogLaunchAnimator mDialogLaunchAnimator;
+ @Mock MediaOutputDialogFactory mMediaOutputDialogFactory;
+ private SystemUIDialog mDialog;
private TextView mTitle;
private TextView mSubTitle;
private Button mSwitchBroadcastAppButton;
private Button mChangeOutputButton;
+ private final FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager);
when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn(null);
- mBroadcastDialog = new BroadcastDialog(mContext, mock(MediaOutputDialogFactory.class),
- mLocalBluetoothManager, CURRENT_BROADCAST_APP, TEST_PACKAGE,
- mock(UiEventLogger.class), mBroadcastSender);
- mBroadcastDialog.show();
- mDialogView = mBroadcastDialog.mDialogView;
+
+ mFeatureFlags.set(Flags.WM_ENABLE_PREDICTIVE_BACK_QS_DIALOG_ANIM, true);
+ when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState);
+ when(mSystemUIDialogFactory.create(any())).thenReturn(mDialog);
+
+ mBroadcastDialogDelegate = new BroadcastDialogDelegate(
+ mContext,
+ mMediaOutputDialogFactory,
+ mLocalBluetoothManager,
+ new UiEventLoggerFake(),
+ mFakeExecutor,
+ mBroadcastSender,
+ mSystemUIDialogFactory,
+ CURRENT_BROADCAST_APP,
+ TEST_PACKAGE);
+
+ mDialog = new SystemUIDialog(
+ mContext,
+ 0,
+ DEFAULT_DISMISS_ON_DEVICE_LOCK,
+ mFeatureFlags,
+ mDialogManager,
+ mSysUiState,
+ getFakeBroadcastDispatcher(),
+ mDialogLaunchAnimator,
+ mBroadcastDialogDelegate
+ );
+
+ mDialog.show();
}
@After
public void tearDown() {
- mBroadcastDialog.dismiss();
+ mDialog.dismiss();
}
@Test
public void onCreate_withCurrentApp_titleIsCurrentAppName() {
- mTitle = mDialogView.requireViewById(R.id.dialog_title);
+ mTitle = mDialog.requireViewById(R.id.dialog_title);
assertThat(mTitle.getText().toString()).isEqualTo(mContext.getString(
R.string.bt_le_audio_broadcast_dialog_title, CURRENT_BROADCAST_APP));
@@ -95,7 +138,7 @@ public class BroadcastDialogTest extends SysuiTestCase {
@Test
public void onCreate_withCurrentApp_subTitleIsSwitchAppName() {
- mSubTitle = mDialogView.requireViewById(R.id.dialog_subtitle);
+ mSubTitle = mDialog.requireViewById(R.id.dialog_subtitle);
assertThat(mSubTitle.getText()).isEqualTo(
mContext.getString(R.string.bt_le_audio_broadcast_dialog_sub_title, SWITCH_APP));
@@ -103,7 +146,7 @@ public class BroadcastDialogTest extends SysuiTestCase {
@Test
public void onCreate_withCurrentApp_switchBtnIsSwitchAppName() {
- mSwitchBroadcastAppButton = mDialogView.requireViewById(R.id.switch_broadcast);
+ mSwitchBroadcastAppButton = mDialog.requireViewById(R.id.switch_broadcast);
assertThat(mSwitchBroadcastAppButton.getText().toString()).isEqualTo(
mContext.getString(R.string.bt_le_audio_broadcast_dialog_switch_app, SWITCH_APP));
@@ -111,17 +154,17 @@ public class BroadcastDialogTest extends SysuiTestCase {
@Test
public void onClick_withChangeOutput_dismissBroadcastDialog() {
- mChangeOutputButton = mDialogView.requireViewById(R.id.change_output);
+ mChangeOutputButton = mDialog.requireViewById(R.id.change_output);
mChangeOutputButton.performClick();
- assertThat(mBroadcastDialog.isShowing()).isFalse();
+ assertThat(mDialog.isShowing()).isFalse();
}
@Test
public void onClick_withSwitchBroadcast_stopCurrentBroadcast() {
when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn(
mLocalBluetoothLeBroadcast);
- mSwitchBroadcastAppButton = mDialogView.requireViewById(R.id.switch_broadcast);
+ mSwitchBroadcastAppButton = mDialog.requireViewById(R.id.switch_broadcast);
mSwitchBroadcastAppButton.performClick();
verify(mLocalBluetoothLeBroadcast).stopLatestBroadcast();
@@ -129,7 +172,7 @@ public class BroadcastDialogTest extends SysuiTestCase {
@Test
public void onClick_withSwitchBroadcast_stopCurrentBroadcastFailed() {
- mSwitchBroadcastAppButton = mDialogView.requireViewById(R.id.switch_broadcast);
+ mSwitchBroadcastAppButton = mDialog.requireViewById(R.id.switch_broadcast);
mSwitchBroadcastAppButton.performClick();
assertThat(mSwitchBroadcastAppButton.getText().toString()).isEqualTo(
@@ -139,9 +182,9 @@ public class BroadcastDialogTest extends SysuiTestCase {
@Test
public void handleLeBroadcastStopped_withBroadcastProfileNull_doRefreshButton() {
when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn(null);
- mSwitchBroadcastAppButton = mDialogView.requireViewById(R.id.switch_broadcast);
+ mSwitchBroadcastAppButton = mDialog.requireViewById(R.id.switch_broadcast);
- mBroadcastDialog.handleLeBroadcastStopped();
+ mBroadcastDialogDelegate.handleLeBroadcastStopped();
assertThat(mSwitchBroadcastAppButton.getText().toString()).isEqualTo(
mContext.getString(R.string.bt_le_audio_broadcast_dialog_switch_app, SWITCH_APP));
@@ -152,7 +195,7 @@ public class BroadcastDialogTest extends SysuiTestCase {
when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn(
mLocalBluetoothLeBroadcast);
- mBroadcastDialog.handleLeBroadcastStopped();
+ mBroadcastDialogDelegate.handleLeBroadcastStopped();
verify(mLocalBluetoothLeBroadcast).startBroadcast(eq(SWITCH_APP), any());
}
@@ -160,17 +203,17 @@ public class BroadcastDialogTest extends SysuiTestCase {
@Test
public void handleLeBroadcastMetadataChanged_withNotLaunchFlag_doNotDismissDialog() {
- mBroadcastDialog.handleLeBroadcastMetadataChanged();
+ mBroadcastDialogDelegate.handleLeBroadcastMetadataChanged();
- assertThat(mBroadcastDialog.isShowing()).isTrue();
+ assertThat(mDialog.isShowing()).isTrue();
}
@Test
public void handleLeBroadcastMetadataChanged_withLaunchFlag_dismissDialog() {
- mBroadcastDialog.handleLeBroadcastStarted();
- mBroadcastDialog.handleLeBroadcastMetadataChanged();
+ mBroadcastDialogDelegate.handleLeBroadcastStarted();
+ mBroadcastDialogDelegate.handleLeBroadcastMetadataChanged();
- assertThat(mBroadcastDialog.isShowing()).isFalse();
+ assertThat(mDialog.isShowing()).isFalse();
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogDelegateTest.kt
new file mode 100644
index 000000000000..e931384fd61e
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogDelegateTest.kt
@@ -0,0 +1,101 @@
+/*
+ * 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 com.android.systemui.contrast
+
+import android.app.UiModeManager
+import android.app.UiModeManager.ContrastUtils.fromContrastLevel
+import android.os.Looper
+import android.provider.Settings
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper.RunWithLooper
+import android.view.LayoutInflater
+import android.widget.FrameLayout
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.DialogLaunchAnimator
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.model.SysUiState
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.statusbar.phone.SystemUIDialog
+import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.settings.SecureSettings
+import com.android.systemui.util.time.FakeSystemClock
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.eq
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+/** Test the behaviour of buttons of the [ContrastDialogDelegate]. */
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+@RunWithLooper
+class ContrastDialogDelegateTest : SysuiTestCase() {
+
+ private val mainExecutor = FakeExecutor(FakeSystemClock())
+ private lateinit var mContrastDialogDelegate: ContrastDialogDelegate
+ @Mock private lateinit var sysuiDialogFactory: SystemUIDialog.Factory
+ @Mock private lateinit var sysuiDialog: SystemUIDialog
+ @Mock private lateinit var mockUiModeManager: UiModeManager
+ @Mock private lateinit var mockUserTracker: UserTracker
+ @Mock private lateinit var mockSecureSettings: SecureSettings
+ @Mock private lateinit var sysuiState: SysUiState
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ mDependency.injectTestDependency(FeatureFlags::class.java, FakeFeatureFlags())
+ mDependency.injectTestDependency(SysUiState::class.java, sysuiState)
+ mDependency.injectMockDependency(DialogLaunchAnimator::class.java)
+ whenever(sysuiState.setFlag(any(), any())).thenReturn(sysuiState)
+ whenever(sysuiDialogFactory.create(any())).thenReturn(sysuiDialog)
+ whenever(sysuiDialog.layoutInflater).thenReturn(LayoutInflater.from(mContext))
+
+ whenever(mockUserTracker.userId).thenReturn(context.userId)
+ if (Looper.myLooper() == null) Looper.prepare()
+
+ mContrastDialogDelegate =
+ ContrastDialogDelegate(
+ sysuiDialogFactory,
+ mainExecutor,
+ mockUiModeManager,
+ mockUserTracker,
+ mockSecureSettings
+ )
+ }
+
+ @Test
+ fun testClickButtons_putsContrastInSettings() {
+ mContrastDialogDelegate.onCreate(sysuiDialog, null)
+
+ mContrastDialogDelegate.contrastButtons.forEach {
+ (contrastLevel: Int, clickedButton: FrameLayout) ->
+ clickedButton.performClick()
+ mainExecutor.runAllReady()
+ verify(mockSecureSettings)
+ .putFloatForUser(
+ eq(Settings.Secure.CONTRAST_LEVEL),
+ eq(fromContrastLevel(contrastLevel)),
+ eq(context.userId)
+ )
+ }
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogTest.kt
deleted file mode 100644
index 7753197afc9b..000000000000
--- a/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogTest.kt
+++ /dev/null
@@ -1,84 +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 com.android.systemui.contrast
-
-import android.app.UiModeManager
-import android.app.UiModeManager.ContrastUtils.fromContrastLevel
-import android.os.Looper
-import android.provider.Settings
-import android.testing.AndroidTestingRunner
-import android.widget.FrameLayout
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.settings.UserTracker
-import com.android.systemui.util.mockito.whenever
-import com.android.systemui.util.settings.SecureSettings
-import com.google.common.util.concurrent.MoreExecutors
-import java.util.concurrent.Executor
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito.eq
-import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
-
-/** Test the behaviour of buttons of the [ContrastDialog]. */
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
-class ContrastDialogTest : SysuiTestCase() {
-
- private lateinit var mainExecutor: Executor
- private lateinit var contrastDialog: ContrastDialog
- @Mock private lateinit var mockUiModeManager: UiModeManager
- @Mock private lateinit var mockUserTracker: UserTracker
- @Mock private lateinit var mockSecureSettings: SecureSettings
-
- @Before
- fun setUp() {
- MockitoAnnotations.initMocks(this)
- mainExecutor = MoreExecutors.directExecutor()
- whenever(mockUserTracker.userId).thenReturn(context.userId)
- }
-
- @Test
- fun testClickButtons_putsContrastInSettings() {
- if (Looper.myLooper() == null) Looper.prepare()
- contrastDialog =
- ContrastDialog(
- context,
- mainExecutor,
- mockUiModeManager,
- mockUserTracker,
- mockSecureSettings
- )
- contrastDialog.show()
- try {
- contrastDialog.contrastButtons.forEach {
- (contrastLevel: Int, clickedButton: FrameLayout) ->
- clickedButton.performClick()
- verify(mockSecureSettings)
- .putFloatForUser(
- eq(Settings.Secure.CONTRAST_LEVEL),
- eq(fromContrastLevel(contrastLevel)),
- eq(context.userId)
- )
- }
- } finally {
- contrastDialog.dismiss()
- }
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java
index 50914c86b933..7133e8b193f7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java
@@ -16,8 +16,7 @@
package com.android.systemui.keyguard;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
import android.testing.AndroidTestingRunner;
@@ -52,8 +51,7 @@ public class LifecycleTest extends SysuiTestCase {
mLifecycle.addObserver(mObj1);
mLifecycle.dispatch(mDispatchedObjects::add);
-
- assertTrue(mDispatchedObjects.contains(mObj1));
+ assertThat(mDispatchedObjects).contains(mObj1);
}
@Test
@@ -63,7 +61,7 @@ public class LifecycleTest extends SysuiTestCase {
mLifecycle.dispatch(mDispatchedObjects::add);
- assertFalse(mDispatchedObjects.contains(mObj1));
+ assertThat(mDispatchedObjects).isEmpty();
}
@Test
@@ -73,8 +71,7 @@ public class LifecycleTest extends SysuiTestCase {
mLifecycle.dispatch(mDispatchedObjects::add);
- assertTrue(mDispatchedObjects.contains(mObj1));
- assertTrue(mDispatchedObjects.contains(mObj2));
+ assertThat(mDispatchedObjects).containsExactly(mObj1, mObj2);
}
} \ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt
index bc40c2ddb407..d75cbec8c542 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt
@@ -18,6 +18,7 @@ package com.android.systemui.keyguard.data.repository
import android.provider.Settings
import androidx.test.filters.SmallTest
+import com.android.keyguard.ClockEventController
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.shared.model.SettingsClockSize
@@ -47,6 +48,7 @@ class KeyguardClockRepositoryTest : SysuiTestCase() {
private lateinit var underTest: KeyguardClockRepository
private lateinit var fakeSettings: FakeSettings
@Mock private lateinit var clockRegistry: ClockRegistry
+ @Mock private lateinit var clockEventController: ClockEventController
@Before
fun setup() {
@@ -55,7 +57,14 @@ class KeyguardClockRepositoryTest : SysuiTestCase() {
scheduler = TestCoroutineScheduler()
dispatcher = StandardTestDispatcher(scheduler)
scope = TestScope(dispatcher)
- underTest = KeyguardClockRepository(fakeSettings, clockRegistry, dispatcher)
+ underTest =
+ KeyguardClockRepositoryImpl(
+ fakeSettings,
+ clockRegistry,
+ clockEventController,
+ dispatcher,
+ scope.backgroundScope
+ )
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt
index b3e8fed24c3b..de12b8f91d20 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt
@@ -130,6 +130,7 @@ class KeyguardFaceAuthInteractorTest : SysuiTestCase() {
mContext,
testScope.backgroundScope,
dispatcher,
+ dispatcher,
faceAuthRepository,
{
PrimaryBouncerInteractor(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinderTest.kt
new file mode 100644
index 000000000000..0981c6239cb9
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinderTest.kt
@@ -0,0 +1,103 @@
+/*
+ * 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 com.android.systemui.keyguard.ui.binder
+
+import android.view.View
+import androidx.constraintlayout.helper.widget.Layer
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.plugins.ClockConfig
+import com.android.systemui.plugins.ClockController
+import com.android.systemui.plugins.ClockFaceController
+import com.android.systemui.plugins.ClockFaceLayout
+import com.android.systemui.util.mockito.whenever
+import kotlin.test.Test
+import org.junit.Before
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@kotlinx.coroutines.ExperimentalCoroutinesApi
+class KeyguardClockViewBinderTest : SysuiTestCase() {
+ @Mock private lateinit var rootView: ConstraintLayout
+ @Mock private lateinit var burnInLayer: Layer
+ @Mock private lateinit var clock: ClockController
+ @Mock private lateinit var largeClock: ClockFaceController
+ @Mock private lateinit var smallClock: ClockFaceController
+ @Mock private lateinit var largeClockView: View
+ @Mock private lateinit var smallClockView: View
+ @Mock private lateinit var smallClockFaceLayout: ClockFaceLayout
+ @Mock private lateinit var largeClockFaceLayout: ClockFaceLayout
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+ }
+
+ @Test
+ fun addClockViews_nonWeatherClock() {
+ setupNonWeatherClock()
+ KeyguardClockViewBinder.addClockViews(clock, rootView, burnInLayer)
+ verify(rootView).addView(smallClockView)
+ verify(rootView).addView(largeClockView)
+ verify(burnInLayer).addView(smallClockView)
+ verify(burnInLayer, never()).addView(largeClockView)
+ }
+
+ @Test
+ fun addClockViews_WeatherClock() {
+ setupWeatherClock()
+ KeyguardClockViewBinder.addClockViews(clock, rootView, burnInLayer)
+ verify(rootView).addView(smallClockView)
+ verify(rootView).addView(largeClockView)
+ verify(burnInLayer).addView(smallClockView)
+ verify(burnInLayer).addView(largeClockView)
+ }
+
+ private fun setupWeatherClock() {
+ setupClock()
+ val clockConfig =
+ ClockConfig(
+ id = "WEATHER_CLOCK",
+ name = "",
+ description = "",
+ useAlternateSmartspaceAODTransition = true
+ )
+ whenever(clock.config).thenReturn(clockConfig)
+ }
+
+ private fun setupNonWeatherClock() {
+ setupClock()
+ val clockConfig = ClockConfig(id = "NON_WEATHER_CLOCK", name = "", description = "")
+ whenever(clock.config).thenReturn(clockConfig)
+ }
+
+ private fun setupClock() {
+ whenever(largeClockFaceLayout.views).thenReturn(listOf(largeClockView))
+ whenever(smallClockFaceLayout.views).thenReturn(listOf(smallClockView))
+ whenever(clock.largeClock).thenReturn(largeClock)
+ whenever(clock.smallClock).thenReturn(smallClock)
+ whenever(largeClock.layout).thenReturn(largeClockFaceLayout)
+ whenever(smallClock.layout).thenReturn(smallClockFaceLayout)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
index 740fce988a68..3109e761e423 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
@@ -27,9 +27,9 @@ import com.android.systemui.communal.ui.view.layout.sections.CommunalTutorialInd
import com.android.systemui.keyguard.shared.model.KeyguardBlueprint
import com.android.systemui.keyguard.shared.model.KeyguardSection
import com.android.systemui.keyguard.ui.view.KeyguardRootView
-import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection
+import com.android.systemui.keyguard.ui.view.layout.sections.ClockSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultNotificationStackScrollLayoutSection
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt
index 6b85cf719ef5..64a07fa9f723 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt
@@ -22,9 +22,7 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.flags.FakeFeatureFlagsClassic
import com.android.systemui.flags.Flags.MIGRATE_CLOCKS_TO_BLUEPRINT
-import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
-import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel
import com.android.systemui.res.R
@@ -32,7 +30,6 @@ import com.android.systemui.statusbar.policy.SplitShadeStateController
import com.android.systemui.util.Utils
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
-import dagger.Lazy
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -47,7 +44,6 @@ class ClockSectionTest : SysuiTestCase() {
@Mock private lateinit var keyguardClockViewModel: KeyguardClockViewModel
@Mock private lateinit var smartspaceViewModel: KeyguardSmartspaceViewModel
@Mock private lateinit var splitShadeStateController: SplitShadeStateController
- @Mock private lateinit var keyguardBlueprintInteractor: Lazy<KeyguardBlueprintInteractor>
private var featureFlags: FakeFeatureFlagsClassic = FakeFeatureFlagsClassic()
private lateinit var underTest: ClockSection
@@ -94,7 +90,6 @@ class ClockSectionTest : SysuiTestCase() {
smartspaceViewModel,
mContext,
splitShadeStateController,
- keyguardBlueprintInteractor,
featureFlags
)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
index 46a7735d92a0..f067871aa0e1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
@@ -25,11 +25,16 @@ import com.android.keyguard.KeyguardClockSwitch.SMALL
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.KeyguardClockRepository
+import com.android.systemui.keyguard.data.repository.KeyguardClockRepositoryImpl
import com.android.systemui.keyguard.data.repository.KeyguardRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
+import com.android.systemui.plugins.ClockController
+import com.android.systemui.plugins.ClockFaceConfig
+import com.android.systemui.plugins.ClockFaceController
import com.android.systemui.shared.clocks.ClockRegistry
+import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.FakeSettings
import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
@@ -50,7 +55,6 @@ class KeyguardClockViewModelTest : SysuiTestCase() {
private lateinit var scheduler: TestCoroutineScheduler
private lateinit var dispatcher: CoroutineDispatcher
private lateinit var scope: TestScope
-
private lateinit var underTest: KeyguardClockViewModel
private lateinit var keyguardInteractor: KeyguardInteractor
private lateinit var keyguardRepository: KeyguardRepository
@@ -58,6 +62,9 @@ class KeyguardClockViewModelTest : SysuiTestCase() {
private lateinit var keyguardClockRepository: KeyguardClockRepository
private lateinit var fakeSettings: FakeSettings
@Mock private lateinit var clockRegistry: ClockRegistry
+ @Mock private lateinit var clock: ClockController
+ @Mock private lateinit var largeClock: ClockFaceController
+ @Mock private lateinit var clockFaceConfig: ClockFaceConfig
@Mock private lateinit var eventController: ClockEventController
@Before
fun setup() {
@@ -70,13 +77,21 @@ class KeyguardClockViewModelTest : SysuiTestCase() {
scheduler = TestCoroutineScheduler()
dispatcher = StandardTestDispatcher(scheduler)
scope = TestScope(dispatcher)
- keyguardClockRepository = KeyguardClockRepository(fakeSettings, clockRegistry, dispatcher)
- keyguardClockInteractor = KeyguardClockInteractor(eventController, keyguardClockRepository)
+ setupMockClock()
+ keyguardClockRepository =
+ KeyguardClockRepositoryImpl(
+ fakeSettings,
+ clockRegistry,
+ eventController,
+ dispatcher,
+ scope.backgroundScope
+ )
+ keyguardClockInteractor = KeyguardClockInteractor(keyguardClockRepository)
underTest =
KeyguardClockViewModel(
keyguardInteractor,
keyguardClockInteractor,
- scope.backgroundScope
+ scope.backgroundScope,
)
}
@@ -86,7 +101,7 @@ class KeyguardClockViewModelTest : SysuiTestCase() {
// When use double line clock is disabled,
// should always return small
fakeSettings.putInt(LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 0)
- keyguardRepository.setClockSize(LARGE)
+ keyguardClockRepository.setClockSize(LARGE)
val value = collectLastValue(underTest.clockSize)
assertThat(value()).isEqualTo(SMALL)
}
@@ -95,12 +110,19 @@ class KeyguardClockViewModelTest : SysuiTestCase() {
fun testClockSize_dynamicClockSize() =
scope.runTest {
fakeSettings.putInt(LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 1)
- keyguardRepository.setClockSize(SMALL)
+ keyguardClockRepository.setClockSize(SMALL)
var value = collectLastValue(underTest.clockSize)
assertThat(value()).isEqualTo(SMALL)
- keyguardRepository.setClockSize(LARGE)
+ keyguardClockRepository.setClockSize(LARGE)
value = collectLastValue(underTest.clockSize)
assertThat(value()).isEqualTo(LARGE)
}
+
+ private fun setupMockClock() {
+ whenever(clock.largeClock).thenReturn(largeClock)
+ whenever(largeClock.config).thenReturn(clockFaceConfig)
+ whenever(clockFaceConfig.hasCustomWeatherDataDisplay).thenReturn(false)
+ whenever(clockRegistry.createCurrentClock()).thenReturn(clock)
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt
index 67c4e2688cd0..0c30d10ea563 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt
@@ -51,6 +51,7 @@ import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.res.R
import com.android.systemui.settings.UserFileManager
import com.android.systemui.settings.UserTracker
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.FakeSharedPreferences
@@ -58,8 +59,10 @@ import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.FakeSettings
import com.google.common.truth.Truth
-import kotlin.math.max
import kotlin.math.min
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
@@ -73,6 +76,7 @@ import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations
+@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(JUnit4::class)
class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() {
@@ -85,6 +89,47 @@ class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() {
@Mock private lateinit var keyguardStateController: KeyguardStateController
@Mock private lateinit var launchAnimator: DialogLaunchAnimator
@Mock private lateinit var logger: KeyguardQuickAffordancesMetricsLogger
+ @Mock private lateinit var shadeInteractor: ShadeInteractor
+ @Mock
+ private lateinit var aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel
+ @Mock
+ private lateinit var dozingToLockscreenTransitionViewModel:
+ DozingToLockscreenTransitionViewModel
+ @Mock
+ private lateinit var dreamingHostedToLockscreenTransitionViewModel:
+ DreamingHostedToLockscreenTransitionViewModel
+ @Mock
+ private lateinit var dreamingToLockscreenTransitionViewModel:
+ DreamingToLockscreenTransitionViewModel
+ @Mock
+ private lateinit var goneToLockscreenTransitionViewModel: GoneToLockscreenTransitionViewModel
+ @Mock
+ private lateinit var occludedToLockscreenTransitionViewModel:
+ OccludedToLockscreenTransitionViewModel
+ @Mock
+ private lateinit var offToLockscreenTransitionViewModel: OffToLockscreenTransitionViewModel
+ @Mock
+ private lateinit var primaryBouncerToLockscreenTransitionViewModel:
+ PrimaryBouncerToLockscreenTransitionViewModel
+ @Mock
+ private lateinit var lockscreenToAodTransitionViewModel: LockscreenToAodTransitionViewModel
+ @Mock
+ private lateinit var lockscreenToDozingTransitionViewModel:
+ LockscreenToDozingTransitionViewModel
+ @Mock
+ private lateinit var lockscreenToDreamingHostedTransitionViewModel:
+ LockscreenToDreamingHostedTransitionViewModel
+ @Mock
+ private lateinit var lockscreenToDreamingTransitionViewModel:
+ LockscreenToDreamingTransitionViewModel
+ @Mock
+ private lateinit var lockscreenToGoneTransitionViewModel: LockscreenToGoneTransitionViewModel
+ @Mock
+ private lateinit var lockscreenToOccludedTransitionViewModel:
+ LockscreenToOccludedTransitionViewModel
+ @Mock
+ private lateinit var lockscreenToPrimaryBouncerTransitionViewModel:
+ LockscreenToPrimaryBouncerTransitionViewModel
private lateinit var underTest: KeyguardQuickAffordancesCombinedViewModel
@@ -97,6 +142,10 @@ class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() {
private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
private lateinit var keyguardInteractor: KeyguardInteractor
+ private val intendedAlphaMutableStateFlow: MutableStateFlow<Float> = MutableStateFlow(1f)
+ // the viewModel does a `map { 1 - it }` on this value, which is why it's different
+ private val intendedShadeAlphaMutableStateFlow: MutableStateFlow<Float> = MutableStateFlow(0f)
+
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
@@ -191,6 +240,31 @@ class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() {
userHandle = UserHandle.SYSTEM,
)
+ intendedAlphaMutableStateFlow.value = 1f
+ intendedShadeAlphaMutableStateFlow.value = 0f
+ whenever(aodToLockscreenTransitionViewModel.shortcutsAlpha)
+ .thenReturn(intendedAlphaMutableStateFlow)
+ whenever(dozingToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+ whenever(dreamingHostedToLockscreenTransitionViewModel.shortcutsAlpha)
+ .thenReturn(emptyFlow())
+ whenever(dreamingToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+ whenever(goneToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+ whenever(occludedToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+ whenever(offToLockscreenTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+ whenever(primaryBouncerToLockscreenTransitionViewModel.shortcutsAlpha)
+ .thenReturn(emptyFlow())
+ whenever(lockscreenToAodTransitionViewModel.shortcutsAlpha)
+ .thenReturn(intendedAlphaMutableStateFlow)
+ whenever(lockscreenToDozingTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+ whenever(lockscreenToDreamingHostedTransitionViewModel.shortcutsAlpha)
+ .thenReturn(emptyFlow())
+ whenever(lockscreenToDreamingTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+ whenever(lockscreenToGoneTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+ whenever(lockscreenToOccludedTransitionViewModel.shortcutsAlpha).thenReturn(emptyFlow())
+ whenever(lockscreenToPrimaryBouncerTransitionViewModel.shortcutsAlpha)
+ .thenReturn(emptyFlow())
+ whenever(shadeInteractor.qsExpansion).thenReturn(intendedShadeAlphaMutableStateFlow)
+
underTest =
KeyguardQuickAffordancesCombinedViewModel(
quickAffordanceInteractor =
@@ -210,7 +284,27 @@ class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() {
backgroundDispatcher = testDispatcher,
appContext = mContext,
),
- keyguardInteractor = keyguardInteractor
+ keyguardInteractor = keyguardInteractor,
+ shadeInteractor = shadeInteractor,
+ aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel,
+ dozingToLockscreenTransitionViewModel = dozingToLockscreenTransitionViewModel,
+ dreamingHostedToLockscreenTransitionViewModel =
+ dreamingHostedToLockscreenTransitionViewModel,
+ dreamingToLockscreenTransitionViewModel = dreamingToLockscreenTransitionViewModel,
+ goneToLockscreenTransitionViewModel = goneToLockscreenTransitionViewModel,
+ occludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel,
+ offToLockscreenTransitionViewModel = offToLockscreenTransitionViewModel,
+ primaryBouncerToLockscreenTransitionViewModel =
+ primaryBouncerToLockscreenTransitionViewModel,
+ lockscreenToAodTransitionViewModel = lockscreenToAodTransitionViewModel,
+ lockscreenToDozingTransitionViewModel = lockscreenToDozingTransitionViewModel,
+ lockscreenToDreamingHostedTransitionViewModel =
+ lockscreenToDreamingHostedTransitionViewModel,
+ lockscreenToDreamingTransitionViewModel = lockscreenToDreamingTransitionViewModel,
+ lockscreenToGoneTransitionViewModel = lockscreenToGoneTransitionViewModel,
+ lockscreenToOccludedTransitionViewModel = lockscreenToOccludedTransitionViewModel,
+ lockscreenToPrimaryBouncerTransitionViewModel =
+ lockscreenToPrimaryBouncerTransitionViewModel
)
}
@@ -526,15 +620,15 @@ class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() {
@Test
fun isClickable_falseWhenAlphaBelowThreshold() =
testScope.runTest {
+ intendedAlphaMutableStateFlow.value =
+ KeyguardQuickAffordancesCombinedViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD -
+ .1f
+ // the viewModel does a `map { 1 - it }` on this value, which is why it's different
+ intendedShadeAlphaMutableStateFlow.value =
+ KeyguardQuickAffordancesCombinedViewModel.AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD +
+ .1f
repository.setKeyguardShowing(true)
val latest = collectLastValue(underTest.startButton)
- repository.setKeyguardAlpha(
- max(
- 0f,
- KeyguardQuickAffordancesCombinedViewModel
- .AFFORDANCE_FULLY_OPAQUE_ALPHA_THRESHOLD - 0.1f
- ),
- )
val testConfig =
TestConfig(
@@ -561,9 +655,10 @@ class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() {
@Test
fun isClickable_falseWhenAlphaAtZero() =
testScope.runTest {
+ intendedAlphaMutableStateFlow.value = 0f
+ intendedShadeAlphaMutableStateFlow.value = 1f
repository.setKeyguardShowing(true)
val latest = collectLastValue(underTest.startButton)
- repository.setKeyguardAlpha(0f)
val testConfig =
TestConfig(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt
index e6d6cf263d69..bc60364f27cb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt
@@ -21,6 +21,7 @@ package com.android.systemui.keyguard.ui.viewmodel
import android.view.View
import androidx.test.filters.SmallTest
+import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.systemui.Flags as AConfigFlags
import com.android.systemui.Flags.FLAG_NEW_AOD_TRANSITION
import com.android.systemui.SysUITestComponent
@@ -32,7 +33,9 @@ import com.android.systemui.common.ui.data.repository.FakeConfigurationRepositor
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryRepository
+import com.android.systemui.flags.FakeFeatureFlagsClassic
import com.android.systemui.flags.FakeFeatureFlagsClassicModule
+import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.BurnInInteractor
@@ -79,13 +82,13 @@ import org.mockito.MockitoAnnotations
@SmallTest
@RunWith(JUnit4::class)
class KeyguardRootViewModelTest : SysuiTestCase() {
-
private lateinit var underTest: KeyguardRootViewModel
private lateinit var testScope: TestScope
private lateinit var repository: FakeKeyguardRepository
private lateinit var keyguardInteractor: KeyguardInteractor
private lateinit var configurationRepository: FakeConfigurationRepository
@Mock private lateinit var burnInInteractor: BurnInInteractor
+ @Mock private lateinit var keyguardClockViewModel: KeyguardClockViewModel
@Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
@Mock private lateinit var goneToAodTransitionViewModel: GoneToAodTransitionViewModel
@Mock
@@ -97,7 +100,9 @@ class KeyguardRootViewModelTest : SysuiTestCase() {
private val enterFromTopAnimationAlpha = MutableStateFlow(0f)
private val goneToAodTransitionStep = MutableSharedFlow<TransitionStep>(replay = 1)
private val dozeAmountTransitionStep = MutableSharedFlow<TransitionStep>(replay = 1)
+ private val clockSize = MutableStateFlow(LARGE)
private val startedKeyguardState = MutableStateFlow(KeyguardState.GONE)
+ private val featureFlags: FakeFeatureFlagsClassic = FakeFeatureFlagsClassic()
@Before
fun setUp() {
@@ -107,7 +112,9 @@ class KeyguardRootViewModelTest : SysuiTestCase() {
mSetFlagsRule.enableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
- val withDeps = KeyguardInteractorFactory.create()
+ featureFlags.set(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT, false)
+
+ val withDeps = KeyguardInteractorFactory.create(featureFlags = featureFlags)
keyguardInteractor = withDeps.keyguardInteractor
repository = withDeps.repository
configurationRepository = withDeps.configurationRepository
@@ -124,6 +131,7 @@ class KeyguardRootViewModelTest : SysuiTestCase() {
whenever(keyguardTransitionInteractor.dozeAmountTransition)
.thenReturn(dozeAmountTransitionStep)
whenever(keyguardTransitionInteractor.startedKeyguardState).thenReturn(startedKeyguardState)
+ whenever(keyguardClockViewModel.clockSize).thenReturn(clockSize)
underTest =
KeyguardRootViewModel(
@@ -139,9 +147,12 @@ class KeyguardRootViewModelTest : SysuiTestCase() {
whenever(isPulseExpanding).thenReturn(emptyFlow())
},
burnInInteractor,
+ keyguardClockViewModel,
goneToAodTransitionViewModel,
aodToLockscreenTransitionViewModel,
screenOffAnimationController = mock(),
+ // TODO(b/310989341): remove after change to aconfig
+ featureFlags
)
underTest.clockControllerProvider = Provider { clockController }
}
@@ -163,23 +174,6 @@ class KeyguardRootViewModelTest : SysuiTestCase() {
}
@Test
- fun alpha_inPreviewMode_doesNotChange() =
- testScope.runTest {
- val value = collectLastValue(underTest.alpha)
- underTest.enablePreviewMode()
-
- assertThat(value()).isEqualTo(1f)
- repository.setKeyguardAlpha(0.1f)
- assertThat(value()).isEqualTo(1f)
- repository.setKeyguardAlpha(0.5f)
- assertThat(value()).isEqualTo(1f)
- repository.setKeyguardAlpha(0.2f)
- assertThat(value()).isEqualTo(1f)
- repository.setKeyguardAlpha(0f)
- assertThat(value()).isEqualTo(1f)
- }
-
- @Test
fun translationAndScaleFromBurnInNotDozing() =
testScope.runTest {
val translationX by collectLastValue(underTest.translationX)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt
index d6e2e973b29d..2f35380e562b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt
@@ -61,7 +61,6 @@ import androidx.test.filters.SmallTest
import com.android.internal.logging.InstanceId
import com.android.internal.widget.CachingIconView
import com.android.systemui.ActivityIntentHelper
-import com.android.systemui.res.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.bluetooth.BroadcastDialogController
import com.android.systemui.broadcast.BroadcastSender
@@ -81,12 +80,14 @@ import com.android.systemui.media.controls.models.recommendation.RecommendationV
import com.android.systemui.media.controls.models.recommendation.SmartspaceMediaData
import com.android.systemui.media.controls.pipeline.EMPTY_SMARTSPACE_MEDIA_DATA
import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.util.MediaFlags
import com.android.systemui.media.controls.util.MediaUiEventLogger
import com.android.systemui.media.dialog.MediaOutputDialogFactory
import com.android.systemui.monet.ColorScheme
import com.android.systemui.monet.Style
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
+import com.android.systemui.res.R
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.surfaceeffects.ripple.MultiRippleView
@@ -232,6 +233,7 @@ public class MediaControlPanelTest : SysuiTestCase() {
this.set(Flags.UMO_TURBULENCE_NOISE, false)
}
@Mock private lateinit var globalSettings: GlobalSettings
+ @Mock private lateinit var mediaFlags: MediaFlags
@JvmField @Rule val mockito = MockitoJUnit.rule()
@@ -251,6 +253,7 @@ public class MediaControlPanelTest : SysuiTestCase() {
.thenReturn(applicationInfo)
whenever(packageManager.getApplicationLabel(any())).thenReturn(PACKAGE)
context.setMockPackageManager(packageManager)
+ whenever(mediaFlags.isSceneContainerEnabled()).thenReturn(false)
player =
object :
@@ -273,7 +276,8 @@ public class MediaControlPanelTest : SysuiTestCase() {
lockscreenUserManager,
broadcastDialogController,
fakeFeatureFlag,
- globalSettings
+ globalSettings,
+ mediaFlags,
) {
override fun loadAnimator(
animId: Int,
@@ -1884,7 +1888,8 @@ public class MediaControlPanelTest : SysuiTestCase() {
@Test
fun bindRecommendation_listHasTooFewRecs_notDisplayed() {
player.attachRecommendation(recommendationViewHolder)
- val icon = Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
+ val icon =
+ Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
val data =
smartspaceData.copy(
recommendations =
@@ -1911,7 +1916,8 @@ public class MediaControlPanelTest : SysuiTestCase() {
@Test
fun bindRecommendation_listHasTooFewRecsWithIcons_notDisplayed() {
player.attachRecommendation(recommendationViewHolder)
- val icon = Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
+ val icon =
+ Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
val data =
smartspaceData.copy(
recommendations =
@@ -1955,7 +1961,8 @@ public class MediaControlPanelTest : SysuiTestCase() {
val subtitle1 = "Subtitle1"
val subtitle2 = "Subtitle2"
val subtitle3 = "Subtitle3"
- val icon = Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
+ val icon =
+ Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
val data =
smartspaceData.copy(
@@ -1998,7 +2005,12 @@ public class MediaControlPanelTest : SysuiTestCase() {
listOf(
SmartspaceAction.Builder("id1", "")
.setSubtitle("fake subtitle")
- .setIcon(Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata))
+ .setIcon(
+ Icon.createWithResource(
+ context,
+ com.android.settingslib.R.drawable.ic_1x_mobiledata
+ )
+ )
.setExtras(Bundle.EMPTY)
.build()
)
@@ -2013,7 +2025,8 @@ public class MediaControlPanelTest : SysuiTestCase() {
useRealConstraintSets()
player.attachRecommendation(recommendationViewHolder)
- val icon = Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
+ val icon =
+ Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
val data =
smartspaceData.copy(
recommendations =
@@ -2047,7 +2060,8 @@ public class MediaControlPanelTest : SysuiTestCase() {
useRealConstraintSets()
player.attachRecommendation(recommendationViewHolder)
- val icon = Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
+ val icon =
+ Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
val data =
smartspaceData.copy(
recommendations =
@@ -2086,7 +2100,12 @@ public class MediaControlPanelTest : SysuiTestCase() {
listOf(
SmartspaceAction.Builder("id1", "title1")
.setSubtitle("")
- .setIcon(Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata))
+ .setIcon(
+ Icon.createWithResource(
+ context,
+ com.android.settingslib.R.drawable.ic_1x_mobiledata
+ )
+ )
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id2", "title2")
@@ -2096,7 +2115,12 @@ public class MediaControlPanelTest : SysuiTestCase() {
.build(),
SmartspaceAction.Builder("id3", "title3")
.setSubtitle("")
- .setIcon(Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_3g_mobiledata))
+ .setIcon(
+ Icon.createWithResource(
+ context,
+ com.android.settingslib.R.drawable.ic_3g_mobiledata
+ )
+ )
.setExtras(Bundle.EMPTY)
.build()
)
@@ -2119,7 +2143,12 @@ public class MediaControlPanelTest : SysuiTestCase() {
listOf(
SmartspaceAction.Builder("id1", "")
.setSubtitle("subtitle1")
- .setIcon(Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata))
+ .setIcon(
+ Icon.createWithResource(
+ context,
+ com.android.settingslib.R.drawable.ic_1x_mobiledata
+ )
+ )
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id2", "")
@@ -2129,7 +2158,12 @@ public class MediaControlPanelTest : SysuiTestCase() {
.build(),
SmartspaceAction.Builder("id3", "")
.setSubtitle("subtitle3")
- .setIcon(Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_3g_mobiledata))
+ .setIcon(
+ Icon.createWithResource(
+ context,
+ com.android.settingslib.R.drawable.ic_3g_mobiledata
+ )
+ )
.setExtras(Bundle.EMPTY)
.build()
)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt
index db7c9876f21b..73885f4d428d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt
@@ -32,6 +32,7 @@ import com.android.systemui.controls.controller.ControlsControllerImplTest.Compa
import com.android.systemui.dreams.DreamOverlayStateController
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.util.MediaFlags
import com.android.systemui.media.dream.MediaDreamComplication
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.res.R
@@ -94,6 +95,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
@Mock private lateinit var dreamOverlayStateController: DreamOverlayStateController
@Mock private lateinit var shadeInteractor: ShadeInteractor
@Mock lateinit var logger: MediaViewLogger
+ @Mock private lateinit var mediaFlags: MediaFlags
@Captor
private lateinit var wakefullnessObserver: ArgumentCaptor<(WakefulnessLifecycle.Observer)>
@Captor
@@ -126,6 +128,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
whenever(mediaCarouselController.mediaFrame).thenReturn(mediaFrame)
isQsBypassingShade = MutableStateFlow(false)
whenever(shadeInteractor.isQsBypassingShade).thenReturn(isQsBypassingShade)
+ whenever(mediaFlags.isSceneContainerEnabled()).thenReturn(false)
mediaHierarchyManager =
MediaHierarchyManager(
context,
@@ -145,6 +148,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
testScope.backgroundScope,
ResourcesSplitShadeStateController(),
logger,
+ mediaFlags,
)
verify(wakefulnessLifecycle).addObserver(wakefullnessObserver.capture())
verify(statusBarStateController).addCallback(statusBarCallback.capture())
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImplTest.kt
new file mode 100644
index 000000000000..02d40da1c124
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImplTest.kt
@@ -0,0 +1,130 @@
+/*
+ * 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 com.android.systemui.qs.tiles.base.viewmodel
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.classifier.FalsingManagerFake
+import com.android.systemui.common.shared.model.ContentDescription
+import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.qs.tiles.base.analytics.QSTileAnalytics
+import com.android.systemui.qs.tiles.base.interactor.FakeDisabledByPolicyInteractor
+import com.android.systemui.qs.tiles.base.interactor.FakeQSTileDataInteractor
+import com.android.systemui.qs.tiles.base.interactor.FakeQSTileUserActionInteractor
+import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper
+import com.android.systemui.qs.tiles.base.logging.QSTileLogger
+import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
+import com.android.systemui.qs.tiles.viewmodel.QSTileConfigTestBuilder
+import com.android.systemui.qs.tiles.viewmodel.QSTilePolicy
+import com.android.systemui.qs.tiles.viewmodel.QSTileState
+import com.android.systemui.user.data.repository.FakeUserRepository
+import com.android.systemui.util.time.FakeSystemClock
+import com.google.common.truth.Truth.assertThat
+import java.io.PrintWriter
+import java.io.StringWriter
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalCoroutinesApi::class)
+class QSTileViewModelImplTest : SysuiTestCase() {
+
+ @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
+
+ @Mock private lateinit var qsTileLogger: QSTileLogger
+ @Mock private lateinit var qsTileAnalytics: QSTileAnalytics
+
+ private val userRepository = FakeUserRepository()
+ private val tileDataInteractor = FakeQSTileDataInteractor<Any>()
+ private val tileUserActionInteractor = FakeQSTileUserActionInteractor<Any>()
+ private val disabledByPolicyInteractor = FakeDisabledByPolicyInteractor()
+ private val falsingManager = FalsingManagerFake()
+
+ private val testCoroutineDispatcher = StandardTestDispatcher()
+ private val testScope = TestScope(testCoroutineDispatcher)
+
+ private lateinit var underTest: QSTileViewModelImpl<Any>
+
+ @Before
+ fun setup() {
+ underTest =
+ QSTileViewModelImpl(
+ QSTileConfigTestBuilder.build {
+ policy = QSTilePolicy.Restricted("test_restriction")
+ },
+ { tileUserActionInteractor },
+ { tileDataInteractor },
+ {
+ object : QSTileDataToStateMapper<Any> {
+ override fun map(config: QSTileConfig, data: Any): QSTileState =
+ QSTileState.build(
+ { Icon.Resource(0, ContentDescription.Resource(0)) },
+ data.toString()
+ ) {}
+ }
+ },
+ disabledByPolicyInteractor,
+ userRepository,
+ falsingManager,
+ qsTileAnalytics,
+ qsTileLogger,
+ FakeSystemClock(),
+ testCoroutineDispatcher,
+ testScope.backgroundScope,
+ )
+ }
+
+ @Test
+ fun dumpWritesState() =
+ testScope.runTest {
+ tileDataInteractor.emitData("test_data")
+ underTest.state.launchIn(backgroundScope)
+ runCurrent()
+
+ val sw = StringWriter()
+ PrintWriter(sw).use { underTest.dump(it, emptyArray()) }
+
+ assertThat(sw.buffer.toString())
+ .isEqualTo(
+ "test_spec:\n" +
+ " QSTileState(" +
+ "icon=() -> com.android.systemui.common.shared.model.Icon, " +
+ "label=test_data, " +
+ "activationState=INACTIVE, " +
+ "secondaryLabel=null, " +
+ "supportedActions=[CLICK], " +
+ "contentDescription=null, " +
+ "stateDescription=null, " +
+ "sideViewIcon=None, " +
+ "enabledState=ENABLED, " +
+ "expandedAccessibilityClassName=android.widget.Switch)\n"
+ )
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagsTest.kt
index 5969bd82c361..0173c32bbb94 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagsTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/scene/shared/flag/SceneContainerFlagsTest.kt
@@ -27,6 +27,7 @@ import com.android.systemui.flags.ReleasedFlag
import com.android.systemui.flags.ResourceBooleanFlag
import com.android.systemui.flags.UnreleasedFlag
import com.android.systemui.keyguard.shared.KeyguardShadeMigrationNssl
+import com.android.systemui.res.R
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Rule
@@ -74,10 +75,15 @@ internal class SceneContainerFlagsTest(
.forEach { flagToken ->
setFlagsRule.enableFlags(flagToken)
aconfigFlags.setFlag(flagToken, testCase.areAllFlagsSet)
+ overrideResource(
+ R.bool.config_sceneContainerFrameworkEnabled,
+ testCase.isResourceConfigEnabled
+ )
}
underTest =
SceneContainerFlagsImpl(
+ context = context,
featureFlagsClassic = featureFlags,
isComposeAvailable = testCase.isComposeAvailable,
)
@@ -91,13 +97,12 @@ internal class SceneContainerFlagsTest(
internal data class TestCase(
val isComposeAvailable: Boolean,
val areAllFlagsSet: Boolean,
+ val isResourceConfigEnabled: Boolean,
val expectedEnabled: Boolean,
) {
override fun toString(): String {
- return """
- (compose=$isComposeAvailable + flags=$areAllFlagsSet) -> expected=$expectedEnabled
- """
- .trimIndent()
+ return "(compose=$isComposeAvailable + flags=$areAllFlagsSet) + XML" +
+ " config=$isResourceConfigEnabled -> expected=$expectedEnabled"
}
}
@@ -105,17 +110,20 @@ internal class SceneContainerFlagsTest(
@Parameterized.Parameters(name = "{0}")
@JvmStatic
fun testCases() = buildList {
- repeat(4) { combination ->
- val isComposeAvailable = combination and 0b10 != 0
- val areAllFlagsSet = combination and 0b01 != 0
+ repeat(8) { combination ->
+ val isComposeAvailable = combination and 0b100 != 0
+ val areAllFlagsSet = combination and 0b010 != 0
+ val isResourceConfigEnabled = combination and 0b001 != 0
- val expectedEnabled = isComposeAvailable && areAllFlagsSet
+ val expectedEnabled =
+ isComposeAvailable && areAllFlagsSet && isResourceConfigEnabled
add(
TestCase(
isComposeAvailable = isComposeAvailable,
areAllFlagsSet = areAllFlagsSet,
expectedEnabled = expectedEnabled,
+ isResourceConfigEnabled = isResourceConfigEnabled,
)
)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java
index 1b4ba6433ded..cb90cc53f0f0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java
@@ -328,7 +328,7 @@ public class RecordingControllerTest extends SysuiTestCase {
}
@Override
- public SystemUIDialog create(DialogDelegate<SystemUIDialog> delegate) {
+ public SystemUIDialog create(SystemUIDialog.Delegate delegate) {
SystemUIDialog dialog = super.create(delegate);
mLastDelegate = delegate;
mLastCreatedDialog = dialog;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt
index c848287aa53e..8f696e7f11ad 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt
@@ -89,8 +89,9 @@ class ScreenRecordPermissionDialogDelegateTest : SysuiTestCase() {
userContextProvider,
onStartRecordingClicked,
mediaProjectionMetricsLogger,
+ systemUIDialogFactory
)
- dialog = systemUIDialogFactory.create(delegate)
+ dialog = delegate.createDialog()
delegate.onCreate(dialog, savedInstanceState = null)
whenever(flags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING)).thenReturn(true)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt
index 6e487cdd65b5..88c728fd1b66 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessDialogTest.kt
@@ -28,12 +28,16 @@ import androidx.test.rule.ActivityTestRule
import com.android.systemui.SysuiTestCase
import com.android.systemui.activity.SingleActivityFactory
import com.android.systemui.res.R
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
+import dagger.Lazy
+import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.After
import org.junit.Before
import org.junit.Rule
@@ -55,6 +59,8 @@ class BrightnessDialogTest : SysuiTestCase() {
@Mock private lateinit var brightnessControllerFactory: BrightnessController.Factory
@Mock private lateinit var brightnessController: BrightnessController
@Mock private lateinit var accessibilityMgr: AccessibilityManagerWrapper
+ @Mock private lateinit var shadeInteractorLazy: Lazy<ShadeInteractor>
+ @Mock private lateinit var shadeInteractor: ShadeInteractor
private val clock = FakeSystemClock()
private val mainExecutor = FakeExecutor(clock)
@@ -68,7 +74,8 @@ class BrightnessDialogTest : SysuiTestCase() {
brightnessSliderControllerFactory,
brightnessControllerFactory,
mainExecutor,
- accessibilityMgr
+ accessibilityMgr,
+ shadeInteractor
)
},
/* initialTouchMode= */ false,
@@ -82,6 +89,8 @@ class BrightnessDialogTest : SysuiTestCase() {
.thenReturn(brightnessSliderController)
`when`(brightnessSliderController.rootView).thenReturn(View(context))
`when`(brightnessControllerFactory.create(any())).thenReturn(brightnessController)
+ whenever(shadeInteractorLazy.get()).thenReturn(shadeInteractor)
+ whenever(shadeInteractor.isQsExpanded).thenReturn(MutableStateFlow(false))
}
@After
@@ -175,13 +184,15 @@ class BrightnessDialogTest : SysuiTestCase() {
brightnessSliderControllerFactory: BrightnessSliderController.Factory,
brightnessControllerFactory: BrightnessController.Factory,
mainExecutor: DelayableExecutor,
- accessibilityMgr: AccessibilityManagerWrapper
+ accessibilityMgr: AccessibilityManagerWrapper,
+ shadeInteractor: ShadeInteractor
) :
BrightnessDialog(
brightnessSliderControllerFactory,
brightnessControllerFactory,
mainExecutor,
- accessibilityMgr
+ accessibilityMgr,
+ shadeInteractor
) {
private var finishing = false
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
index 03878b7bcf45..97378c3cc5a9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
@@ -96,6 +96,7 @@ import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.KeyguardViewConfigurator;
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository;
import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor;
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory;
@@ -343,6 +344,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
protected final int mMaxUdfpsBurnInOffsetY = 5;
protected FakeFeatureFlagsClassic mFeatureFlags = new FakeFeatureFlagsClassic();
protected KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor;
+ protected KeyguardClockInteractor mKeyguardClockInteractor;
protected FakeKeyguardRepository mFakeKeyguardRepository;
protected KeyguardInteractor mKeyguardInteractor;
protected SceneTestUtils mUtils = new SceneTestUtils(this);
@@ -696,6 +698,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
systemClock,
mKeyguardBottomAreaViewModel,
mKeyguardBottomAreaInteractor,
+ mKeyguardClockInteractor,
mAlternateBouncerInteractor,
mDreamingToLockscreenTransitionViewModel,
mOccludedToLockscreenTransitionViewModel,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
index 36b4435e2137..28fe8e4e8d3a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
@@ -362,6 +362,28 @@ public class NotificationPanelViewControllerTest extends NotificationPanelViewCo
}
@Test
+ public void onInterceptTouchEvent_nsslMigrationOff_userActivity() {
+ mSetFlagsRule.disableFlags(com.android.systemui.Flags.FLAG_KEYGUARD_SHADE_MIGRATION_NSSL);
+
+ mTouchHandler.onInterceptTouchEvent(MotionEvent.obtain(0L /* downTime */,
+ 0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */,
+ 0 /* metaState */));
+
+ verify(mCentralSurfaces).userActivity();
+ }
+
+ @Test
+ public void onInterceptTouchEvent_nsslMigrationOn_userActivity_not_called() {
+ mSetFlagsRule.enableFlags(com.android.systemui.Flags.FLAG_KEYGUARD_SHADE_MIGRATION_NSSL);
+
+ mTouchHandler.onInterceptTouchEvent(MotionEvent.obtain(0L /* downTime */,
+ 0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */,
+ 0 /* metaState */));
+
+ verify(mCentralSurfaces, times(0)).userActivity();
+ }
+
+ @Test
public void testOnTouchEvent_expansionResumesAfterBriefTouch() {
mFalsingManager.setIsClassifierEnabled(true);
mFalsingManager.setIsFalseTouch(false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
index 0587633b09cf..6ff79660efec 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
@@ -98,7 +98,6 @@ import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
-import java.util.Optional
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.test.TestScope
@@ -113,8 +112,9 @@ import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
-import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
+import java.util.Optional
+import org.mockito.Mockito.`when` as whenever
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@@ -446,6 +446,26 @@ class NotificationShadeWindowViewControllerTest : SysuiTestCase() {
}
@Test
+ fun handleDispatchTouchEvent_nsslMigrationOff_userActivity_not_called() {
+ mSetFlagsRule.disableFlags(Flags.FLAG_KEYGUARD_SHADE_MIGRATION_NSSL)
+ underTest.setStatusBarViewController(phoneStatusBarViewController)
+
+ interactionEventHandler.handleDispatchTouchEvent(DOWN_EVENT)
+
+ verify(centralSurfaces, times(0)).userActivity()
+ }
+
+ @Test
+ fun handleDispatchTouchEvent_nsslMigrationOn_userActivity() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_KEYGUARD_SHADE_MIGRATION_NSSL)
+ underTest.setStatusBarViewController(phoneStatusBarViewController)
+
+ interactionEventHandler.handleDispatchTouchEvent(DOWN_EVENT)
+
+ verify(centralSurfaces).userActivity()
+ }
+
+ @Test
fun shouldInterceptTouchEvent_statusBarKeyguardViewManagerShouldIntercept() {
// down event should be intercepted by keyguardViewManager
whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(DOWN_EVENT))
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
index 1dbb2972c6f3..62c0ebeb8c07 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
@@ -22,6 +22,8 @@ import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import static kotlinx.coroutines.test.TestCoroutineDispatchersKt.StandardTestDispatcher;
+
import android.content.res.Resources;
import android.os.Handler;
import android.os.Looper;
@@ -293,8 +295,10 @@ public class QuickSettingsControllerBaseTest extends SysuiTestCase {
)
);
- mActiveNotificationsInteractor =
- new ActiveNotificationsInteractor(new ActiveNotificationListRepository());
+ mActiveNotificationsInteractor = new ActiveNotificationsInteractor(
+ new ActiveNotificationListRepository(),
+ StandardTestDispatcher(/* scheduler = */ null, /* name = */ null)
+ );
KeyguardStatusView keyguardStatusView = new KeyguardStatusView(mContext);
keyguardStatusView.setId(R.id.keyguard_status_view);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/RenderNotificationsListInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/RenderNotificationsListInteractorTest.kt
index b86f8410fb7f..6374d5e259fc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/RenderNotificationsListInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/domain/interactor/RenderNotificationsListInteractorTest.kt
@@ -25,14 +25,19 @@ import com.android.systemui.statusbar.notification.shared.byKey
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.junit.Test
@SmallTest
class RenderNotificationsListInteractorTest : SysuiTestCase() {
+ private val backgroundDispatcher = StandardTestDispatcher()
+ private val testScope = TestScope(backgroundDispatcher)
private val notifsRepository = ActiveNotificationListRepository()
- private val notifsInteractor = ActiveNotificationsInteractor(notifsRepository)
+ private val notifsInteractor =
+ ActiveNotificationsInteractor(notifsRepository, backgroundDispatcher)
private val underTest =
RenderNotificationListInteractor(
notifsRepository,
@@ -40,21 +45,26 @@ class RenderNotificationsListInteractorTest : SysuiTestCase() {
)
@Test
- fun setRenderedList_preservesOrdering() = runTest {
- val notifs by collectLastValue(notifsInteractor.topLevelRepresentativeNotifications)
- val keys = (1..50).shuffled().map { "$it" }
- val entries =
- keys.map {
- mock<ListEntry> {
- val mockRep = mock<NotificationEntry> {
- whenever(key).thenReturn(it)
- whenever(sbn).thenReturn(mock())
- whenever(icons).thenReturn(mock())
+ fun setRenderedList_preservesOrdering() =
+ testScope.runTest {
+ val notifs by collectLastValue(notifsInteractor.topLevelRepresentativeNotifications)
+ val keys = (1..50).shuffled().map { "$it" }
+ val entries =
+ keys.map {
+ mock<ListEntry> {
+ val mockRep =
+ mock<NotificationEntry> {
+ whenever(key).thenReturn(it)
+ whenever(sbn).thenReturn(mock())
+ whenever(icons).thenReturn(mock())
+ }
+ whenever(representativeEntry).thenReturn(mockRep)
}
- whenever(representativeEntry).thenReturn(mockRep)
}
- }
- underTest.setRenderedList(entries)
- assertThat(notifs).comparingElementsUsing(byKey).containsExactlyElementsIn(keys).inOrder()
- }
+ underTest.setRenderedList(entries)
+ assertThat(notifs)
+ .comparingElementsUsing(byKey)
+ .containsExactlyElementsIn(keys)
+ .inOrder()
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
index ff5c02622e4e..755897442eb6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
@@ -35,6 +35,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static kotlinx.coroutines.flow.FlowKt.emptyFlow;
+import static kotlinx.coroutines.test.TestCoroutineDispatchersKt.StandardTestDispatcher;
import android.metrics.LogMaker;
import android.testing.AndroidTestingRunner;
@@ -169,7 +170,8 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase {
new ActiveNotificationListRepository();
private final ActiveNotificationsInteractor mActiveNotificationsInteractor =
- new ActiveNotificationsInteractor(mActiveNotificationsRepository);
+ new ActiveNotificationsInteractor(mActiveNotificationsRepository,
+ StandardTestDispatcher(/* scheduler = */ null, /* name = */ null));
private final SeenNotificationsInteractor mSeenNotificationsInteractor =
new SeenNotificationsInteractor(mActiveNotificationsRepository);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DevicePostureControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DevicePostureControllerImplTest.kt
new file mode 100644
index 000000000000..ce471705ed85
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DevicePostureControllerImplTest.kt
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2021 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.policy
+
+import android.hardware.devicestate.DeviceStateManager
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import android.testing.TestableResources
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_CLOSED
+import com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_FLIPPED
+import com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_HALF_OPENED
+import com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_OPENED
+import com.android.systemui.statusbar.policy.DevicePostureController.DEVICE_POSTURE_UNKNOWN
+import com.android.systemui.statusbar.policy.DevicePostureController.SUPPORTED_POSTURES_SIZE
+import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.time.FakeSystemClock
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mock
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+class DevicePostureControllerImplTest : SysuiTestCase() {
+ private val useBaseStateDeviceState = SUPPORTED_POSTURES_SIZE
+ private val deviceStateToPostureMapping =
+ arrayOf(
+ "$DEVICE_POSTURE_UNKNOWN:$DEVICE_POSTURE_UNKNOWN",
+ "$DEVICE_POSTURE_CLOSED:$DEVICE_POSTURE_CLOSED",
+ "$DEVICE_POSTURE_HALF_OPENED:$DEVICE_POSTURE_HALF_OPENED",
+ "$DEVICE_POSTURE_OPENED:$DEVICE_POSTURE_OPENED",
+ "$DEVICE_POSTURE_FLIPPED:$DEVICE_POSTURE_FLIPPED",
+ "$useBaseStateDeviceState:1000"
+ )
+ @Mock private lateinit var deviceStateManager: DeviceStateManager
+ @Captor
+ private lateinit var deviceStateCallback: ArgumentCaptor<DeviceStateManager.DeviceStateCallback>
+
+ private lateinit var mainExecutor: FakeExecutor
+ private lateinit var testableResources: TestableResources
+ private lateinit var underTest: DevicePostureControllerImpl
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ mainExecutor = FakeExecutor(FakeSystemClock())
+ testableResources = context.getOrCreateTestableResources()
+ testableResources.addOverride(
+ com.android.internal.R.array.config_device_state_postures,
+ deviceStateToPostureMapping
+ )
+ underTest =
+ DevicePostureControllerImpl(
+ context,
+ deviceStateManager,
+ mainExecutor,
+ )
+ verifyRegistersForDeviceStateCallback()
+ }
+
+ @Test
+ fun testPostureChanged_updates() {
+ var posture = -1
+ underTest.addCallback { posture = it }
+
+ deviceStateCallback.value.onStateChanged(DEVICE_POSTURE_UNKNOWN)
+ assertThat(posture).isEqualTo(DEVICE_POSTURE_UNKNOWN)
+
+ deviceStateCallback.value.onStateChanged(DEVICE_POSTURE_CLOSED)
+ assertThat(posture).isEqualTo(DEVICE_POSTURE_CLOSED)
+
+ deviceStateCallback.value.onStateChanged(DEVICE_POSTURE_HALF_OPENED)
+ assertThat(posture).isEqualTo(DEVICE_POSTURE_HALF_OPENED)
+
+ deviceStateCallback.value.onStateChanged(DEVICE_POSTURE_OPENED)
+ assertThat(posture).isEqualTo(DEVICE_POSTURE_OPENED)
+
+ deviceStateCallback.value.onStateChanged(DEVICE_POSTURE_FLIPPED)
+ assertThat(posture).isEqualTo(DEVICE_POSTURE_FLIPPED)
+ }
+
+ @Test
+ fun testPostureChanged_useBaseUpdate() {
+ var posture = -1
+ underTest.addCallback { posture = it }
+
+ deviceStateCallback.value.onStateChanged(DEVICE_POSTURE_HALF_OPENED)
+ assertThat(posture).isEqualTo(DEVICE_POSTURE_HALF_OPENED)
+
+ // base state change doesn't change the posture
+ deviceStateCallback.value.onBaseStateChanged(DEVICE_POSTURE_CLOSED)
+ assertThat(posture).isEqualTo(DEVICE_POSTURE_HALF_OPENED)
+
+ // WHEN the display state maps to using the base state, then posture updates
+ deviceStateCallback.value.onStateChanged(useBaseStateDeviceState)
+ assertThat(posture).isEqualTo(DEVICE_POSTURE_CLOSED)
+ }
+
+ @Test
+ fun baseStateChanges_doesNotUpdatePosture() {
+ var numPostureChanges = 0
+ underTest.addCallback { numPostureChanges++ }
+
+ deviceStateCallback.value.onStateChanged(DEVICE_POSTURE_HALF_OPENED)
+ assertThat(numPostureChanges).isEqualTo(1)
+
+ // base state changes doesn't send another posture update since the device state isn't
+ // useBaseStateDeviceState
+ deviceStateCallback.value.onBaseStateChanged(DEVICE_POSTURE_CLOSED)
+ deviceStateCallback.value.onBaseStateChanged(DEVICE_POSTURE_HALF_OPENED)
+ deviceStateCallback.value.onBaseStateChanged(DEVICE_POSTURE_FLIPPED)
+ deviceStateCallback.value.onBaseStateChanged(DEVICE_POSTURE_OPENED)
+ deviceStateCallback.value.onBaseStateChanged(DEVICE_POSTURE_UNKNOWN)
+ assertThat(numPostureChanges).isEqualTo(1)
+ }
+
+ private fun verifyRegistersForDeviceStateCallback() {
+ verify(deviceStateManager).registerCallback(eq(mainExecutor), deviceStateCallback.capture())
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProviderTest.kt
new file mode 100644
index 000000000000..4e61b89b9c3e
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProviderTest.kt
@@ -0,0 +1,96 @@
+/*
+ * 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 com.android.systemui.unfold.progress
+
+import android.os.Looper
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper.RunWithLooper
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.unfold.TestUnfoldTransitionProvider
+import com.android.systemui.utils.os.FakeHandler
+import kotlin.test.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+@RunWithLooper(setAsMainLooper = true)
+class MainThreadUnfoldTransitionProgressProviderTest : SysuiTestCase() {
+
+ private val wrappedProgressProvider = TestUnfoldTransitionProvider()
+ private val fakeHandler = FakeHandler(Looper.getMainLooper())
+ private val listener = TestUnfoldProgressListener()
+
+ private val progressProvider =
+ MainThreadUnfoldTransitionProgressProvider(fakeHandler, wrappedProgressProvider)
+
+ @Test
+ fun onTransitionStarted_propagated() {
+ progressProvider.addCallback(listener)
+
+ wrappedProgressProvider.onTransitionStarted()
+ fakeHandler.dispatchQueuedMessages()
+
+ listener.assertStarted()
+ }
+
+ @Test
+ fun onTransitionProgress_propagated() {
+ progressProvider.addCallback(listener)
+
+ wrappedProgressProvider.onTransitionStarted()
+ wrappedProgressProvider.onTransitionProgress(0.5f)
+ fakeHandler.dispatchQueuedMessages()
+
+ listener.assertLastProgress(0.5f)
+ }
+
+ @Test
+ fun onTransitionFinished_propagated() {
+ progressProvider.addCallback(listener)
+
+ wrappedProgressProvider.onTransitionStarted()
+ wrappedProgressProvider.onTransitionProgress(0.5f)
+ wrappedProgressProvider.onTransitionFinished()
+ fakeHandler.dispatchQueuedMessages()
+
+ listener.ensureTransitionFinished()
+ }
+
+ @Test
+ fun onTransitionFinishing_propagated() {
+ progressProvider.addCallback(listener)
+
+ wrappedProgressProvider.onTransitionStarted()
+ wrappedProgressProvider.onTransitionProgress(0.5f)
+ wrappedProgressProvider.onTransitionFinished()
+ fakeHandler.dispatchQueuedMessages()
+
+ listener.ensureTransitionFinished()
+ }
+
+ @Test
+ fun onTransitionStarted_afterCallbackRemoved_notPropagated() {
+ progressProvider.addCallback(listener)
+ progressProvider.removeCallback(listener)
+
+ wrappedProgressProvider.onTransitionStarted()
+ fakeHandler.dispatchQueuedMessages()
+
+ listener.assertNotStarted()
+ }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt
index f57ace9bfdc6..b28af46835ae 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt
@@ -29,7 +29,9 @@ import com.android.systemui.demomode.DemoModeController
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.ScreenLifecycle
import com.android.systemui.keyguard.WakefulnessLifecycle
+import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.dagger.BiometricLog
import com.android.systemui.log.dagger.BroadcastDispatcherLog
import com.android.systemui.log.dagger.SceneFrameworkLog
import com.android.systemui.media.controls.ui.MediaHierarchyManager
@@ -54,6 +56,7 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.phone.LSShadeTransitionLogger
import com.android.systemui.statusbar.phone.ScreenOffAnimationController
import com.android.systemui.statusbar.phone.ScrimController
+import com.android.systemui.statusbar.phone.SystemUIDialogManager
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.statusbar.policy.ZenModeController
import com.android.systemui.statusbar.window.StatusBarWindowController
@@ -106,12 +109,16 @@ data class TestMocksModule(
val unfoldTransitionProgressProvider: Optional<UnfoldTransitionProgressProvider> =
Optional.empty(),
@get:Provides val zenModeController: ZenModeController = mock(),
+ @get:Provides val systemUIDialogManager: SystemUIDialogManager = mock(),
+ @get:Provides val deviceEntryIconTransitions: Set<DeviceEntryIconTransition> = emptySet(),
// log buffers
@get:[Provides BroadcastDispatcherLog]
val broadcastDispatcherLogger: LogBuffer = mock(),
@get:[Provides SceneFrameworkLog]
val sceneLogger: LogBuffer = mock(),
+ @get:[Provides BiometricLog]
+ val biometricLogger: LogBuffer = mock(),
@get:Provides val lsShadeTransitionLogger: LSShadeTransitionLogger = mock(),
// framework mocks
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/data/FakeSystemUiDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/data/FakeSystemUiDataLayerModule.kt
index 8c653a535e29..ce52f4bd32f6 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/data/FakeSystemUiDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/data/FakeSystemUiDataLayerModule.kt
@@ -20,6 +20,7 @@ import com.android.systemui.authentication.data.FakeAuthenticationDataLayerModul
import com.android.systemui.bouncer.data.repository.FakeBouncerDataLayerModule
import com.android.systemui.common.ui.data.FakeCommonDataLayerModule
import com.android.systemui.deviceentry.data.FakeDeviceEntryDataLayerModule
+import com.android.systemui.keyevent.data.repository.FakeKeyEventDataLayerModule
import com.android.systemui.keyguard.data.FakeKeyguardDataLayerModule
import com.android.systemui.power.data.FakePowerDataLayerModule
import com.android.systemui.shade.data.repository.FakeShadeDataLayerModule
@@ -44,6 +45,7 @@ import dagger.Module
FakeStatusBarDataLayerModule::class,
FakeTelephonyDataLayerModule::class,
FakeUserDataLayerModule::class,
+ FakeKeyEventDataLayerModule::class,
]
)
object FakeSystemUiDataLayerModule
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt
index 8ff04a63802a..d97cb56787cc 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt
@@ -16,6 +16,7 @@
package com.android.systemui.deviceentry.data
import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepositoryModule
+import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryHapticsRepositoryModule
import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryRepositoryModule
import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepositoryModule
import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFaceAuthRepositoryModule
@@ -28,6 +29,7 @@ import dagger.Module
[
FakeBiometricSettingsRepositoryModule::class,
FakeDeviceEntryRepositoryModule::class,
+ FakeDeviceEntryHapticsRepositoryModule::class,
FakeDeviceEntryFaceAuthRepositoryModule::class,
FakeDeviceEntryFingerprintAuthRepositoryModule::class,
FakeFingerprintPropertyRepositoryModule::class,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryHapticsRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryHapticsRepository.kt
new file mode 100644
index 000000000000..b29b67d7c220
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryHapticsRepository.kt
@@ -0,0 +1,55 @@
+/*
+ * 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 com.android.systemui.deviceentry.data.repository
+
+import com.android.systemui.dagger.SysUISingleton
+import dagger.Binds
+import dagger.Module
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+
+/** Fake implementation of [DeviceEntryHapticsRepository] */
+@SysUISingleton
+class FakeDeviceEntryHapticsRepository @Inject constructor() : DeviceEntryHapticsRepository {
+ private var _successHapticRequest: MutableStateFlow<Boolean> = MutableStateFlow(false)
+ override val successHapticRequest: Flow<Boolean> = _successHapticRequest.asStateFlow()
+
+ private var _errorHapticRequest: MutableStateFlow<Boolean> = MutableStateFlow(false)
+ override val errorHapticRequest: Flow<Boolean> = _errorHapticRequest.asStateFlow()
+
+ override fun requestSuccessHaptic() {
+ _successHapticRequest.value = true
+ }
+
+ override fun handleSuccessHaptic() {
+ _successHapticRequest.value = false
+ }
+
+ override fun requestErrorHaptic() {
+ _errorHapticRequest.value = true
+ }
+
+ override fun handleErrorHaptic() {
+ _errorHapticRequest.value = false
+ }
+}
+
+@Module
+interface FakeDeviceEntryHapticsRepositoryModule {
+ @Binds fun bindFake(fake: FakeDeviceEntryHapticsRepository): DeviceEntryHapticsRepository
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventDataLayerModule.kt
index f4feee19df65..191bcccebc04 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventDataLayerModule.kt
@@ -13,8 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
+
+package com.android.systemui.keyevent.data.repository
import dagger.Module
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+@Module(includes = [FakeKeyEventRepositoryModule::class]) object FakeKeyEventDataLayerModule
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventRepository.kt
index 95b5316fbab5..97dab4987f6c 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventRepository.kt
@@ -16,11 +16,14 @@
package com.android.systemui.keyevent.data.repository
+import dagger.Binds
+import dagger.Module
+import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
-class FakeKeyEventRepository() : KeyEventRepository {
+class FakeKeyEventRepository @Inject constructor() : KeyEventRepository {
private val _isPowerButtonDown = MutableStateFlow(false)
override val isPowerButtonDown: Flow<Boolean> = _isPowerButtonDown.asStateFlow()
@@ -28,3 +31,8 @@ class FakeKeyEventRepository() : KeyEventRepository {
_isPowerButtonDown.value = isDown
}
}
+
+@Module
+interface FakeKeyEventRepositoryModule {
+ @Binds fun bindFake(fake: FakeKeyEventRepository): KeyEventRepository
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/FakeKeyguardDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/FakeKeyguardDataLayerModule.kt
index 6838e7676a23..abbd9be66b17 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/FakeKeyguardDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/FakeKeyguardDataLayerModule.kt
@@ -16,6 +16,7 @@
package com.android.systemui.keyguard.data
import com.android.systemui.keyguard.data.repository.FakeCommandQueueModule
+import com.android.systemui.keyguard.data.repository.FakeKeyguardClockRepositoryModule
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepositoryModule
import com.android.systemui.keyguard.data.repository.FakeKeyguardSurfaceBehindRepositoryModule
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepositoryModule
@@ -28,6 +29,7 @@ import dagger.Module
FakeKeyguardRepositoryModule::class,
FakeKeyguardTransitionRepositoryModule::class,
FakeKeyguardSurfaceBehindRepositoryModule::class,
+ FakeKeyguardClockRepositoryModule::class,
]
)
object FakeKeyguardDataLayerModule
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt
new file mode 100644
index 000000000000..21936c36179c
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt
@@ -0,0 +1,56 @@
+/*
+ * 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 com.android.systemui.keyguard.data.repository
+
+import com.android.keyguard.ClockEventController
+import com.android.keyguard.KeyguardClockSwitch.ClockSize
+import com.android.keyguard.KeyguardClockSwitch.LARGE
+import com.android.systemui.keyguard.shared.model.SettingsClockSize
+import com.android.systemui.plugins.ClockId
+import com.android.systemui.shared.clocks.DEFAULT_CLOCK_ID
+import com.android.systemui.util.mockito.mock
+import dagger.Binds
+import dagger.Module
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+
+class FakeKeyguardClockRepository @Inject constructor() : KeyguardClockRepository {
+ private val _clockSize = MutableStateFlow(LARGE)
+ override val clockSize: StateFlow<Int> = _clockSize
+
+ private val _selectedClockSize = MutableStateFlow(SettingsClockSize.DYNAMIC)
+ override val selectedClockSize = _selectedClockSize
+
+ private val _currentClockId = MutableStateFlow(DEFAULT_CLOCK_ID)
+ override val currentClockId: Flow<ClockId> = _currentClockId
+
+ private val _currentClock = MutableStateFlow(null)
+ override val currentClock = _currentClock
+ override val clockEventController: ClockEventController
+ get() = mock()
+
+ override fun setClockSize(@ClockSize size: Int) {
+ _clockSize.value = size
+ }
+}
+
+@Module
+interface FakeKeyguardClockRepositoryModule {
+ @Binds fun bindFake(fake: FakeKeyguardClockRepository): KeyguardClockRepository
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
index 4068e408f0bd..75fe37eddd70 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
@@ -18,7 +18,6 @@
package com.android.systemui.keyguard.data.repository
import android.graphics.Point
-import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.systemui.common.shared.model.Position
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.shared.model.BiometricUnlockModel
@@ -42,8 +41,6 @@ import kotlinx.coroutines.flow.asStateFlow
class FakeKeyguardRepository @Inject constructor() : KeyguardRepository {
private val _deferKeyguardDone: MutableSharedFlow<KeyguardDone> = MutableSharedFlow()
override val keyguardDone: Flow<KeyguardDone> = _deferKeyguardDone
- private val _clockSize = MutableStateFlow<Int>(LARGE)
- override val clockSize: Flow<Int> = _clockSize
private val _clockShouldBeCentered = MutableStateFlow<Boolean>(true)
override val clockShouldBeCentered: Flow<Boolean> = _clockShouldBeCentered
@@ -187,10 +184,6 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository {
_deferKeyguardDone.emit(timing)
}
- override fun setClockSize(size: Int) {
- _clockSize.value = size
- }
-
override fun setClockShouldBeCentered(shouldBeCentered: Boolean) {
_clockShouldBeCentered.value = shouldBeCentered
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryKosmos.kt
new file mode 100644
index 000000000000..e6716ba32cda
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryKosmos.kt
@@ -0,0 +1,23 @@
+/*
+ * 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 com.android.systemui.keyguard.data.repository
+
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.keyguardClockRepository: KeyguardClockRepository by
+ Kosmos.Fixture { fakeKeyguardClockRepository }
+val Kosmos.fakeKeyguardClockRepository by Kosmos.Fixture { FakeKeyguardClockRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt
new file mode 100644
index 000000000000..d791e949f853
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt
@@ -0,0 +1,23 @@
+/*
+ * 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 com.android.systemui.keyguard.domain.interactor
+
+import com.android.systemui.keyguard.data.repository.keyguardClockRepository
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.keyguardClockInteractor by
+ Kosmos.Fixture { KeyguardClockInteractor(keyguardClockRepository = keyguardClockRepository) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt
new file mode 100644
index 000000000000..d8786830f536
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt
@@ -0,0 +1,31 @@
+/*
+ * 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 com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+
+val Kosmos.keyguardClockViewModel by
+ Kosmos.Fixture {
+ KeyguardClockViewModel(
+ keyguardInteractor = keyguardInteractor,
+ keyguardClockInteractor = keyguardClockInteractor,
+ applicationScope = applicationCoroutineScope,
+ )
+ }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt
index 663b8450e690..4f807e3ddb64 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt
@@ -20,6 +20,7 @@ package com.android.systemui.keyguard.ui.viewmodel
import android.content.applicationContext
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
+import com.android.systemui.flags.FakeFeatureFlagsClassic
import com.android.systemui.keyguard.domain.interactor.burnInInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
@@ -42,5 +43,7 @@ val Kosmos.keyguardRootViewModel by Fixture {
goneToAodTransitionViewModel = goneToAodTransitionViewModel,
aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel,
screenOffAnimationController = screenOffAnimationController,
+ keyguardClockViewModel = keyguardClockViewModel,
+ featureFlags = FakeFeatureFlagsClassic(),
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
index 2902c3f65a16..e67df9dde871 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
@@ -18,8 +18,6 @@ package com.android.systemui.qs.ui.adapter
import android.content.Context
import android.view.View
-import android.view.ViewGroup
-import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -27,7 +25,7 @@ import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.filterNotNull
class FakeQSSceneAdapter(
- private val inflateDelegate: suspend (Context, ViewGroup?) -> View,
+ private val inflateDelegate: suspend (Context) -> View,
) : QSSceneAdapter {
private val _customizing = MutableStateFlow(false)
override val isCustomizing: StateFlow<Boolean> = _customizing.asStateFlow()
@@ -38,8 +36,8 @@ class FakeQSSceneAdapter(
private val _state = MutableStateFlow<QSSceneAdapter.State?>(null)
val state = _state.filterNotNull()
- override suspend fun inflate(context: Context, parent: ViewGroup?) {
- _view.value = inflateDelegate(context, parent)
+ override suspend fun inflate(context: Context) {
+ _view.value = inflateDelegate(context)
}
override fun setState(state: QSSceneAdapter.State) {
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt
index 92ec4f22001b..a70b91da6145 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt
@@ -24,6 +24,7 @@ import dagger.Module
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
/** Fake implementation of [ShadeRepository] */
@SysUISingleton
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/ActiveNotificationsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/ActiveNotificationsInteractorKosmos.kt
index 3d7fb6d91393..01f453570e63 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/ActiveNotificationsInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/domain/interactor/ActiveNotificationsInteractorKosmos.kt
@@ -17,7 +17,10 @@
package com.android.systemui.statusbar.notification.domain.interactor
import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
val Kosmos.activeNotificationsInteractor by
- Kosmos.Fixture { ActiveNotificationsInteractor(activeNotificationListRepository) }
+ Kosmos.Fixture {
+ ActiveNotificationsInteractor(activeNotificationListRepository, testDispatcher)
+ }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationsKeyguardInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationsKeyguardInteractorKosmos.kt
index 61a38b864c40..432464e86c3f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationsKeyguardInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationsKeyguardInteractorKosmos.kt
@@ -18,11 +18,13 @@ package com.android.systemui.statusbar.notification.stack.domain.interactor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.statusbar.notification.data.repository.notificationsKeyguardViewStateRepository
import com.android.systemui.statusbar.notification.domain.interactor.NotificationsKeyguardInteractor
val Kosmos.notificationsKeyguardInteractor by Fixture {
NotificationsKeyguardInteractor(
repository = notificationsKeyguardViewStateRepository,
+ backgroundDispatcher = testDispatcher,
)
}
diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedModule.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedModule.kt
index 42d31b38ff76..f7fb01465a40 100644
--- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedModule.kt
+++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedModule.kt
@@ -19,8 +19,10 @@ package com.android.systemui.unfold
import android.os.Handler
import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.dagger.UnfoldBg
+import com.android.systemui.unfold.dagger.UnfoldBgProgressFlag
import com.android.systemui.unfold.dagger.UnfoldMain
import com.android.systemui.unfold.progress.FixedTimingTransitionProgressProvider
+import com.android.systemui.unfold.progress.MainThreadUnfoldTransitionProgressProvider
import com.android.systemui.unfold.progress.PhysicsBasedUnfoldTransitionProgressProvider
import com.android.systemui.unfold.progress.UnfoldTransitionProgressForwarder
import com.android.systemui.unfold.updates.DeviceFoldStateProvider
@@ -36,15 +38,18 @@ import com.android.systemui.unfold.util.ScaleAwareTransitionProgressProvider
import com.android.systemui.unfold.util.UnfoldKeyguardVisibilityManager
import com.android.systemui.unfold.util.UnfoldKeyguardVisibilityManagerImpl
import com.android.systemui.unfold.util.UnfoldKeyguardVisibilityProvider
+import dagger.BindsOptionalOf
import dagger.Module
import dagger.Provides
import java.util.Optional
import javax.inject.Provider
import javax.inject.Singleton
+import kotlin.jvm.optionals.getOrDefault
@Module(
includes =
[
+ UnfoldFlagsModule::class,
UnfoldSharedInternalModule::class,
UnfoldRotationProviderInternalModule::class,
HingeAngleProviderInternalModule::class,
@@ -69,6 +74,16 @@ class UnfoldSharedModule {
fun foldStateRepository(impl: FoldStateRepositoryImpl): FoldStateRepository = impl
}
+@Module
+abstract class UnfoldFlagsModule {
+ /**
+ * Users of the library can bind this boolean to notify whether the progress should be
+ * calculated only in the background (and the main thread provider is generated by posting the
+ * background events in the main handler).
+ */
+ @BindsOptionalOf @UnfoldBgProgressFlag abstract fun unfoldBgProgressFlag(): Boolean
+}
+
/**
* Needed as methods inside must be public, but their parameters can be internal (and, a public
* method can't have internal parameters). Making the module internal and included in a public one
@@ -87,17 +102,34 @@ internal class UnfoldSharedInternalModule {
fixedTimingTransitionProgressProvider: Provider<FixedTimingTransitionProgressProvider>,
foldStateProvider: FoldStateProvider,
@UnfoldMain mainHandler: Handler,
+ mainThreadUnfoldTransitionProgressProviderFactory:
+ MainThreadUnfoldTransitionProgressProvider.Factory,
+ @UnfoldBg bgProvider: Provider<Optional<UnfoldTransitionProgressProvider>>,
+ @UnfoldBgProgressFlag unfoldBgProgressFlag: Optional<Boolean>,
): Optional<UnfoldTransitionProgressProvider> {
- return createOptionalUnfoldTransitionProgressProvider(
- config = config,
- scaleAwareProviderFactory = scaleAwareProviderFactory,
- tracingListener = tracingListener.create("MainThread"),
- physicsBasedUnfoldTransitionProgressProvider =
- physicsBasedUnfoldTransitionProgressProvider,
- fixedTimingTransitionProgressProvider = fixedTimingTransitionProgressProvider,
- foldStateProvider = foldStateProvider,
- progressHandler = mainHandler,
- )
+ if (unfoldBgProgressFlag.getOrDefault(false)) {
+ // In this case, we wrap the background progress provider
+ val mainThreadProvider: Optional<UnfoldTransitionProgressProvider> =
+ bgProvider.get().map {
+ mainThreadUnfoldTransitionProgressProviderFactory.create(it)
+ }
+ mainThreadProvider.ifPresent {
+ it.addCallback(tracingListener.create("MainThreadFromBgProgress"))
+ }
+ return mainThreadProvider
+ } else {
+ // TODO(b/277879146): Remove this once unfold_animation_background_progress is launched.
+ return createOptionalUnfoldTransitionProgressProvider(
+ config = config,
+ scaleAwareProviderFactory = scaleAwareProviderFactory,
+ tracingListener = tracingListener.create("MainThread"),
+ physicsBasedUnfoldTransitionProgressProvider =
+ physicsBasedUnfoldTransitionProgressProvider,
+ fixedTimingTransitionProgressProvider = fixedTimingTransitionProgressProvider,
+ foldStateProvider = foldStateProvider,
+ progressHandler = mainHandler,
+ )
+ }
}
@Provides
diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/dagger/UnfoldBgProgressFlag.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/dagger/UnfoldBgProgressFlag.kt
new file mode 100644
index 000000000000..0e371fa6bfb7
--- /dev/null
+++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/dagger/UnfoldBgProgressFlag.kt
@@ -0,0 +1,26 @@
+/*
+ * 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 com.android.systemui.unfold.dagger
+
+import javax.inject.Qualifier
+
+/**
+ * Annotates the boolean representing whether we are calculating progresses in the background.
+ *
+ * Used to allow clients to provide this value, without depending on the flags directly.
+ */
+@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class UnfoldBgProgressFlag
diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProvider.kt
new file mode 100644
index 000000000000..9bdf3d5d5307
--- /dev/null
+++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/progress/MainThreadUnfoldTransitionProgressProvider.kt
@@ -0,0 +1,92 @@
+/*
+ * 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 com.android.systemui.unfold.progress
+
+import android.os.Handler
+import androidx.annotation.FloatRange
+import com.android.systemui.unfold.UnfoldTransitionProgressProvider
+import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
+import com.android.systemui.unfold.dagger.UnfoldMain
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+
+/**
+ * [UnfoldTransitionProgressProvider] that forwards all progress to the main thread handler.
+ *
+ * This is needed when progress are calculated in the background, but some listeners need the
+ * callbacks in the main thread.
+ */
+class MainThreadUnfoldTransitionProgressProvider
+@AssistedInject
+constructor(
+ @UnfoldMain private val mainHandler: Handler,
+ @Assisted private val rootProvider: UnfoldTransitionProgressProvider
+) : UnfoldTransitionProgressProvider {
+
+ private val listenerMap = mutableMapOf<TransitionProgressListener, TransitionProgressListener>()
+
+ override fun addCallback(listener: TransitionProgressListener) {
+ assertMainThread()
+ val proxy = TransitionProgressListerProxy(listener)
+ rootProvider.addCallback(proxy)
+ listenerMap[listener] = proxy
+ }
+
+ override fun removeCallback(listener: TransitionProgressListener) {
+ assertMainThread()
+ val proxy = listenerMap.remove(listener) ?: return
+ rootProvider.removeCallback(proxy)
+ }
+
+ private fun assertMainThread() {
+ check(mainHandler.looper.isCurrentThread) {
+ "Should be called from the main thread, but this is ${Thread.currentThread()}"
+ }
+ }
+
+ override fun destroy() {
+ rootProvider.destroy()
+ }
+
+ inner class TransitionProgressListerProxy(private val listener: TransitionProgressListener) :
+ TransitionProgressListener {
+ override fun onTransitionStarted() {
+ mainHandler.post { listener.onTransitionStarted() }
+ }
+
+ override fun onTransitionProgress(@FloatRange(from = 0.0, to = 1.0) progress: Float) {
+ mainHandler.post { listener.onTransitionProgress(progress) }
+ }
+
+ override fun onTransitionFinishing() {
+ mainHandler.post { listener.onTransitionFinishing() }
+ }
+
+ override fun onTransitionFinished() {
+ mainHandler.post { listener.onTransitionFinished() }
+ }
+ }
+
+ @AssistedFactory
+ interface Factory {
+ /** Creates a [MainThreadUnfoldTransitionProgressProvider] that wraps the [rootProvider]. */
+ fun create(
+ rootProvider: UnfoldTransitionProgressProvider
+ ): MainThreadUnfoldTransitionProgressProvider
+ }
+}
diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values-sw600dp/config.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values-sw600dp/config.xml
new file mode 100644
index 000000000000..be1f081d5b8f
--- /dev/null
+++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values-sw600dp/config.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<resources>
+ <!-- If true, attach the navigation bar to the app during app transition -->
+ <bool name="config_attachNavBarToAppDuringTransition">false</bool>
+</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values-sw600dp/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values-sw600dp/config.xml
new file mode 100644
index 000000000000..be1f081d5b8f
--- /dev/null
+++ b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values-sw600dp/config.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<resources>
+ <!-- If true, attach the navigation bar to the app during app transition -->
+ <bool name="config_attachNavBarToAppDuringTransition">false</bool>
+</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values-sw600dp/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values-sw600dp/config.xml
new file mode 100644
index 000000000000..be1f081d5b8f
--- /dev/null
+++ b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values-sw600dp/config.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<resources>
+ <!-- If true, attach the navigation bar to the app during app transition -->
+ <bool name="config_attachNavBarToAppDuringTransition">false</bool>
+</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values-sw600dp/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values-sw600dp/config.xml
new file mode 100644
index 000000000000..be1f081d5b8f
--- /dev/null
+++ b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values-sw600dp/config.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * 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.
+ */
+-->
+<resources>
+ <!-- If true, attach the navigation bar to the app during app transition -->
+ <bool name="config_attachNavBarToAppDuringTransition">false</bool>
+</resources>
diff --git a/ravenwood/OWNERS b/ravenwood/OWNERS
index c06b3b9c2d11..41fd68e6c2d9 100644
--- a/ravenwood/OWNERS
+++ b/ravenwood/OWNERS
@@ -1,3 +1,5 @@
+set noparent
+
jsharkey@google.com
omakoto@google.com
jaggies@google.com
diff --git a/ravenwood/README.md b/ravenwood/README.md
new file mode 100644
index 000000000000..9c4fda7a50a6
--- /dev/null
+++ b/ravenwood/README.md
@@ -0,0 +1,28 @@
+# Ravenwood
+
+Ravenwood is an officially-supported lightweight unit testing environment for Android platform code that runs on the host.
+
+Ravenwood’s focus on Android platform use-cases, improved maintainability, and device consistency distinguishes it from Robolectric, which remains a popular choice for app testing.
+
+## Background
+
+Executing tests on a typical Android device has substantial overhead, such as flashing the build, waiting for the boot to complete, and retrying tests that fail due to general flakiness.
+
+In contrast, defining a lightweight unit testing environment mitigates these issues by running directly from build artifacts (no flashing required), runs immediately (no booting required), and runs in an isolated environment (less flakiness).
+
+## Guiding principles
+Here’s a summary of the guiding principles for Ravenwood, aimed at addressing Robolectric design concerns and better supporting Android platform developers:
+
+* **API support for Ravenwood is opt-in.** Teams that own APIs decide exactly what, and how, they support their API functionality being available to tests. When an API hasn’t opted-in, the API signatures remain available for tests to compile against and/or mock, but they throw when called under a Ravenwood environment.
+ * _Contrasted with Robolectric which attempts to run API implementations as-is, causing maintenance pains as teams maintain or redesign their API internals._
+* **API support and customizations for Ravenwood appear directly inline with relevant code.** This improves maintenance of APIs by providing awareness of what code runs under Ravenwood, including the ability to replace code at a per-method level when Ravenwood-specific customization is needed.
+ * _Contrasted with Robolectric which maintains customized behavior in separate “Shadow” classes that are difficult for maintainers to be aware of._
+* **APIs supported under Ravenwood are tested to remain consistent with physical devices.** As teams progressively opt-in supporting APIs under Ravenwood, we’re requiring they bring along “bivalent” tests (such as the relevant CTS) to validate that Ravenwood behaves just like a physical device.
+ * _Contrasted with Robolectric, which has limited (and forked) testing of their environment, increasing their risk of accidental divergence over time and misleading “passing” signals._
+* **Ravenwood aims to support more “real” code.** As API owners progressively opt-in their code, they have the freedom to provide either a limited “fake” that is a faithful emulation of how a device behaves, or they can bring more “real” code that runs on physical devices.
+ * _Contrasted with Robolectric, where support for “real” code ends at the app process boundary, such as a call into `system_server`._
+
+## More details
+
+* [Ravenwood for Test Authors](test-authors.md)
+* [Ravenwood for API Maintainers](api-maintainers.md)
diff --git a/ravenwood/TEST_MAPPING b/ravenwood/TEST_MAPPING
index 72eb665bee65..031984829e77 100644
--- a/ravenwood/TEST_MAPPING
+++ b/ravenwood/TEST_MAPPING
@@ -1,7 +1,21 @@
{
- "presubmit": [
- // Let's only run this one as a smoke test.
- // TODO: Enable it once the infra knows how to run it.
- // { "name": "CtsUtilTestCasesRavenwood" }
- ]
+ "presubmit": [
+ {
+ "name": "RavenwoodMockitoTest_device"
+ }
+ ],
+ "ravenwood-presubmit": [
+ {
+ "name": "RavenwoodMinimumTest",
+ "host": true
+ },
+ {
+ "name": "RavenwoodMockitoTest",
+ "host": true
+ },
+ {
+ "name": "CtsUtilTestCasesRavenwood",
+ "host": true
+ }
+ ]
}
diff --git a/ravenwood/api-maintainers.md b/ravenwood/api-maintainers.md
new file mode 100644
index 000000000000..30e899cd3ce3
--- /dev/null
+++ b/ravenwood/api-maintainers.md
@@ -0,0 +1,73 @@
+# Ravenwood for API Maintainers
+
+By default, Android APIs aren’t opted-in to Ravenwood, and they default to throwing when called under the Ravenwood environment.
+
+To opt-in to supporting an API under Ravenwood, you can use the inline annotations documented below to customize your API behavior when running under Ravenwood. Because these annotations are inline in the relevant platform source code, they serve as valuable reminders to future API maintainers of Ravenwood support expectations.
+
+> **Note:** to ensure that API teams are well-supported during early Ravenwood onboarding, the Ravenwood team is manually maintaining an allow-list of classes that are able to use Ravenwood annotations. Please reach out to ravenwood@ so we can offer design advice and allow-list your APIs.
+
+These Ravenwood-specific annotations have no bearing on the status of an API being public, `@SystemApi`, `@TestApi`, `@hide`, etc. Ravenwood annotations are an orthogonal concept that are only consumed by the internal `hoststubgen` tool during a post-processing step that generates the Ravenwood runtime environment. Teams that own APIs can continue to refactor opted-in `@hide` implementation details, as long as the test-visible behavior continues passing.
+
+As described in our Guiding Principles, when a team opts-in an API, we’re requiring that they bring along “bivalent” tests (such as the relevant CTS) to validate that Ravenwood behaves just like a physical device. At the moment this means adding the bivalent tests to relevant `TEST_MAPPING` files to ensure they remain consistently passing over time. These bivalent tests are important because they progressively provide the foundation on which higher-level unit tests place their trust.
+
+## Opt-in to supporting a single method while other methods remained opt-out
+
+```
+@RavenwoodKeepPartialClass
+public class MyManager {
+ @RavenwoodKeep
+ public static String modeToString(int mode) {
+ // This method implementation runs as-is on both devices and Ravenwood
+ }
+
+ public static void doComplex() {
+ // This method implementation runs as-is on devices, but because there
+ // is no method-level annotation, and the class-level default is
+ // “keep partial”, this method is not supported under Ravenwood and
+ // will throw
+ }
+}
+```
+
+## Opt-in an entire class with opt-out of specific methods
+
+```
+@RavenwoodKeepWholeClass
+public class MyStruct {
+ public void doSimple() {
+ // This method implementation runs as-is on both devices and Ravenwood,
+ // implicitly inheriting the class-level annotation
+ }
+
+ @RavenwoodThrow
+ public void doComplex() {
+ // This method implementation runs as-is on devices, but the
+ // method-level annotation overrides the class-level annotation, so
+ // this method is not supported under Ravenwood and will throw
+ }
+}
+```
+
+## Replace a complex method when under Ravenwood
+
+```
+@RavenwoodKeepWholeClass
+public class MyStruct {
+ @RavenwoodReplace
+ public void doComplex() {
+ // This method implementation runs as-is on devices, but the
+ // implementation is replaced/substituted by the
+ // doComplex$ravenwood() method implementation under Ravenwood
+ }
+
+ public void doComplex$ravenwood() {
+ // This method implementation only runs under Ravenwood
+ }
+}
+```
+
+## General strategies for side-stepping tricky dependencies
+
+The “replace” strategy described above is quite powerful, and can be used in creative ways to sidestep tricky underlying dependencies that aren’t ready yet.
+
+For example, consider a constructor or static initializer that relies on unsupported functionality from another team. By factoring the unsupported logic into a dedicated method, that method can then be replaced under Ravenwood to offer baseline functionality.
diff --git a/ravenwood/framework-minus-apex-ravenwood-policies.txt b/ravenwood/framework-minus-apex-ravenwood-policies.txt
index c70c171048e7..96cfa4896808 100644
--- a/ravenwood/framework-minus-apex-ravenwood-policies.txt
+++ b/ravenwood/framework-minus-apex-ravenwood-policies.txt
@@ -1,5 +1,8 @@
# Ravenwood "policy" file for framework-minus-apex.
+# Keep all AIDL interfaces
+class :aidl stubclass
+
# Collections
class android.util.ArrayMap stubclass
class android.util.ArraySet stubclass
@@ -131,6 +134,8 @@ class com.android.modules.utils.TypedXmlSerializer stubclass
class android.net.Uri stubclass
class android.net.UriCodec stubclass
-# Context: just enough to support wrapper, no further functionality
+# Just enough to support mocking, no further functionality
class android.content.Context stub
method <init> ()V stub
+class android.content.pm.PackageManager stub
+ method <init> ()V stub
diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java
index be0c09ee4a25..eacdc2f79254 100644
--- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java
+++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java
@@ -32,6 +32,8 @@ public class RavenwoodRuleImpl {
android.os.Process.init$ravenwood(rule.mUid, rule.mPid);
android.os.Binder.init$ravenwood();
+ com.android.server.LocalServices.removeAllServicesForTest();
+
if (rule.mProvideMainThread) {
final HandlerThread main = new HandlerThread(MAIN_THREAD_NAME);
main.start();
@@ -45,6 +47,8 @@ public class RavenwoodRuleImpl {
Looper.clearMainLooperForTest();
}
+ com.android.server.LocalServices.removeAllServicesForTest();
+
android.os.Process.reset$ravenwood();
android.os.Binder.reset$ravenwood();
}
diff --git a/ravenwood/minimum-test/Android.bp b/ravenwood/minimum-test/Android.bp
new file mode 100644
index 000000000000..bf3583cebd2c
--- /dev/null
+++ b/ravenwood/minimum-test/Android.bp
@@ -0,0 +1,24 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "frameworks_base_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["frameworks_base_license"],
+}
+
+// Minimum ravenwood test according to test-authors.md.
+android_ravenwood_test {
+ name: "RavenwoodMinimumTest",
+
+ static_libs: [
+ "androidx.annotation_annotation",
+ "androidx.test.rules",
+ ],
+
+ srcs: [
+ "test/**/*.java",
+ ],
+ sdk_version: "test_current",
+ auto_gen_config: true,
+}
diff --git a/ravenwood/minimum-test/test/com/android/ravenwood/RavenwoodMinimumTest.java b/ravenwood/minimum-test/test/com/android/ravenwood/RavenwoodMinimumTest.java
new file mode 100644
index 000000000000..085c18622885
--- /dev/null
+++ b/ravenwood/minimum-test/test/com/android/ravenwood/RavenwoodMinimumTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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 com.android.ravenwood;
+
+import android.platform.test.annotations.IgnoreUnderRavenwood;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class RavenwoodMinimumTest {
+ @Rule
+ public RavenwoodRule mRavenwood = new RavenwoodRule.Builder()
+ .setProcessApp()
+ .build();
+
+ @Test
+ public void testSimple() {
+ Assert.assertTrue(android.os.Process.isApplicationUid(android.os.Process.myUid()));
+ }
+
+ @Test
+ @IgnoreUnderRavenwood
+ public void testIgnored() {
+ throw new RuntimeException("Shouldn't be executed under ravenwood");
+ }
+}
diff --git a/ravenwood/ravenwood-annotation-allowed-classes.txt b/ravenwood/ravenwood-annotation-allowed-classes.txt
index 07c2cd7c26b3..72e9ba367bc9 100644
--- a/ravenwood/ravenwood-annotation-allowed-classes.txt
+++ b/ravenwood/ravenwood-annotation-allowed-classes.txt
@@ -2,16 +2,20 @@
com.android.internal.util.ArrayUtils
+android.util.AtomicFile
android.util.DataUnit
android.util.EventLog
android.util.IntArray
android.util.LongArray
+android.util.LruCache
android.util.Slog
android.util.TimeUtils
android.util.Xml
android.os.Binder
android.os.Binder$IdentitySupplier
+android.os.FileUtils
+android.os.FileUtils$MemoryPipe
android.os.Handler
android.os.HandlerExecutor
android.os.HandlerThread
@@ -30,6 +34,7 @@ android.content.ClipDescription
android.content.ComponentName
android.content.ContentUris
android.content.ContentValues
+android.content.ContextWrapper
android.content.Intent
android.content.IntentFilter
android.content.UriMatcher
@@ -59,3 +64,5 @@ android.graphics.Point
android.graphics.PointF
android.graphics.Rect
android.graphics.RectF
+
+com.android.server.LocalServices
diff --git a/ravenwood/ravenwood-standard-options.txt b/ravenwood/ravenwood-standard-options.txt
index 8ad21fa53a51..f64f26d7962a 100644
--- a/ravenwood/ravenwood-standard-options.txt
+++ b/ravenwood/ravenwood-standard-options.txt
@@ -1,6 +1,6 @@
# File containing standard options to HostStubGen for Ravenwood
---debug
+# --debug # To enable debug log on consone
# Keep all classes / methods / fields, but make the methods throw.
--default-throw
diff --git a/ravenwood/test-authors.md b/ravenwood/test-authors.md
new file mode 100644
index 000000000000..5adef534a2b2
--- /dev/null
+++ b/ravenwood/test-authors.md
@@ -0,0 +1,148 @@
+# Ravenwood for Test Authors
+
+The Ravenwood testing environment runs inside a single Java process on the host side, and provides a limited yet growing set of Android API functionality.
+
+Ravenwood explicitly does not support “large” integration tests that expect a fully booted Android OS. Instead, it’s more suited for “small” and “medium” tests where your code-under-test has been factored to remove dependencies on a fully booted device.
+
+When writing tests under Ravenwood, all Android API symbols associated with your declared `sdk_version` are available to link against using, but unsupported APIs will throw an exception. This design choice enables mocking of unsupported APIs, and supports sharing of test code to build “bivalent” test suites that run against either Ravenwood or a traditional device.
+
+## Typical test structure
+
+Below are the typical steps needed to add a straightforward “small” unit test:
+
+* Define an `android_ravenwood_test` rule in your `Android.bp` file:
+
+```
+android_ravenwood_test {
+ name: "MyTestsRavenwood",
+ static_libs: [
+ "androidx.annotation_annotation",
+ "androidx.test.rules",
+ ],
+ srcs: [
+ "src/com/example/MyCode.java",
+ "tests/src/com/example/MyCodeTest.java",
+ ],
+ sdk_version: "test_current",
+ auto_gen_config: true,
+}
+```
+
+* Write your unit test just like you would for an Android device:
+
+```
+import android.platform.test.annotations.IgnoreUnderRavenwood;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class MyCodeTest {
+ @Test
+ public void testSimple() {
+ // ...
+ }
+}
+```
+
+* APIs available under Ravenwood are stateless by default. If your test requires explicit states (such as defining the UID you’re running under, or requiring a main `Looper` thread), add a `RavenwoodRule` to declare that:
+
+```
+import android.platform.test.annotations.IgnoreUnderRavenwood;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class MyCodeTest {
+ @Rule
+ public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder()
+ .setProcessApp()
+ .setProvideMainThread(true)
+ .build();
+```
+
+Once you’ve defined your test, you can use typical commands to execute it locally:
+
+```
+$ atest MyTestsRavenwood
+```
+
+> **Note:** There's a known bug where `atest` currently requires a connected device to run Ravenwood tests, but that device isn't used for testing.
+
+You can also run your new tests automatically via `TEST_MAPPING` rules like this:
+
+```
+{
+ "ravenwood-presubmit": [
+ {
+ "name": "MyTestsRavenwood",
+ "host": true
+ }
+ ]
+}
+```
+
+## Strategies for migration/bivalent tests
+
+Ravenwood aims to support tests that are written in a “bivalent” way, where the same test code can run on both a real Android device and under a Ravenwood environment.
+
+In situations where a test method depends on API functionality not yet available under Ravenwood, we provide an annotation to quietly “ignore” that test under Ravenwood, while continuing to validate that test on real devices. Please note that your test must declare a `RavenwoodRule` for the annotation to take effect.
+
+Test authors are encouraged to provide a `blockedBy` or `reason` argument to help future maintainers understand why a test is being ignored, and under what conditions it might be supported in the future.
+
+```
+@RunWith(AndroidJUnit4.class)
+public class MyCodeTest {
+ @Rule
+ public final RavenwoodRule mRavenwood = new RavenwoodRule();
+
+ @Test
+ public void testSimple() {
+ // Simple test that runs on both devices and Ravenwood
+ }
+
+ @Test
+ @IgnoreUnderRavenwood(blockedBy = PackageManager.class)
+ public void testComplex() {
+ // Complex test that runs on devices, but is ignored under Ravenwood
+ }
+}
+```
+
+## Strategies for unsupported APIs
+
+As you write tests against Ravenwood, you’ll likely discover API dependencies that aren’t supported yet. Here’s a few strategies that can help you make progress:
+
+* Your code-under-test may benefit from subtle dependency refactoring to reduce coupling. (For example, providing a specific `File` argument instead of deriving it internally from a `Context`.)
+* Although mocking code that your team doesn’t own is a generally discouraged testing practice, it can be a valuable pressure relief valve when a dependency isn’t yet supported.
+
+## Strategies for debugging test development
+
+When writing tests you may encounter odd or hard to debug behaviors. One good place to start is at the beginning of the logs stored by atest:
+
+```
+$ atest MyTestsRavenwood
+...
+Test Logs have saved in /tmp/atest_result/20231128_094010_0e90t8v8/log
+Run 'atest --history' to review test result history.
+```
+
+The most useful logs are in the `isolated-java-logs` text file, which can typically be tab-completed by copy-pasting the logs path mentioned in the atest output:
+
+```
+$ less /tmp/atest_result/20231128_133105_h9al__79/log/i*/i*/isolated-java-logs*
+```
+
+Here are some common known issues and recommended workarounds:
+
+* Some code may unconditionally interact with unsupported APIs, such as via static initializers. One strategy is to shift the logic into `@Before` methods and make it conditional by testing `RavenwoodRule.isUnderRavenwood()`.
+* Some code may reference API symbols not yet present in the Ravenwood runtime, such as ART or ICU internals, or APIs from Mainline modules. One strategy is to refactor to avoid these internal dependencies, but Ravenwood aims to better support them soon.
+ * This may also manifest as very odd behavior, such as test not being executed at all, tracked by bug #312517322
+ * This may also manifest as an obscure Mockito error claiming “Mockito can only mock non-private & non-final classes”
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
index 74538ac02289..6cac6a47c77b 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
@@ -668,7 +668,7 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
final Context uiContext = displayContext.createWindowContext(
TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, null /* options */);
magnificationGestureHandler = new WindowMagnificationGestureHandler(uiContext,
- mAms.getWindowMagnificationMgr(), mAms.getTraceManager(),
+ mAms.getMagnificationConnectionManager(), mAms.getTraceManager(),
mAms.getMagnificationController(),
detectControlGestures,
detectTwoFingerTripleTap,
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index b5e8c849517b..2eecb4d3a86c 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -158,10 +158,10 @@ import com.android.internal.util.Preconditions;
import com.android.server.AccessibilityManagerInternal;
import com.android.server.LocalServices;
import com.android.server.SystemService;
+import com.android.server.accessibility.magnification.MagnificationConnectionManager;
import com.android.server.accessibility.magnification.MagnificationController;
import com.android.server.accessibility.magnification.MagnificationProcessor;
import com.android.server.accessibility.magnification.MagnificationScaleProvider;
-import com.android.server.accessibility.magnification.WindowMagnificationManager;
import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.pm.UserManagerInternal;
import com.android.server.policy.WindowManagerPolicy;
@@ -3442,7 +3442,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
&& (userState.getMagnificationCapabilitiesLocked()
!= Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN)
|| userHasMagnificationServicesLocked(userState);
- getWindowMagnificationMgr().requestConnection(connect);
+ getMagnificationConnectionManager().requestConnection(connect);
}
/**
@@ -4122,17 +4122,17 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
mSecurityPolicy.enforceCallingOrSelfPermission(
android.Manifest.permission.STATUS_BAR_SERVICE);
- getWindowMagnificationMgr().setConnection(connection);
+ getMagnificationConnectionManager().setConnection(connection);
}
/**
- * Getter of {@link WindowMagnificationManager}.
+ * Getter of {@link MagnificationConnectionManager}.
*
- * @return WindowMagnificationManager
+ * @return MagnificationManager
*/
- public WindowMagnificationManager getWindowMagnificationMgr() {
+ public MagnificationConnectionManager getMagnificationConnectionManager() {
synchronized (mLock) {
- return mMagnificationController.getWindowMagnificationMgr();
+ return mMagnificationController.getMagnificationConnectionManager();
}
}
@@ -4423,7 +4423,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
pw.println();
}
pw.append("hasWindowMagnificationConnection=").append(
- String.valueOf(getWindowMagnificationMgr().isConnected()));
+ String.valueOf(getMagnificationConnectionManager().isConnected()));
pw.println();
mMagnificationProcessor.dump(pw, getValidDisplayList());
final int userCount = mUserStates.size();
@@ -5144,7 +5144,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
for (int i = 0; i < displays.size(); i++) {
final int displayId = displays.get(i).getDisplayId();
- getWindowMagnificationMgr().removeMagnificationButton(displayId);
+ getMagnificationConnectionManager().removeMagnificationButton(displayId);
}
}
}
@@ -5580,6 +5580,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
@Override
public void injectInputEventToInputFilter(InputEvent event) {
+ mSecurityPolicy.enforceCallingPermission(Manifest.permission.INJECT_EVENTS,
+ "injectInputEventToInputFilter");
synchronized (mLock) {
final long endMillis =
SystemClock.uptimeMillis() + WAIT_INPUT_FILTER_INSTALL_TIMEOUT_MS;
diff --git a/services/accessibility/java/com/android/server/accessibility/ProxyManager.java b/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
index 2032a5021cd9..b4deeb0a6872 100644
--- a/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
@@ -29,12 +29,14 @@ import android.companion.virtual.VirtualDeviceManager;
import android.content.ComponentName;
import android.content.Context;
import android.hardware.display.DisplayManager;
+import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.ArraySet;
import android.util.IntArray;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseIntArray;
@@ -66,8 +68,8 @@ import java.util.function.Consumer;
* TODO(241117292): Remove or cut down during simultaneous user refactoring.
*/
public class ProxyManager {
- private static final boolean DEBUG = false;
private static final String LOG_TAG = "ProxyManager";
+ private static final boolean DEBUG = Log.isLoggable(LOG_TAG, Log.DEBUG) && Build.IS_DEBUGGABLE;
// Names used to populate ComponentName and ResolveInfo in connection.mA11yServiceInfo and in
// the infos of connection.setInstalledAndEnabledServices
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
index e3797c98bebe..f55ecb05c55f 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
@@ -916,18 +916,27 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
&& event.getPointerCount() == 2;
mHandler.removeMessages(MESSAGE_TRANSITION_TO_DELEGATING_STATE);
- if (isActivated() && event.getPointerCount() == 2) {
- storePointerDownLocation(mSecondPointerDownLocation, event);
- mHandler.sendEmptyMessageDelayed(MESSAGE_TRANSITION_TO_PANNINGSCALING_STATE,
- ViewConfiguration.getTapTimeout());
- } else if (mIsTwoFingerCountReached) {
- // Placing two-finger triple-taps behind isActivated to avoid
- // blocking panning scaling state
+ if (event.getPointerCount() == 2) {
if (isMultiFingerMultiTapTriggered(/* targetTapCount= */ 2, event)) {
// 3tap and hold
afterLongTapTimeoutTransitionToDraggingState(event);
} else {
- afterMultiTapTimeoutTransitionToDelegatingState();
+ if (mDetectTwoFingerTripleTap) {
+ // If mDetectTwoFingerTripleTap, delay transition to the delegating
+ // state for mMultiTapMaxDelay to ensure reachability of
+ // multi finger multi tap
+ afterMultiTapTimeoutTransitionToDelegatingState();
+ }
+
+ if (isActivated()) {
+ // If activated, delay transition to the panning scaling
+ // state for tap timeout to ensure reachability of
+ // multi finger multi tap
+ storePointerDownLocation(mSecondPointerDownLocation, event);
+ mHandler.sendEmptyMessageDelayed(
+ MESSAGE_TRANSITION_TO_PANNINGSCALING_STATE,
+ ViewConfiguration.getTapTimeout());
+ }
}
} else {
transitionToDelegatingStateAndClear();
@@ -953,6 +962,9 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
// (which is a rare combo to be used aside from magnification)
if (isMultiTapTriggered(2 /* taps */) && event.getPointerCount() == 1) {
transitionToViewportDraggingStateAndClear(event);
+ } else if (isMultiFingerMultiTapTriggered(/* targetTapCount= */ 2, event)
+ && event.getPointerCount() == 2) {
+ transitionToViewportDraggingStateAndClear(event);
} else if (isActivated() && event.getPointerCount() == 2) {
if (mIsSinglePanningEnabled
&& overscrollState(event, mFirstPointerDownLocation)
@@ -961,11 +973,6 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
}
//Primary pointer is swiping, so transit to PanningScalingState
transitToPanningScalingStateAndClear();
- } else if (isMultiFingerMultiTapTriggered(/* targetTapCount= */ 2, event)
- && event.getPointerCount() == 2) {
- // Placing two-finger triple-taps behind isActivated to avoid
- // blocking panning scaling state
- transitionToViewportDraggingStateAndClear(event);
} else if (mIsSinglePanningEnabled
&& isActivated()
&& event.getPointerCount() == 1) {
@@ -979,8 +986,11 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
}
} else if (isActivated() && pointerDownValid(mSecondPointerDownLocation)
&& distanceClosestPointerToPoint(
- mSecondPointerDownLocation, /* move */ event) > mSwipeMinDistance) {
- //Second pointer is swiping, so transit to PanningScalingState
+ mSecondPointerDownLocation, /* move */ event) > mSwipeMinDistance
+ // If mCompleteTapCount is not zero, it means that it is a multi tap
+ // gesture. So, we should not transit to the PanningScalingState.
+ && mCompletedTapCount == 0) {
+ // Second pointer is swiping, so transit to PanningScalingState
transitToPanningScalingStateAndClear();
}
}
@@ -988,6 +998,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
case ACTION_UP: {
mHandler.removeMessages(MESSAGE_ON_TRIPLE_TAP_AND_HOLD);
+ mHandler.removeMessages(MESSAGE_TRANSITION_TO_PANNINGSCALING_STATE);
if (!mFullScreenMagnificationController.magnificationRegionContains(
mDisplayId, event.getX(), event.getY())) {
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionManager.java
index 3ea805bbb4a6..5a3c070819bd 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionManager.java
@@ -60,19 +60,19 @@ import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
/**
- * A class to manipulate window magnification through {@link MagnificationConnectionWrapper}
+ * A class to manipulate magnification through {@link MagnificationConnectionWrapper}
* create by {@link #setConnection(IWindowMagnificationConnection)}. To set the connection with
* SysUI, call {@code StatusBarManagerInternal#requestWindowMagnificationConnection(boolean)}.
* The applied magnification scale is constrained by
* {@link MagnificationScaleProvider#constrainScale(float)}
*/
-public class WindowMagnificationManager implements
+public class MagnificationConnectionManager implements
PanningScalingHandler.MagnificationDelegate,
WindowManagerInternal.AccessibilityControllerInternal.UiChangesForAccessibilityCallbacks {
private static final boolean DBG = false;
- private static final String TAG = "WindowMagnificationMgr";
+ private static final String TAG = "MagnificationConnectionManager";
/**
* Indicate that the magnification window is at the magnification center.
@@ -208,7 +208,7 @@ public class WindowMagnificationManager implements
private final AccessibilityTraceManager mTrace;
private final MagnificationScaleProvider mScaleProvider;
- public WindowMagnificationManager(Context context, Object lock, @NonNull Callback callback,
+ public MagnificationConnectionManager(Context context, Object lock, @NonNull Callback callback,
AccessibilityTraceManager trace, MagnificationScaleProvider scaleProvider) {
mContext = context;
mLock = lock;
@@ -1040,7 +1040,7 @@ public class WindowMagnificationManager implements
private float mScale = MagnificationScaleProvider.MIN_SCALE;
private boolean mEnabled;
- private final WindowMagnificationManager mWindowMagnificationManager;
+ private final MagnificationConnectionManager mMagnificationConnectionManager;
// Records the bounds of window magnification.
private final Rect mBounds = new Rect();
// The magnified bounds on the screen.
@@ -1058,11 +1058,15 @@ public class WindowMagnificationManager implements
"mTrackingTypingFocusSumTime");
private volatile long mTrackingTypingFocusSumTime = 0;
- WindowMagnifier(int displayId, WindowMagnificationManager windowMagnificationManager) {
+ WindowMagnifier(int displayId,
+ MagnificationConnectionManager magnificationConnectionManager) {
mDisplayId = displayId;
- mWindowMagnificationManager = windowMagnificationManager;
+ mMagnificationConnectionManager = magnificationConnectionManager;
}
+ // TODO(b/312324808): Investigating whether
+ // mMagnificationConnectionManager#enableWindowMagnificationInternal requires a sync lock
+ @SuppressWarnings("GuardedBy")
boolean enableWindowMagnificationInternal(float scale, float centerX, float centerY,
@Nullable MagnificationAnimationCallback animationCallback,
@WindowPosition int windowPosition, int id) {
@@ -1072,8 +1076,8 @@ public class WindowMagnificationManager implements
}
final float normScale = MagnificationScaleProvider.constrainScale(scale);
setMagnificationFrameOffsetRatioByWindowPosition(windowPosition);
- if (mWindowMagnificationManager.enableWindowMagnificationInternal(mDisplayId, normScale,
- centerX, centerY, mMagnificationFrameOffsetRatio.x,
+ if (mMagnificationConnectionManager.enableWindowMagnificationInternal(mDisplayId,
+ normScale, centerX, centerY, mMagnificationFrameOffsetRatio.x,
mMagnificationFrameOffsetRatio.y, animationCallback)) {
mScale = normScale;
mEnabled = true;
@@ -1096,12 +1100,15 @@ public class WindowMagnificationManager implements
}
}
+ // TODO(b/312324808): Investigating whether
+ // mMagnificationConnectionManager#disableWindowMagnificationInternal requires a sync lock
+ @SuppressWarnings("GuardedBy")
boolean disableWindowMagnificationInternal(
@Nullable MagnificationAnimationCallback animationResultCallback) {
if (!mEnabled) {
return false;
}
- if (mWindowMagnificationManager.disableWindowMagnificationInternal(
+ if (mMagnificationConnectionManager.disableWindowMagnificationInternal(
mDisplayId, animationResultCallback)) {
mEnabled = false;
mIdOfLastServiceToControl = INVALID_SERVICE_ID;
@@ -1112,6 +1119,10 @@ public class WindowMagnificationManager implements
return false;
}
+ // ErrorProne says the access of mMagnificationConnectionManager#setScaleInternal should
+ // be guarded by 'this.mMagnificationConnectionManager.mLock' which is the same one as
+ // 'mLock'. Therefore, we'll put @SuppressWarnings here.
+ @SuppressWarnings("GuardedBy")
@GuardedBy("mLock")
void setScale(float scale) {
if (!mEnabled) {
@@ -1119,7 +1130,8 @@ public class WindowMagnificationManager implements
}
final float normScale = MagnificationScaleProvider.constrainScale(scale);
if (Float.compare(mScale, normScale) != 0
- && mWindowMagnificationManager.setScaleInternal(mDisplayId, scale)) {
+ && mMagnificationConnectionManager
+ .setScaleForWindowMagnificationInternal(mDisplayId, scale)) {
mScale = normScale;
}
}
@@ -1159,8 +1171,8 @@ public class WindowMagnificationManager implements
}
void setTrackingTypingFocusEnabled(boolean trackingTypingFocusEnabled) {
- if (mWindowMagnificationManager.isWindowMagnifierEnabled(mDisplayId)
- && mWindowMagnificationManager.isImeVisible(mDisplayId)
+ if (mMagnificationConnectionManager.isWindowMagnifierEnabled(mDisplayId)
+ && mMagnificationConnectionManager.isImeVisible(mDisplayId)
&& trackingTypingFocusEnabled) {
startTrackingTypingFocusRecord();
}
@@ -1206,7 +1218,7 @@ public class WindowMagnificationManager implements
Slog.d(TAG, "stop and log: session duration = " + duration
+ ", elapsed = " + elapsed);
}
- mWindowMagnificationManager.logTrackingTypingFocus(duration);
+ mMagnificationConnectionManager.logTrackingTypingFocus(duration);
mTrackingTypingFocusStartTime = 0;
mTrackingTypingFocusSumTime = 0;
}
@@ -1216,9 +1228,14 @@ public class WindowMagnificationManager implements
return mEnabled;
}
+ // ErrorProne says the access of mMagnificationConnectionManager#moveWindowMagnifierInternal
+ // should be guarded by 'this.mMagnificationConnectionManager.mLock' which is the same one
+ // as 'mLock'. Therefore, we'll put @SuppressWarnings here.
+ @SuppressWarnings("GuardedBy")
@GuardedBy("mLock")
void move(float offsetX, float offsetY) {
- mWindowMagnificationManager.moveWindowMagnifierInternal(mDisplayId, offsetX, offsetY);
+ mMagnificationConnectionManager.moveWindowMagnifierInternal(
+ mDisplayId, offsetX, offsetY);
}
@GuardedBy("mLock")
@@ -1270,8 +1287,10 @@ public class WindowMagnificationManager implements
animationCallback);
}
- private boolean setScaleInternal(int displayId, float scale) {
- return mConnectionWrapper != null && mConnectionWrapper.setScale(displayId, scale);
+ @GuardedBy("mLock")
+ private boolean setScaleForWindowMagnificationInternal(int displayId, float scale) {
+ return mConnectionWrapper != null
+ && mConnectionWrapper.setScaleForWindowMagnification(displayId, scale);
}
@GuardedBy("mLock")
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionWrapper.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionWrapper.java
index f0c44d64f5ec..20538f167656 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionWrapper.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionWrapper.java
@@ -82,16 +82,16 @@ class MagnificationConnectionWrapper {
return true;
}
- boolean setScale(int displayId, float scale) {
+ boolean setScaleForWindowMagnification(int displayId, float scale) {
if (mTrace.isA11yTracingEnabledForTypes(FLAGS_WINDOW_MAGNIFICATION_CONNECTION)) {
mTrace.logTrace(TAG + ".setScale", FLAGS_WINDOW_MAGNIFICATION_CONNECTION,
"displayId=" + displayId + ";scale=" + scale);
}
try {
- mConnection.setScale(displayId, scale);
+ mConnection.setScaleForWindowMagnification(displayId, scale);
} catch (RemoteException e) {
if (DBG) {
- Slog.e(TAG, "Error calling setScale()", e);
+ Slog.e(TAG, "Error calling setScaleForWindowMagnification()", e);
}
return false;
}
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
index effd8732d086..52e123a5e70c 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
@@ -77,7 +77,7 @@ import java.util.concurrent.Executor;
* <b>Note</b> Updates magnification switch UI when magnification mode transition
* is done and before invoking {@link TransitionCallBack#onResult}.
*/
-public class MagnificationController implements WindowMagnificationManager.Callback,
+public class MagnificationController implements MagnificationConnectionManager.Callback,
MagnificationGestureHandler.Callback,
FullScreenMagnificationController.MagnificationInfoChangedCallback,
WindowManagerInternal.AccessibilityControllerInternal.UiChangesForAccessibilityCallbacks {
@@ -96,7 +96,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb
private final AlwaysOnMagnificationFeatureFlag mAlwaysOnMagnificationFeatureFlag;
private final MagnificationScaleProvider mScaleProvider;
private FullScreenMagnificationController mFullScreenMagnificationController;
- private WindowMagnificationManager mWindowMagnificationMgr;
+ private MagnificationConnectionManager mMagnificationConnectionManager;
private int mMagnificationCapabilities = ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;
/** Whether the platform supports window magnification feature. */
private final boolean mSupportWindowMagnification;
@@ -164,11 +164,11 @@ public class MagnificationController implements WindowMagnificationManager.Callb
@VisibleForTesting
public MagnificationController(AccessibilityManagerService ams, Object lock,
Context context, FullScreenMagnificationController fullScreenMagnificationController,
- WindowMagnificationManager windowMagnificationManager,
+ MagnificationConnectionManager magnificationConnectionManager,
MagnificationScaleProvider scaleProvider, Executor backgroundExecutor) {
this(ams, lock, context, scaleProvider, backgroundExecutor);
mFullScreenMagnificationController = fullScreenMagnificationController;
- mWindowMagnificationMgr = windowMagnificationManager;
+ mMagnificationConnectionManager = magnificationConnectionManager;
}
@Override
@@ -179,10 +179,10 @@ public class MagnificationController implements WindowMagnificationManager.Callb
if (updatePersistence) {
getFullScreenMagnificationController().persistScale(displayId);
}
- } else if (getWindowMagnificationMgr().isWindowMagnifierEnabled(displayId)) {
- getWindowMagnificationMgr().setScale(displayId, scale);
+ } else if (getMagnificationConnectionManager().isWindowMagnifierEnabled(displayId)) {
+ getMagnificationConnectionManager().setScale(displayId, scale);
if (updatePersistence) {
- getWindowMagnificationMgr().persistScale(displayId);
+ getMagnificationConnectionManager().persistScale(displayId);
}
}
}
@@ -222,15 +222,15 @@ public class MagnificationController implements WindowMagnificationManager.Callb
}
if (showModeSwitchButton) {
- getWindowMagnificationMgr().showMagnificationButton(displayId, mode);
+ getMagnificationConnectionManager().showMagnificationButton(displayId, mode);
} else {
- getWindowMagnificationMgr().removeMagnificationButton(displayId);
+ getMagnificationConnectionManager().removeMagnificationButton(displayId);
}
if (!enableSettingsPanel) {
// Whether the settings panel needs to be shown is controlled in system UI.
// Here, we only guarantee that the settings panel is closed when it is not needed.
- getWindowMagnificationMgr().removeMagnificationSettingsPanel(displayId);
+ getMagnificationConnectionManager().removeMagnificationSettingsPanel(displayId);
}
}
@@ -284,7 +284,8 @@ public class MagnificationController implements WindowMagnificationManager.Callb
final FullScreenMagnificationController screenMagnificationController =
getFullScreenMagnificationController();
- final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationMgr();
+ final MagnificationConnectionManager magnificationConnectionManager =
+ getMagnificationConnectionManager();
final float scale = getTargetModeScaleFromCurrentMagnification(displayId, targetMode);
final DisableMagnificationCallback animationEndCallback =
new DisableMagnificationCallback(transitionCallBack, displayId, targetMode,
@@ -295,7 +296,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb
if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW) {
screenMagnificationController.reset(displayId, animationEndCallback);
} else {
- windowMagnificationMgr.disableWindowMagnification(displayId, false,
+ magnificationConnectionManager.disableWindowMagnification(displayId, false,
animationEndCallback);
}
}
@@ -340,7 +341,8 @@ public class MagnificationController implements WindowMagnificationManager.Callb
}
final FullScreenMagnificationController screenMagnificationController =
getFullScreenMagnificationController();
- final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationMgr();
+ final MagnificationConnectionManager magnificationConnectionManager =
+ getMagnificationConnectionManager();
final float targetScale = Float.isNaN(config.getScale())
? getTargetModeScaleFromCurrentMagnification(displayId, targetMode)
: config.getScale();
@@ -353,14 +355,15 @@ public class MagnificationController implements WindowMagnificationManager.Callb
if (targetMode == MAGNIFICATION_MODE_WINDOW) {
screenMagnificationController.reset(displayId, false);
if (targetActivated) {
- windowMagnificationMgr.enableWindowMagnification(displayId,
+ magnificationConnectionManager.enableWindowMagnification(displayId,
targetScale, magnificationCenter.x, magnificationCenter.y,
magnificationAnimationCallback, id);
} else {
- windowMagnificationMgr.disableWindowMagnification(displayId, false);
+ magnificationConnectionManager.disableWindowMagnification(displayId, false);
}
} else if (targetMode == MAGNIFICATION_MODE_FULLSCREEN) {
- windowMagnificationMgr.disableWindowMagnification(displayId, false, null);
+ magnificationConnectionManager.disableWindowMagnification(
+ displayId, false, null);
if (targetActivated) {
if (!screenMagnificationController.isRegistered(displayId)) {
screenMagnificationController.register(displayId);
@@ -409,7 +412,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb
if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW) {
return getFullScreenMagnificationController().getScale(displayId);
} else {
- return getWindowMagnificationMgr().getScale(displayId);
+ return getMagnificationConnectionManager().getScale(displayId);
}
}
@@ -441,7 +444,8 @@ public class MagnificationController implements WindowMagnificationManager.Callb
mAccessibilityCallbacksDelegateArray.put(displayId,
getFullScreenMagnificationController());
} else if (mode == ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW) {
- mAccessibilityCallbacksDelegateArray.put(displayId, getWindowMagnificationMgr());
+ mAccessibilityCallbacksDelegateArray.put(
+ displayId, getMagnificationConnectionManager());
} else {
mAccessibilityCallbacksDelegateArray.delete(displayId);
}
@@ -462,13 +466,13 @@ public class MagnificationController implements WindowMagnificationManager.Callb
@Override
public void onRequestMagnificationSpec(int displayId, int serviceId) {
- final WindowMagnificationManager windowMagnificationManager;
+ final MagnificationConnectionManager magnificationConnectionManager;
synchronized (mLock) {
updateMagnificationUIControls(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
- windowMagnificationManager = mWindowMagnificationMgr;
+ magnificationConnectionManager = mMagnificationConnectionManager;
}
- if (windowMagnificationManager != null) {
- mWindowMagnificationMgr.disableWindowMagnification(displayId, false);
+ if (magnificationConnectionManager != null) {
+ mMagnificationConnectionManager.disableWindowMagnification(displayId, false);
}
}
@@ -491,7 +495,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb
setCurrentMagnificationModeAndSwitchDelegate(displayId,
ACCESSIBILITY_MAGNIFICATION_MODE_NONE);
duration = SystemClock.uptimeMillis() - mWindowModeEnabledTimeArray.get(displayId);
- scale = mWindowMagnificationMgr.getLastActivatedScale(displayId);
+ scale = mMagnificationConnectionManager.getLastActivatedScale(displayId);
}
logMagnificationUsageState(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, duration, scale);
}
@@ -507,13 +511,14 @@ public class MagnificationController implements WindowMagnificationManager.Callb
public void onSourceBoundsChanged(int displayId, Rect bounds) {
if (shouldNotifyMagnificationChange(displayId, MAGNIFICATION_MODE_WINDOW)) {
// notify sysui the magnification scale changed on window magnifier
- mWindowMagnificationMgr.onUserMagnificationScaleChanged(
- mUserId, displayId, getWindowMagnificationMgr().getScale(displayId));
+ mMagnificationConnectionManager.onUserMagnificationScaleChanged(
+ mUserId, displayId, getMagnificationConnectionManager().getScale(displayId));
final MagnificationConfig config = new MagnificationConfig.Builder()
.setMode(MAGNIFICATION_MODE_WINDOW)
- .setActivated(getWindowMagnificationMgr().isWindowMagnifierEnabled(displayId))
- .setScale(getWindowMagnificationMgr().getScale(displayId))
+ .setActivated(
+ getMagnificationConnectionManager().isWindowMagnifierEnabled(displayId))
+ .setScale(getMagnificationConnectionManager().getScale(displayId))
.setCenterX(bounds.exactCenterX())
.setCenterY(bounds.exactCenterY()).build();
mAms.notifyMagnificationChanged(displayId, new Region(bounds), config);
@@ -525,7 +530,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb
@NonNull MagnificationConfig config) {
if (shouldNotifyMagnificationChange(displayId, MAGNIFICATION_MODE_FULLSCREEN)) {
// notify sysui the magnification scale changed on fullscreen magnifier
- mWindowMagnificationMgr.onUserMagnificationScaleChanged(
+ mMagnificationConnectionManager.onUserMagnificationScaleChanged(
mUserId, displayId, config.getScale());
mAms.notifyMagnificationChanged(displayId, region, config);
@@ -548,8 +553,8 @@ public class MagnificationController implements WindowMagnificationManager.Callb
synchronized (mLock) {
final boolean fullScreenActivated = mFullScreenMagnificationController != null
&& mFullScreenMagnificationController.isActivated(displayId);
- final boolean windowEnabled = mWindowMagnificationMgr != null
- && mWindowMagnificationMgr.isWindowMagnifierEnabled(displayId);
+ final boolean windowEnabled = mMagnificationConnectionManager != null
+ && mMagnificationConnectionManager.isWindowMagnifierEnabled(displayId);
final Integer transitionMode = mTransitionModes.get(displayId);
if (((changeMode == MAGNIFICATION_MODE_FULLSCREEN && fullScreenActivated)
|| (changeMode == MAGNIFICATION_MODE_WINDOW && windowEnabled))
@@ -608,10 +613,10 @@ public class MagnificationController implements WindowMagnificationManager.Callb
}
private void disableWindowMagnificationIfNeeded(int displayId) {
- final WindowMagnificationManager windowMagnificationManager =
- getWindowMagnificationMgr();
+ final MagnificationConnectionManager magnificationConnectionManager =
+ getMagnificationConnectionManager();
if (isActivated(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW)) {
- windowMagnificationManager.disableWindowMagnification(displayId, false);
+ magnificationConnectionManager.disableWindowMagnification(displayId, false);
}
}
@@ -620,7 +625,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb
synchronized (mLock) {
mIsImeVisibleArray.put(displayId, shown);
}
- getWindowMagnificationMgr().onImeWindowVisibilityChanged(displayId, shown);
+ getMagnificationConnectionManager().onImeWindowVisibilityChanged(displayId, shown);
logMagnificationModeWithImeOnIfNeeded(displayId);
}
@@ -661,7 +666,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb
/**
* Updates the active user ID of {@link FullScreenMagnificationController} and {@link
- * WindowMagnificationManager}.
+ * MagnificationConnectionManager}.
*
* @param userId the currently active user ID
*/
@@ -671,10 +676,10 @@ public class MagnificationController implements WindowMagnificationManager.Callb
}
mUserId = userId;
final FullScreenMagnificationController fullMagnificationController;
- final WindowMagnificationManager windowMagnificationManager;
+ final MagnificationConnectionManager magnificationConnectionManager;
synchronized (mLock) {
fullMagnificationController = mFullScreenMagnificationController;
- windowMagnificationManager = mWindowMagnificationMgr;
+ magnificationConnectionManager = mMagnificationConnectionManager;
mAccessibilityCallbacksDelegateArray.clear();
mCurrentMagnificationModeArray.clear();
mLastMagnificationActivatedModeArray.clear();
@@ -685,8 +690,8 @@ public class MagnificationController implements WindowMagnificationManager.Callb
if (fullMagnificationController != null) {
fullMagnificationController.resetAllIfNeeded(false);
}
- if (windowMagnificationManager != null) {
- windowMagnificationManager.disableAllWindowMagnifiers();
+ if (magnificationConnectionManager != null) {
+ magnificationConnectionManager.disableAllWindowMagnifiers();
}
}
@@ -700,8 +705,8 @@ public class MagnificationController implements WindowMagnificationManager.Callb
if (mFullScreenMagnificationController != null) {
mFullScreenMagnificationController.onDisplayRemoved(displayId);
}
- if (mWindowMagnificationMgr != null) {
- mWindowMagnificationMgr.onDisplayRemoved(displayId);
+ if (mMagnificationConnectionManager != null) {
+ mMagnificationConnectionManager.onDisplayRemoved(displayId);
}
mAccessibilityCallbacksDelegateArray.delete(displayId);
mCurrentMagnificationModeArray.delete(displayId);
@@ -728,7 +733,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb
* @param enabled Enable the following typing focus feature
*/
public void setMagnificationFollowTypingEnabled(boolean enabled) {
- getWindowMagnificationMgr().setMagnificationFollowTypingEnabled(enabled);
+ getMagnificationConnectionManager().setMagnificationFollowTypingEnabled(enabled);
getFullScreenMagnificationController().setMagnificationFollowTypingEnabled(enabled);
}
@@ -805,29 +810,29 @@ public class MagnificationController implements WindowMagnificationManager.Callb
}
/**
- * Getter of {@link WindowMagnificationManager}.
+ * Getter of {@link MagnificationConnectionManager}.
*
- * @return {@link WindowMagnificationManager}.
+ * @return {@link MagnificationConnectionManager}.
*/
- public WindowMagnificationManager getWindowMagnificationMgr() {
+ public MagnificationConnectionManager getMagnificationConnectionManager() {
synchronized (mLock) {
- if (mWindowMagnificationMgr == null) {
- mWindowMagnificationMgr = new WindowMagnificationManager(mContext,
+ if (mMagnificationConnectionManager == null) {
+ mMagnificationConnectionManager = new MagnificationConnectionManager(mContext,
mLock, this, mAms.getTraceManager(),
mScaleProvider);
}
- return mWindowMagnificationMgr;
+ return mMagnificationConnectionManager;
}
}
private @Nullable PointF getCurrentMagnificationCenterLocked(int displayId, int targetMode) {
if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) {
- if (mWindowMagnificationMgr == null
- || !mWindowMagnificationMgr.isWindowMagnifierEnabled(displayId)) {
+ if (mMagnificationConnectionManager == null
+ || !mMagnificationConnectionManager.isWindowMagnifierEnabled(displayId)) {
return null;
}
- mTempPoint.set(mWindowMagnificationMgr.getCenterX(displayId),
- mWindowMagnificationMgr.getCenterY(displayId));
+ mTempPoint.set(mMagnificationConnectionManager.getCenterX(displayId),
+ mMagnificationConnectionManager.getCenterY(displayId));
} else {
if (mFullScreenMagnificationController == null
|| !mFullScreenMagnificationController.isActivated(displayId)) {
@@ -858,10 +863,10 @@ public class MagnificationController implements WindowMagnificationManager.Callb
}
} else if (mode == ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW) {
synchronized (mLock) {
- if (mWindowMagnificationMgr == null) {
+ if (mMagnificationConnectionManager == null) {
return false;
}
- isActivated = mWindowMagnificationMgr.isWindowMagnifierEnabled(displayId);
+ isActivated = mMagnificationConnectionManager.isWindowMagnifierEnabled(displayId);
}
}
return isActivated;
@@ -980,7 +985,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb
mCurrentCenter.x, mCurrentCenter.y, mAnimate,
MAGNIFICATION_GESTURE_HANDLER_ID);
} else {
- getWindowMagnificationMgr().enableWindowMagnification(mDisplayId,
+ getMagnificationConnectionManager().enableWindowMagnification(mDisplayId,
mCurrentScale, mCurrentCenter.x,
mCurrentCenter.y, mAnimate ? STUB_ANIMATION_CALLBACK : null,
MAGNIFICATION_GESTURE_HANDLER_ID);
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationProcessor.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationProcessor.java
index 5cf2a638fa3e..ed8f1ab3a1b2 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationProcessor.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationProcessor.java
@@ -84,13 +84,13 @@ public class MagnificationProcessor {
.setCenterX(fullScreenMagnificationController.getCenterX(displayId))
.setCenterY(fullScreenMagnificationController.getCenterY(displayId));
} else if (mode == MAGNIFICATION_MODE_WINDOW) {
- final WindowMagnificationManager windowMagnificationManager =
- mController.getWindowMagnificationMgr();
+ final MagnificationConnectionManager magnificationConnectionManager =
+ mController.getMagnificationConnectionManager();
builder.setMode(mode)
.setActivated(mController.isActivated(displayId, MAGNIFICATION_MODE_WINDOW))
- .setScale(windowMagnificationManager.getScale(displayId))
- .setCenterX(windowMagnificationManager.getCenterX(displayId))
- .setCenterY(windowMagnificationManager.getCenterY(displayId));
+ .setScale(magnificationConnectionManager.getScale(displayId))
+ .setCenterX(magnificationConnectionManager.getCenterX(displayId))
+ .setCenterY(magnificationConnectionManager.getCenterY(displayId));
} else {
// For undefined mode, set enabled to false
builder.setActivated(false);
@@ -135,12 +135,12 @@ public class MagnificationProcessor {
}
} else if (configMode == MAGNIFICATION_MODE_WINDOW) {
if (configActivated) {
- return mController.getWindowMagnificationMgr().enableWindowMagnification(displayId,
- config.getScale(), config.getCenterX(), config.getCenterY(),
+ return mController.getMagnificationConnectionManager().enableWindowMagnification(
+ displayId, config.getScale(), config.getCenterX(), config.getCenterY(),
animate ? STUB_ANIMATION_CALLBACK : null,
id);
} else {
- return mController.getWindowMagnificationMgr()
+ return mController.getMagnificationConnectionManager()
.disableWindowMagnification(displayId, false);
}
}
@@ -256,7 +256,7 @@ public class MagnificationProcessor {
if (currentMode == MAGNIFICATION_MODE_FULLSCREEN) {
getFullscreenMagnificationRegion(displayId, outRegion, canControlMagnification);
} else if (currentMode == MAGNIFICATION_MODE_WINDOW) {
- mController.getWindowMagnificationMgr().getMagnificationSourceBounds(displayId,
+ mController.getMagnificationConnectionManager().getMagnificationSourceBounds(displayId,
outRegion);
}
}
@@ -297,8 +297,8 @@ public class MagnificationProcessor {
if (mode == MAGNIFICATION_MODE_FULLSCREEN) {
return mController.getFullScreenMagnificationController().reset(displayId, animate);
} else if (mode == MAGNIFICATION_MODE_WINDOW) {
- return mController.getWindowMagnificationMgr().disableWindowMagnification(displayId,
- false, animate ? STUB_ANIMATION_CALLBACK : null);
+ return mController.getMagnificationConnectionManager().disableWindowMagnification(
+ displayId, false, animate ? STUB_ANIMATION_CALLBACK : null);
}
return false;
}
@@ -325,19 +325,20 @@ public class MagnificationProcessor {
*/
public void resetAllIfNeeded(int connectionId) {
mController.getFullScreenMagnificationController().resetAllIfNeeded(connectionId);
- mController.getWindowMagnificationMgr().resetAllIfNeeded(connectionId);
+ mController.getMagnificationConnectionManager().resetAllIfNeeded(connectionId);
}
/**
* {@link FullScreenMagnificationController#isActivated(int)}
- * {@link WindowMagnificationManager#isWindowMagnifierEnabled(int)}
+ * {@link MagnificationConnectionManager#isWindowMagnifierEnabled(int)}
*/
public boolean isMagnifying(int displayId) {
int mode = getControllingMode(displayId);
if (mode == MAGNIFICATION_MODE_FULLSCREEN) {
return mController.getFullScreenMagnificationController().isActivated(displayId);
} else if (mode == MAGNIFICATION_MODE_WINDOW) {
- return mController.getWindowMagnificationMgr().isWindowMagnifierEnabled(displayId);
+ return mController.getMagnificationConnectionManager().isWindowMagnifierEnabled(
+ displayId);
}
return false;
}
@@ -416,22 +417,23 @@ public class MagnificationProcessor {
pw.append(" SupportWindowMagnification="
+ mController.supportWindowMagnification()).println();
pw.append(" WindowMagnificationConnectionState="
- + mController.getWindowMagnificationMgr().getConnectionState()).println();
+ + mController.getMagnificationConnectionManager().getConnectionState()).println();
}
private int getIdOfLastServiceToMagnify(int mode, int displayId) {
return (mode == MAGNIFICATION_MODE_FULLSCREEN)
? mController.getFullScreenMagnificationController()
.getIdOfLastServiceToMagnify(displayId)
- : mController.getWindowMagnificationMgr().getIdOfLastServiceToMagnify(
+ : mController.getMagnificationConnectionManager().getIdOfLastServiceToMagnify(
displayId);
}
private void dumpTrackingTypingFocusEnabledState(final PrintWriter pw, int displayId,
int mode) {
if (mode == MAGNIFICATION_MODE_WINDOW) {
- pw.append(" TrackingTypingFocusEnabled=" + mController
- .getWindowMagnificationMgr().isTrackingTypingFocusEnabled(displayId))
+ pw.append(" TrackingTypingFocusEnabled="
+ + mController.getMagnificationConnectionManager()
+ .isTrackingTypingFocusEnabled(displayId))
.println();
}
}
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java
index 94556282d0d3..6b48d2bacf9d 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/PanningScalingHandler.java
@@ -45,6 +45,7 @@ class PanningScalingHandler extends
private static final String TAG = "PanningScalingHandler";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ // TODO(b/312372035): Revisit the scope of usage of the interface
interface MagnificationDelegate {
boolean processScroll(int displayId, float distanceX, float distanceY);
void setScale(int displayId, float scale);
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java
index 36e751181cfd..73c267a6e262 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java
@@ -79,7 +79,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
private static final float MIN_SCALE = 1.0f;
private static final float MAX_SCALE = MagnificationScaleProvider.MAX_SCALE;
- private final WindowMagnificationManager mWindowMagnificationMgr;
+ private final MagnificationConnectionManager mMagnificationConnectionManager;
@VisibleForTesting
final DelegatingState mDelegatingState;
@VisibleForTesting
@@ -101,7 +101,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
private long mTripleTapAndHoldStartedTime = 0;
public WindowMagnificationGestureHandler(@UiContext Context context,
- WindowMagnificationManager windowMagnificationMgr,
+ MagnificationConnectionManager magnificationConnectionManager,
AccessibilityTraceManager trace,
Callback callback,
boolean detectSingleFingerTripleTap,
@@ -115,7 +115,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
"WindowMagnificationGestureHandler() , displayId = " + displayId + ")");
}
mContext = context;
- mWindowMagnificationMgr = windowMagnificationMgr;
+ mMagnificationConnectionManager = magnificationConnectionManager;
mMotionEventDispatcherDelegate = new MotionEventDispatcherDelegate(context,
(event, rawEvent, policyFlags) -> dispatchTransformedEvent(event, rawEvent,
policyFlags));
@@ -128,18 +128,18 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
@Override
public boolean processScroll(int displayId, float distanceX,
float distanceY) {
- return mWindowMagnificationMgr.processScroll(displayId, distanceX,
- distanceY);
+ return mMagnificationConnectionManager.processScroll(
+ displayId, distanceX, distanceY);
}
@Override
public void setScale(int displayId, float scale) {
- mWindowMagnificationMgr.setScale(displayId, scale);
+ mMagnificationConnectionManager.setScale(displayId, scale);
}
@Override
public float getScale(int displayId) {
- return mWindowMagnificationMgr.getScale(displayId);
+ return mMagnificationConnectionManager.getScale(displayId);
}
}));
@@ -167,7 +167,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
Slog.i(mLogTag, "onDestroy(); delayed = "
+ mDetectingState.toString());
}
- mWindowMagnificationMgr.disableWindowMagnification(mDisplayId, true);
+ mMagnificationConnectionManager.disableWindowMagnification(mDisplayId, true);
resetToDetectState();
}
@@ -176,7 +176,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
final Point screenSize = mTempPoint;
getScreenSize(mTempPoint);
toggleMagnification(screenSize.x / 2.0f, screenSize.y / 2.0f,
- WindowMagnificationManager.WINDOW_POSITION_AT_CENTER);
+ MagnificationConnectionManager.WINDOW_POSITION_AT_CENTER);
}
private void getScreenSize(Point outSize) {
@@ -190,28 +190,29 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
}
private void enableWindowMagnifier(float centerX, float centerY,
- @WindowMagnificationManager.WindowPosition int windowPosition) {
+ @MagnificationConnectionManager.WindowPosition int windowPosition) {
if (DEBUG_ALL) {
Slog.i(mLogTag, "enableWindowMagnifier :"
+ centerX + ", " + centerY + ", " + windowPosition);
}
final float scale = MathUtils.constrain(
- mWindowMagnificationMgr.getPersistedScale(mDisplayId), MIN_SCALE, MAX_SCALE);
- mWindowMagnificationMgr.enableWindowMagnification(mDisplayId, scale, centerX, centerY,
- windowPosition);
+ mMagnificationConnectionManager.getPersistedScale(mDisplayId),
+ MIN_SCALE, MAX_SCALE);
+ mMagnificationConnectionManager.enableWindowMagnification(
+ mDisplayId, scale, centerX, centerY, windowPosition);
}
private void disableWindowMagnifier() {
if (DEBUG_ALL) {
Slog.i(mLogTag, "disableWindowMagnifier()");
}
- mWindowMagnificationMgr.disableWindowMagnification(mDisplayId, false);
+ mMagnificationConnectionManager.disableWindowMagnification(mDisplayId, false);
}
private void toggleMagnification(float centerX, float centerY,
- @WindowMagnificationManager.WindowPosition int windowPosition) {
- if (mWindowMagnificationMgr.isWindowMagnifierEnabled(mDisplayId)) {
+ @MagnificationConnectionManager.WindowPosition int windowPosition) {
+ if (mMagnificationConnectionManager.isWindowMagnifierEnabled(mDisplayId)) {
disableWindowMagnifier();
} else {
enableWindowMagnifier(centerX, centerY, windowPosition);
@@ -223,7 +224,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
Slog.i(mLogTag, "onTripleTap()");
}
toggleMagnification(up.getX(), up.getY(),
- WindowMagnificationManager.WINDOW_POSITION_AT_CENTER);
+ MagnificationConnectionManager.WINDOW_POSITION_AT_CENTER);
}
@VisibleForTesting
@@ -232,9 +233,9 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
Slog.i(mLogTag, "onTripleTapAndHold()");
}
mViewportDraggingState.mEnabledBeforeDrag =
- mWindowMagnificationMgr.isWindowMagnifierEnabled(mDisplayId);
+ mMagnificationConnectionManager.isWindowMagnifierEnabled(mDisplayId);
enableWindowMagnifier(up.getX(), up.getY(),
- WindowMagnificationManager.WINDOW_POSITION_AT_TOP_LEFT);
+ MagnificationConnectionManager.WINDOW_POSITION_AT_TOP_LEFT);
mTripleTapAndHoldStartedTime = SystemClock.uptimeMillis();
transitionTo(mViewportDraggingState);
}
@@ -242,7 +243,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
@VisibleForTesting
void releaseTripleTapAndHold() {
if (!mViewportDraggingState.mEnabledBeforeDrag) {
- mWindowMagnificationMgr.disableWindowMagnification(mDisplayId, true);
+ mMagnificationConnectionManager.disableWindowMagnification(mDisplayId, true);
}
transitionTo(mDetectingState);
if (mTripleTapAndHoldStartedTime != 0) {
@@ -331,7 +332,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
@Override
public void onExit() {
mPanningScalingHandler.setEnabled(false);
- mWindowMagnificationMgr.persistScale(mDisplayId);
+ mMagnificationConnectionManager.persistScale(mDisplayId);
clear();
}
@@ -404,7 +405,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
if (!Float.isNaN(mLastX) && !Float.isNaN(mLastY)) {
float offsetX = event.getX() - mLastX;
float offsetY = event.getY() - mLastY;
- mWindowMagnificationMgr.moveWindowMagnification(mDisplayId, offsetX,
+ mMagnificationConnectionManager.moveWindowMagnification(mDisplayId, offsetX,
offsetY);
}
mLastX = event.getX();
@@ -522,7 +523,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
@Override
public boolean shouldStopDetection(MotionEvent motionEvent) {
- return !mWindowMagnificationMgr.isWindowMagnifierEnabled(mDisplayId)
+ return !mMagnificationConnectionManager.isWindowMagnifierEnabled(mDisplayId)
&& !mDetectSingleFingerTripleTap
&& !(mDetectTwoFingerTripleTap
&& Flags.enableMagnificationMultipleFingerMultipleTapGesture());
@@ -540,7 +541,8 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
"onGestureDetected : delayedEventQueue = " + delayedEventQueue);
}
if (gestureId == MagnificationGestureMatcher.GESTURE_TWO_FINGERS_DOWN_OR_SWIPE
- && mWindowMagnificationMgr.pointersInWindow(mDisplayId, motionEvent) > 0) {
+ && mMagnificationConnectionManager
+ .pointersInWindow(mDisplayId, motionEvent) > 0) {
transitionTo(mObservePanningScalingState);
} else if (gestureId == MagnificationGestureMatcher.GESTURE_TRIPLE_TAP) {
onTripleTap(motionEvent);
@@ -584,7 +586,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
+ ", mMagnifiedInteractionState=" + mObservePanningScalingState
+ ", mCurrentState=" + State.nameOf(mCurrentState)
+ ", mPreviousState=" + State.nameOf(mPreviousState)
- + ", mWindowMagnificationMgr=" + mWindowMagnificationMgr
+ + ", mMagnificationConnectionManager=" + mMagnificationConnectionManager
+ ", mDisplayId=" + mDisplayId
+ '}';
}
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index 96a873ecc217..316a16d9934c 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -32,7 +32,6 @@ import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
import android.annotation.Nullable;
import android.app.ApplicationThreadConstants;
import android.app.IBackupAgent;
-import android.app.backup.BackupAnnotations;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.BackupManagerMonitor;
@@ -183,8 +182,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
mUserId = 0;
mBackupEligibilityRules = null;
this.backupManagerService = backupManagerService;
- mBackupManagerMonitorEventSender =
- new BackupManagerMonitorEventSender(/*monitor*/null);
+ mBackupManagerMonitorEventSender = new BackupManagerMonitorEventSender(/* monitor= */ null);
}
// This task can assume that the wakelock is properly held for it and doesn't have to worry
@@ -212,8 +210,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
mTransportConnection = transportConnection;
mObserver = observer;
- mBackupManagerMonitorEventSender =
- new BackupManagerMonitorEventSender(monitor);
+ mBackupManagerMonitorEventSender = new BackupManagerMonitorEventSender(monitor);
mToken = restoreSetToken;
mPmToken = pmToken;
mTargetPackage = targetPackage;
@@ -221,9 +218,10 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
mFinished = false;
mDidLaunch = false;
mListener = listener;
- mAgentTimeoutParameters = Objects.requireNonNull(
- backupManagerService.getAgentTimeoutParameters(),
- "Timeout parameters cannot be null");
+ mAgentTimeoutParameters =
+ Objects.requireNonNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
mBackupEligibilityRules = backupEligibilityRules;
if (targetPackage != null) {
@@ -236,7 +234,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// We want everything and a pony
List<PackageInfo> apps =
PackageManagerBackupAgent.getStorableApplications(
- backupManagerService.getPackageManager(), mUserId,
+ backupManagerService.getPackageManager(),
+ mUserId,
backupEligibilityRules);
filterSet = packagesToNames(apps);
if (DEBUG) {
@@ -264,11 +263,11 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
continue;
}
-
ApplicationInfo applicationInfo = info.applicationInfo;
if (backupEligibilityRules.appIsEligibleForBackup(applicationInfo)) {
if (Flags.enableSkippingRestoreLaunchedApps()
- && !backupEligibilityRules.isAppEligibleForRestore(applicationInfo)) {
+ && !backupEligibilityRules.isAppEligibleForRestore(
+ applicationInfo)) {
continue;
}
@@ -280,16 +279,21 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
}
if (hasSystem) {
try {
- mAcceptSet.add(0, backupManagerService.getPackageManager().getPackageInfoAsUser(
- PLATFORM_PACKAGE_NAME, 0, mUserId));
+ mAcceptSet.add(
+ 0,
+ backupManagerService
+ .getPackageManager()
+ .getPackageInfoAsUser(PLATFORM_PACKAGE_NAME, 0, mUserId));
} catch (NameNotFoundException e) {
// won't happen; we know a priori that it's valid
}
}
if (hasSettings) {
try {
- mAcceptSet.add(backupManagerService.getPackageManager().getPackageInfoAsUser(
- SETTINGS_PACKAGE, 0, mUserId));
+ mAcceptSet.add(
+ backupManagerService
+ .getPackageManager()
+ .getPackageInfoAsUser(SETTINGS_PACKAGE, 0, mUserId));
} catch (NameNotFoundException e) {
// this one is always valid too
}
@@ -402,15 +406,15 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// If we're starting a full-system restore, set up to begin widget ID remapping
if (mIsSystemRestore) {
AppWidgetBackupBridge.systemRestoreStarting(mUserId);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_START_SYSTEM_RESTORE,
null,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
} else {
- //We are either performing RestoreAtInstall or Bmgr.
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ // We are either performing RestoreAtInstall or Bmgr.
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_START_RESTORE_AT_INSTALL,
null,
@@ -443,7 +447,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
mStatus = transport.startRestore(mToken, packages);
if (mStatus != BackupTransport.TRANSPORT_OK) {
Slog.e(TAG, "Transport error " + mStatus + "; no restore possible");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_ERROR_DURING_START_RESTORE,
mCurrentPackage,
@@ -457,7 +461,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
RestoreDescription desc = transport.nextRestorePackage();
if (desc == null) {
Slog.e(TAG, "No restore metadata available; halting");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_NO_RESTORE_METADATA_AVAILABLE,
mCurrentPackage,
@@ -467,11 +471,9 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
executeNextState(UnifiedRestoreState.FINAL);
return;
}
- if (!PACKAGE_MANAGER_SENTINEL.equals(
- desc.getPackageName())) {
- Slog.e(TAG, "Required package metadata but got "
- + desc.getPackageName());
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ if (!PACKAGE_MANAGER_SENTINEL.equals(desc.getPackageName())) {
+ Slog.e(TAG, "Required package metadata but got " + desc.getPackageName());
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_NO_PM_METADATA_RECEIVED,
mCurrentPackage,
@@ -500,26 +502,27 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// message and jump straight to the FINAL state. Because this was
// synchronous we also know that we should cancel the pending timeout
// message.
- backupManagerService.getBackupHandler().removeMessages(
- MSG_RESTORE_OPERATION_TIMEOUT);
+ backupManagerService.getBackupHandler().removeMessages(MSG_RESTORE_OPERATION_TIMEOUT);
// Verify that the backup set includes metadata. If not, we can't do
// signature/version verification etc, so we simply do not proceed with
// the restore operation.
if (!mPmAgent.hasMetadata()) {
Slog.e(TAG, "PM agent has no metadata, so not restoring");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_PM_AGENT_HAS_NO_METADATA,
mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE,
PACKAGE_MANAGER_SENTINEL,
"Package manager restore metadata missing");
mStatus = BackupTransport.TRANSPORT_ERROR;
- backupManagerService.getBackupHandler().removeMessages(
- MSG_BACKUP_RESTORE_STEP, this);
+ backupManagerService
+ .getBackupHandler()
+ .removeMessages(MSG_BACKUP_RESTORE_STEP, this);
executeNextState(UnifiedRestoreState.FINAL);
return;
}
@@ -530,15 +533,14 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
} catch (Exception e) {
// If we lost the transport at any time, halt
Slog.e(TAG, "Unable to contact transport for restore: " + e.getMessage());
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_LOST_TRANSPORT,
null,
BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT,
monitoringExtras);
mStatus = BackupTransport.TRANSPORT_ERROR;
- backupManagerService.getBackupHandler().removeMessages(
- MSG_BACKUP_RESTORE_STEP, this);
+ backupManagerService.getBackupHandler().removeMessages(MSG_BACKUP_RESTORE_STEP, this);
executeNextState(UnifiedRestoreState.FINAL);
return;
}
@@ -553,10 +555,10 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
mTransportConnection.connectOrThrow(
"PerformUnifiedRestoreTask.dispatchNextRestore()");
mRestoreDescription = transport.nextRestorePackage();
- final String pkgName = (mRestoreDescription != null)
- ? mRestoreDescription.getPackageName() : null;
+ final String pkgName =
+ (mRestoreDescription != null) ? mRestoreDescription.getPackageName() : null;
if (pkgName == null) {
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_CANNOT_GET_NEXT_PKG_NAME,
null,
@@ -586,23 +588,26 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
if (metaInfo == null) {
PackageInfo pkgInfo = new PackageInfo();
pkgInfo.packageName = pkgName;
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_PM_AGENT_HAS_NO_METADATA,
pkgInfo,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
Slog.e(TAG, "No metadata for " + pkgName);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, pkgName,
- "Package metadata missing");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, pkgName, "Package metadata missing");
nextState = UnifiedRestoreState.RUNNING_QUEUE;
return;
}
try {
- mCurrentPackage = backupManagerService.getPackageManager().getPackageInfoAsUser(
- pkgName, PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ mCurrentPackage =
+ backupManagerService
+ .getPackageManager()
+ .getPackageInfoAsUser(
+ pkgName, PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_START_PACKAGE_RESTORE,
mCurrentPackage,
@@ -613,14 +618,14 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// Whoops, we thought we could restore this package but it
// turns out not to be present. Skip it.
Slog.e(TAG, "Package not present: " + pkgName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_NOT_PRESENT,
mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, pkgName,
- "Package missing on device");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, pkgName, "Package missing on device");
nextState = UnifiedRestoreState.RUNNING_QUEUE;
return;
}
@@ -630,40 +635,53 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// installed. If the app has not declared that it is prepared to
// handle this case, we do not attempt the restore.
if ((mCurrentPackage.applicationInfo.flags
- & ApplicationInfo.FLAG_RESTORE_ANY_VERSION) == 0) {
- String message = "Source version " + metaInfo.versionCode
- + " > installed version " + mCurrentPackage.getLongVersionCode();
+ & ApplicationInfo.FLAG_RESTORE_ANY_VERSION)
+ == 0) {
+ String message =
+ "Source version "
+ + metaInfo.versionCode
+ + " > installed version "
+ + mCurrentPackage.getLongVersionCode();
Slog.w(TAG, "Package " + pkgName + ": " + message);
- Bundle monitoringExtras = mBackupManagerMonitorEventSender.putMonitoringExtra(
- null,
- BackupManagerMonitor.EXTRA_LOG_RESTORE_VERSION,
- metaInfo.versionCode);
- monitoringExtras = mBackupManagerMonitorEventSender.putMonitoringExtra(
- monitoringExtras,
- BackupManagerMonitor.EXTRA_LOG_RESTORE_ANYWAY, false);
+ Bundle monitoringExtras =
+ mBackupManagerMonitorEventSender.putMonitoringExtra(
+ null,
+ BackupManagerMonitor.EXTRA_LOG_RESTORE_VERSION,
+ metaInfo.versionCode);
+ monitoringExtras =
+ mBackupManagerMonitorEventSender.putMonitoringExtra(
+ monitoringExtras,
+ BackupManagerMonitor.EXTRA_LOG_RESTORE_ANYWAY,
+ false);
monitoringExtras = addRestoreOperationTypeToEvent(monitoringExtras);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_RESTORE_VERSION_HIGHER,
mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
- pkgName, message);
+ EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, pkgName, message);
nextState = UnifiedRestoreState.RUNNING_QUEUE;
return;
} else {
if (DEBUG) {
- Slog.v(TAG, "Source version " + metaInfo.versionCode
- + " > installed version " + mCurrentPackage.getLongVersionCode()
- + " but restoreAnyVersion");
+ Slog.v(
+ TAG,
+ "Source version "
+ + metaInfo.versionCode
+ + " > installed version "
+ + mCurrentPackage.getLongVersionCode()
+ + " but restoreAnyVersion");
}
- Bundle monitoringExtras = mBackupManagerMonitorEventSender.putMonitoringExtra(
- null,
- BackupManagerMonitor.EXTRA_LOG_RESTORE_VERSION,
- metaInfo.versionCode);
- monitoringExtras = mBackupManagerMonitorEventSender.putMonitoringExtra(
- monitoringExtras,
- BackupManagerMonitor.EXTRA_LOG_RESTORE_ANYWAY, true);
+ Bundle monitoringExtras =
+ mBackupManagerMonitorEventSender.putMonitoringExtra(
+ null,
+ BackupManagerMonitor.EXTRA_LOG_RESTORE_VERSION,
+ metaInfo.versionCode);
+ monitoringExtras =
+ mBackupManagerMonitorEventSender.putMonitoringExtra(
+ monitoringExtras,
+ BackupManagerMonitor.EXTRA_LOG_RESTORE_ANYWAY,
+ true);
monitoringExtras = addRestoreOperationTypeToEvent(monitoringExtras);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_RESTORE_VERSION_HIGHER,
@@ -674,10 +692,15 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
}
if (MORE_DEBUG) {
- Slog.v(TAG, "Package " + pkgName
- + " restore version [" + metaInfo.versionCode
- + "] is compatible with installed version ["
- + mCurrentPackage.getLongVersionCode() + "]");
+ Slog.v(
+ TAG,
+ "Package "
+ + pkgName
+ + " restore version ["
+ + metaInfo.versionCode
+ + "] is compatible with installed version ["
+ + mCurrentPackage.getLongVersionCode()
+ + "]");
}
// Reset per-package preconditions and fire the appropriate next state
@@ -690,19 +713,17 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
} else {
// Unknown restore type; ignore this package and move on
Slog.e(TAG, "Unrecognized restore type " + type);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);;
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_UNKNOWN_RESTORE_TYPE,
mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
nextState = UnifiedRestoreState.RUNNING_QUEUE;
- return;
}
} catch (Exception e) {
- Slog.e(TAG, "Can't get next restore target from transport; halting: "
- + e.getMessage());
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);;
+ Slog.e(TAG, "Can't get next restore target from transport; halting: " + e.getMessage());
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_NO_NEXT_RESTORE_TARGET,
mCurrentPackage,
@@ -710,7 +731,6 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
monitoringExtras);
EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
nextState = UnifiedRestoreState.FINAL;
- return;
} finally {
executeNextState(nextState);
}
@@ -725,21 +745,25 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// Validate some semantic requirements that apply in this way
// only to the key/value restore API flow
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_KV_RESTORE, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_KV_RESTORE,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
- /*monitoringExtras*/ addRestoreOperationTypeToEvent(/*extras*/null));
+ /* extras= */ addRestoreOperationTypeToEvent(/* extras= */ null));
if (mCurrentPackage.applicationInfo.backupAgentName == null
|| "".equals(mCurrentPackage.applicationInfo.backupAgentName)) {
if (MORE_DEBUG) {
- Slog.i(TAG, "Data exists for package " + packageName
- + " but app has no agent; skipping");
+ Slog.i(
+ TAG,
+ "Data exists for package "
+ + packageName
+ + " but app has no agent; skipping");
}
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_APP_HAS_NO_AGENT, mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT, monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
- "Package has no agent");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, packageName, "Package has no agent");
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
return;
}
@@ -748,31 +772,34 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
if (!BackupUtils.signaturesMatch(metaInfo.sigHashes, mCurrentPackage, pmi)) {
Slog.w(TAG, "Signature mismatch restoring " + packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_SIGNATURE_MISMATCH, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_SIGNATURE_MISMATCH,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
- "Signature mismatch");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, packageName, "Signature mismatch");
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
return;
}
// Good to go! Set up and bind the agent...
- mAgent = backupManagerService.bindToAgentSynchronous(
- mCurrentPackage.applicationInfo,
- ApplicationThreadConstants.BACKUP_MODE_RESTORE,
- mBackupEligibilityRules.getBackupDestination());
+ mAgent =
+ backupManagerService.bindToAgentSynchronous(
+ mCurrentPackage.applicationInfo,
+ ApplicationThreadConstants.BACKUP_MODE_RESTORE,
+ mBackupEligibilityRules.getBackupDestination());
if (mAgent == null) {
Slog.w(TAG, "Can't find backup agent for " + packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_CANT_FIND_AGENT, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_CANT_FIND_AGENT,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
- "Restore agent missing");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, packageName, "Restore agent missing");
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
return;
}
@@ -786,9 +813,10 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
++mCount;
} catch (Exception e) {
Slog.e(TAG, "Error when attempting restore: " + e.toString());
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_KV_AGENT_ERROR, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_KV_AGENT_ERROR,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
monitoringExtras);
keyValueAgentErrorCleanup(false);
@@ -820,16 +848,18 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
"PerformUnifiedRestoreTask.initiateOneRestore()");
// Run the transport's restore pass
- stage = ParcelFileDescriptor.open(downloadFile,
- ParcelFileDescriptor.MODE_READ_WRITE |
- ParcelFileDescriptor.MODE_CREATE |
- ParcelFileDescriptor.MODE_TRUNCATE);
+ stage =
+ ParcelFileDescriptor.open(
+ downloadFile,
+ ParcelFileDescriptor.MODE_READ_WRITE
+ | ParcelFileDescriptor.MODE_CREATE
+ | ParcelFileDescriptor.MODE_TRUNCATE);
if (transport.getRestoreData(stage) != BackupTransport.TRANSPORT_OK) {
// Transport-level failure. This failure could be specific to package currently in
// restore.
Slog.e(TAG, "Error getting restore data for " + packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_ERROR_KV_RESTORE,
mCurrentPackage,
@@ -840,7 +870,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
downloadFile.delete();
UnifiedRestoreState nextState =
BackupAndRestoreFeatureFlags
- .getUnifiedRestoreContinueAfterTransportFailureInKvRestore()
+ .getUnifiedRestoreContinueAfterTransportFailureInKvRestore()
? UnifiedRestoreState.RUNNING_QUEUE
: UnifiedRestoreState.FINAL;
executeNextState(nextState);
@@ -852,13 +882,16 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// if appropriate
if (staging) {
stage.close();
- stage = ParcelFileDescriptor.open(downloadFile,
- ParcelFileDescriptor.MODE_READ_ONLY);
+ stage =
+ ParcelFileDescriptor.open(
+ downloadFile, ParcelFileDescriptor.MODE_READ_ONLY);
- mBackupData = ParcelFileDescriptor.open(mBackupDataName,
- ParcelFileDescriptor.MODE_READ_WRITE |
- ParcelFileDescriptor.MODE_CREATE |
- ParcelFileDescriptor.MODE_TRUNCATE);
+ mBackupData =
+ ParcelFileDescriptor.open(
+ mBackupDataName,
+ ParcelFileDescriptor.MODE_READ_WRITE
+ | ParcelFileDescriptor.MODE_CREATE
+ | ParcelFileDescriptor.MODE_TRUNCATE);
BackupDataInput in = new BackupDataInput(stage.getFileDescriptor());
BackupDataOutput out = new BackupDataOutput(mBackupData.getFileDescriptor());
@@ -870,34 +903,40 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// Okay, we have the data. Now have the agent do the restore.
stage.close();
- mBackupData = ParcelFileDescriptor.open(mBackupDataName,
- ParcelFileDescriptor.MODE_READ_ONLY);
+ mBackupData =
+ ParcelFileDescriptor.open(mBackupDataName, ParcelFileDescriptor.MODE_READ_ONLY);
- mNewState = ParcelFileDescriptor.open(mNewStateName,
- ParcelFileDescriptor.MODE_READ_WRITE |
- ParcelFileDescriptor.MODE_CREATE |
- ParcelFileDescriptor.MODE_TRUNCATE);
+ mNewState =
+ ParcelFileDescriptor.open(
+ mNewStateName,
+ ParcelFileDescriptor.MODE_READ_WRITE
+ | ParcelFileDescriptor.MODE_CREATE
+ | ParcelFileDescriptor.MODE_TRUNCATE);
// Kick off the restore, checking for hung agents. The timeout or
// the operationComplete() callback will schedule the next step,
// so we do not do that here.
- long restoreAgentTimeoutMillis = mAgentTimeoutParameters.getRestoreAgentTimeoutMillis(
- app.applicationInfo.uid);
+ long restoreAgentTimeoutMillis =
+ mAgentTimeoutParameters.getRestoreAgentTimeoutMillis(app.applicationInfo.uid);
backupManagerService.prepareOperationTimeout(
mEphemeralOpToken, restoreAgentTimeoutMillis, this, OpType.RESTORE_WAIT);
startedAgentRestore = true;
- mAgent.doRestoreWithExcludedKeys(mBackupData, appVersionCode, mNewState,
- mEphemeralOpToken, backupManagerService.getBackupManagerBinder(),
+ mAgent.doRestoreWithExcludedKeys(
+ mBackupData,
+ appVersionCode,
+ mNewState,
+ mEphemeralOpToken,
+ backupManagerService.getBackupManagerBinder(),
new ArrayList<>(getExcludedKeysForPackage(packageName)));
} catch (Exception e) {
Slog.e(TAG, "Unable to call app for restore: " + packageName, e);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_KV_AGENT_ERROR, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_KV_AGENT_ERROR,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
- packageName, e.toString());
+ EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName, e.toString());
// Clears any pending timeout messages as well.
keyValueAgentErrorCleanup(startedAgentRestore);
@@ -915,8 +954,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// 2. Widget metadata needs to be separated from the rest to be handled separately
// But 'android' package doesn't contain widget metadata so we want to skip staging for it
// when there are no keys to be excluded either.
- return !packageName.equals(PLATFORM_PACKAGE_NAME) ||
- !getExcludedKeysForPackage(PLATFORM_PACKAGE_NAME).isEmpty();
+ return !packageName.equals(PLATFORM_PACKAGE_NAME)
+ || !getExcludedKeysForPackage(PLATFORM_PACKAGE_NAME).isEmpty();
}
@VisibleForTesting
@@ -970,14 +1009,16 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// When finished, StreamFeederThread executes next state as appropriate on the
// backup looper, and the overall unified restore task resumes
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
- /*monitoringExtras*/ addRestoreOperationTypeToEvent(/*extras*/null));
+ /* extras= */ addRestoreOperationTypeToEvent(/* extras= */ null));
try {
StreamFeederThread feeder = new StreamFeederThread();
if (MORE_DEBUG) {
- Slog.i(TAG, "Spinning threads for stream restore of "
- + mCurrentPackage.packageName);
+ Slog.i(
+ TAG,
+ "Spinning threads for stream restore of " + mCurrentPackage.packageName);
}
new Thread(feeder, "unified-stream-feeder").start();
@@ -988,9 +1029,10 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// current target. We haven't asked the transport for data yet, though,
// so we can do that simply by going back to running the restore queue.
Slog.e(TAG, "Unable to construct pipes for stream restore!");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_NO_FEEDER_THREAD, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_NO_FEEDER_THREAD,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
@@ -1005,24 +1047,24 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
try {
long restoreAgentFinishedTimeoutMillis =
mAgentTimeoutParameters.getRestoreAgentFinishedTimeoutMillis();
- backupManagerService
- .prepareOperationTimeout(mEphemeralOpToken,
- restoreAgentFinishedTimeoutMillis, this,
- OpType.RESTORE_WAIT);
- mAgent.doRestoreFinished(mEphemeralOpToken,
- backupManagerService.getBackupManagerBinder());
+ backupManagerService.prepareOperationTimeout(
+ mEphemeralOpToken,
+ restoreAgentFinishedTimeoutMillis,
+ this,
+ OpType.RESTORE_WAIT);
+ mAgent.doRestoreFinished(
+ mEphemeralOpToken, backupManagerService.getBackupManagerBinder());
// If we get this far, the callback or timeout will schedule the
// next restore state, so we're done
} catch (Exception e) {
final String packageName = mCurrentPackage.packageName;
Slog.e(TAG, "Unable to finalize restore of " + packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_AGENT_FAILURE, mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT, monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
- packageName, e.toString());
+ EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName, e.toString());
keyValueAgentErrorCleanup(true);
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
}
@@ -1054,13 +1096,20 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
UnifiedRestoreState nextState = UnifiedRestoreState.RUNNING_QUEUE;
int status = BackupTransport.TRANSPORT_OK;
- EventLog.writeEvent(EventLogTags.FULL_RESTORE_PACKAGE,
- mCurrentPackage.packageName);
+ EventLog.writeEvent(EventLogTags.FULL_RESTORE_PACKAGE, mCurrentPackage.packageName);
- mEngine = new FullRestoreEngine(backupManagerService, mOperationStorage,
- this, null, mBackupManagerMonitorEventSender.getMonitor(),
- mCurrentPackage, false, mEphemeralOpToken, false,
- mBackupEligibilityRules);
+ mEngine =
+ new FullRestoreEngine(
+ backupManagerService,
+ mOperationStorage,
+ /* monitorTask= */ this,
+ /* observer= */ null,
+ mBackupManagerMonitorEventSender.getMonitor(),
+ mCurrentPackage,
+ /* allowApks= */ false,
+ mEphemeralOpToken,
+ /* isAdbRestore= */ false,
+ mBackupEligibilityRules);
mEngineThread = new FullRestoreEngineThread(mEngine, mEnginePipes[0]);
ParcelFileDescriptor eWriteEnd = mEnginePipes[1];
@@ -1077,8 +1126,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
String callerLogString = "PerformUnifiedRestoreTask$StreamFeederThread.run()";
try {
- BackupTransportClient transport = mTransportConnection.connectOrThrow(
- callerLogString);
+ BackupTransportClient transport =
+ mTransportConnection.connectOrThrow(callerLogString);
while (status == BackupTransport.TRANSPORT_OK) {
// have the transport write some of the restoring data to us
int result = transport.getNextFullRestoreDataChunk(tWriteEnd);
@@ -1104,17 +1153,24 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
} else if (result == BackupTransport.NO_MORE_DATA) {
// Clean finish. Wind up and we're done!
if (MORE_DEBUG) {
- Slog.i(TAG, "Got clean full-restore EOF for "
- + mCurrentPackage.packageName);
+ Slog.i(
+ TAG,
+ "Got clean full-restore EOF for "
+ + mCurrentPackage.packageName);
}
status = BackupTransport.TRANSPORT_OK;
break;
} else {
// Transport reported some sort of failure; the fall-through
// handling will deal properly with that.
- Slog.e(TAG, "Error " + result + " streaming restore for "
- + mCurrentPackage.packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Slog.e(
+ TAG,
+ "Error "
+ + result
+ + " streaming restore for "
+ + mCurrentPackage.packageName);
+ Bundle monitoringExtras =
+ addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_ERROR_FULL_RESTORE,
mCurrentPackage,
@@ -1132,21 +1188,23 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// but potentially recoverable; abandon this package's restore but
// carry on with the next restore target.
Slog.e(TAG, "Unable to route data for restore");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_FULL_AGENT_ERROR,
mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
- mCurrentPackage.packageName, "I/O error on pipes");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE,
+ mCurrentPackage.packageName,
+ "I/O error on pipes");
status = BackupTransport.AGENT_ERROR;
} catch (Exception e) {
// The transport threw; terminate the whole operation. Closing
// the sockets will wake up the engine and it will then tidy up the
// remote end.
Slog.e(TAG, "Transport failed during restore: " + e.getMessage());
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_ERROR_FULL_RESTORE,
mCurrentPackage,
@@ -1218,10 +1276,14 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// BackupRestoreTask interface, specifically for timeout handling
@Override
- public void execute() { /* intentionally empty */ }
+ public void execute() {
+ // intentionally empty
+ }
@Override
- public void operationComplete(long result) { /* intentionally empty */ }
+ public void operationComplete(long result) {
+ // intentionally empty
+ }
// The app has timed out handling a restoring file
@Override
@@ -1230,10 +1292,11 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
if (DEBUG) {
Slog.w(TAG, "Full-data restore target timed out; shutting down");
}
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE_TIMEOUT,
- mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
+ mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
monitoringExtras);
mEngineThread.handleTimeout();
@@ -1252,8 +1315,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
String callerLogString = "PerformUnifiedRestoreTask.finalizeRestore()";
try {
- BackupTransportClient transport =
- mTransportConnection.connectOrThrow(callerLogString);
+ BackupTransportClient transport = mTransportConnection.connectOrThrow(callerLogString);
transport.finishRestore();
} catch (Exception e) {
Slog.e(TAG, "Error finishing restore", e);
@@ -1278,17 +1340,21 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
Slog.v(TAG, "finishing PM token " + mPmToken);
}
try {
- backupManagerService.getPackageManagerBinder().finishPackageInstall(mPmToken,
- mDidLaunch);
- } catch (RemoteException e) { /* can't happen */ }
+ backupManagerService
+ .getPackageManagerBinder()
+ .finishPackageInstall(mPmToken, mDidLaunch);
+ } catch (RemoteException e) {
+ // can't happen
+ }
} else {
// We were invoked via an active restore session, not by the Package
// Manager, so start up the session timeout again.
long restoreAgentTimeoutMillis =
mAgentTimeoutParameters.getRestoreSessionTimeoutMillis();
- backupManagerService.getBackupHandler().sendEmptyMessageDelayed(
- MSG_RESTORE_SESSION_TIMEOUT,
- restoreAgentTimeoutMillis);
+ backupManagerService
+ .getBackupHandler()
+ .sendEmptyMessageDelayed(
+ MSG_RESTORE_SESSION_TIMEOUT, restoreAgentTimeoutMillis);
}
if (mIsSystemRestore) {
@@ -1312,9 +1378,12 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
Slog.d(TAG, "Starting next pending restore.");
}
PerformUnifiedRestoreTask task = backupManagerService.getPendingRestores().remove();
- backupManagerService.getBackupHandler().sendMessage(
- backupManagerService.getBackupHandler().obtainMessage(
- MSG_BACKUP_RESTORE_STEP, task));
+ backupManagerService
+ .getBackupHandler()
+ .sendMessage(
+ backupManagerService
+ .getBackupHandler()
+ .obtainMessage(MSG_BACKUP_RESTORE_STEP, task));
} else {
backupManagerService.setRestoreInProgress(false);
@@ -1325,7 +1394,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
}
Slog.i(TAG, "Restore complete.");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_RESTORE_COMPLETE,
null,
@@ -1381,14 +1450,15 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// migration to the newly-restored device's dataset, we will change
// the following from a discard of the newly-written state to the
// "correct" operation of renaming into the canonical state blob.
- mNewStateName.delete(); // TODO: remove; see above comment
+ mNewStateName.delete(); // TODO: remove; see above comment
// If this wasn't the PM pseudopackage, tear down the agent side
if (mCurrentPackage.applicationInfo != null) {
// unbind and tidy up even on timeout or failure
try {
- backupManagerService.getActivityManager().unbindBackupAgent(
- mCurrentPackage.applicationInfo);
+ backupManagerService
+ .getActivityManager()
+ .unbindBackupAgent(mCurrentPackage.applicationInfo);
// The agent was probably running with a stub Application object,
// which isn't a valid run mode for the main app logic. Shut
@@ -1407,17 +1477,22 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
final boolean killAfterRestore =
!UserHandle.isCore(mCurrentPackage.applicationInfo.uid)
&& ((mRestoreDescription.getDataType()
- == RestoreDescription.TYPE_FULL_STREAM)
- || ((appFlags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0));
+ == RestoreDescription.TYPE_FULL_STREAM)
+ || ((appFlags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE)
+ != 0));
if (mTargetPackage == null && killAfterRestore) {
if (DEBUG) {
- Slog.d(TAG, "Restore complete, killing host process of "
- + mCurrentPackage.applicationInfo.processName);
+ Slog.d(
+ TAG,
+ "Restore complete, killing host process of "
+ + mCurrentPackage.applicationInfo.processName);
}
- backupManagerService.getActivityManager().killApplicationProcess(
- mCurrentPackage.applicationInfo.processName,
- mCurrentPackage.applicationInfo.uid);
+ backupManagerService
+ .getActivityManager()
+ .killApplicationProcess(
+ mCurrentPackage.applicationInfo.processName,
+ mCurrentPackage.applicationInfo.uid);
}
} catch (RemoteException e) {
// can't happen; we run in the same process as the activity manager
@@ -1434,9 +1509,12 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
mOperationStorage.removeOperation(mEphemeralOpToken);
if (MORE_DEBUG) {
- Slog.i(TAG, "operationComplete() during restore: target="
- + mCurrentPackage.packageName
- + " state=" + mState);
+ Slog.i(
+ TAG,
+ "operationComplete() during restore: target="
+ + mCurrentPackage.packageName
+ + " state="
+ + mState);
}
final UnifiedRestoreState nextState;
@@ -1449,30 +1527,31 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
break;
case RESTORE_KEYVALUE:
- case RESTORE_FULL: {
+ case RESTORE_FULL:
// Okay, we've just heard back from the agent that it's done with
// the restore itself. We now have to send the same agent its
// doRestoreFinished() callback, so roll into that state.
nextState = UnifiedRestoreState.RESTORE_FINISHED;
break;
- }
- case RESTORE_FINISHED: {
+ case RESTORE_FINISHED:
// Okay, we're done with this package. Tidy up and go on to the next
// app in the queue.
int size = (int) mBackupDataName.length();
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_RESTORE_FINISHED, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_RESTORE_FINISHED,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_PACKAGE,
- mCurrentPackage.packageName, size);
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_PACKAGE, mCurrentPackage.packageName, size);
- // Ask the agent for logs after doRestoreFinished() has completed executing to allow
+ // Ask the agent for logs after doRestoreFinished() has completed executing to
+ // allow
// it to finalize its logs.
- mBackupManagerMonitorEventSender.monitorAgentLoggingResults(mCurrentPackage,
- mAgent);
+ mBackupManagerMonitorEventSender.monitorAgentLoggingResults(
+ mCurrentPackage, mAgent);
// Just go back to running the restore queue
keyValueAgentCleanup();
@@ -1481,22 +1560,20 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
// incorporate it into current bookeeping and then pass that along to
// the app as part of the restore-time work.
if (mWidgetData != null) {
- backupManagerService.restoreWidgetData(mCurrentPackage.packageName,
- mWidgetData);
+ backupManagerService.restoreWidgetData(
+ mCurrentPackage.packageName, mWidgetData);
}
nextState = UnifiedRestoreState.RUNNING_QUEUE;
break;
- }
- default: {
+ default:
// Some kind of horrible semantic error; we're in an unexpected state.
// Back off hard and wind up.
Slog.e(TAG, "Unexpected restore callback into state " + mState);
keyValueAgentErrorCleanup(true);
nextState = UnifiedRestoreState.FINAL;
break;
- }
}
executeNextState(nextState);
@@ -1507,12 +1584,14 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
public void handleCancel(boolean cancelAll) {
mOperationStorage.removeOperation(mEphemeralOpToken);
Slog.e(TAG, "Timeout restoring application " + mCurrentPackage.packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_RESTORE_TIMEOUT,
- mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT, monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
- mCurrentPackage.packageName, "restore timeout");
+ mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
+ monitoringExtras);
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, mCurrentPackage.packageName, "restore timeout");
// Handle like an agent that threw on invocation: wipe it and go on to the next
keyValueAgentErrorCleanup(true);
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
@@ -1521,12 +1600,13 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
@VisibleForTesting
void executeNextState(UnifiedRestoreState nextState) {
if (MORE_DEBUG) {
- Slog.i(TAG, " => executing next step on "
- + this + " nextState=" + nextState);
+ Slog.i(TAG, " => executing next step on " + this + " nextState=" + nextState);
}
mState = nextState;
- Message msg = backupManagerService.getBackupHandler().obtainMessage(
- MSG_BACKUP_RESTORE_STEP, this);
+ Message msg =
+ backupManagerService
+ .getBackupHandler()
+ .obtainMessage(MSG_BACKUP_RESTORE_STEP, this);
backupManagerService.getBackupHandler().sendMessage(msg);
}
@@ -1584,9 +1664,8 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
}
}
- private Bundle addRestoreOperationTypeToEvent (@Nullable Bundle extra) {
+ private Bundle addRestoreOperationTypeToEvent(@Nullable Bundle extras) {
return mBackupManagerMonitorEventSender.putMonitoringExtra(
- extra,
- BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE, RESTORE);
+ extras, BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE, RESTORE);
}
}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 71a1f012e5cb..cce596b7f088 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -833,6 +833,13 @@ public class CompanionDeviceManagerService extends SystemService {
}
@Override
+ public boolean isPermissionTransferUserConsented(String packageName, int userId,
+ int associationId) {
+ return mSystemDataTransferProcessor.isPermissionTransferUserConsented(packageName,
+ userId, associationId);
+ }
+
+ @Override
public void startSystemDataTransfer(String packageName, int userId, int associationId,
ISystemDataTransferCallback callback) {
mSystemDataTransferProcessor.startSystemDataTransfer(packageName, userId,
diff --git a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java
index e5c847acad6e..bd646fa6bfbc 100644
--- a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java
+++ b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java
@@ -120,7 +120,8 @@ public class SystemDataTransferProcessor {
* Resolve the requested association, throwing if the caller doesn't have
* adequate permissions.
*/
- private @NonNull AssociationInfo resolveAssociation(String packageName, int userId,
+ @NonNull
+ private AssociationInfo resolveAssociation(String packageName, int userId,
int associationId) {
AssociationInfo association = mAssociationStore.getAssociationById(associationId);
association = PermissionsUtils.sanitizeWithCallerChecks(mContext, association);
@@ -133,6 +134,20 @@ public class SystemDataTransferProcessor {
}
/**
+ * Return whether the user has consented to the permission transfer for the association.
+ */
+ public boolean isPermissionTransferUserConsented(String packageName, @UserIdInt int userId,
+ int associationId) {
+ resolveAssociation(packageName, userId, associationId);
+
+ PermissionSyncRequest request = getPermissionSyncRequest(associationId);
+ if (request == null) {
+ return false;
+ }
+ return request.isUserConsented();
+ }
+
+ /**
* Build a PendingIntent of permission sync user consent dialog
*/
public PendingIntent buildPermissionTransferUserConsentIntent(String packageName,
diff --git a/services/companion/java/com/android/server/companion/virtual/TEST_MAPPING b/services/companion/java/com/android/server/companion/virtual/TEST_MAPPING
index 3583a7816ab2..a159a5e003c9 100644
--- a/services/companion/java/com/android/server/companion/virtual/TEST_MAPPING
+++ b/services/companion/java/com/android/server/companion/virtual/TEST_MAPPING
@@ -55,5 +55,15 @@
}
]
}
+ ],
+ "postsubmit": [
+ {
+ "name": "CtsVirtualDevicesCameraTestCases",
+ "options": [
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ }
+ ]
+ }
]
}
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
index 4987fbce42d0..45d7314f3fab 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
@@ -939,7 +939,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
if (mVirtualCameraController == null) {
throw new UnsupportedOperationException("Virtual camera controller is not available");
}
- mVirtualCameraController.registerCamera(Objects.requireNonNull(cameraConfig));
+ mVirtualCameraController.registerCamera(cameraConfig);
}
@Override // Binder call
@@ -951,7 +951,19 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
if (mVirtualCameraController == null) {
throw new UnsupportedOperationException("Virtual camera controller is not available");
}
- mVirtualCameraController.unregisterCamera(Objects.requireNonNull(cameraConfig));
+ mVirtualCameraController.unregisterCamera(cameraConfig);
+ }
+
+ @Override // Binder call
+ @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+ public int getVirtualCameraId(@NonNull VirtualCameraConfig cameraConfig)
+ throws RemoteException {
+ super.getVirtualCameraId_enforcePermission();
+ Objects.requireNonNull(cameraConfig);
+ if (mVirtualCameraController == null) {
+ throw new UnsupportedOperationException("Virtual camera controller is not available");
+ }
+ return mVirtualCameraController.getCameraId(cameraConfig);
}
@Override
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
index d194bb29b19b..9b78ed41206d 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java
@@ -460,11 +460,11 @@ public class VirtualDeviceManagerService extends SystemService {
synchronized (mVirtualDeviceManagerLock) {
if (!Flags.persistentDeviceIdApi() && mVirtualDevices.size() == 0) {
- final long callindId = Binder.clearCallingIdentity();
+ final long callingId = Binder.clearCallingIdentity();
try {
registerCdmAssociationListener();
} finally {
- Binder.restoreCallingIdentity(callindId);
+ Binder.restoreCallingIdentity(callingId);
}
}
mVirtualDevices.put(deviceId, virtualDevice);
@@ -498,13 +498,16 @@ public class VirtualDeviceManagerService extends SystemService {
synchronized (mVirtualDeviceManagerLock) {
virtualDeviceImpl = mVirtualDevices.get(virtualDevice.getDeviceId());
if (virtualDeviceImpl == null) {
- throw new SecurityException("Invalid VirtualDevice");
+ throw new SecurityException(
+ "Invalid VirtualDevice (deviceId = " + virtualDevice.getDeviceId()
+ + ")");
}
}
if (virtualDeviceImpl.getOwnerUid() != callingUid) {
throw new SecurityException(
"uid " + callingUid
- + " is not the owner of the supplied VirtualDevice");
+ + " is not the owner of the supplied VirtualDevice (deviceId = "
+ + virtualDevice.getDeviceId() + ")");
}
return virtualDeviceImpl.createVirtualDisplay(
@@ -851,6 +854,11 @@ public class VirtualDeviceManagerService extends SystemService {
}
@Override
+ public int getDeviceIdForDisplayId(int displayId) {
+ return mImpl.getDeviceIdForDisplayId(displayId);
+ }
+
+ @Override
public @Nullable String getPersistentIdForDevice(int deviceId) {
if (deviceId == Context.DEVICE_ID_DEFAULT) {
return VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT;
diff --git a/services/companion/java/com/android/server/companion/virtual/camera/VirtualCameraController.java b/services/companion/java/com/android/server/companion/virtual/camera/VirtualCameraController.java
index 06be3f39dcd1..d089b05238e4 100644
--- a/services/companion/java/com/android/server/companion/virtual/camera/VirtualCameraController.java
+++ b/services/companion/java/com/android/server/companion/virtual/camera/VirtualCameraController.java
@@ -27,14 +27,14 @@ import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.util.ArraySet;
+import android.util.ArrayMap;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
-import java.util.Set;
+import java.util.Map;
/**
* Manages the registration and removal of virtual camera from the server side.
@@ -47,10 +47,13 @@ public final class VirtualCameraController implements IBinder.DeathRecipient {
private static final String VIRTUAL_CAMERA_SERVICE_NAME = "virtual_camera";
private static final String TAG = "VirtualCameraController";
+ private final Object mServiceLock = new Object();
+
+ @GuardedBy("mServiceLock")
@Nullable private IVirtualCameraService mVirtualCameraService;
@GuardedBy("mCameras")
- private final Set<VirtualCameraConfig> mCameras = new ArraySet<>();
+ private final Map<IBinder, CameraDescriptor> mCameras = new ArrayMap<>();
public VirtualCameraController() {
connectVirtualCameraService();
@@ -67,19 +70,16 @@ public final class VirtualCameraController implements IBinder.DeathRecipient {
* @param cameraConfig The {@link VirtualCameraConfig} sent by the client.
*/
public void registerCamera(@NonNull VirtualCameraConfig cameraConfig) {
- // Try to connect to service if not connected already.
- if (mVirtualCameraService == null) {
- connectVirtualCameraService();
- }
- // Throw exception if we are unable to connect to service.
- if (mVirtualCameraService == null) {
- throw new IllegalStateException("Virtual camera service is not connected.");
- }
+ connectVirtualCameraServiceIfNeeded();
try {
if (registerCameraWithService(cameraConfig)) {
+ CameraDescriptor cameraDescriptor =
+ new CameraDescriptor(cameraConfig);
+ IBinder binder = cameraConfig.getCallback().asBinder();
+ binder.linkToDeath(cameraDescriptor, 0 /* flags */);
synchronized (mCameras) {
- mCameras.add(cameraConfig);
+ mCameras.put(binder, cameraDescriptor);
}
} else {
// TODO(b/310857519): Revisit this to find a better way of indicating failure.
@@ -96,24 +96,44 @@ public final class VirtualCameraController implements IBinder.DeathRecipient {
* @param cameraConfig The {@link VirtualCameraConfig} sent by the client.
*/
public void unregisterCamera(@NonNull VirtualCameraConfig cameraConfig) {
- try {
- if (mVirtualCameraService == null) {
- Slog.w(TAG, "Virtual camera service is not connected.");
+ synchronized (mCameras) {
+ IBinder binder = cameraConfig.getCallback().asBinder();
+ if (!mCameras.containsKey(binder)) {
+ Slog.w(TAG, "Virtual camera was not registered.");
} else {
- mVirtualCameraService.unregisterCamera(cameraConfig.getCallback().asBinder());
+ connectVirtualCameraServiceIfNeeded();
+
+ try {
+ synchronized (mServiceLock) {
+ mVirtualCameraService.unregisterCamera(binder);
+ }
+ mCameras.remove(binder);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
}
- synchronized (mCameras) {
- mCameras.remove(cameraConfig);
+ }
+ }
+
+ /** Return the id of the virtual camera with the given config. */
+ public int getCameraId(@NonNull VirtualCameraConfig cameraConfig) {
+ connectVirtualCameraServiceIfNeeded();
+
+ try {
+ synchronized (mServiceLock) {
+ return mVirtualCameraService.getCameraId(cameraConfig.getCallback().asBinder());
}
} catch (RemoteException e) {
- e.rethrowFromSystemServer();
+ throw e.rethrowFromSystemServer();
}
}
@Override
public void binderDied() {
Slog.d(TAG, "Virtual camera service died.");
- mVirtualCameraService = null;
+ synchronized (mServiceLock) {
+ mVirtualCameraService = null;
+ }
synchronized (mCameras) {
mCameras.clear();
}
@@ -122,32 +142,48 @@ public final class VirtualCameraController implements IBinder.DeathRecipient {
/** Release resources associated with this controller. */
public void close() {
synchronized (mCameras) {
- if (mVirtualCameraService == null) {
- Slog.w(TAG, "Virtual camera service is not connected.");
- } else {
- for (VirtualCameraConfig config : mCameras) {
- try {
- mVirtualCameraService.unregisterCamera(config.getCallback().asBinder());
- } catch (RemoteException e) {
- Slog.w(TAG, "close(): Camera failed to be removed on camera "
- + "service.", e);
+ if (!mCameras.isEmpty()) {
+ connectVirtualCameraServiceIfNeeded();
+
+ synchronized (mServiceLock) {
+ for (IBinder binder : mCameras.keySet()) {
+ try {
+ mVirtualCameraService.unregisterCamera(binder);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "close(): Camera failed to be removed on camera "
+ + "service.", e);
+ }
}
}
+ mCameras.clear();
}
- mCameras.clear();
}
- mVirtualCameraService = null;
+ synchronized (mServiceLock) {
+ mVirtualCameraService = null;
+ }
}
/** Dumps information about this {@link VirtualCameraController} for debugging purposes. */
public void dump(PrintWriter fout, String indent) {
fout.println(indent + "VirtualCameraController:");
indent += indent;
- fout.printf("%sService:%s\n", indent, mVirtualCameraService);
synchronized (mCameras) {
fout.printf("%sRegistered cameras:%d%n\n", indent, mCameras.size());
- for (VirtualCameraConfig config : mCameras) {
- fout.printf("%s token: %s\n", indent, config);
+ for (CameraDescriptor descriptor : mCameras.values()) {
+ fout.printf("%s token: %s\n", indent, descriptor.mConfig);
+ }
+ }
+ }
+
+ private void connectVirtualCameraServiceIfNeeded() {
+ synchronized (mServiceLock) {
+ // Try to connect to service if not connected already.
+ if (mVirtualCameraService == null) {
+ connectVirtualCameraService();
+ }
+ // Throw exception if we are unable to connect to service.
+ if (mVirtualCameraService == null) {
+ throw new IllegalStateException("Virtual camera service is not connected.");
}
}
}
@@ -173,7 +209,24 @@ public final class VirtualCameraController implements IBinder.DeathRecipient {
private boolean registerCameraWithService(VirtualCameraConfig config) throws RemoteException {
VirtualCameraConfiguration serviceConfiguration = getServiceCameraConfiguration(config);
- return mVirtualCameraService.registerCamera(config.getCallback().asBinder(),
- serviceConfiguration);
+ synchronized (mServiceLock) {
+ return mVirtualCameraService.registerCamera(config.getCallback().asBinder(),
+ serviceConfiguration);
+ }
+ }
+
+ private final class CameraDescriptor implements IBinder.DeathRecipient {
+
+ private final VirtualCameraConfig mConfig;
+
+ CameraDescriptor(VirtualCameraConfig config) {
+ mConfig = config;
+ }
+
+ @Override
+ public void binderDied() {
+ Slog.d(TAG, "Virtual camera binder died");
+ unregisterCamera(mConfig);
+ }
}
}
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 3323d0ba64dd..659112e90203 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -136,7 +136,6 @@ java_library_static {
"android.hardware.light-V2.0-java",
"android.hardware.gnss-V2-java",
"android.hardware.vibrator-V2-java",
- "android.nfc.flags-aconfig-java",
"app-compat-annotations",
"framework-tethering.stubs.module_lib",
"service-art.stubs.system_server",
diff --git a/services/core/java/android/app/usage/UsageStatsManagerInternal.java b/services/core/java/android/app/usage/UsageStatsManagerInternal.java
index fc565111dbe8..23c008eb7f67 100644
--- a/services/core/java/android/app/usage/UsageStatsManagerInternal.java
+++ b/services/core/java/android/app/usage/UsageStatsManagerInternal.java
@@ -27,6 +27,7 @@ import android.content.ComponentName;
import android.content.LocusId;
import android.content.res.Configuration;
import android.os.IBinder;
+import android.os.PersistableBundle;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
@@ -134,6 +135,18 @@ public abstract class UsageStatsManagerInternal {
@Nullable LocusId locusId, @NonNull IBinder appToken);
/**
+ * Report a user interaction event to UsageStatsManager
+ *
+ * @param pkgName The package for which this user interaction event occurred.
+ * @param userId The user id to which component belongs to.
+ * @param extras The extra details about this user interaction event.
+ * {@link UsageEvents.Event#USER_INTERACTION}
+ * {@link UsageStatsManager#reportUserInteraction(String, int, PersistableBundle)}
+ */
+ public abstract void reportUserInteractionEvent(@NonNull String pkgName, @UserIdInt int userId,
+ @NonNull PersistableBundle extras);
+
+ /**
* Prepares the UsageStatsService for shutdown.
*/
public abstract void prepareShutdown();
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index 898b69310fe1..31c9348c8127 100644
--- a/services/core/java/android/content/pm/PackageManagerInternal.java
+++ b/services/core/java/android/content/pm/PackageManagerInternal.java
@@ -45,7 +45,6 @@ import android.util.SparseArray;
import com.android.internal.pm.pkg.component.ParsedMainComponent;
import com.android.internal.util.function.pooled.PooledLambda;
-import com.android.permission.persistence.RuntimePermissionsState;
import com.android.server.pm.Installer.LegacyDexoptDisabledException;
import com.android.server.pm.KnownPackages;
import com.android.server.pm.PackageArchiver;
@@ -1104,7 +1103,9 @@ public abstract class PackageManagerInternal {
* Read legacy permission states for permissions migration to new permission subsystem.
* Note that this api is supposed to be used for permissions state migration only.
*/
- public abstract RuntimePermissionsState getLegacyPermissionsState(@UserIdInt int userId);
+ // TODO: restore to com.android.permission.persistence.RuntimePermissionsState
+ // once Ravenwood includes Mainline stubs
+ public abstract Object getLegacyPermissionsState(@UserIdInt int userId);
/**
* @return permissions file version for the given user.
diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS
index 7fe06827f1b3..c258370dc12b 100644
--- a/services/core/java/com/android/server/OWNERS
+++ b/services/core/java/com/android/server/OWNERS
@@ -1,5 +1,5 @@
-# BootReceiver
-per-file BootReceiver.java = gaillard@google.com
+# BootReceiver / Watchdog
+per-file BootReceiver.java,Watchdog.java = gaillard@google.com
# Connectivity / Networking
per-file ConnectivityService.java,ConnectivityServiceInitializer.java,NetworkManagementService.java,NsdService.java,VpnManagerService.java = file:/services/core/java/com/android/server/net/OWNERS
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index 23a30f9dc2ee..c5c2b0b5dd59 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -1044,7 +1044,6 @@ public final class PinnerService extends SystemService {
if (DEBUG) {
Slog.d(TAG, "pin file: " + fileToPin + " use-pinlist: " + attemptPinIntrospection);
}
- Trace.beginSection("pinFile:" + fileToPin);
ZipFile fileAsZip = null;
InputStream pinRangeStream = null;
try {
@@ -1067,7 +1066,6 @@ public final class PinnerService extends SystemService {
} finally {
safeClose(pinRangeStream);
safeClose(fileAsZip); // Also closes any streams we've opened
- Trace.endSection();
}
}
diff --git a/services/core/java/com/android/server/SecurityStateManagerService.java b/services/core/java/com/android/server/SecurityStateManagerService.java
new file mode 100644
index 000000000000..98039be20897
--- /dev/null
+++ b/services/core/java/com/android/server/SecurityStateManagerService.java
@@ -0,0 +1,109 @@
+/*
+ * 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 com.android.server;
+
+import static android.os.SecurityStateManager.KEY_KERNEL_VERSION;
+import static android.os.SecurityStateManager.KEY_SYSTEM_SPL;
+import static android.os.SecurityStateManager.KEY_VENDOR_SPL;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.ISecurityStateManager;
+import android.os.SystemProperties;
+import android.os.VintfRuntimeInfo;
+import android.text.TextUtils;
+import android.util.Slog;
+import android.webkit.WebViewProviderInfo;
+import android.webkit.WebViewUpdateService;
+
+import com.android.internal.R;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class SecurityStateManagerService extends ISecurityStateManager.Stub {
+
+ private static final String TAG = "SecurityStateManagerService";
+
+ static final String VENDOR_SECURITY_PATCH_PROPERTY_KEY = "ro.vendor.build"
+ + ".security_patch";
+ static final Pattern KERNEL_RELEASE_PATTERN = Pattern.compile("(\\d+\\.\\d+\\.\\d+)("
+ + ".*)");
+
+ private final Context mContext;
+ private final PackageManager mPackageManager;
+
+ public SecurityStateManagerService(Context context) {
+ mContext = context;
+ mPackageManager = context.getPackageManager();
+ }
+
+ @Override
+ public Bundle getGlobalSecurityState() {
+ Bundle globalSecurityState = new Bundle();
+ globalSecurityState.putString(KEY_SYSTEM_SPL, Build.VERSION.SECURITY_PATCH);
+ globalSecurityState.putString(KEY_VENDOR_SPL,
+ SystemProperties.get(VENDOR_SECURITY_PATCH_PROPERTY_KEY, ""));
+ String moduleMetadataProviderPackageName =
+ mContext.getString(R.string.config_defaultModuleMetadataProvider);
+ if (!moduleMetadataProviderPackageName.isEmpty()) {
+ globalSecurityState.putString(moduleMetadataProviderPackageName,
+ getSpl(moduleMetadataProviderPackageName));
+ }
+ globalSecurityState.putString(KEY_KERNEL_VERSION, getKernelVersion());
+ addWebViewPackages(globalSecurityState);
+ addSecurityStatePackages(globalSecurityState);
+ return globalSecurityState;
+ }
+
+ private String getSpl(String packageName) {
+ if (!TextUtils.isEmpty(packageName)) {
+ try {
+ return mPackageManager.getPackageInfo(packageName, 0 /* flags */).versionName;
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.e(TAG, TextUtils.formatSimple("Failed to get SPL for package %s.",
+ packageName), e);
+ }
+ }
+ return "";
+ }
+
+ private String getKernelVersion() {
+ Matcher matcher = KERNEL_RELEASE_PATTERN.matcher(VintfRuntimeInfo.getKernelVersion());
+ if (matcher.matches()) {
+ return matcher.group(1);
+ }
+ return "";
+ }
+
+ private void addWebViewPackages(Bundle bundle) {
+ for (WebViewProviderInfo info : WebViewUpdateService.getAllWebViewPackages()) {
+ String packageName = info.packageName;
+ bundle.putString(packageName, getSpl(packageName));
+ }
+ }
+
+ private void addSecurityStatePackages(Bundle bundle) {
+ String[] packageNames;
+ packageNames = mContext.getResources().getStringArray(R.array.config_securityStatePackages);
+ for (String packageName : packageNames) {
+ bundle.putString(packageName, getSpl(packageName));
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index 003046ab884f..382ee6e0c0a6 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -69,6 +69,7 @@ import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.time.Clock;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -98,11 +99,17 @@ public class Watchdog implements Dumpable {
// applications may not work with a debug build. CTS will fail.
private static final long DEFAULT_TIMEOUT = DB ? 10 * 1000 : 60 * 1000;
+ // This ratio is used to compute the pre-watchdog timeout (2 means that the pre-watchdog timeout
+ // will be half the full timeout).
+ //
+ // The pre-watchdog event is similar to a full watchdog except it does not crash system server.
+ private static final int PRE_WATCHDOG_TIMEOUT_RATIO = 3;
+
// These are temporally ordered: larger values as lateness increases
- private static final int COMPLETED = 0;
- private static final int WAITING = 1;
- private static final int WAITED_HALF = 2;
- private static final int OVERDUE = 3;
+ static final int COMPLETED = 0;
+ static final int WAITING = 1;
+ static final int WAITED_UNTIL_PRE_WATCHDOG = 2;
+ static final int OVERDUE = 3;
// Track watchdog timeout history and break the crash loop if there is.
private static final String TIMEOUT_HISTORY_FILE = "/data/system/watchdog-timeout-history.txt";
@@ -237,10 +244,8 @@ public class Watchdog implements Dumpable {
}
}
- /**
- * Used for checking status of handle threads and scheduling monitor callbacks.
- */
- public final class HandlerChecker implements Runnable {
+ /** Used for checking status of handle threads and scheduling monitor callbacks. */
+ public static class HandlerChecker implements Runnable {
private final Handler mHandler;
private final String mName;
private final ArrayList<Monitor> mMonitors = new ArrayList<Monitor>();
@@ -251,11 +256,19 @@ public class Watchdog implements Dumpable {
private long mStartTimeMillis;
private int mPauseCount;
private long mPauseEndTimeMillis;
+ private Clock mClock;
+ private Object mLock;
- HandlerChecker(Handler handler, String name) {
+ HandlerChecker(Handler handler, String name, Object lock, Clock clock) {
mHandler = handler;
mName = name;
+ mLock = lock;
mCompleted = true;
+ mClock = clock;
+ }
+
+ HandlerChecker(Handler handler, String name, Object lock) {
+ this(handler, name, lock, SystemClock.uptimeClock());
}
void addMonitorLocked(Monitor monitor) {
@@ -278,11 +291,9 @@ public class Watchdog implements Dumpable {
mMonitorQueue.clear();
}
- long nowMillis = SystemClock.uptimeMillis();
- boolean isPaused = mPauseCount > 0
- || (mPauseEndTimeMillis > 0 && mPauseEndTimeMillis < nowMillis);
- if ((mMonitors.size() == 0 && mHandler.getLooper().getQueue().isPolling())
- || isPaused) {
+ long nowMillis = mClock.millis();
+ boolean isPaused = mPauseCount > 0 || mPauseEndTimeMillis > nowMillis;
+ if ((mMonitors.size() == 0 && isHandlerPolling()) || isPaused) {
// Don't schedule until after resume OR
// If the target looper has recently been polling, then
// there is no reason to enqueue our checker on it since that
@@ -305,15 +316,19 @@ public class Watchdog implements Dumpable {
mHandler.postAtFrontOfQueue(this);
}
+ boolean isHandlerPolling() {
+ return mHandler.getLooper().getQueue().isPolling();
+ }
+
public int getCompletionStateLocked() {
if (mCompleted) {
return COMPLETED;
} else {
- long latency = SystemClock.uptimeMillis() - mStartTimeMillis;
- if (latency < mWaitMaxMillis / 2) {
+ long latency = mClock.millis() - mStartTimeMillis;
+ if (latency < mWaitMaxMillis / PRE_WATCHDOG_TIMEOUT_RATIO) {
return WAITING;
} else if (latency < mWaitMaxMillis) {
- return WAITED_HALF;
+ return WAITED_UNTIL_PRE_WATCHDOG;
}
}
return OVERDUE;
@@ -334,7 +349,7 @@ public class Watchdog implements Dumpable {
} else {
prefix = "Blocked in monitor " + mCurrentMonitor.getClass().getName();
}
- long latencySeconds = (SystemClock.uptimeMillis() - mStartTimeMillis) / 1000;
+ long latencySeconds = (mClock.millis() - mStartTimeMillis) / 1000;
return prefix + " on " + mName + " (" + getThread().getName() + ")"
+ " for " + latencySeconds + "s";
}
@@ -366,10 +381,11 @@ public class Watchdog implements Dumpable {
* the given time.
*/
public void pauseForLocked(int pauseMillis, String reason) {
- mPauseEndTimeMillis = SystemClock.uptimeMillis() + pauseMillis;
+ mPauseEndTimeMillis = mClock.millis() + pauseMillis;
// Mark as completed, because there's a chance we called this after the watchog
- // thread loop called Object#wait after 'WAITED_HALF'. In that case we want to ensure
- // the next call to #getCompletionStateLocked for this checker returns 'COMPLETED'
+ // thread loop called Object#wait after 'WAITED_UNTIL_PRE_WATCHDOG'. In that case we
+ // want to ensure the next call to #getCompletionStateLocked for this checker returns
+ // 'COMPLETED'
mCompleted = true;
Slog.i(TAG, "Pausing of HandlerChecker: " + mName + " for reason: "
+ reason + ". Pause end time: " + mPauseEndTimeMillis);
@@ -379,8 +395,9 @@ public class Watchdog implements Dumpable {
public void pauseLocked(String reason) {
mPauseCount++;
// Mark as completed, because there's a chance we called this after the watchog
- // thread loop called Object#wait after 'WAITED_HALF'. In that case we want to ensure
- // the next call to #getCompletionStateLocked for this checker returns 'COMPLETED'
+ // thread loop called Object#wait after 'WAITED_UNTIL_PRE_WATCHDOG'. In that case we
+ // want to ensure the next call to #getCompletionStateLocked for this checker returns
+ // 'COMPLETED'
mCompleted = true;
Slog.i(TAG, "Pausing HandlerChecker: " + mName + " for reason: "
+ reason + ". Pause count: " + mPauseCount);
@@ -396,6 +413,11 @@ public class Watchdog implements Dumpable {
Slog.wtf(TAG, "Already resumed HandlerChecker: " + mName);
}
}
+
+ @Override
+ public String toString() {
+ return "CheckerHandler for " + mName;
+ }
}
final class RebootRequestReceiver extends BroadcastReceiver {
@@ -445,31 +467,40 @@ public class Watchdog implements Dumpable {
ServiceThread t = new ServiceThread("watchdog.monitor",
android.os.Process.THREAD_PRIORITY_DEFAULT, true /*allowIo*/);
t.start();
- mMonitorChecker = new HandlerChecker(new Handler(t.getLooper()), "monitor thread");
+ mMonitorChecker = new HandlerChecker(new Handler(t.getLooper()), "monitor thread", mLock);
mHandlerCheckers.add(withDefaultTimeout(mMonitorChecker));
- mHandlerCheckers.add(withDefaultTimeout(
- new HandlerChecker(FgThread.getHandler(), "foreground thread")));
+ mHandlerCheckers.add(
+ withDefaultTimeout(
+ new HandlerChecker(FgThread.getHandler(), "foreground thread", mLock)));
// Add checker for main thread. We only do a quick check since there
// can be UI running on the thread.
- mHandlerCheckers.add(withDefaultTimeout(
- new HandlerChecker(new Handler(Looper.getMainLooper()), "main thread")));
+ mHandlerCheckers.add(
+ withDefaultTimeout(
+ new HandlerChecker(
+ new Handler(Looper.getMainLooper()), "main thread", mLock)));
// Add checker for shared UI thread.
- mHandlerCheckers.add(withDefaultTimeout(
- new HandlerChecker(UiThread.getHandler(), "ui thread")));
+ mHandlerCheckers.add(
+ withDefaultTimeout(new HandlerChecker(UiThread.getHandler(), "ui thread", mLock)));
// And also check IO thread.
- mHandlerCheckers.add(withDefaultTimeout(
- new HandlerChecker(IoThread.getHandler(), "i/o thread")));
+ mHandlerCheckers.add(
+ withDefaultTimeout(new HandlerChecker(IoThread.getHandler(), "i/o thread", mLock)));
// And the display thread.
- mHandlerCheckers.add(withDefaultTimeout(
- new HandlerChecker(DisplayThread.getHandler(), "display thread")));
+ mHandlerCheckers.add(
+ withDefaultTimeout(
+ new HandlerChecker(DisplayThread.getHandler(), "display thread", mLock)));
// And the animation thread.
- mHandlerCheckers.add(withDefaultTimeout(
- new HandlerChecker(AnimationThread.getHandler(), "animation thread")));
+ mHandlerCheckers.add(
+ withDefaultTimeout(
+ new HandlerChecker(
+ AnimationThread.getHandler(), "animation thread", mLock)));
// And the surface animation thread.
- mHandlerCheckers.add(withDefaultTimeout(
- new HandlerChecker(SurfaceAnimationThread.getHandler(),
- "surface animation thread")));
+ mHandlerCheckers.add(
+ withDefaultTimeout(
+ new HandlerChecker(
+ SurfaceAnimationThread.getHandler(),
+ "surface animation thread",
+ mLock)));
// Initialize monitor for Binder threads.
addMonitor(new BinderThreadMonitor());
@@ -609,7 +640,7 @@ public class Watchdog implements Dumpable {
public void addThread(Handler thread) {
synchronized (mLock) {
final String name = thread.getLooper().getThread().getName();
- mHandlerCheckers.add(withDefaultTimeout(new HandlerChecker(thread, name)));
+ mHandlerCheckers.add(withDefaultTimeout(new HandlerChecker(thread, name, mLock)));
}
}
@@ -617,7 +648,7 @@ public class Watchdog implements Dumpable {
synchronized (mLock) {
final String name = thread.getLooper().getThread().getName();
mHandlerCheckers.add(
- withCustomTimeout(new HandlerChecker(thread, name), timeoutMillis));
+ withCustomTimeout(new HandlerChecker(thread, name, mLock), timeoutMillis));
}
}
@@ -797,11 +828,11 @@ public class Watchdog implements Dumpable {
String subject = "";
boolean allowRestart = true;
int debuggerWasConnected = 0;
- boolean doWaitedHalfDump = false;
+ boolean doWaitedPreDump = false;
// The value of mWatchdogTimeoutMillis might change while we are executing the loop.
// We store the current value to use a consistent value for all handlers.
final long watchdogTimeoutMillis = mWatchdogTimeoutMillis;
- final long checkIntervalMillis = watchdogTimeoutMillis / 2;
+ final long checkIntervalMillis = watchdogTimeoutMillis / PRE_WATCHDOG_TIMEOUT_RATIO;
final ArrayList<Integer> pids;
synchronized (mLock) {
long timeout = checkIntervalMillis;
@@ -848,15 +879,16 @@ public class Watchdog implements Dumpable {
} else if (waitState == WAITING) {
// still waiting but within their configured intervals; back off and recheck
continue;
- } else if (waitState == WAITED_HALF) {
+ } else if (waitState == WAITED_UNTIL_PRE_WATCHDOG) {
if (!waitedHalf) {
- Slog.i(TAG, "WAITED_HALF");
+ Slog.i(TAG, "WAITED_UNTIL_PRE_WATCHDOG");
waitedHalf = true;
- // We've waited half, but we'd need to do the stack trace dump w/o the lock.
- blockedCheckers = getCheckersWithStateLocked(WAITED_HALF);
+ // We've waited until the pre-watchdog, but we'd need to do the stack trace
+ // dump w/o the lock.
+ blockedCheckers = getCheckersWithStateLocked(WAITED_UNTIL_PRE_WATCHDOG);
subject = describeCheckersLocked(blockedCheckers);
pids = new ArrayList<>(mInterestingJavaPids);
- doWaitedHalfDump = true;
+ doWaitedPreDump = true;
} else {
continue;
}
@@ -874,12 +906,12 @@ public class Watchdog implements Dumpable {
// First collect stack traces from all threads of the system process.
//
// Then, if we reached the full timeout, kill this process so that the system will
- // restart. If we reached half of the timeout, just log some information and continue.
- logWatchog(doWaitedHalfDump, subject, pids);
+ // restart. If we reached pre-watchdog timeout, just log some information and continue.
+ logWatchog(doWaitedPreDump, subject, pids);
- if (doWaitedHalfDump) {
- // We have waited for only half of the timeout, we continue to wait for the duration
- // of the full timeout before killing the process.
+ if (doWaitedPreDump) {
+ // We have waited for only pre-watchdog timeout, we continue to wait for the
+ // duration of the full timeout before killing the process.
continue;
}
@@ -928,8 +960,8 @@ public class Watchdog implements Dumpable {
}
}
- private void logWatchog(boolean halfWatchdog, String subject, ArrayList<Integer> pids) {
- // Get critical event log before logging the half watchdog so that it doesn't
+ private void logWatchog(boolean preWatchdog, String subject, ArrayList<Integer> pids) {
+ // Get critical event log before logging the pre-watchdog so that it doesn't
// occur in the log.
String criticalEvents =
CriticalEventLog.getInstance().logLinesForSystemServerTraceFile();
@@ -941,7 +973,7 @@ public class Watchdog implements Dumpable {
}
final String dropboxTag;
- if (halfWatchdog) {
+ if (preWatchdog) {
dropboxTag = "pre_watchdog";
CriticalEventLog.getInstance().logHalfWatchdog(subject);
FrameworkStatsLog.write(FrameworkStatsLog.SYSTEM_SERVER_PRE_WATCHDOG_OCCURRED);
@@ -971,7 +1003,7 @@ public class Watchdog implements Dumpable {
report.append(processCpuTracker.printCurrentState(anrTime, 10));
report.append(tracesFileException.getBuffer());
- if (!halfWatchdog) {
+ if (!preWatchdog) {
// Trigger the kernel to dump all blocked threads, and backtraces on all CPUs to the
// kernel log
doSysRq('w');
diff --git a/services/core/java/com/android/server/adb/AdbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
index 6794f750c82d..3280afdf6703 100644
--- a/services/core/java/com/android/server/adb/AdbDebuggingManager.java
+++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
@@ -1797,8 +1797,13 @@ public class AdbDebuggingManager {
mFingerprints);
try {
- dump.write("user_keys", AdbDebuggingManagerProto.USER_KEYS,
- FileUtils.readTextFile(new File("/data/misc/adb/adb_keys"), 0, null));
+ File userKeys = new File("/data/misc/adb/adb_keys");
+ if (userKeys.exists()) {
+ dump.write("user_keys", AdbDebuggingManagerProto.USER_KEYS,
+ FileUtils.readTextFile(userKeys, 0, null));
+ } else {
+ Slog.i(TAG, "No user keys on this device");
+ }
} catch (IOException e) {
Slog.i(TAG, "Cannot read user keys", e);
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 54c8ed38bb1c..b87d02d86c22 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -79,7 +79,6 @@ import static android.os.PowerExemptionManager.REASON_ACTIVITY_VISIBILITY_GRACE_
import static android.os.PowerExemptionManager.REASON_BACKGROUND_ACTIVITY_PERMISSION;
import static android.os.PowerExemptionManager.REASON_BOOT_COMPLETED;
import static android.os.PowerExemptionManager.REASON_COMPANION_DEVICE_MANAGER;
-import static android.os.PowerExemptionManager.REASON_DENIED;
import static android.os.PowerExemptionManager.REASON_INSTR_BACKGROUND_ACTIVITY_PERMISSION;
import static android.os.PowerExemptionManager.REASON_LOCKED_BOOT_COMPLETED;
import static android.os.PowerExemptionManager.REASON_PROC_STATE_BTOP;
@@ -5051,7 +5050,7 @@ public class ActivityManagerService extends IActivityManager.Stub
REASON_LOCKED_BOOT_COMPLETED);
}
// Send BOOT_COMPLETED if the user is unlocked
- if (StorageManager.isUserKeyUnlocked(app.userId)) {
+ if (StorageManager.isCeStorageUnlocked(app.userId)) {
sendBootBroadcastToAppLocked(app, new Intent(Intent.ACTION_BOOT_COMPLETED),
REASON_BOOT_COMPLETED);
}
@@ -14150,7 +14149,8 @@ public class ActivityManagerService extends IActivityManager.Stub
|| action.startsWith("android.intent.action.PACKAGE_")
|| action.startsWith("android.intent.action.UID_")
|| action.startsWith("android.intent.action.EXTERNAL_")
- || action.startsWith("android.bluetooth.")) {
+ || action.startsWith("android.bluetooth.")
+ || action.equals(Intent.ACTION_SHUTDOWN)) {
if (DEBUG_BROADCAST) {
Slog.wtf(TAG,
"System internals registering for " + filter.toLongString()
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index e65603021708..f8f3d82556fa 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -480,6 +480,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
}
public void systemServicesReady() {
+ mStats.setPowerStatsCollectorEnabled(Flags.streamlinedBatteryStats());
mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(Flags.streamlinedBatteryStats());
mWorker.systemServicesReady();
mStats.systemServicesReady(mContext);
@@ -885,9 +886,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
syncStats("get-stats", BatteryExternalStatsWorker.UPDATE_ALL);
}
- synchronized (mStats) {
- return mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, queries);
- }
+ return mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, queries);
}
/** Register callbacks for statsd pulled atoms. */
@@ -2648,7 +2647,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub
pw.println(" --proto: output as a binary protobuffer");
pw.println(" --model power-profile: use the power profile model"
+ " even if measured energy is available");
- pw.println(" --sample: collect and dump a sample of stats for debugging purpose");
+ if (Flags.streamlinedBatteryStats()) {
+ pw.println(" --sample: collect and dump a sample of stats for debugging purpose");
+ }
pw.println(" <package.name>: optional name of package to filter output by.");
pw.println(" -h: print this help text.");
pw.println("Battery stats (batterystats) commands:");
@@ -2727,13 +2728,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub
BatteryUsageStatsQuery query = builder.build();
synchronized (mStats) {
mStats.prepareForDumpLocked();
- BatteryUsageStats batteryUsageStats =
- mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, query);
- if (proto) {
- batteryUsageStats.dumpToProto(fd);
- } else {
- batteryUsageStats.dump(pw, "");
- }
+ }
+ BatteryUsageStats batteryUsageStats =
+ mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, query);
+ if (proto) {
+ batteryUsageStats.dumpToProto(fd);
+ } else {
+ batteryUsageStats.dump(pw, "");
}
}
@@ -2938,10 +2939,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub
mCpuWakeupStats.dump(new IndentingPrintWriter(pw, " "),
SystemClock.elapsedRealtime());
return;
- } else if ("--sample".equals(arg)) {
+ } else if (Flags.streamlinedBatteryStats() && "--sample".equals(arg)) {
dumpStatsSample(pw);
return;
- } else if ("--aggregated".equals(arg)) {
+ } else if (Flags.streamlinedBatteryStats() && "--aggregated".equals(arg)) {
dumpAggregatedStats(pw);
return;
} else if ("--store".equals(arg)) {
@@ -3013,7 +3014,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
mBatteryStatsConfig, Clock.SYSTEM_CLOCK, mMonotonicClock,
null, mStats.mHandler, null, null,
mUserManagerUserInfoProvider, mPowerProfile,
- mCpuScalingPolicies, null);
+ mCpuScalingPolicies, new PowerStatsUidResolver());
checkinStats.readSummaryFromParcel(in);
in.recycle();
checkinStats.dumpProtoLocked(mContext, fd, apps, flags,
@@ -3055,7 +3056,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
mBatteryStatsConfig, Clock.SYSTEM_CLOCK, mMonotonicClock,
null, mStats.mHandler, null, null,
mUserManagerUserInfoProvider, mPowerProfile,
- mCpuScalingPolicies, null);
+ mCpuScalingPolicies, new PowerStatsUidResolver());
checkinStats.readSummaryFromParcel(in);
in.recycle();
checkinStats.dumpCheckin(mContext, pw, apps, flags,
diff --git a/services/core/java/com/android/server/am/BroadcastProcessQueue.java b/services/core/java/com/android/server/am/BroadcastProcessQueue.java
index 3ce92bc2737e..0b561467a078 100644
--- a/services/core/java/com/android/server/am/BroadcastProcessQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastProcessQueue.java
@@ -361,7 +361,8 @@ class BroadcastProcessQueue {
&& (record.userId == testRecord.userId)
&& record.intent.filterEquals(testRecord.intent)
&& isReceiverEquals(receiver, testReceiver)
- && testRecord.allReceiversPending()) {
+ && testRecord.allReceiversPending()
+ && record.isMatchingRecord(testRecord)) {
// Exact match found; perform in-place swap
args.arg1 = record;
args.argi1 = recordIndex;
diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
index e07631cfbdb0..ad499911f84a 100644
--- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
+++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
@@ -230,6 +230,14 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
new AtomicReference<>();
/**
+ * Container for holding the set of broadcast records that matches an enqueueing record.
+ * @see BroadcastRecord#isMatchingRecord(BroadcastRecord)
+ */
+ @GuardedBy("mService")
+ private final AtomicReference<ArrayMap<BroadcastRecord, Boolean>> mMatchingRecordsCache =
+ new AtomicReference<>();
+
+ /**
* Map from UID to its last known "foreground" state. A UID is considered to be in
* "foreground" state when it's procState is {@link ActivityManager#PROCESS_STATE_TOP}.
* <p>
@@ -747,6 +755,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
if (replacedBroadcasts == null) {
replacedBroadcasts = new ArraySet<>();
}
+ ArrayMap<BroadcastRecord, Boolean> matchingBroadcasts =
+ mMatchingRecordsCache.getAndSet(null);
+ if (matchingBroadcasts == null) {
+ matchingBroadcasts = new ArrayMap<>();
+ }
+ r.setMatchingRecordsCache(matchingBroadcasts);
boolean enqueuedBroadcast = false;
for (int i = 0; i < r.receivers.size(); i++) {
@@ -780,6 +794,9 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
skipAndCancelReplacedBroadcasts(replacedBroadcasts);
replacedBroadcasts.clear();
mReplacedBroadcastsCache.compareAndSet(null, replacedBroadcasts);
+ matchingBroadcasts.clear();
+ r.clearMatchingRecordsCache();
+ mMatchingRecordsCache.compareAndSet(null, matchingBroadcasts);
// If nothing to dispatch, send any pending result immediately
if (r.receivers.isEmpty() || !enqueuedBroadcast) {
diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java
index 198adcb7606a..99b91ffb1c2f 100644
--- a/services/core/java/com/android/server/am/BroadcastRecord.java
+++ b/services/core/java/com/android/server/am/BroadcastRecord.java
@@ -61,6 +61,7 @@ import android.os.Binder;
import android.os.Bundle;
import android.os.SystemClock;
import android.os.UserHandle;
+import android.util.ArrayMap;
import android.util.PrintWriterPrinter;
import android.util.SparseArray;
import android.util.TimeUtils;
@@ -164,6 +165,11 @@ final class BroadcastRecord extends Binder {
@Nullable
final BiFunction<Integer, Bundle, Bundle> filterExtrasForReceiver;
+ // Cache of records that are "matching" this. Only used at the time of enqueuing this record
+ // into the queue.
+ @Nullable
+ private ArrayMap<BroadcastRecord, Boolean> mMatchingRecordsCache;
+
private @Nullable String mCachedToString;
private @Nullable String mCachedToShortString;
@@ -1250,6 +1256,33 @@ final class BroadcastRecord extends Binder {
return (terminalCount == 0 && dispatchTime <= 0);
}
+ boolean isMatchingRecord(@NonNull BroadcastRecord record) {
+ final int idx = mMatchingRecordsCache.indexOfKey(record);
+ if (idx > 0) {
+ return mMatchingRecordsCache.valueAt(idx);
+ }
+ // Consider a record to be matching if has the same receivers in the same order.
+ boolean matches = (receivers.size() == record.receivers.size());
+ if (matches) {
+ for (int i = receivers.size() - 1; i >= 0; --i) {
+ if (!isReceiverEquals(receivers.get(i), record.receivers.get(i))) {
+ matches = false;
+ break;
+ }
+ }
+ }
+ mMatchingRecordsCache.put(record, matches);
+ return matches;
+ }
+
+ void setMatchingRecordsCache(@NonNull ArrayMap<BroadcastRecord, Boolean> matchingRecordsCache) {
+ mMatchingRecordsCache = matchingRecordsCache;
+ }
+
+ void clearMatchingRecordsCache() {
+ mMatchingRecordsCache = null;
+ }
+
@Override
public String toString() {
if (mCachedToString == null) {
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index 192fd6f1a9ce..95ef2b4b0b44 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -120,7 +120,7 @@ public class SettingsToPropertiesMapper {
static final String[] sDeviceConfigAconfigScopes = new String[] {
"accessibility",
"android_core_networking",
- "angle",
+ "aoc",
"app_widgets",
"arc_next",
"avic",
@@ -142,7 +142,9 @@ public class SettingsToPropertiesMapper {
"core_experiments_team_internal",
"core_graphics",
"dck_framework",
+ "devoptions_settings",
"game",
+ "gpu",
"haptics",
"hardware_backed_security_mainline",
"input",
@@ -152,11 +154,13 @@ public class SettingsToPropertiesMapper {
"mainline_sdk",
"media_audio",
"media_drm",
+ "media_reliability",
"media_tv",
"media_solutions",
"nfc",
"pdf_viewer",
"pixel_audio_android",
+ "pixel_bluetooth",
"pixel_system_sw_touch",
"pixel_watch",
"platform_security",
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 344673793700..7780b3906b9f 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -1180,6 +1180,8 @@ public class AppOpsService extends IAppOpsService.Stub {
uidState.pkgOps.put(packageName,
new Ops(packageName, uidState));
}
+
+ createSandboxUidStateIfNotExistsForAppLocked(uid);
}
}
}
@@ -1261,6 +1263,8 @@ public class AppOpsService extends IAppOpsService.Stub {
ops.put(code, new Op(uidState, packageName, code, uid));
}
}
+
+ createSandboxUidStateIfNotExistsForAppLocked(uid);
}
/**
@@ -4011,6 +4015,11 @@ public class AppOpsService extends IAppOpsService.Stub {
return uidState;
}
+ private void createSandboxUidStateIfNotExistsForAppLocked(int uid) {
+ final int sandboxUid = Process.toSdkSandboxUid(uid);
+ getUidStateLocked(sandboxUid, true);
+ }
+
private void updateAppWidgetVisibility(SparseArray<String> uidPackageNames, boolean visible) {
synchronized (this) {
getUidStateTracker().updateAppWidgetVisibility(uidPackageNames, visible);
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index d4b72c1770f7..4f6c6d61ee6f 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -38,6 +38,7 @@ import static android.provider.Settings.Secure.VOLUME_HUSH_MUTE;
import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
import static android.provider.Settings.Secure.VOLUME_HUSH_VIBRATE;
+import static com.android.media.audio.Flags.alarmMinVolumeZero;
import static com.android.media.audio.Flags.bluetoothMacAddressAnonymization;
import static com.android.media.audio.Flags.disablePrescaleAbsoluteVolume;
import static com.android.server.audio.SoundDoseHelper.ACTION_CHECK_MUSIC_ACTIVE;
@@ -94,6 +95,7 @@ import android.hardware.usb.UsbManager;
import android.hidl.manager.V1_0.IServiceManager;
import android.media.AudioAttributes;
import android.media.AudioAttributes.AttributeSystemUsage;
+import android.media.AudioDescriptor;
import android.media.AudioDeviceAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioDeviceVolumeManager;
@@ -106,6 +108,7 @@ import android.media.AudioManager.AudioDeviceCategory;
import android.media.AudioManagerInternal;
import android.media.AudioMixerAttributes;
import android.media.AudioPlaybackConfiguration;
+import android.media.AudioProfile;
import android.media.AudioRecordingConfiguration;
import android.media.AudioRoutesInfo;
import android.media.AudioSystem;
@@ -233,6 +236,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -1191,6 +1195,19 @@ public class AudioService extends IAudioService.Stub
MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM] = maxAlarmVolume;
}
+ if (alarmMinVolumeZero()) {
+ try {
+ int minAlarmVolume = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_audio_alarm_min_vol);
+ if (minAlarmVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM]) {
+ MIN_STREAM_VOLUME[AudioSystem.STREAM_ALARM] = minAlarmVolume;
+ } else {
+ Log.e(TAG, "Error min alarm volume greater than max alarm volume");
+ }
+ } catch (Resources.NotFoundException e) {
+ Log.e(TAG, "Error querying for alarm min volume ", e);
+ }
+ }
int defaultAlarmVolume = SystemProperties.getInt("ro.config.alarm_vol_default", -1);
if (defaultAlarmVolume != -1 &&
defaultAlarmVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM]) {
@@ -4600,7 +4617,7 @@ public class AudioService extends IAudioService.Stub
}
private void setStreamVolume(int streamType, int index, int flags,
- @NonNull AudioDeviceAttributes ada,
+ @Nullable AudioDeviceAttributes ada,
String callingPackage, String caller, String attributionTag, int uid,
boolean hasModifyAudioSettings,
boolean canChangeMuteAndUpdateController) {
@@ -4618,7 +4635,9 @@ public class AudioService extends IAudioService.Stub
int streamTypeAlias = mStreamVolumeAlias[streamType];
VolumeStreamState streamState = mStreamStates[streamTypeAlias];
- final int device = ada.getInternalType();
+ final int device = (ada == null)
+ ? getDeviceForStream(streamType)
+ : ada.getInternalType();
int oldIndex;
// skip a2dp absolute volume control request when the device
@@ -7671,6 +7690,13 @@ public class AudioService extends IAudioService.Stub
@Retention(RetentionPolicy.SOURCE)
public @interface ConnectionState {}
+ /**
+ * Default SAD for a TV using ARC, used when the Amplifier didn't report any SADs.
+ * Represents 2-channel LPCM including all defined sample rates and bit depths.
+ * For the format definition, see Table 34 in the CEA standard CEA-861-D.
+ */
+ private static final byte[] DEFAULT_ARC_AUDIO_DESCRIPTOR = new byte[]{0x09, 0x7f, 0x07};
+
@android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
/**
* see AudioManager.setWiredDeviceConnectionState()
@@ -7682,6 +7708,27 @@ public class AudioService extends IAudioService.Stub
attributes = retrieveBluetoothAddress(attributes);
+ // When using ARC, a TV should use default 2 channel LPCM if the Amplifier didn't
+ // report any SADs. See section 13.15.3 of the HDMI-CEC spec version 1.4b.
+ if (attributes.getType() == AudioDeviceInfo.TYPE_HDMI_ARC
+ && attributes.getRole() == AudioDeviceAttributes.ROLE_OUTPUT
+ && attributes.getAudioDescriptors().isEmpty()) {
+ attributes = new AudioDeviceAttributes(
+ attributes.getRole(),
+ attributes.getType(),
+ attributes.getAddress(),
+ attributes.getName(),
+ attributes.getAudioProfiles(),
+ new ArrayList<AudioDescriptor>(Collections.singletonList(
+ new AudioDescriptor(
+ AudioDescriptor.STANDARD_EDID,
+ AudioProfile.AUDIO_ENCAPSULATION_TYPE_NONE,
+ DEFAULT_ARC_AUDIO_DESCRIPTOR
+ )
+ ))
+ );
+ }
+
if (state != CONNECTION_STATE_CONNECTED
&& state != CONNECTION_STATE_DISCONNECTED) {
throw new IllegalArgumentException("Invalid state " + state);
@@ -10665,8 +10712,8 @@ public class AudioService extends IAudioService.Stub
/** @see LoudnessCodecConfigurator#addMediaCodec(MediaCodec) */
@Override
- public void addLoudnessCodecInfo(int piid, LoudnessCodecInfo codecInfo) {
- mLoudnessCodecHelper.addLoudnessCodecInfo(piid, codecInfo);
+ public void addLoudnessCodecInfo(int piid, int mediaCodecHash, LoudnessCodecInfo codecInfo) {
+ mLoudnessCodecHelper.addLoudnessCodecInfo(piid, mediaCodecHash, codecInfo);
}
/** @see LoudnessCodecConfigurator#removeMediaCodec(MediaCodec) */
@@ -11370,6 +11417,8 @@ public class AudioService extends IAudioService.Stub
static final int LOG_NB_EVENTS_SPATIAL = 30;
static final int LOG_NB_EVENTS_SOUND_DOSE = 30;
+ static final int LOG_NB_EVENTS_LOUDNESS_CODEC = 30;
+
static final EventLogger
sLifecycleLogger = new EventLogger(LOG_NB_EVENTS_LIFECYCLE,
"audio services lifecycle");
@@ -11569,6 +11618,10 @@ public class AudioService extends IAudioService.Stub
mSpatializerHelper.dump(pw);
sSpatialLogger.dump(pw);
+ pw.println("\n");
+ pw.println("\nLoudness alignment:");
+ mLoudnessCodecHelper.dump(pw);
+
mAudioSystem.dump(pw);
}
diff --git a/services/core/java/com/android/server/audio/AudioServiceEvents.java b/services/core/java/com/android/server/audio/AudioServiceEvents.java
index f69b9f6523cc..de8901179028 100644
--- a/services/core/java/com/android/server/audio/AudioServiceEvents.java
+++ b/services/core/java/com/android/server/audio/AudioServiceEvents.java
@@ -622,6 +622,55 @@ public class AudioServiceEvents {
}
}
+ static final class LoudnessEvent extends EventLogger.Event {
+ static final int START_PIID = 0;
+
+ static final int STOP_PIID = 1;
+
+ static final int CLIENT_DIED = 2;
+
+ final int mEventType;
+ final int mIntValue1;
+ final int mIntValue2;
+
+ private LoudnessEvent(int event, int i1, int i2) {
+ mEventType = event;
+ mIntValue1 = i1;
+ mIntValue2 = i2;
+ }
+
+ static LoudnessEvent getStartPiid(int piid, int pid) {
+ return new LoudnessEvent(START_PIID, piid, pid);
+ }
+
+ static LoudnessEvent getStopPiid(int piid, int pid) {
+ return new LoudnessEvent(STOP_PIID, piid, pid);
+ }
+
+ static LoudnessEvent getClientDied(int pid) {
+ return new LoudnessEvent(CLIENT_DIED, 0 /* ignored */, pid);
+ }
+
+
+ @Override
+ public String eventToString() {
+ switch (mEventType) {
+ case START_PIID:
+ return String.format(
+ "Start loudness updates for piid %d for client pid %d",
+ mIntValue1, mIntValue2);
+ case STOP_PIID:
+ return String.format(
+ "Stop loudness updates for piid %d for client pid %d",
+ mIntValue1, mIntValue2);
+ case CLIENT_DIED:
+ return String.format("Loudness client with pid %d died", mIntValue2);
+
+ }
+ return new StringBuilder("FIXME invalid event type:").append(mEventType).toString();
+ }
+ }
+
/**
* Class to log stream type mute/unmute events
*/
diff --git a/services/core/java/com/android/server/audio/LoudnessCodecHelper.java b/services/core/java/com/android/server/audio/LoudnessCodecHelper.java
index 3c67e9dd116b..bbe819f22e3a 100644
--- a/services/core/java/com/android/server/audio/LoudnessCodecHelper.java
+++ b/services/core/java/com/android/server/audio/LoudnessCodecHelper.java
@@ -21,6 +21,11 @@ import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_HEADPHONES;
import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_HEARING_AID;
import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_WATCH;
import static android.media.AudioPlaybackConfiguration.PLAYER_DEVICEID_INVALID;
+import static android.media.LoudnessCodecInfo.CodecMetadataType.CODEC_METADATA_TYPE_MPEG_4;
+import static android.media.LoudnessCodecInfo.CodecMetadataType.CODEC_METADATA_TYPE_MPEG_D;
+import static android.media.MediaFormat.KEY_AAC_DRC_EFFECT_TYPE;
+import static android.media.MediaFormat.KEY_AAC_DRC_HEAVY_COMPRESSION;
+import static android.media.MediaFormat.KEY_AAC_DRC_TARGET_REFERENCE_LEVEL;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -41,7 +46,11 @@ import android.util.SparseArray;
import android.util.SparseIntArray;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.audio.AudioServiceEvents.LoudnessEvent;
+import com.android.server.utils.EventLogger;
+import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -50,6 +59,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
+import java.util.stream.Collectors;
/**
* Class to handle the updates in loudness parameters and responsible to generate parameters that
@@ -70,10 +80,14 @@ public class LoudnessCodecHelper {
private static final String SYSTEM_PROPERTY_SPEAKER_SPL_RANGE_SIZE =
"audio.loudness.builtin-speaker-spl-range-size";
- private static final int SPL_RANGE_UNKNOWN = 0;
- private static final int SPL_RANGE_SMALL = 1;
- private static final int SPL_RANGE_MEDIUM = 2;
- private static final int SPL_RANGE_LARGE = 3;
+ @VisibleForTesting
+ static final int SPL_RANGE_UNKNOWN = 0;
+ @VisibleForTesting
+ static final int SPL_RANGE_SMALL = 1;
+ @VisibleForTesting
+ static final int SPL_RANGE_MEDIUM = 2;
+ @VisibleForTesting
+ static final int SPL_RANGE_LARGE = 3;
/** The possible transducer SPL ranges as defined in CTA2075 */
@IntDef({
@@ -99,12 +113,19 @@ public class LoudnessCodecHelper {
pid = (Integer) cookie;
}
if (pid != null) {
- mLoudnessCodecHelper.removePid(pid);
+ if (DEBUG) {
+ Log.d(TAG, "Client with pid " + pid + " died, removing from receiving updates");
+ }
+ sLogger.enqueue(LoudnessEvent.getClientDied(pid));
+ mLoudnessCodecHelper.onClientPidDied(pid);
}
super.onCallbackDied(callback, cookie);
}
}
+ private static final EventLogger sLogger = new EventLogger(
+ AudioService.LOG_NB_EVENTS_LOUDNESS_CODEC, "Loudness updates");
+
private final LoudnessRemoteCallbackList mLoudnessUpdateDispatchers =
new LoudnessRemoteCallbackList(this);
@@ -125,7 +146,8 @@ public class LoudnessCodecHelper {
private final AudioService mAudioService;
/** Contains the properties necessary to compute the codec loudness related parameters. */
- private static final class LoudnessCodecInputProperties {
+ @VisibleForTesting
+ static final class LoudnessCodecInputProperties {
private final int mMetadataType;
private final boolean mIsDownmixing;
@@ -200,10 +222,53 @@ public class LoudnessCodecHelper {
}
PersistableBundle createLoudnessParameters() {
- // TODO: create bundle with new parameters
- return new PersistableBundle();
- }
+ PersistableBundle loudnessParams = new PersistableBundle();
+
+ switch (mDeviceSplRange) {
+ case SPL_RANGE_LARGE:
+ // corresponds to -31dB attenuation
+ loudnessParams.putInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL, 124);
+ if (mMetadataType == CODEC_METADATA_TYPE_MPEG_4) {
+ loudnessParams.putInt(KEY_AAC_DRC_HEAVY_COMPRESSION, 0);
+ } else if (mMetadataType == CODEC_METADATA_TYPE_MPEG_D) {
+ // general compression
+ loudnessParams.putInt(KEY_AAC_DRC_EFFECT_TYPE, 6);
+ }
+ break;
+ case SPL_RANGE_MEDIUM:
+ // corresponds to -24dB attenuation
+ loudnessParams.putInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL, 96);
+ if (mMetadataType == CODEC_METADATA_TYPE_MPEG_4) {
+ loudnessParams.putInt(KEY_AAC_DRC_HEAVY_COMPRESSION, mIsDownmixing ? 1 : 0);
+ } else if (mMetadataType == CODEC_METADATA_TYPE_MPEG_D) {
+ // general compression
+ loudnessParams.putInt(KEY_AAC_DRC_EFFECT_TYPE, 6);
+ }
+ break;
+ case SPL_RANGE_SMALL:
+ // corresponds to -16dB attenuation
+ loudnessParams.putInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL, 64);
+ if (mMetadataType == CODEC_METADATA_TYPE_MPEG_4) {
+ loudnessParams.putInt(KEY_AAC_DRC_HEAVY_COMPRESSION, 1);
+ } else if (mMetadataType == CODEC_METADATA_TYPE_MPEG_D) {
+ // limited playback range compression
+ loudnessParams.putInt(KEY_AAC_DRC_EFFECT_TYPE, 3);
+ }
+ break;
+ default:
+ // corresponds to -24dB attenuation
+ loudnessParams.putInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL, 96);
+ if (mMetadataType == CODEC_METADATA_TYPE_MPEG_4) {
+ loudnessParams.putInt(KEY_AAC_DRC_HEAVY_COMPRESSION, mIsDownmixing ? 1 : 0);
+ } else if (mMetadataType == CODEC_METADATA_TYPE_MPEG_D) {
+ // general compression
+ loudnessParams.putInt(KEY_AAC_DRC_EFFECT_TYPE, 6);
+ }
+ break;
+ }
+ return loudnessParams;
+ }
}
@GuardedBy("mLock")
@@ -227,22 +292,25 @@ public class LoudnessCodecHelper {
if (DEBUG) {
Log.d(TAG, "startLoudnessCodecUpdates: piid " + piid + " codecInfos " + codecInfoList);
}
- Set<LoudnessCodecInfo> infoSet;
+
synchronized (mLock) {
if (mStartedPiids.contains(piid)) {
Log.w(TAG, "Already started loudness updates for piid " + piid);
return;
}
- infoSet = new HashSet<>(codecInfoList);
+ Set<LoudnessCodecInfo> infoSet = new HashSet<>(codecInfoList);
mStartedPiids.put(piid, infoSet);
- mPiidToPidCache.put(piid, Binder.getCallingPid());
+ int pid = Binder.getCallingPid();
+ mPiidToPidCache.put(piid, pid);
+
+ sLogger.enqueue(LoudnessEvent.getStartPiid(piid, pid));
}
try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
mAudioService.getActivePlaybackConfigurations().stream().filter(
conf -> conf.getPlayerInterfaceId() == piid).findFirst().ifPresent(
- apc -> updateCodecParametersForConfiguration(apc, infoSet));
+ this::updateCodecParametersForConfiguration);
}
}
@@ -250,20 +318,24 @@ public class LoudnessCodecHelper {
if (DEBUG) {
Log.d(TAG, "stopLoudnessCodecUpdates: piid " + piid);
}
+
synchronized (mLock) {
if (!mStartedPiids.contains(piid)) {
Log.w(TAG, "Loudness updates are already stopped for piid " + piid);
return;
}
mStartedPiids.remove(piid);
+
+ sLogger.enqueue(LoudnessEvent.getStopPiid(piid, mPiidToPidCache.get(piid, -1)));
mPiidToDeviceIdCache.delete(piid);
mPiidToPidCache.delete(piid);
}
}
- void addLoudnessCodecInfo(int piid, LoudnessCodecInfo info) {
+ void addLoudnessCodecInfo(int piid, int mediaCodecHash, LoudnessCodecInfo info) {
if (DEBUG) {
- Log.d(TAG, "addLoudnessCodecInfo: piid " + piid + " info " + info);
+ Log.d(TAG, "addLoudnessCodecInfo: piid " + piid + " mcHash " + mediaCodecHash + " info "
+ + info);
}
Set<LoudnessCodecInfo> infoSet;
@@ -280,7 +352,20 @@ public class LoudnessCodecHelper {
try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
mAudioService.getActivePlaybackConfigurations().stream().filter(
conf -> conf.getPlayerInterfaceId() == piid).findFirst().ifPresent(
- apc -> updateCodecParametersForConfiguration(apc, Set.of(info)));
+ apc -> {
+ final AudioDeviceInfo deviceInfo = apc.getAudioDeviceInfo();
+ if (deviceInfo != null) {
+ PersistableBundle updateBundle = new PersistableBundle();
+ synchronized (mLock) {
+ updateBundle.putPersistableBundle(
+ Integer.toString(mediaCodecHash),
+ getCodecBundle_l(deviceInfo, info));
+ }
+ if (!updateBundle.isDefinitelyEmpty()) {
+ dispatchNewLoudnessParameters(piid, updateBundle);
+ }
+ }
+ });
}
}
@@ -298,24 +383,6 @@ public class LoudnessCodecHelper {
}
}
- void removePid(int pid) {
- if (DEBUG) {
- Log.d(TAG, "Removing pid " + pid + " from receiving updates");
- }
- synchronized (mLock) {
- for (int i = 0; i < mPiidToPidCache.size(); ++i) {
- int piid = mPiidToPidCache.keyAt(i);
- if (mPiidToPidCache.get(piid) == pid) {
- if (DEBUG) {
- Log.d(TAG, "Removing piid " + piid);
- }
- mStartedPiids.delete(piid);
- mPiidToDeviceIdCache.delete(piid);
- }
- }
- }
- }
-
PersistableBundle getLoudnessParams(int piid, LoudnessCodecInfo codecInfo) {
if (DEBUG) {
Log.d(TAG, "getLoudnessParams: piid " + piid + " codecInfo " + codecInfo);
@@ -381,48 +448,77 @@ public class LoudnessCodecHelper {
}
}
- updateApcList.forEach(apc -> updateCodecParametersForConfiguration(apc, null));
+ updateApcList.forEach(apc -> updateCodecParametersForConfiguration(apc));
+ }
+
+ /** Updates and dispatches the new loudness parameters for all its registered codecs. */
+ void dump(PrintWriter pw) {
+ // Registered clients
+ pw.println("\nRegistered clients:\n");
+ synchronized (mLock) {
+ for (int i = 0; i < mStartedPiids.size(); ++i) {
+ int piid = mStartedPiids.keyAt(i);
+ int pid = mPiidToPidCache.get(piid, -1);
+ final Set<LoudnessCodecInfo> codecInfos = mStartedPiids.get(piid);
+ pw.println(String.format("Player piid %d pid %d active codec types %s\n", piid,
+ pid, codecInfos.stream().map(Object::toString).collect(
+ Collectors.joining(", "))));
+ }
+ pw.println();
+ }
+
+ sLogger.dump(pw);
+ pw.println();
}
- /** Updates and dispatches the new loudness parameters for the {@code codecInfos} set.
+ private void onClientPidDied(int pid) {
+ synchronized (mLock) {
+ for (int i = 0; i < mPiidToPidCache.size(); ++i) {
+ int piid = mPiidToPidCache.keyAt(i);
+ if (mPiidToPidCache.get(piid) == pid) {
+ if (DEBUG) {
+ Log.d(TAG, "Removing piid " + piid);
+ }
+ mStartedPiids.delete(piid);
+ mPiidToDeviceIdCache.delete(piid);
+ }
+ }
+ }
+ }
+
+ /**
+ * Updates and dispatches the new loudness parameters for the {@code codecInfos} set.
*
* @param apc the player configuration for which the loudness parameters are updated.
- * @param codecInfos the codec info for which the parameters are updated. If {@code null},
- * send updates for all the started codecs assigned to {@code apc}
*/
- private void updateCodecParametersForConfiguration(AudioPlaybackConfiguration apc,
- Set<LoudnessCodecInfo> codecInfos) {
+ private void updateCodecParametersForConfiguration(AudioPlaybackConfiguration apc) {
if (DEBUG) {
- Log.d(TAG, "updateCodecParametersForConfiguration apc:" + apc + " codecInfos: "
- + codecInfos);
+ Log.d(TAG, "updateCodecParametersForConfiguration apc:" + apc);
}
+
final PersistableBundle allBundles = new PersistableBundle();
final int piid = apc.getPlayerInterfaceId();
+
synchronized (mLock) {
- if (codecInfos == null) {
- codecInfos = mStartedPiids.get(piid);
- }
+ final Set<LoudnessCodecInfo> codecInfos = mStartedPiids.get(piid);
final AudioDeviceInfo deviceInfo = apc.getAudioDeviceInfo();
if (codecInfos != null && deviceInfo != null) {
for (LoudnessCodecInfo info : codecInfos) {
- allBundles.putPersistableBundle(Integer.toString(info.mediaCodecHashCode),
+ allBundles.putPersistableBundle(Integer.toString(info.hashCode()),
getCodecBundle_l(deviceInfo, info));
}
}
}
if (!allBundles.isDefinitelyEmpty()) {
- if (DEBUG) {
- Log.d(TAG, "Dispatching for piid: " + piid + " bundle: " + allBundles);
- }
dispatchNewLoudnessParameters(piid, allBundles);
}
}
private void dispatchNewLoudnessParameters(int piid, PersistableBundle bundle) {
if (DEBUG) {
- Log.d(TAG, "dispatchNewLoudnessParameters: piid " + piid);
+ Log.d(TAG, "dispatchNewLoudnessParameters: piid " + piid + " bundle: " + bundle);
}
final int nbDispatchers = mLoudnessUpdateDispatchers.beginBroadcast();
for (int i = 0; i < nbDispatchers; ++i) {
diff --git a/services/core/java/com/android/server/audio/SpatializerHelper.java b/services/core/java/com/android/server/audio/SpatializerHelper.java
index 61e4f36a34ed..4f7f31dfa7dc 100644
--- a/services/core/java/com/android/server/audio/SpatializerHelper.java
+++ b/services/core/java/com/android/server/audio/SpatializerHelper.java
@@ -1016,6 +1016,11 @@ public class SpatializerHelper {
if (mSpat == null) {
mSpatCallback = new SpatializerCallback();
mSpat = AudioSystem.getSpatializer(mSpatCallback);
+ if (mSpat == null) {
+ Log.e(TAG, "createSpat(): No Spatializer found");
+ postReset();
+ return;
+ }
try {
//TODO: register heatracking callback only when sensors are registered
if (mIsHeadTrackingSupported) {
diff --git a/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java b/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java
index 745222873698..95a047faef07 100644
--- a/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java
+++ b/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java
@@ -116,8 +116,10 @@ public final class BiometricContextProvider implements BiometricContext {
service.setBiometicContextListener(new IBiometricContextListener.Stub() {
@Override
public void onFoldChanged(int foldState) {
- mFoldState = foldState;
- // no need to notify, not sent to HAL
+ if (mFoldState != foldState) {
+ mFoldState = foldState;
+ notifyChanged();
+ }
}
@Override
@@ -254,6 +256,7 @@ public final class BiometricContextProvider implements BiometricContext {
+ "isAwake: " + isAwake() + ", "
+ "isDisplayOn: " + isDisplayOn() + ", "
+ "dock: " + getDockedState() + ", "
- + "rotation: " + getCurrentRotation() + "]";
+ + "rotation: " + getCurrentRotation() + ", "
+ + "foldState: " + mFoldState + "]";
}
}
diff --git a/services/core/java/com/android/server/biometrics/log/OperationContextExt.java b/services/core/java/com/android/server/biometrics/log/OperationContextExt.java
index f78ca43253f6..b4e0dff615f5 100644
--- a/services/core/java/com/android/server/biometrics/log/OperationContextExt.java
+++ b/services/core/java/com/android/server/biometrics/log/OperationContextExt.java
@@ -23,6 +23,7 @@ import android.hardware.biometrics.AuthenticateOptions;
import android.hardware.biometrics.IBiometricContextListener;
import android.hardware.biometrics.common.AuthenticateReason;
import android.hardware.biometrics.common.DisplayState;
+import android.hardware.biometrics.common.FoldState;
import android.hardware.biometrics.common.OperationContext;
import android.hardware.biometrics.common.OperationReason;
import android.hardware.biometrics.common.WakeReason;
@@ -250,6 +251,7 @@ public class OperationContextExt {
OperationContextExt update(@NonNull BiometricContext biometricContext, boolean isCrypto) {
mAidlContext.isAod = biometricContext.isAod();
mAidlContext.displayState = toAidlDisplayState(biometricContext.getDisplayState());
+ mAidlContext.foldState = toAidlFoldState(biometricContext.getFoldState());
mAidlContext.isCrypto = isCrypto;
setFirstSessionId(biometricContext);
@@ -276,6 +278,19 @@ public class OperationContextExt {
return DisplayState.UNKNOWN;
}
+ @FoldState
+ private static int toAidlFoldState(@IBiometricContextListener.FoldState int state) {
+ switch (state) {
+ case IBiometricContextListener.FoldState.FULLY_CLOSED:
+ return FoldState.FULLY_CLOSED;
+ case IBiometricContextListener.FoldState.FULLY_OPENED:
+ return FoldState.FULLY_OPENED;
+ case IBiometricContextListener.FoldState.HALF_OPENED:
+ return FoldState.HALF_OPENED;
+ }
+ return FoldState.UNKNOWN;
+ }
+
private void setFirstSessionId(@NonNull BiometricContext biometricContext) {
if (mIsBP) {
mSessionInfo = biometricContext.getBiometricPromptSessionInfo();
diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java
index 5bb5c53f6d5e..a7965441274c 100644
--- a/services/core/java/com/android/server/camera/CameraServiceProxy.java
+++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java
@@ -52,7 +52,6 @@ import android.hardware.display.DisplayManager;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.media.AudioManager;
-import android.nfc.INfcAdapter;
import android.nfc.NfcAdapter;
import android.nfc.NfcManager;
import android.os.Binder;
@@ -1281,45 +1280,19 @@ public class CameraServiceProxy extends SystemService
}
}
- // TODO(b/303286040): Remove the raw INfcAdapter usage once |ENABLE_NFC_MAINLINE_FLAG| is
- // rolled out.
- private static final String NFC_SERVICE_BINDER_NAME = "nfc";
- // Flags arguments to NFC adapter to enable/disable NFC
- public static final int DISABLE_POLLING_FLAGS = 0x1000;
- public static final int ENABLE_POLLING_FLAGS = 0x0000;
- private void setNfcReaderModeUsingINfcAdapter(boolean enablePolling) {
- IBinder nfcServiceBinder = getBinderService(NFC_SERVICE_BINDER_NAME);
- if (nfcServiceBinder == null) {
+ private void notifyNfcService(boolean enablePolling) {
+ NfcManager nfcManager = mContext.getSystemService(NfcManager.class);
+ if (nfcManager == null) {
Slog.w(TAG, "Could not connect to NFC service to notify it of camera state");
return;
}
- INfcAdapter nfcAdapterRaw = INfcAdapter.Stub.asInterface(nfcServiceBinder);
- int flags = enablePolling ? ENABLE_POLLING_FLAGS : DISABLE_POLLING_FLAGS;
- if (DEBUG) Slog.v(TAG, "Setting NFC reader mode to flags " + flags);
- try {
- nfcAdapterRaw.setReaderMode(nfcInterfaceToken, null, flags, null);
- } catch (RemoteException e) {
- Slog.w(TAG, "Could not notify NFC service, remote exception: " + e);
- }
- }
-
- private void notifyNfcService(boolean enablePolling) {
- if (android.nfc.Flags.enableNfcMainline()) {
- NfcManager nfcManager = mContext.getSystemService(NfcManager.class);
- if (nfcManager == null) {
- Slog.w(TAG, "Could not connect to NFC service to notify it of camera state");
- return;
- }
- NfcAdapter nfcAdapter = nfcManager.getDefaultAdapter();
- if (nfcAdapter == null) {
- Slog.w(TAG, "Could not connect to NFC service to notify it of camera state");
- return;
- }
- if (DEBUG) Slog.v(TAG, "Setting NFC reader mode. enablePolling: " + enablePolling);
- nfcAdapter.setReaderMode(enablePolling);
- } else {
- setNfcReaderModeUsingINfcAdapter(enablePolling);
+ NfcAdapter nfcAdapter = nfcManager.getDefaultAdapter();
+ if (nfcAdapter == null) {
+ Slog.w(TAG, "Could not connect to NFC service to notify it of camera state");
+ return;
}
+ if (DEBUG) Slog.v(TAG, "Setting NFC reader mode. enablePolling: " + enablePolling);
+ nfcAdapter.setReaderMode(enablePolling);
}
private static int[] toArray(Collection<Integer> c) {
diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java
index b394fb5b3afe..56a94ec06ad4 100644
--- a/services/core/java/com/android/server/clipboard/ClipboardService.java
+++ b/services/core/java/com/android/server/clipboard/ClipboardService.java
@@ -56,6 +56,7 @@ import android.graphics.drawable.Drawable;
import android.hardware.display.DisplayManager;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
@@ -67,7 +68,6 @@ import android.os.Parcel;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.DeviceConfig;
@@ -116,8 +116,6 @@ import java.util.function.Consumer;
public class ClipboardService extends SystemService {
private static final String TAG = "ClipboardService";
- private static final boolean IS_EMULATOR =
- SystemProperties.getBoolean("ro.boot.qemu", false);
@VisibleForTesting
public static final long DEFAULT_CLIPBOARD_TIMEOUT_MILLIS = 3600000;
@@ -193,7 +191,7 @@ public class ClipboardService extends SystemService {
mAutofillInternal = LocalServices.getService(AutofillManagerInternal.class);
final IBinder permOwner = mUgmInternal.newUriPermissionOwner("clipboard");
mPermissionOwner = permOwner;
- if (IS_EMULATOR) {
+ if (Build.IS_EMULATOR) {
mEmulatorClipboardMonitor = new EmulatorClipboardMonitor((clip) -> {
synchronized (mLock) {
Clipboard clipboard = getClipboardLocked(0, DEVICE_ID_DEFAULT);
diff --git a/services/core/java/com/android/server/companion/virtual/VirtualDeviceManagerInternal.java b/services/core/java/com/android/server/companion/virtual/VirtualDeviceManagerInternal.java
index be78ea20d09d..cecde55ef89f 100644
--- a/services/core/java/com/android/server/companion/virtual/VirtualDeviceManagerInternal.java
+++ b/services/core/java/com/android/server/companion/virtual/VirtualDeviceManagerInternal.java
@@ -149,6 +149,14 @@ public abstract class VirtualDeviceManagerInternal {
public abstract @NonNull ArraySet<Integer> getDisplayIdsForDevice(int deviceId);
/**
+ * Returns the ID of the device which owns the display with the given ID.
+ *
+ * <p>In case the virtual display ID is invalid or doesn't belong to a virtual device, then
+ * {@link android.content.Context#DEVICE_ID_DEFAULT} is returned.</p>
+ */
+ public abstract int getDeviceIdForDisplayId(int displayId);
+
+ /**
* Gets the persistent ID for the VirtualDevice with the given device ID.
*
* @param deviceId which device we're asking about
diff --git a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
index debf828abf0a..d848f4b6cce5 100644
--- a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
+++ b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
@@ -121,6 +121,7 @@ public abstract class BrightnessMappingStrategy {
// Display independent, mode dependent values
float[] brightnessLevelsNits;
+ float[] brightnessLevels = null;
float[] luxLevels;
if (isForIdleMode) {
brightnessLevelsNits = getFloatArray(resources.obtainTypedArray(
@@ -130,11 +131,21 @@ public abstract class BrightnessMappingStrategy {
} else {
brightnessLevelsNits = displayDeviceConfig.getAutoBrightnessBrighteningLevelsNits();
luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux();
+
+ brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels();
+ if (brightnessLevels == null || brightnessLevels.length == 0) {
+ // Load the old configuration in the range [0, 255]. The values need to be
+ // normalized to the range [0, 1].
+ int[] brightnessLevelsInt = resources.getIntArray(
+ com.android.internal.R.array.config_autoBrightnessLcdBacklightValues);
+ brightnessLevels = new float[brightnessLevelsInt.length];
+ for (int i = 0; i < brightnessLevels.length; i++) {
+ brightnessLevels[i] = normalizeAbsoluteBrightness(brightnessLevelsInt[i]);
+ }
+ }
}
// Display independent, mode independent values
- int[] brightnessLevelsBacklight = resources.getIntArray(
- com.android.internal.R.array.config_autoBrightnessLcdBacklightValues);
float autoBrightnessAdjustmentMaxGamma = resources.getFraction(
com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma,
1, 1);
@@ -155,8 +166,8 @@ public abstract class BrightnessMappingStrategy {
builder.setShortTermModelUpperLuxMultiplier(SHORT_TERM_MODEL_THRESHOLD_RATIO);
return new PhysicalMappingStrategy(builder.build(), nitsRange, brightnessRange,
autoBrightnessAdjustmentMaxGamma, isForIdleMode, displayWhiteBalanceController);
- } else if (isValidMapping(luxLevels, brightnessLevelsBacklight) && !isForIdleMode) {
- return new SimpleMappingStrategy(luxLevels, brightnessLevelsBacklight,
+ } else if (isValidMapping(luxLevels, brightnessLevels)) {
+ return new SimpleMappingStrategy(luxLevels, brightnessLevels,
autoBrightnessAdjustmentMaxGamma, shortTermModelTimeout);
} else {
return null;
@@ -620,7 +631,7 @@ public abstract class BrightnessMappingStrategy {
private float mUserBrightness;
private long mShortTermModelTimeout;
- private SimpleMappingStrategy(float[] lux, int[] brightness, float maxGamma,
+ private SimpleMappingStrategy(float[] lux, float[] brightness, float maxGamma,
long timeout) {
Preconditions.checkArgument(lux.length != 0 && brightness.length != 0,
"Lux and brightness arrays must not be empty!");
@@ -635,7 +646,7 @@ public abstract class BrightnessMappingStrategy {
mBrightness = new float[N];
for (int i = 0; i < N; i++) {
mLux[i] = lux[i];
- mBrightness[i] = normalizeAbsoluteBrightness(brightness[i]);
+ mBrightness[i] = brightness[i];
}
mMaxGamma = maxGamma;
diff --git a/services/core/java/com/android/server/display/DisplayAdapter.java b/services/core/java/com/android/server/display/DisplayAdapter.java
index 70d4ad2c6e1f..c26118eac7a2 100644
--- a/services/core/java/com/android/server/display/DisplayAdapter.java
+++ b/services/core/java/com/android/server/display/DisplayAdapter.java
@@ -20,6 +20,8 @@ import android.content.Context;
import android.os.Handler;
import android.view.Display;
+import com.android.server.display.feature.DisplayManagerFlags;
+
import java.io.PrintWriter;
import java.util.concurrent.atomic.AtomicInteger;
@@ -39,6 +41,7 @@ abstract class DisplayAdapter {
private final Handler mHandler;
private final Listener mListener;
private final String mName;
+ private final DisplayManagerFlags mFeatureFlags;
public static final int DISPLAY_DEVICE_EVENT_ADDED = 1;
public static final int DISPLAY_DEVICE_EVENT_CHANGED = 2;
@@ -50,13 +53,14 @@ abstract class DisplayAdapter {
private static final AtomicInteger NEXT_DISPLAY_MODE_ID = new AtomicInteger(1); // 0 = no mode.
// Called with SyncRoot lock held.
- public DisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
- Context context, Handler handler, Listener listener, String name) {
+ DisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context, Handler handler,
+ Listener listener, String name, DisplayManagerFlags featureFlags) {
mSyncRoot = syncRoot;
mContext = context;
mHandler = handler;
mListener = listener;
mName = name;
+ mFeatureFlags = featureFlags;
}
/**
@@ -88,6 +92,10 @@ abstract class DisplayAdapter {
return mName;
}
+ public final DisplayManagerFlags getFeatureFlags() {
+ return mFeatureFlags;
+ }
+
/**
* Registers the display adapter with the display manager.
*
diff --git a/services/core/java/com/android/server/display/DisplayDevice.java b/services/core/java/com/android/server/display/DisplayDevice.java
index 2fdf90d7d286..3b05b47eb542 100644
--- a/services/core/java/com/android/server/display/DisplayDevice.java
+++ b/services/core/java/com/android/server/display/DisplayDevice.java
@@ -400,6 +400,7 @@ abstract class DisplayDevice {
}
private DisplayDeviceConfig loadDisplayDeviceConfig() {
- return DisplayDeviceConfig.create(mContext, false);
+ return DisplayDeviceConfig.create(mContext, /* useConfigXml= */ false,
+ mDisplayAdapter.getFeatureFlags());
}
}
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index b99de5cc0c7b..d97127c91fbf 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -57,6 +57,7 @@ import com.android.server.display.config.HdrBrightnessData;
import com.android.server.display.config.HighBrightnessMode;
import com.android.server.display.config.IntegerArray;
import com.android.server.display.config.LuxThrottling;
+import com.android.server.display.config.LuxToBrightnessMapping;
import com.android.server.display.config.NitsMap;
import com.android.server.display.config.NonNegativeFloatToFloatPoint;
import com.android.server.display.config.Point;
@@ -77,6 +78,7 @@ import com.android.server.display.config.ThermalThrottling;
import com.android.server.display.config.ThresholdPoint;
import com.android.server.display.config.UsiVersion;
import com.android.server.display.config.XmlParser;
+import com.android.server.display.feature.DisplayManagerFlags;
import com.android.server.display.utils.DebugUtils;
import org.xmlpull.v1.XmlPullParserException;
@@ -310,16 +312,18 @@ import javax.xml.datatype.DatatypeConfigurationException;
* <darkeningLightDebounceIdleMillis>
* 1000
* </darkeningLightDebounceIdleMillis>
- * <displayBrightnessMapping>
- * <displayBrightnessPoint>
- * <lux>50</lux>
- * <nits>45.32</nits>
- * </displayBrightnessPoint>
- * <displayBrightnessPoint>
- * <lux>80</lux>
- * <nits>75.43</nits>
- * </displayBrightnessPoint>
- * </displayBrightnessMapping>
+ * <luxToBrightnessMapping>
+ * <map>
+ * <point>
+ * <first>0</first>
+ * <second>0.2</second>
+ * </point>
+ * <point>
+ * <first>80</first>
+ * <second>0.3</second>
+ * </point>
+ * </map>
+ * </luxToBrightnessMapping>
* </autoBrightness>
*
* <screenBrightnessRampFastDecrease>0.01</screenBrightnessRampFastDecrease>
@@ -528,6 +532,7 @@ import javax.xml.datatype.DatatypeConfigurationException;
* <majorVersion>2</majorVersion>
* <minorVersion>0</minorVersion>
* </usiVersion>
+ * <screenBrightnessCapForWearBedtimeMode>0.1</screenBrightnessCapForWearBedtimeMode>
* </displayConfiguration>
* }
* </pre>
@@ -629,7 +634,6 @@ public class DisplayDeviceConfig {
// for the corresponding values above
private float[] mBrightness;
-
/**
* Array of desired screen brightness in nits corresponding to the lux values
* in the mBrightnessLevelsLux array. The display brightness is defined as the
@@ -639,20 +643,25 @@ public class DisplayDeviceConfig {
private float[] mBrightnessLevelsNits;
/**
- * Array of light sensor lux values to define our levels for auto backlight
- * brightness support.
+ * Array of desired screen brightness corresponding to the lux values
+ * in the mBrightnessLevelsLux array. The brightness values must be non-negative and
+ * non-decreasing. They must be between {@link PowerManager.BRIGHTNESS_MIN} and
+ * {@link PowerManager.BRIGHTNESS_MAX}. This must be overridden in platform specific overlays
+ */
+ private float[] mBrightnessLevels;
+
+ /**
+ * Array of light sensor lux values to define our levels for auto-brightness support.
*
- * The N + 1 entries of this array define N control points defined in mBrightnessLevelsNits,
- * with first value always being 0 lux
+ * The first lux value is always 0.
*
- * The control points must be strictly increasing. Each control point
- * corresponds to an entry in the brightness backlight values arrays.
- * For example, if lux == level[1] (second element of the levels array)
- * then the brightness will be determined by value[0] (first element
- * of the brightness values array).
+ * The control points must be strictly increasing. Each control point corresponds to an entry
+ * in the brightness values arrays. For example, if lux == luxLevels[1] (second element
+ * of the levels array) then the brightness will be determined by brightnessLevels[1] (second
+ * element of the brightness values array).
*
- * Spline interpolation is used to determine the auto-brightness
- * backlight values for lux levels between these control points.
+ * Spline interpolation is used to determine the auto-brightness values for lux levels between
+ * these control points.
*/
private float[] mBrightnessLevelsLux;
@@ -843,9 +852,17 @@ public class DisplayDeviceConfig {
@Nullable
private HdrBrightnessData mHdrBrightnessData;
+ /**
+ * Maximum screen brightness setting when screen brightness capped in Wear Bedtime mode.
+ */
+ private float mBrightnessCapForWearBedtimeMode;
+
+ private final DisplayManagerFlags mFlags;
+
@VisibleForTesting
- DisplayDeviceConfig(Context context) {
+ DisplayDeviceConfig(Context context, DisplayManagerFlags flags) {
mContext = context;
+ mFlags = flags;
}
/**
@@ -861,9 +878,9 @@ public class DisplayDeviceConfig {
* @return A configuration instance for the specified display.
*/
public static DisplayDeviceConfig create(Context context, long physicalDisplayId,
- boolean isFirstDisplay) {
+ boolean isFirstDisplay, DisplayManagerFlags flags) {
final DisplayDeviceConfig config = createWithoutDefaultValues(context, physicalDisplayId,
- isFirstDisplay);
+ isFirstDisplay, flags);
config.copyUninitializedValuesFromSecondaryConfig(loadDefaultConfigurationXml(context));
return config;
@@ -878,28 +895,29 @@ public class DisplayDeviceConfig {
* or the default values.
* @return A configuration instance.
*/
- public static DisplayDeviceConfig create(Context context, boolean useConfigXml) {
+ public static DisplayDeviceConfig create(Context context, boolean useConfigXml,
+ DisplayManagerFlags flags) {
final DisplayDeviceConfig config;
if (useConfigXml) {
- config = getConfigFromGlobalXml(context);
+ config = getConfigFromGlobalXml(context, flags);
} else {
- config = getConfigFromPmValues(context);
+ config = getConfigFromPmValues(context, flags);
}
return config;
}
private static DisplayDeviceConfig createWithoutDefaultValues(Context context,
- long physicalDisplayId, boolean isFirstDisplay) {
+ long physicalDisplayId, boolean isFirstDisplay, DisplayManagerFlags flags) {
DisplayDeviceConfig config;
config = loadConfigFromDirectory(context, Environment.getProductDirectory(),
- physicalDisplayId);
+ physicalDisplayId, flags);
if (config != null) {
return config;
}
config = loadConfigFromDirectory(context, Environment.getVendorDirectory(),
- physicalDisplayId);
+ physicalDisplayId, flags);
if (config != null) {
return config;
}
@@ -907,7 +925,7 @@ public class DisplayDeviceConfig {
// If no config can be loaded from any ddc xml at all,
// prepare a whole config using the global config.xml.
// Guaranteed not null
- return create(context, isFirstDisplay);
+ return create(context, isFirstDisplay, flags);
}
private static DisplayConfiguration loadDefaultConfigurationXml(Context context) {
@@ -960,18 +978,19 @@ public class DisplayDeviceConfig {
}
private static DisplayDeviceConfig loadConfigFromDirectory(Context context,
- File baseDirectory, long physicalDisplayId) {
+ File baseDirectory, long physicalDisplayId, DisplayManagerFlags flags) {
DisplayDeviceConfig config;
// Create config using filename from physical ID (including "stable" bit).
config = getConfigFromSuffix(context, baseDirectory, STABLE_ID_SUFFIX_FORMAT,
- physicalDisplayId);
+ physicalDisplayId, flags);
if (config != null) {
return config;
}
// Create config using filename from physical ID (excluding "stable" bit).
final long withoutStableFlag = physicalDisplayId & ~STABLE_FLAG;
- config = getConfigFromSuffix(context, baseDirectory, NO_SUFFIX_FORMAT, withoutStableFlag);
+ config = getConfigFromSuffix(context, baseDirectory, NO_SUFFIX_FORMAT, withoutStableFlag,
+ flags);
if (config != null) {
return config;
}
@@ -980,7 +999,7 @@ public class DisplayDeviceConfig {
final DisplayAddress.Physical physicalAddress =
DisplayAddress.fromPhysicalDisplayId(physicalDisplayId);
int port = physicalAddress.getPort();
- config = getConfigFromSuffix(context, baseDirectory, PORT_SUFFIX_FORMAT, port);
+ config = getConfigFromSuffix(context, baseDirectory, PORT_SUFFIX_FORMAT, port, flags);
return config;
}
@@ -1599,6 +1618,13 @@ public class DisplayDeviceConfig {
}
/**
+ * @return Auto brightness brightening levels
+ */
+ public float[] getAutoBrightnessBrighteningLevels() {
+ return mBrightnessLevels;
+ }
+
+ /**
* @return Default peak refresh rate of the associated display
*/
public int getDefaultPeakRefreshRate() {
@@ -1741,6 +1767,13 @@ public class DisplayDeviceConfig {
return mHostUsiVersion;
}
+ /**
+ * @return Maximum screen brightness setting when screen brightness capped in Wear Bedtime mode.
+ */
+ public float getBrightnessCapForWearBedtimeMode() {
+ return mBrightnessCapForWearBedtimeMode;
+ }
+
@Override
public String toString() {
return "DisplayDeviceConfig{"
@@ -1844,6 +1877,7 @@ public class DisplayDeviceConfig {
+ mAutoBrightnessDarkeningLightDebounceIdle
+ ", mBrightnessLevelsLux= " + Arrays.toString(mBrightnessLevelsLux)
+ ", mBrightnessLevelsNits= " + Arrays.toString(mBrightnessLevelsNits)
+ + ", mBrightnessLevels= " + Arrays.toString(mBrightnessLevels)
+ ", mDdcAutoBrightnessAvailable= " + mDdcAutoBrightnessAvailable
+ ", mAutoBrightnessAvailable= " + mAutoBrightnessAvailable
+ "\n"
@@ -1867,36 +1901,39 @@ public class DisplayDeviceConfig {
+ ", mHighAmbientBrightnessThresholds= "
+ Arrays.toString(mHighAmbientBrightnessThresholds)
+ "\n"
- + "mScreenOffBrightnessSensorValueToLux=" + Arrays.toString(
+ + "mScreenOffBrightnessSensorValueToLux= " + Arrays.toString(
mScreenOffBrightnessSensorValueToLux)
+ "\n"
+ "mUsiVersion= " + mHostUsiVersion + "\n"
- + "mHdrBrightnessData" + mHdrBrightnessData
+ + "mHdrBrightnessData= " + mHdrBrightnessData + "\n"
+ + "mBrightnessCapForWearBedtimeMode= " + mBrightnessCapForWearBedtimeMode
+ "}";
}
private static DisplayDeviceConfig getConfigFromSuffix(Context context, File baseDirectory,
- String suffixFormat, long idNumber) {
+ String suffixFormat, long idNumber, DisplayManagerFlags flags) {
final String suffix = String.format(Locale.ROOT, suffixFormat, idNumber);
final String filename = String.format(Locale.ROOT, CONFIG_FILE_FORMAT, suffix);
final File filePath = Environment.buildPath(
baseDirectory, ETC_DIR, DISPLAY_CONFIG_DIR, filename);
- final DisplayDeviceConfig config = new DisplayDeviceConfig(context);
+ final DisplayDeviceConfig config = new DisplayDeviceConfig(context, flags);
if (config.initFromFile(filePath)) {
return config;
}
return null;
}
- private static DisplayDeviceConfig getConfigFromGlobalXml(Context context) {
- DisplayDeviceConfig config = new DisplayDeviceConfig(context);
+ private static DisplayDeviceConfig getConfigFromGlobalXml(Context context,
+ DisplayManagerFlags flags) {
+ DisplayDeviceConfig config = new DisplayDeviceConfig(context, flags);
config.initFromGlobalXml();
return config;
}
- private static DisplayDeviceConfig getConfigFromPmValues(Context context) {
- DisplayDeviceConfig config = new DisplayDeviceConfig(context);
+ private static DisplayDeviceConfig getConfigFromPmValues(Context context,
+ DisplayManagerFlags flags) {
+ DisplayDeviceConfig config = new DisplayDeviceConfig(context, flags);
config.initFromDefaultValues();
return config;
}
@@ -1938,6 +1975,7 @@ public class DisplayDeviceConfig {
loadScreenOffBrightnessSensorValueToLuxFromDdc(config);
loadUsiVersion(config);
mHdrBrightnessData = HdrBrightnessData.loadConfig(config);
+ loadBrightnessCapForWearBedtimeMode(config);
} else {
Slog.w(TAG, "DisplayDeviceConfig file is null");
}
@@ -1961,6 +1999,7 @@ public class DisplayDeviceConfig {
loadAutoBrightnessConfigsFromConfigXml();
loadAutoBrightnessAvailableFromConfigXml();
loadRefreshRateSetting(null);
+ loadBrightnessCapForWearBedtimeModeFromConfigXml();
mLoadedFrom = "<config.xml>";
}
@@ -2599,8 +2638,23 @@ public class DisplayDeviceConfig {
* loading the value from the display config, and if not present, falls back to config.xml.
*/
private void loadAutoBrightnessDisplayBrightnessMapping(AutoBrightness autoBrightnessConfig) {
- if (autoBrightnessConfig == null
- || autoBrightnessConfig.getDisplayBrightnessMapping() == null) {
+ if (mFlags.areAutoBrightnessModesEnabled() && autoBrightnessConfig != null
+ && autoBrightnessConfig.getLuxToBrightnessMapping() != null) {
+ LuxToBrightnessMapping mapping = autoBrightnessConfig.getLuxToBrightnessMapping();
+ final int size = mapping.getMap().getPoint().size();
+ mBrightnessLevels = new float[size];
+ mBrightnessLevelsLux = new float[size];
+ for (int i = 0; i < size; i++) {
+ float backlight = mapping.getMap().getPoint().get(i).getSecond().floatValue();
+ mBrightnessLevels[i] = mBacklightToBrightnessSpline.interpolate(backlight);
+ mBrightnessLevelsLux[i] = mapping.getMap().getPoint().get(i).getFirst()
+ .floatValue();
+ }
+ if (size > 0 && mBrightnessLevelsLux[0] != 0) {
+ throw new IllegalArgumentException(
+ "The first lux value in the display brightness mapping must be 0");
+ }
+ } else {
mBrightnessLevelsNits = getFloatArray(mContext.getResources()
.obtainTypedArray(com.android.internal.R.array
.config_autoBrightnessDisplayValuesNits), PowerManager
@@ -2608,18 +2662,6 @@ public class DisplayDeviceConfig {
mBrightnessLevelsLux = getLuxLevels(mContext.getResources()
.getIntArray(com.android.internal.R.array
.config_autoBrightnessLevels));
- } else {
- final int size = autoBrightnessConfig.getDisplayBrightnessMapping()
- .getDisplayBrightnessPoint().size();
- mBrightnessLevelsNits = new float[size];
- // The first control point is implicit and always at 0 lux.
- mBrightnessLevelsLux = new float[size + 1];
- for (int i = 0; i < size; i++) {
- mBrightnessLevelsNits[i] = autoBrightnessConfig.getDisplayBrightnessMapping()
- .getDisplayBrightnessPoint().get(i).getNits().floatValue();
- mBrightnessLevelsLux[i + 1] = autoBrightnessConfig.getDisplayBrightnessMapping()
- .getDisplayBrightnessPoint().get(i).getLux().floatValue();
- }
}
}
@@ -3350,6 +3392,23 @@ public class DisplayDeviceConfig {
: null;
}
+ private void loadBrightnessCapForWearBedtimeMode(DisplayConfiguration config) {
+ if (config != null) {
+ BigDecimal configBrightnessCap = config.getScreenBrightnessCapForWearBedtimeMode();
+ if (configBrightnessCap != null) {
+ mBrightnessCapForWearBedtimeMode = configBrightnessCap.floatValue();
+ } else {
+ loadBrightnessCapForWearBedtimeModeFromConfigXml();
+ }
+ }
+ }
+
+ private void loadBrightnessCapForWearBedtimeModeFromConfigXml() {
+ mBrightnessCapForWearBedtimeMode = BrightnessSynchronizer.brightnessIntToFloat(
+ mContext.getResources().getInteger(com.android.internal.R.integer
+ .config_screenBrightnessCapForWearBedtimeMode));
+ }
+
/**
* Container for high brightness mode configuration data.
*/
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 6a7c17d54980..2ab15e639d68 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1853,7 +1853,7 @@ public final class DisplayManagerService extends SystemService {
// early apps like SetupWizard/Launcher. In particular, SUW is displayed using
// the virtual display inside VR before any VR-specific apps even run.
mVirtualDisplayAdapter = mInjector.getVirtualDisplayAdapter(mSyncRoot, mContext,
- mHandler, mDisplayDeviceRepo);
+ mHandler, mDisplayDeviceRepo, mFlags);
if (mVirtualDisplayAdapter != null) {
registerDisplayAdapterLocked(mVirtualDisplayAdapter);
}
@@ -1871,7 +1871,7 @@ public final class DisplayManagerService extends SystemService {
private void registerOverlayDisplayAdapterLocked() {
registerDisplayAdapterLocked(new OverlayDisplayAdapter(
- mSyncRoot, mContext, mHandler, mDisplayDeviceRepo, mUiHandler));
+ mSyncRoot, mContext, mHandler, mDisplayDeviceRepo, mUiHandler, mFlags));
}
private void registerWifiDisplayAdapterLocked() {
@@ -1880,7 +1880,7 @@ public final class DisplayManagerService extends SystemService {
|| SystemProperties.getInt(FORCE_WIFI_DISPLAY_ENABLE, -1) == 1) {
mWifiDisplayAdapter = new WifiDisplayAdapter(
mSyncRoot, mContext, mHandler, mDisplayDeviceRepo,
- mPersistentDataStore);
+ mPersistentDataStore, mFlags);
registerDisplayAdapterLocked(mWifiDisplayAdapter);
}
}
@@ -3288,8 +3288,10 @@ public final class DisplayManagerService extends SystemService {
@VisibleForTesting
static class Injector {
VirtualDisplayAdapter getVirtualDisplayAdapter(SyncRoot syncRoot, Context context,
- Handler handler, DisplayAdapter.Listener displayAdapterListener) {
- return new VirtualDisplayAdapter(syncRoot, context, handler, displayAdapterListener);
+ Handler handler, DisplayAdapter.Listener displayAdapterListener,
+ DisplayManagerFlags flags) {
+ return new VirtualDisplayAdapter(syncRoot, context, handler, displayAdapterListener,
+ flags);
}
LocalDisplayAdapter getLocalDisplayAdapter(SyncRoot syncRoot, Context context,
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index ff9a1ab61b13..22898a65c5de 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -84,8 +84,6 @@ final class LocalDisplayAdapter extends DisplayAdapter {
private final boolean mIsBootDisplayModeSupported;
- private final DisplayManagerFlags mFlags;
-
private final DisplayNotificationManager mDisplayNotificationManager;
private Context mOverlayContext;
@@ -103,12 +101,11 @@ final class LocalDisplayAdapter extends DisplayAdapter {
Listener listener, DisplayManagerFlags flags,
DisplayNotificationManager displayNotificationManager,
Injector injector) {
- super(syncRoot, context, handler, listener, TAG);
+ super(syncRoot, context, handler, listener, TAG, flags);
mDisplayNotificationManager = displayNotificationManager;
mInjector = injector;
mSurfaceControlProxy = mInjector.getSurfaceControlProxy();
mIsBootDisplayModeSupported = mSurfaceControlProxy.getBootDisplayModeSupport();
- mFlags = flags;
}
@Override
@@ -510,7 +507,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {
// Load display device config
final Context context = getOverlayContext();
mDisplayDeviceConfig = mInjector.createDisplayDeviceConfig(context, mPhysicalDisplayId,
- mIsFirstDisplay);
+ mIsFirstDisplay, getFeatureFlags());
// Load brightness HWC quirk
mBacklightAdapter.setForceSurfaceControl(mDisplayDeviceConfig.hasQuirk(
@@ -831,7 +828,8 @@ final class LocalDisplayAdapter extends DisplayAdapter {
+ ", state=" + Display.stateToString(state) + ")");
}
- boolean isDisplayOffloadEnabled = mFlags.isDisplayOffloadEnabled();
+ boolean isDisplayOffloadEnabled =
+ getFeatureFlags().isDisplayOffloadEnabled();
// We must tell sidekick/displayoffload to stop controlling the display
// before we can change its power mode, so do that first.
@@ -1377,8 +1375,8 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
public DisplayDeviceConfig createDisplayDeviceConfig(Context context,
- long physicalDisplayId, boolean isFirstDisplay) {
- return DisplayDeviceConfig.create(context, physicalDisplayId, isFirstDisplay);
+ long physicalDisplayId, boolean isFirstDisplay, DisplayManagerFlags flags) {
+ return DisplayDeviceConfig.create(context, physicalDisplayId, isFirstDisplay, flags);
}
}
diff --git a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
index 2ce7690ecc3f..22ff2d0eeffd 100644
--- a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java
@@ -36,6 +36,7 @@ import android.view.SurfaceControl;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.display.feature.DisplayManagerFlags;
import com.android.server.display.mode.DisplayModeDirector;
import java.io.PrintWriter;
@@ -134,8 +135,9 @@ final class OverlayDisplayAdapter extends DisplayAdapter {
// Called with SyncRoot lock held.
public OverlayDisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
- Context context, Handler handler, Listener listener, Handler uiHandler) {
- super(syncRoot, context, handler, listener, TAG);
+ Context context, Handler handler, Listener listener, Handler uiHandler,
+ DisplayManagerFlags featureFlags) {
+ super(syncRoot, context, handler, listener, TAG, featureFlags);
mUiHandler = uiHandler;
}
diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
index edbd42465534..ec5ad7de11b3 100644
--- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
@@ -61,6 +61,7 @@ import android.view.Surface;
import android.view.SurfaceControl;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.display.feature.DisplayManagerFlags;
import java.io.PrintWriter;
import java.util.concurrent.atomic.AtomicInteger;
@@ -88,7 +89,7 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
// Called with SyncRoot lock held.
public VirtualDisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
- Context context, Handler handler, Listener listener) {
+ Context context, Handler handler, Listener listener, DisplayManagerFlags featureFlags) {
this(syncRoot, context, handler, listener, new SurfaceControlDisplayFactory() {
@Override
public IBinder createDisplay(String name, boolean secure, float requestedRefreshRate) {
@@ -99,14 +100,15 @@ public class VirtualDisplayAdapter extends DisplayAdapter {
public void destroyDisplay(IBinder displayToken) {
DisplayControl.destroyDisplay(displayToken);
}
- });
+ }, featureFlags);
}
@VisibleForTesting
VirtualDisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
Context context, Handler handler, Listener listener,
- SurfaceControlDisplayFactory surfaceControlDisplayFactory) {
- super(syncRoot, context, handler, listener, TAG);
+ SurfaceControlDisplayFactory surfaceControlDisplayFactory,
+ DisplayManagerFlags featureFlags) {
+ super(syncRoot, context, handler, listener, TAG, featureFlags);
mHandler = handler;
mSurfaceControlDisplayFactory = surfaceControlDisplayFactory;
}
diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
index 7660cf8a1c3a..aa98cd85d38e 100644
--- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
@@ -41,6 +41,7 @@ import android.view.SurfaceControl;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.display.feature.DisplayManagerFlags;
import com.android.server.display.utils.DebugUtils;
import java.io.PrintWriter;
@@ -99,8 +100,8 @@ final class WifiDisplayAdapter extends DisplayAdapter {
// Called with SyncRoot lock held.
public WifiDisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
Context context, Handler handler, Listener listener,
- PersistentDataStore persistentDataStore) {
- super(syncRoot, context, handler, listener, TAG);
+ PersistentDataStore persistentDataStore, DisplayManagerFlags featureFlags) {
+ super(syncRoot, context, handler, listener, TAG, featureFlags);
if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT)) {
throw new RuntimeException("WiFi display was requested, "
diff --git a/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamper.java b/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamper.java
index dfcda40d8e3c..42ebc401335e 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamper.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamper.java
@@ -17,6 +17,7 @@
package com.android.server.display.brightness.clamper;
import android.annotation.NonNull;
+import android.os.Handler;
import android.os.PowerManager;
import com.android.server.display.DisplayBrightnessState;
@@ -24,13 +25,25 @@ import com.android.server.display.DisplayBrightnessState;
import java.io.PrintWriter;
/**
- * Provides max allowed brightness
+ * Provides brightness range constraints
*/
abstract class BrightnessClamper<T> {
protected float mBrightnessCap = PowerManager.BRIGHTNESS_MAX;
protected boolean mIsActive = false;
+ @NonNull
+ protected final Handler mHandler;
+
+ @NonNull
+ protected final BrightnessClamperController.ClamperChangeListener mChangeListener;
+
+ BrightnessClamper(Handler handler,
+ BrightnessClamperController.ClamperChangeListener changeListener) {
+ mHandler = handler;
+ mChangeListener = changeListener;
+ }
+
float getBrightnessCap() {
return mBrightnessCap;
}
@@ -60,6 +73,8 @@ abstract class BrightnessClamper<T> {
protected enum Type {
THERMAL,
- POWER
+ POWER,
+ BEDTIME_MODE,
+ LUX,
}
}
diff --git a/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java b/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java
index b57491949196..01694ddee06a 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java
@@ -68,14 +68,14 @@ public class BrightnessClamperController {
private boolean mClamperApplied = false;
public BrightnessClamperController(Handler handler,
- ClamperChangeListener clamperChangeListener, DisplayDeviceData data, Context context,
+ ClamperChangeListener clamperChangeListener, DisplayDeviceData data, Context context,
DisplayManagerFlags flags) {
this(new Injector(), handler, clamperChangeListener, data, context, flags);
}
@VisibleForTesting
BrightnessClamperController(Injector injector, Handler handler,
- ClamperChangeListener clamperChangeListener, DisplayDeviceData data, Context context,
+ ClamperChangeListener clamperChangeListener, DisplayDeviceData data, Context context,
DisplayManagerFlags flags) {
mDeviceConfigParameterProvider = injector.getDeviceConfigParameterProvider();
mHandler = handler;
@@ -90,7 +90,8 @@ public class BrightnessClamperController {
}
};
- mClampers = injector.getClampers(handler, clamperChangeListenerInternal, data, flags);
+ mClampers = injector.getClampers(handler, clamperChangeListenerInternal, data, flags,
+ context);
mModifiers = injector.getModifiers(context);
mOnPropertiesChangedListener =
properties -> mClampers.forEach(BrightnessClamper::onDeviceConfigChanged);
@@ -146,7 +147,8 @@ public class BrightnessClamperController {
* Should be moved to DisplayBrightnessState OR derived from DisplayBrightnessState
* TODO: b/263362199
*/
- @BrightnessInfo.BrightnessMaxReason public int getBrightnessMaxReason() {
+ @BrightnessInfo.BrightnessMaxReason
+ public int getBrightnessMaxReason() {
if (mClamperType == null) {
return BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE;
} else if (mClamperType == Type.THERMAL) {
@@ -234,13 +236,20 @@ public class BrightnessClamperController {
List<BrightnessClamper<? super DisplayDeviceData>> getClampers(Handler handler,
ClamperChangeListener clamperChangeListener, DisplayDeviceData data,
- DisplayManagerFlags flags) {
+ DisplayManagerFlags flags, Context context) {
List<BrightnessClamper<? super DisplayDeviceData>> clampers = new ArrayList<>();
clampers.add(
new BrightnessThermalClamper(handler, clamperChangeListener, data));
if (flags.isPowerThrottlingClamperEnabled()) {
clampers.add(new BrightnessPowerClamper(handler, clamperChangeListener,
- data));
+ data));
+ }
+ if (flags.isBrightnessWearBedtimeModeClamperEnabled()) {
+ clampers.add(new BrightnessWearBedtimeModeClamper(handler, context,
+ clamperChangeListener, data));
+ }
+ if (flags.isEvenDimmerEnabled()) {
+ clampers.add(new BrightnessMinClamper(handler, clamperChangeListener, context));
}
return clampers;
}
@@ -257,7 +266,8 @@ public class BrightnessClamperController {
* Config Data for clampers
*/
public static class DisplayDeviceData implements BrightnessThermalClamper.ThermalData,
- BrightnessPowerClamper.PowerData {
+ BrightnessPowerClamper.PowerData,
+ BrightnessWearBedtimeModeClamper.WearBedtimeModeData {
@NonNull
private final String mUniqueDisplayId;
@NonNull
@@ -315,5 +325,10 @@ public class BrightnessClamperController {
public PowerThrottlingConfigData getPowerThrottlingConfigData() {
return mDisplayDeviceConfig.getPowerThrottlingConfigData();
}
+
+ @Override
+ public float getBrightnessWearBedtimeModeCap() {
+ return mDisplayDeviceConfig.getBrightnessCapForWearBedtimeMode();
+ }
}
}
diff --git a/services/core/java/com/android/server/display/brightness/clamper/BrightnessMinClamper.java b/services/core/java/com/android/server/display/brightness/clamper/BrightnessMinClamper.java
new file mode 100644
index 000000000000..71efca12f91c
--- /dev/null
+++ b/services/core/java/com/android/server/display/brightness/clamper/BrightnessMinClamper.java
@@ -0,0 +1,137 @@
+/*
+ * 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 com.android.server.display.brightness.clamper;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.Slog;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.display.utils.DebugUtils;
+
+import java.io.PrintWriter;
+
+/**
+ * Class used to prevent the screen brightness dipping below a certain value, based on current
+ * lux conditions.
+ */
+public class BrightnessMinClamper extends BrightnessClamper {
+
+ // To enable these logs, run:
+ // 'adb shell setprop persist.log.tag.BrightnessMinClamper DEBUG && adb reboot'
+ private static final String TAG = "BrightnessMinClamper";
+ private static final boolean DEBUG = DebugUtils.isDebuggable(TAG);
+
+ private final SettingsObserver mSettingsObserver;
+
+ ContentResolver mContentResolver;
+ private float mNitsLowerBound;
+
+ @VisibleForTesting
+ BrightnessMinClamper(Handler handler,
+ BrightnessClamperController.ClamperChangeListener listener, Context context) {
+ super(handler, listener);
+
+ mContentResolver = context.getContentResolver();
+ mSettingsObserver = new SettingsObserver(mHandler);
+ mHandler.post(() -> {
+ start();
+ });
+ }
+
+ private void recalculateLowerBound() {
+ final int userId = UserHandle.USER_CURRENT;
+ float settingNitsLowerBound = Settings.Secure.getFloatForUser(
+ mContentResolver, Settings.Secure.EVEN_DIMMER_MIN_NITS,
+ /* def= */ PowerManager.BRIGHTNESS_MIN, userId);
+
+ boolean isActive = Settings.Secure.getIntForUser(mContentResolver,
+ Settings.Secure.EVEN_DIMMER_ACTIVATED,
+ /* def= */ 0, userId) == 1;
+
+ // TODO: luxBasedNitsLowerBound = mMinNitsToLuxSpline(currentLux);
+ float luxBasedNitsLowerBound = PowerManager.BRIGHTNESS_MIN;
+ final float nitsLowerBound = Math.max(settingNitsLowerBound, luxBasedNitsLowerBound);
+
+ if (mNitsLowerBound != nitsLowerBound || mIsActive != isActive) {
+ mIsActive = isActive;
+ mNitsLowerBound = nitsLowerBound;
+ if (DEBUG) {
+ Slog.i(TAG, "mIsActive: " + mIsActive);
+ }
+ // TODO: mBrightnessCap = nitsToBrightnessSpline(mNitsLowerBound);
+ mChangeListener.onChanged();
+ }
+ }
+
+ void start() {
+ recalculateLowerBound();
+ }
+
+
+ @Override
+ Type getType() {
+ return Type.LUX;
+ }
+
+ @Override
+ void onDeviceConfigChanged() {
+ // TODO
+ }
+
+ @Override
+ void onDisplayChanged(Object displayData) {
+
+ }
+
+ @Override
+ void stop() {
+ mContentResolver.unregisterContentObserver(mSettingsObserver);
+ }
+
+ @Override
+ void dump(PrintWriter pw) {
+ pw.println("BrightnessMinClamper:");
+ pw.println(" mBrightnessCap=" + mBrightnessCap);
+ pw.println(" mIsActive=" + mIsActive);
+ pw.println(" mNitsLowerBound=" + mNitsLowerBound);
+ super.dump(pw);
+ }
+
+ private final class SettingsObserver extends ContentObserver {
+ SettingsObserver(Handler handler) {
+ super(handler);
+ mContentResolver.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.EVEN_DIMMER_MIN_NITS),
+ false, this);
+ mContentResolver.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.EVEN_DIMMER_ACTIVATED),
+ false, this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ recalculateLowerBound();
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/display/brightness/clamper/BrightnessPowerClamper.java b/services/core/java/com/android/server/display/brightness/clamper/BrightnessPowerClamper.java
index 339b5896f3f7..790322d75251 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/BrightnessPowerClamper.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/BrightnessPowerClamper.java
@@ -49,10 +49,6 @@ class BrightnessPowerClamper extends
private final Injector mInjector;
@NonNull
private final DeviceConfigParameterProvider mConfigParameterProvider;
- @NonNull
- private final Handler mHandler;
- @NonNull
- private final ClamperChangeListener mChangeListener;
@Nullable
private PmicMonitor mPmicMonitor;
// data from DeviceConfig, for all displays, for all dataSets
@@ -99,10 +95,9 @@ class BrightnessPowerClamper extends
@VisibleForTesting
BrightnessPowerClamper(Injector injector, Handler handler, ClamperChangeListener listener,
PowerData powerData) {
+ super(handler, listener);
mInjector = injector;
mConfigParameterProvider = injector.getDeviceConfigParameterProvider();
- mHandler = handler;
- mChangeListener = listener;
mHandler.post(() -> {
setDisplayData(powerData);
diff --git a/services/core/java/com/android/server/display/brightness/clamper/BrightnessThermalClamper.java b/services/core/java/com/android/server/display/brightness/clamper/BrightnessThermalClamper.java
index 8ae962b83c69..944a8a65693b 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/BrightnessThermalClamper.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/BrightnessThermalClamper.java
@@ -54,10 +54,6 @@ class BrightnessThermalClamper extends
private final IThermalService mThermalService;
@NonNull
private final DeviceConfigParameterProvider mConfigParameterProvider;
- @NonNull
- private final Handler mHandler;
- @NonNull
- private final ClamperChangeListener mChangelistener;
// data from DeviceConfig, for all displays, for all dataSets
// mapOf(uniqueDisplayId to mapOf(dataSetId to ThermalBrightnessThrottlingData))
@NonNull
@@ -108,10 +104,9 @@ class BrightnessThermalClamper extends
@VisibleForTesting
BrightnessThermalClamper(Injector injector, Handler handler,
ClamperChangeListener listener, ThermalData thermalData) {
+ super(handler, listener);
mThermalService = injector.getThermalService();
mConfigParameterProvider = injector.getDeviceConfigParameterProvider();
- mHandler = handler;
- mChangelistener = listener;
mHandler.post(() -> {
setDisplayData(thermalData);
loadOverrideData();
@@ -220,7 +215,7 @@ class BrightnessThermalClamper extends
if (brightnessCap != mBrightnessCap || mIsActive != isActive) {
mBrightnessCap = brightnessCap;
mIsActive = isActive;
- mChangelistener.onChanged();
+ mChangeListener.onChanged();
}
}
diff --git a/services/core/java/com/android/server/display/brightness/clamper/BrightnessWearBedtimeModeClamper.java b/services/core/java/com/android/server/display/brightness/clamper/BrightnessWearBedtimeModeClamper.java
new file mode 100644
index 000000000000..7e853bfc4ad6
--- /dev/null
+++ b/services/core/java/com/android/server/display/brightness/clamper/BrightnessWearBedtimeModeClamper.java
@@ -0,0 +1,99 @@
+/*
+ * 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 com.android.server.display.brightness.clamper;
+
+import android.annotation.NonNull;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+public class BrightnessWearBedtimeModeClamper extends
+ BrightnessClamper<BrightnessWearBedtimeModeClamper.WearBedtimeModeData> {
+
+ public static final int BEDTIME_MODE_OFF = 0;
+ public static final int BEDTIME_MODE_ON = 1;
+
+ private final Context mContext;
+
+ private final ContentObserver mSettingsObserver;
+
+ BrightnessWearBedtimeModeClamper(Handler handler, Context context,
+ BrightnessClamperController.ClamperChangeListener listener, WearBedtimeModeData data) {
+ this(new Injector(), handler, context, listener, data);
+ }
+
+ @VisibleForTesting
+ BrightnessWearBedtimeModeClamper(Injector injector, Handler handler, Context context,
+ BrightnessClamperController.ClamperChangeListener listener, WearBedtimeModeData data) {
+ super(handler, listener);
+ mContext = context;
+ mBrightnessCap = data.getBrightnessWearBedtimeModeCap();
+ mSettingsObserver = new ContentObserver(mHandler) {
+ @Override
+ public void onChange(boolean selfChange) {
+ final int bedtimeModeSetting = Settings.Global.getInt(
+ mContext.getContentResolver(),
+ Settings.Global.Wearable.BEDTIME_MODE,
+ BEDTIME_MODE_OFF);
+ mIsActive = bedtimeModeSetting == BEDTIME_MODE_ON;
+ mChangeListener.onChanged();
+ }
+ };
+ injector.registerBedtimeModeObserver(context.getContentResolver(), mSettingsObserver);
+ }
+
+ @NonNull
+ @Override
+ Type getType() {
+ return Type.BEDTIME_MODE;
+ }
+
+ @Override
+ void onDeviceConfigChanged() {}
+
+ @Override
+ void onDisplayChanged(WearBedtimeModeData displayData) {
+ mHandler.post(() -> {
+ mBrightnessCap = displayData.getBrightnessWearBedtimeModeCap();
+ mChangeListener.onChanged();
+ });
+ }
+
+ @Override
+ void stop() {
+ mContext.getContentResolver().unregisterContentObserver(mSettingsObserver);
+ }
+
+ interface WearBedtimeModeData {
+ float getBrightnessWearBedtimeModeCap();
+ }
+
+ @VisibleForTesting
+ static class Injector {
+ void registerBedtimeModeObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer) {
+ cr.registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.Wearable.BEDTIME_MODE),
+ /* notifyForDescendants= */ false, observer, UserHandle.USER_ALL);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
index 5cfbf26338e3..f579dbd16592 100644
--- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
+++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
@@ -78,6 +78,9 @@ public class DisplayManagerFlags {
Flags.FLAG_ENABLE_POWER_THROTTLING_CLAMPER,
Flags::enablePowerThrottlingClamper);
+ private final FlagState mEvenDimmerFlagState = new FlagState(
+ Flags.FLAG_EVEN_DIMMER,
+ Flags::evenDimmer);
private final FlagState mSmallAreaDetectionFlagState = new FlagState(
com.android.graphics.surfaceflinger.flags.Flags.FLAG_ENABLE_SMALL_AREA_DETECTION,
com.android.graphics.surfaceflinger.flags.Flags::enableSmallAreaDetection);
@@ -90,6 +93,14 @@ public class DisplayManagerFlags {
Flags.FLAG_ENABLE_EXTERNAL_VSYNC_PROXIMITY_VOTE,
Flags::enableExternalVsyncProximityVote);
+ private final FlagState mBrightnessWearBedtimeModeClamperFlagState = new FlagState(
+ Flags.FLAG_BRIGHTNESS_WEAR_BEDTIME_MODE_CLAMPER,
+ Flags::brightnessWearBedtimeModeClamper);
+
+ private final FlagState mAutoBrightnessModesFlagState = new FlagState(
+ Flags.FLAG_AUTO_BRIGHTNESS_MODES,
+ Flags::autoBrightnessModes);
+
/** Returns whether connected display management is enabled or not. */
public boolean isConnectedDisplayManagementEnabled() {
return mConnectedDisplayManagementFlagState.isEnabled();
@@ -166,6 +177,11 @@ public class DisplayManagerFlags {
return mBackUpSmoothDisplayAndForcePeakRefreshRateFlagState.isEnabled();
}
+ /** Returns whether brightness range is allowed to extend below traditional range. */
+ public boolean isEvenDimmerEnabled() {
+ return mEvenDimmerFlagState.isEnabled();
+ }
+
public boolean isSmallAreaDetectionEnabled() {
return mSmallAreaDetectionFlagState.isEnabled();
}
@@ -174,10 +190,21 @@ public class DisplayManagerFlags {
return mBrightnessIntRangeUserPerceptionFlagState.isEnabled();
}
- public boolean isExternalVsyncProximityVoteEnabled() {
+ public boolean isVsyncProximityVoteEnabled() {
return mVsyncProximityVote.isEnabled();
}
+ public boolean isBrightnessWearBedtimeModeClamperEnabled() {
+ return mBrightnessWearBedtimeModeClamperFlagState.isEnabled();
+ }
+
+ /**
+ * @return Whether generic auto-brightness modes are enabled
+ */
+ public boolean areAutoBrightnessModesEnabled() {
+ return mAutoBrightnessModesFlagState.isEnabled();
+ }
+
/**
* dumps all flagstates
* @param pw printWriter
@@ -197,6 +224,8 @@ public class DisplayManagerFlags {
pw.println(" " + mSmallAreaDetectionFlagState);
pw.println(" " + mBrightnessIntRangeUserPerceptionFlagState);
pw.println(" " + mVsyncProximityVote);
+ pw.println(" " + mBrightnessWearBedtimeModeClamperFlagState);
+ pw.println(" " + mAutoBrightnessModesFlagState);
}
private static class FlagState {
diff --git a/services/core/java/com/android/server/display/feature/display_flags.aconfig b/services/core/java/com/android/server/display/feature/display_flags.aconfig
index d95bdae7514d..1b4d74cdff1f 100644
--- a/services/core/java/com/android/server/display/feature/display_flags.aconfig
+++ b/services/core/java/com/android/server/display/feature/display_flags.aconfig
@@ -106,6 +106,14 @@ flag {
}
flag {
+ name: "even_dimmer"
+ namespace: "display_manager"
+ description: "Feature flag for extending the brightness below traditional range"
+ bug: "179428400"
+ is_fixed_read_only: true
+}
+
+flag {
name: "brightness_int_range_user_perception"
namespace: "display_manager"
description: "Feature flag for converting the brightness integer range to the user perception scale"
@@ -120,3 +128,19 @@ flag {
bug: "284866750"
is_fixed_read_only: true
}
+
+flag {
+ name: "brightness_wear_bedtime_mode_clamper"
+ namespace: "display_manager"
+ description: "Feature flag for the Wear Bedtime mode brightness clamper"
+ bug: "293613040"
+ is_fixed_read_only: true
+}
+
+flag {
+ name: "auto_brightness_modes"
+ namespace: "display_manager"
+ description: "Feature flag for generic auto-brightness modes"
+ bug: "293613040"
+ is_fixed_read_only: true
+}
diff --git a/services/core/java/com/android/server/display/mode/BaseModeRefreshRateVote.java b/services/core/java/com/android/server/display/mode/BaseModeRefreshRateVote.java
index c04df64fc15a..c53823139ffe 100644
--- a/services/core/java/com/android/server/display/mode/BaseModeRefreshRateVote.java
+++ b/services/core/java/com/android/server/display/mode/BaseModeRefreshRateVote.java
@@ -31,7 +31,7 @@ class BaseModeRefreshRateVote implements Vote {
}
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
if (summary.appRequestBaseModeRefreshRate == 0f
&& mAppRequestBaseModeRefreshRate > 0f) {
summary.appRequestBaseModeRefreshRate = mAppRequestBaseModeRefreshRate;
diff --git a/services/core/java/com/android/server/display/mode/CombinedVote.java b/services/core/java/com/android/server/display/mode/CombinedVote.java
index f24fe3a7eb04..4b68791268e9 100644
--- a/services/core/java/com/android/server/display/mode/CombinedVote.java
+++ b/services/core/java/com/android/server/display/mode/CombinedVote.java
@@ -28,7 +28,7 @@ class CombinedVote implements Vote {
}
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
mVotes.forEach(vote -> vote.updateSummary(summary));
}
diff --git a/services/core/java/com/android/server/display/mode/DisableRefreshRateSwitchingVote.java b/services/core/java/com/android/server/display/mode/DisableRefreshRateSwitchingVote.java
index 2fc5590a4b94..7f5740690c7f 100644
--- a/services/core/java/com/android/server/display/mode/DisableRefreshRateSwitchingVote.java
+++ b/services/core/java/com/android/server/display/mode/DisableRefreshRateSwitchingVote.java
@@ -31,7 +31,7 @@ class DisableRefreshRateSwitchingVote implements Vote {
}
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
summary.disableRefreshRateSwitching =
summary.disableRefreshRateSwitching || mDisableRefreshRateSwitching;
}
diff --git a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
index 8eb03ec0d3bd..f7b540bc3753 100644
--- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
@@ -21,8 +21,8 @@ import static android.hardware.display.DisplayManagerInternal.REFRESH_RATE_LIMIT
import static android.os.PowerManager.BRIGHTNESS_INVALID_FLOAT;
import static android.view.Display.Mode.INVALID_MODE_ID;
-import static com.android.internal.display.RefreshRateSettingsUtils.findHighestRefreshRate;
import static com.android.server.display.DisplayDeviceConfig.DEFAULT_LOW_REFRESH_RATE;
+import static com.android.internal.display.RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay;
import android.annotation.IntegerRes;
import android.annotation.NonNull;
@@ -179,6 +179,9 @@ public class DisplayModeDirector {
private final boolean mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled;
+ private final boolean mVsyncProximityVoteEnabled;
+
+
public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler,
@NonNull DisplayManagerFlags displayManagerFlags) {
this(context, handler, new RealInjector(context), displayManagerFlags);
@@ -196,6 +199,7 @@ public class DisplayModeDirector {
.isDisplaysRefreshRatesSynchronizationEnabled();
mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled = displayManagerFlags
.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled();
+ mVsyncProximityVoteEnabled = displayManagerFlags.isVsyncProximityVoteEnabled();
mContext = context;
mHandler = new DisplayModeDirectorHandler(handler.getLooper());
mInjector = injector;
@@ -262,130 +266,6 @@ public class DisplayModeDirector {
mVotesStorage.setLoggingEnabled(loggingEnabled);
}
- static final class VoteSummary {
- public float minPhysicalRefreshRate;
- public float maxPhysicalRefreshRate;
- public float minRenderFrameRate;
- public float maxRenderFrameRate;
- public int width;
- public int height;
- public int minWidth;
- public int minHeight;
- public boolean disableRefreshRateSwitching;
- public float appRequestBaseModeRefreshRate;
-
- public List<SupportedModesVote.SupportedMode> supportedModes;
-
- final boolean mIsDisplayResolutionRangeVotingEnabled;
-
- VoteSummary(boolean isDisplayResolutionRangeVotingEnabled) {
- mIsDisplayResolutionRangeVotingEnabled = isDisplayResolutionRangeVotingEnabled;
- reset();
- }
-
- public void reset() {
- minPhysicalRefreshRate = 0f;
- maxPhysicalRefreshRate = Float.POSITIVE_INFINITY;
- minRenderFrameRate = 0f;
- maxRenderFrameRate = Float.POSITIVE_INFINITY;
- width = Vote.INVALID_SIZE;
- height = Vote.INVALID_SIZE;
- minWidth = 0;
- minHeight = 0;
- disableRefreshRateSwitching = false;
- appRequestBaseModeRefreshRate = 0f;
- }
-
- @Override
- public String toString() {
- return "minPhysicalRefreshRate=" + minPhysicalRefreshRate
- + ", maxPhysicalRefreshRate=" + maxPhysicalRefreshRate
- + ", minRenderFrameRate=" + minRenderFrameRate
- + ", maxRenderFrameRate=" + maxRenderFrameRate
- + ", width=" + width
- + ", height=" + height
- + ", minWidth=" + minWidth
- + ", minHeight=" + minHeight
- + ", disableRefreshRateSwitching=" + disableRefreshRateSwitching
- + ", appRequestBaseModeRefreshRate=" + appRequestBaseModeRefreshRate;
- }
- }
-
- // VoteSummary is returned as an output param to cut down a bit on the number of temporary
- // objects.
- private void summarizeVotes(
- SparseArray<Vote> votes,
- int lowestConsideredPriority,
- int highestConsideredPriority,
- /*out*/ VoteSummary summary) {
- summary.reset();
- for (int priority = highestConsideredPriority;
- priority >= lowestConsideredPriority;
- priority--) {
- Vote vote = votes.get(priority);
- if (vote == null) {
- continue;
- }
-
- vote.updateSummary(summary);
-
- if (mLoggingEnabled) {
- Slog.w(TAG, "Vote summary for priority " + Vote.priorityToString(priority)
- + ": " + summary);
- }
- }
- }
-
- private boolean equalsWithinFloatTolerance(float a, float b) {
- return a >= b - FLOAT_TOLERANCE && a <= b + FLOAT_TOLERANCE;
- }
-
- private Display.Mode selectBaseMode(VoteSummary summary,
- ArrayList<Display.Mode> availableModes, Display.Mode defaultMode) {
- // The base mode should be as close as possible to the app requested mode. Since all the
- // available modes already have the same size, we just need to look for a matching refresh
- // rate. If the summary doesn't include an app requested refresh rate, we'll use the default
- // mode refresh rate. This is important because SurfaceFlinger can do only seamless switches
- // by default. Some devices (e.g. TV) don't support seamless switching so the mode we select
- // here won't be changed.
- float preferredRefreshRate =
- summary.appRequestBaseModeRefreshRate > 0
- ? summary.appRequestBaseModeRefreshRate : defaultMode.getRefreshRate();
- for (Display.Mode availableMode : availableModes) {
- if (equalsWithinFloatTolerance(preferredRefreshRate, availableMode.getRefreshRate())) {
- return availableMode;
- }
- }
-
- // If we couldn't find a mode id based on the refresh rate, it means that the available
- // modes were filtered by the app requested size, which is different that the default mode
- // size, and the requested app refresh rate was dropped from the summary due to a higher
- // priority vote. Since we don't have any other hint about the refresh rate,
- // we just pick the first.
- return !availableModes.isEmpty() ? availableModes.get(0) : null;
- }
-
- private void disableModeSwitching(VoteSummary summary, float fps) {
- summary.minPhysicalRefreshRate = summary.maxPhysicalRefreshRate = fps;
- summary.maxRenderFrameRate = Math.min(summary.maxRenderFrameRate, fps);
-
- if (mLoggingEnabled) {
- Slog.i(TAG, "Disabled mode switching on summary: " + summary);
- }
- }
-
- private void disableRenderRateSwitching(VoteSummary summary, float fps) {
- summary.minRenderFrameRate = summary.maxRenderFrameRate;
-
- if (!isRenderRateAchievable(fps, summary)) {
- summary.minRenderFrameRate = summary.maxRenderFrameRate = fps;
- }
-
- if (mLoggingEnabled) {
- Slog.i(TAG, "Disabled render rate switching on summary: " + summary);
- }
- }
-
/**
* Calculates the refresh rate ranges and display modes that the system is allowed to freely
* switch between based on global and display-specific constraints.
@@ -407,9 +287,10 @@ public class DisplayModeDirector {
return new DesiredDisplayModeSpecs();
}
- ArrayList<Display.Mode> availableModes = new ArrayList<>();
+ List<Display.Mode> availableModes = new ArrayList<>();
availableModes.add(defaultMode);
- VoteSummary primarySummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled);
+ VoteSummary primarySummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled,
+ mVsyncProximityVoteEnabled, mLoggingEnabled, mSupportsFrameRateOverride);
int lowestConsideredPriority = Vote.MIN_PRIORITY;
int highestConsideredPriority = Vote.MAX_PRIORITY;
@@ -421,39 +302,18 @@ public class DisplayModeDirector {
// We try to find a range of priorities which define a non-empty set of allowed display
// modes. Each time we fail we increase the lowest priority.
while (lowestConsideredPriority <= highestConsideredPriority) {
- summarizeVotes(
- votes, lowestConsideredPriority, highestConsideredPriority, primarySummary);
-
- // If we don't have anything specifying the width / height of the display, just use
- // the default width and height. We don't want these switching out from underneath
- // us since it's a pretty disruptive behavior.
- if (primarySummary.height == Vote.INVALID_SIZE
- || primarySummary.width == Vote.INVALID_SIZE) {
- primarySummary.width = defaultMode.getPhysicalWidth();
- primarySummary.height = defaultMode.getPhysicalHeight();
- } else if (mIsDisplayResolutionRangeVotingEnabled) {
- updateSummaryWithBestAllowedResolution(modes, primarySummary);
- }
+ primarySummary.applyVotes(
+ votes, lowestConsideredPriority, highestConsideredPriority);
- availableModes = filterModes(modes, primarySummary);
+ primarySummary.adjustSize(defaultMode, modes);
+
+ availableModes = primarySummary.filterModes(modes);
if (!availableModes.isEmpty()) {
if (mLoggingEnabled) {
Slog.w(TAG, "Found available modes=" + availableModes
+ " with lowest priority considered "
+ Vote.priorityToString(lowestConsideredPriority)
- + " and constraints: "
- + "width=" + primarySummary.width
- + ", height=" + primarySummary.height
- + ", minPhysicalRefreshRate="
- + primarySummary.minPhysicalRefreshRate
- + ", maxPhysicalRefreshRate="
- + primarySummary.maxPhysicalRefreshRate
- + ", minRenderFrameRate=" + primarySummary.minRenderFrameRate
- + ", maxRenderFrameRate=" + primarySummary.maxRenderFrameRate
- + ", disableRefreshRateSwitching="
- + primarySummary.disableRefreshRateSwitching
- + ", appRequestBaseModeRefreshRate="
- + primarySummary.appRequestBaseModeRefreshRate);
+ + " and summary: " + primarySummary);
}
break;
}
@@ -461,17 +321,7 @@ public class DisplayModeDirector {
if (mLoggingEnabled) {
Slog.w(TAG, "Couldn't find available modes with lowest priority set to "
+ Vote.priorityToString(lowestConsideredPriority)
- + " and with the following constraints: "
- + "width=" + primarySummary.width
- + ", height=" + primarySummary.height
- + ", minPhysicalRefreshRate=" + primarySummary.minPhysicalRefreshRate
- + ", maxPhysicalRefreshRate=" + primarySummary.maxPhysicalRefreshRate
- + ", minRenderFrameRate=" + primarySummary.minRenderFrameRate
- + ", maxRenderFrameRate=" + primarySummary.maxRenderFrameRate
- + ", disableRefreshRateSwitching="
- + primarySummary.disableRefreshRateSwitching
- + ", appRequestBaseModeRefreshRate="
- + primarySummary.appRequestBaseModeRefreshRate);
+ + " and with the following summary: " + primarySummary);
}
// If we haven't found anything with the current set of votes, drop the
@@ -479,51 +329,16 @@ public class DisplayModeDirector {
lowestConsideredPriority++;
}
- if (mLoggingEnabled) {
- Slog.i(TAG,
- "Primary physical range: ["
- + primarySummary.minPhysicalRefreshRate
- + " "
- + primarySummary.maxPhysicalRefreshRate
- + "] render frame rate range: ["
- + primarySummary.minRenderFrameRate
- + " "
- + primarySummary.maxRenderFrameRate
- + "]");
- }
-
- VoteSummary appRequestSummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled);
- summarizeVotes(
- votes,
+ VoteSummary appRequestSummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled,
+ mVsyncProximityVoteEnabled, mLoggingEnabled, mSupportsFrameRateOverride);
+
+ appRequestSummary.applyVotes(votes,
Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF,
- Vote.MAX_PRIORITY,
- appRequestSummary);
- appRequestSummary.minPhysicalRefreshRate =
- Math.min(appRequestSummary.minPhysicalRefreshRate,
- primarySummary.minPhysicalRefreshRate);
- appRequestSummary.maxPhysicalRefreshRate =
- Math.max(appRequestSummary.maxPhysicalRefreshRate,
- primarySummary.maxPhysicalRefreshRate);
- appRequestSummary.minRenderFrameRate =
- Math.min(appRequestSummary.minRenderFrameRate,
- primarySummary.minRenderFrameRate);
- appRequestSummary.maxRenderFrameRate =
- Math.max(appRequestSummary.maxRenderFrameRate,
- primarySummary.maxRenderFrameRate);
- if (mLoggingEnabled) {
- Slog.i(TAG,
- "App request range: ["
- + appRequestSummary.minPhysicalRefreshRate
- + " "
- + appRequestSummary.maxPhysicalRefreshRate
- + "] Frame rate range: ["
- + appRequestSummary.minRenderFrameRate
- + " "
- + appRequestSummary.maxRenderFrameRate
- + "]");
- }
-
- Display.Mode baseMode = selectBaseMode(primarySummary, availableModes, defaultMode);
+ Vote.MAX_PRIORITY);
+
+ appRequestSummary.limitRefreshRanges(primarySummary);
+
+ Display.Mode baseMode = primarySummary.selectBaseMode(availableModes, defaultMode);
if (baseMode == null) {
Slog.w(TAG, "Can't find a set of allowed modes which satisfies the votes. Falling"
+ " back to the default mode. Display = " + displayId + ", votes = " + votes
@@ -544,13 +359,12 @@ public class DisplayModeDirector {
if (modeSwitchingDisabled || primarySummary.disableRefreshRateSwitching) {
float fps = baseMode.getRefreshRate();
- disableModeSwitching(primarySummary, fps);
+ primarySummary.disableModeSwitching(fps);
if (modeSwitchingDisabled) {
- disableModeSwitching(appRequestSummary, fps);
- disableRenderRateSwitching(primarySummary, fps);
-
+ appRequestSummary.disableModeSwitching(fps);
+ primarySummary.disableRenderRateSwitching(fps);
if (mModeSwitchingType == DisplayManager.SWITCHING_TYPE_NONE) {
- disableRenderRateSwitching(appRequestSummary, fps);
+ appRequestSummary.disableRenderRateSwitching(fps);
}
}
}
@@ -577,138 +391,6 @@ public class DisplayModeDirector {
}
}
- private boolean isRenderRateAchievable(float physicalRefreshRate, VoteSummary summary) {
- // Check whether the render frame rate range is achievable by the mode's physical
- // refresh rate, meaning that if a divisor of the physical refresh rate is in range
- // of the render frame rate.
- // For example for the render frame rate [50, 70]:
- // - 120Hz is in range as we can render at 60hz by skipping every other frame,
- // which is within the render rate range
- // - 90hz is not in range as none of the even divisors (i.e. 90, 45, 30)
- // fall within the acceptable render range.
- final int divisor =
- (int) Math.ceil((physicalRefreshRate / summary.maxRenderFrameRate)
- - FLOAT_TOLERANCE);
- float adjustedPhysicalRefreshRate = physicalRefreshRate / divisor;
- return adjustedPhysicalRefreshRate >= (summary.minRenderFrameRate - FLOAT_TOLERANCE);
- }
-
- private ArrayList<Display.Mode> filterModes(Display.Mode[] supportedModes,
- VoteSummary summary) {
- if (summary.minRenderFrameRate > summary.maxRenderFrameRate + FLOAT_TOLERANCE) {
- if (mLoggingEnabled) {
- Slog.w(TAG, "Vote summary resulted in empty set (invalid frame rate range)"
- + ": minRenderFrameRate=" + summary.minRenderFrameRate
- + ", maxRenderFrameRate=" + summary.maxRenderFrameRate);
- }
- return new ArrayList<>();
- }
-
- ArrayList<Display.Mode> availableModes = new ArrayList<>();
- boolean missingBaseModeRefreshRate = summary.appRequestBaseModeRefreshRate > 0f;
- for (Display.Mode mode : supportedModes) {
- if (mode.getPhysicalWidth() != summary.width
- || mode.getPhysicalHeight() != summary.height) {
- if (mLoggingEnabled) {
- Slog.w(TAG, "Discarding mode " + mode.getModeId() + ", wrong size"
- + ": desiredWidth=" + summary.width
- + ": desiredHeight=" + summary.height
- + ": actualWidth=" + mode.getPhysicalWidth()
- + ": actualHeight=" + mode.getPhysicalHeight());
- }
- continue;
- }
- final float physicalRefreshRate = mode.getRefreshRate();
- // Some refresh rates are calculated based on frame timings, so they aren't *exactly*
- // equal to expected refresh rate. Given that, we apply a bit of tolerance to this
- // comparison.
- if (physicalRefreshRate < (summary.minPhysicalRefreshRate - FLOAT_TOLERANCE)
- || physicalRefreshRate > (summary.maxPhysicalRefreshRate + FLOAT_TOLERANCE)) {
- if (mLoggingEnabled) {
- Slog.w(TAG, "Discarding mode " + mode.getModeId()
- + ", outside refresh rate bounds"
- + ": minPhysicalRefreshRate=" + summary.minPhysicalRefreshRate
- + ", maxPhysicalRefreshRate=" + summary.maxPhysicalRefreshRate
- + ", modeRefreshRate=" + physicalRefreshRate);
- }
- continue;
- }
-
- // The physical refresh rate must be in the render frame rate range, unless
- // frame rate override is supported.
- if (!mSupportsFrameRateOverride) {
- if (physicalRefreshRate < (summary.minRenderFrameRate - FLOAT_TOLERANCE)
- || physicalRefreshRate > (summary.maxRenderFrameRate + FLOAT_TOLERANCE)) {
- if (mLoggingEnabled) {
- Slog.w(TAG, "Discarding mode " + mode.getModeId()
- + ", outside render rate bounds"
- + ": minPhysicalRefreshRate=" + summary.minPhysicalRefreshRate
- + ", maxPhysicalRefreshRate=" + summary.maxPhysicalRefreshRate
- + ", modeRefreshRate=" + physicalRefreshRate);
- }
- continue;
- }
- }
-
- if (!isRenderRateAchievable(physicalRefreshRate, summary)) {
- if (mLoggingEnabled) {
- Slog.w(TAG, "Discarding mode " + mode.getModeId()
- + ", outside frame rate bounds"
- + ": minRenderFrameRate=" + summary.minRenderFrameRate
- + ", maxRenderFrameRate=" + summary.maxRenderFrameRate
- + ", modePhysicalRefreshRate=" + physicalRefreshRate);
- }
- continue;
- }
-
- availableModes.add(mode);
- if (equalsWithinFloatTolerance(mode.getRefreshRate(),
- summary.appRequestBaseModeRefreshRate)) {
- missingBaseModeRefreshRate = false;
- }
- }
- if (missingBaseModeRefreshRate) {
- return new ArrayList<>();
- }
-
- return availableModes;
- }
-
- private void updateSummaryWithBestAllowedResolution(final Display.Mode[] supportedModes,
- VoteSummary outSummary) {
- final int maxAllowedWidth = outSummary.width;
- final int maxAllowedHeight = outSummary.height;
- if (mLoggingEnabled) {
- Slog.i(TAG, "updateSummaryWithBestAllowedResolution " + outSummary);
- }
- outSummary.width = Vote.INVALID_SIZE;
- outSummary.height = Vote.INVALID_SIZE;
-
- int maxNumberOfPixels = 0;
- for (Display.Mode mode : supportedModes) {
- if (mode.getPhysicalWidth() > maxAllowedWidth
- || mode.getPhysicalHeight() > maxAllowedHeight
- || mode.getPhysicalWidth() < outSummary.minWidth
- || mode.getPhysicalHeight() < outSummary.minHeight
- || mode.getRefreshRate() < (outSummary.minPhysicalRefreshRate - FLOAT_TOLERANCE)
- || mode.getRefreshRate() > (outSummary.maxPhysicalRefreshRate + FLOAT_TOLERANCE)
- ) {
- continue;
- }
-
- int numberOfPixels = mode.getPhysicalHeight() * mode.getPhysicalWidth();
- if (numberOfPixels > maxNumberOfPixels || (mode.getPhysicalWidth() == maxAllowedWidth
- && mode.getPhysicalHeight() == maxAllowedHeight)) {
- if (mLoggingEnabled) {
- Slog.i(TAG, "updateSummaryWithBestAllowedResolution updated with " + mode);
- }
- maxNumberOfPixels = numberOfPixels;
- outSummary.width = mode.getPhysicalWidth();
- outSummary.height = mode.getPhysicalHeight();
- }
- }
- }
-
/**
* Gets the observer responsible for application display mode requests.
*/
@@ -925,16 +607,11 @@ public class DisplayModeDirector {
}
@VisibleForTesting
- DisplayObserver getDisplayObserver() {
- return mDisplayObserver;
- }
-
- @VisibleForTesting
DesiredDisplayModeSpecs getDesiredDisplayModeSpecsWithInjectedFpsSettings(
float minRefreshRate, float peakRefreshRate, float defaultRefreshRate) {
synchronized (mLock) {
- mSettingsObserver.updateRefreshRateSettingLocked(minRefreshRate, peakRefreshRate,
- defaultRefreshRate, Display.DEFAULT_DISPLAY);
+ mSettingsObserver.updateRefreshRateSettingLocked(
+ minRefreshRate, peakRefreshRate, defaultRefreshRate);
return getDesiredDisplayModeSpecs(Display.DEFAULT_DISPLAY);
}
}
@@ -1268,23 +945,9 @@ public class DisplayModeDirector {
mBrightnessObserver.onLowPowerModeEnabledLocked(inLowPowerMode);
}
- /**
- * Update refresh rate settings for all displays
- */
private void updateRefreshRateSettingLocked() {
- Display[] displays = mInjector.getDisplays();
- for (int i = 0; i < displays.length; i++) {
- updateRefreshRateSettingLocked(displays[i].getDisplayId());
- }
- }
-
- /**
- * Update refresh rate settings for a specific display
- * @param displayId The display ID
- */
- private void updateRefreshRateSettingLocked(int displayId) {
final ContentResolver cr = mContext.getContentResolver();
- float highestRefreshRate = findHighestRefreshRate(mContext, displayId);
+ float highestRefreshRate = findHighestRefreshRateForDefaultDisplay(mContext);
float minRefreshRate = Settings.System.getFloatForUser(cr,
Settings.System.MIN_REFRESH_RATE, 0f, cr.getUserId());
@@ -1312,12 +975,11 @@ public class DisplayModeDirector {
}
}
- updateRefreshRateSettingLocked(minRefreshRate, peakRefreshRate, mDefaultRefreshRate,
- displayId);
+ updateRefreshRateSettingLocked(minRefreshRate, peakRefreshRate, mDefaultRefreshRate);
}
- private void updateRefreshRateSettingLocked(float minRefreshRate, float peakRefreshRate,
- float defaultRefreshRate, int displayId) {
+ private void updateRefreshRateSettingLocked(
+ float minRefreshRate, float peakRefreshRate, float defaultRefreshRate) {
// TODO(b/156304339): The logic in here, aside from updating the refresh rate votes, is
// used to predict if we're going to be doing frequent refresh rate switching, and if
// so, enable the brightness observer. The logic here is more complicated and fragile
@@ -1325,9 +987,9 @@ public class DisplayModeDirector {
Vote peakVote = peakRefreshRate == 0f
? null
: Vote.forRenderFrameRates(0f, Math.max(minRefreshRate, peakRefreshRate));
- mVotesStorage.updateVote(displayId, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE,
+ mVotesStorage.updateGlobalVote(Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE,
peakVote);
- mVotesStorage.updateVote(displayId, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE,
+ mVotesStorage.updateGlobalVote(Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE,
Vote.forRenderFrameRates(minRefreshRate, Float.POSITIVE_INFINITY));
Vote defaultVote =
defaultRefreshRate == 0f
@@ -1484,8 +1146,7 @@ public class DisplayModeDirector {
}
}
- @VisibleForTesting
- public final class DisplayObserver implements DisplayManager.DisplayListener {
+ private final class DisplayObserver implements DisplayManager.DisplayListener {
// Note that we can never call into DisplayManager or any of the non-POD classes it
// returns, while holding mLock since it may call into DMS, which might be simultaneously
// calling into us already holding its own lock.
@@ -1577,7 +1238,6 @@ public class DisplayModeDirector {
updateDisplayModes(displayId, displayInfo);
updateLayoutLimitedFrameRate(displayId, displayInfo);
updateUserSettingDisplayPreferredSize(displayInfo);
- mSettingsObserver.updateRefreshRateSettingLocked(displayId);
}
@Nullable
diff --git a/services/core/java/com/android/server/display/mode/RefreshRateVote.java b/services/core/java/com/android/server/display/mode/RefreshRateVote.java
index 173b3c58cd95..670b8a13da4d 100644
--- a/services/core/java/com/android/server/display/mode/RefreshRateVote.java
+++ b/services/core/java/com/android/server/display/mode/RefreshRateVote.java
@@ -64,7 +64,7 @@ abstract class RefreshRateVote implements Vote {
* Vote: min(ignored) min(applied) min(applied+physical) max(applied) max(ignored)
*/
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
summary.minRenderFrameRate = Math.max(summary.minRenderFrameRate, mMinRefreshRate);
summary.maxRenderFrameRate = Math.min(summary.maxRenderFrameRate, mMaxRefreshRate);
// Physical refresh rate cannot be lower than the minimal render frame rate.
@@ -97,7 +97,7 @@ abstract class RefreshRateVote implements Vote {
* Vote: min(ignored) min(applied) max(applied+render) max(applied) max(ignored)
*/
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
summary.minPhysicalRefreshRate = Math.max(summary.minPhysicalRefreshRate,
mMinRefreshRate);
summary.maxPhysicalRefreshRate = Math.min(summary.maxPhysicalRefreshRate,
diff --git a/services/core/java/com/android/server/display/mode/SizeVote.java b/services/core/java/com/android/server/display/mode/SizeVote.java
index a9b18a54a105..f2f8dc451098 100644
--- a/services/core/java/com/android/server/display/mode/SizeVote.java
+++ b/services/core/java/com/android/server/display/mode/SizeVote.java
@@ -48,7 +48,7 @@ class SizeVote implements Vote {
}
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
if (mHeight > 0 && mWidth > 0) {
// For display size, disable refresh rate switching and base mode refresh rate use
// only the first vote we come across (i.e. the highest priority vote that includes
diff --git a/services/core/java/com/android/server/display/mode/SupportedModesVote.java b/services/core/java/com/android/server/display/mode/SupportedModesVote.java
index b31461fc66b8..7eebcc050b16 100644
--- a/services/core/java/com/android/server/display/mode/SupportedModesVote.java
+++ b/services/core/java/com/android/server/display/mode/SupportedModesVote.java
@@ -35,7 +35,7 @@ class SupportedModesVote implements Vote {
* If summary.supportedModes==null then there is no restriction on supportedModes
*/
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
if (summary.supportedModes == null) {
summary.supportedModes = new ArrayList<>(mSupportedModes);
} else {
diff --git a/services/core/java/com/android/server/display/mode/Vote.java b/services/core/java/com/android/server/display/mode/Vote.java
index c1cdd6952dcc..aa44566f6d99 100644
--- a/services/core/java/com/android/server/display/mode/Vote.java
+++ b/services/core/java/com/android/server/display/mode/Vote.java
@@ -128,7 +128,7 @@ interface Vote {
*/
int INVALID_SIZE = -1;
- void updateSummary(DisplayModeDirector.VoteSummary summary);
+ void updateSummary(VoteSummary summary);
static Vote forPhysicalRefreshRates(float minRefreshRate, float maxRefreshRate) {
return new CombinedVote(
diff --git a/services/core/java/com/android/server/display/mode/VoteSummary.java b/services/core/java/com/android/server/display/mode/VoteSummary.java
new file mode 100644
index 000000000000..99f414267dee
--- /dev/null
+++ b/services/core/java/com/android/server/display/mode/VoteSummary.java
@@ -0,0 +1,376 @@
+/*
+ * 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 com.android.server.display.mode;
+
+import android.util.Slog;
+import android.util.SparseArray;
+import android.view.Display;
+import android.view.SurfaceControl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+final class VoteSummary {
+ private static final float FLOAT_TOLERANCE = SurfaceControl.RefreshRateRange.FLOAT_TOLERANCE;
+ private static final String TAG = "VoteSummary";
+
+ public float minPhysicalRefreshRate;
+ public float maxPhysicalRefreshRate;
+ public float minRenderFrameRate;
+ public float maxRenderFrameRate;
+ public int width;
+ public int height;
+ public int minWidth;
+ public int minHeight;
+ public boolean disableRefreshRateSwitching;
+ public float appRequestBaseModeRefreshRate;
+
+ public List<SupportedModesVote.SupportedMode> supportedModes;
+
+ final boolean mIsDisplayResolutionRangeVotingEnabled;
+
+ private final boolean mVsyncProximityVoteEnabled;
+ private final boolean mSupportsFrameRateOverride;
+ private final boolean mLoggingEnabled;
+
+ VoteSummary(boolean isDisplayResolutionRangeVotingEnabled, boolean vsyncProximityVoteEnabled,
+ boolean loggingEnabled, boolean supportsFrameRateOverride) {
+ mIsDisplayResolutionRangeVotingEnabled = isDisplayResolutionRangeVotingEnabled;
+ mVsyncProximityVoteEnabled = vsyncProximityVoteEnabled;
+ mLoggingEnabled = loggingEnabled;
+ mSupportsFrameRateOverride = supportsFrameRateOverride;
+ reset();
+ }
+
+ void applyVotes(SparseArray<Vote> votes,
+ int lowestConsideredPriority, int highestConsideredPriority) {
+ reset();
+ for (int priority = highestConsideredPriority;
+ priority >= lowestConsideredPriority;
+ priority--) {
+ Vote vote = votes.get(priority);
+ if (vote == null) {
+ continue;
+ }
+ vote.updateSummary(this);
+ }
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "applyVotes for range ["
+ + Vote.priorityToString(lowestConsideredPriority) + ", "
+ + Vote.priorityToString(highestConsideredPriority) + "]: "
+ + this);
+ }
+ }
+
+ void adjustSize(Display.Mode defaultMode, Display.Mode[] modes) {
+ // If we don't have anything specifying the width / height of the display, just use
+ // the default width and height. We don't want these switching out from underneath
+ // us since it's a pretty disruptive behavior.
+ if (height == Vote.INVALID_SIZE || width == Vote.INVALID_SIZE) {
+ width = defaultMode.getPhysicalWidth();
+ height = defaultMode.getPhysicalHeight();
+ } else if (mIsDisplayResolutionRangeVotingEnabled) {
+ updateSummaryWithBestAllowedResolution(modes);
+ }
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "adjustSize: " + this);
+ }
+ }
+
+ void limitRefreshRanges(VoteSummary otherSummary) {
+ minPhysicalRefreshRate =
+ Math.min(minPhysicalRefreshRate, otherSummary.minPhysicalRefreshRate);
+ maxPhysicalRefreshRate =
+ Math.max(maxPhysicalRefreshRate, otherSummary.maxPhysicalRefreshRate);
+ minRenderFrameRate = Math.min(minRenderFrameRate, otherSummary.minRenderFrameRate);
+ maxRenderFrameRate = Math.max(maxRenderFrameRate, otherSummary.maxRenderFrameRate);
+
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "limitRefreshRanges: " + this);
+ }
+ }
+
+ List<Display.Mode> filterModes(Display.Mode[] modes) {
+ if (!isValid()) {
+ return new ArrayList<>();
+ }
+ ArrayList<Display.Mode> availableModes = new ArrayList<>();
+ boolean missingBaseModeRefreshRate = appRequestBaseModeRefreshRate > 0f;
+
+ for (Display.Mode mode : modes) {
+ if (!validateModeSupported(mode)) {
+ continue;
+ }
+ if (!validateModeSize(mode)) {
+ continue;
+ }
+ if (!validateModeWithinPhysicalRefreshRange(mode)) {
+ continue;
+ }
+ if (!validateModeWithinRenderRefreshRange(mode)) {
+ continue;
+ }
+ if (!validateModeRenderRateAchievable(mode)) {
+ continue;
+ }
+ availableModes.add(mode);
+ if (equalsWithinFloatTolerance(mode.getRefreshRate(), appRequestBaseModeRefreshRate)) {
+ missingBaseModeRefreshRate = false;
+ }
+ }
+ if (missingBaseModeRefreshRate) {
+ return new ArrayList<>();
+ }
+
+ return availableModes;
+ }
+
+ Display.Mode selectBaseMode(List<Display.Mode> availableModes, Display.Mode defaultMode) {
+ // The base mode should be as close as possible to the app requested mode. Since all the
+ // available modes already have the same size, we just need to look for a matching refresh
+ // rate. If the summary doesn't include an app requested refresh rate, we'll use the default
+ // mode refresh rate. This is important because SurfaceFlinger can do only seamless switches
+ // by default. Some devices (e.g. TV) don't support seamless switching so the mode we select
+ // here won't be changed.
+ float preferredRefreshRate =
+ appRequestBaseModeRefreshRate > 0
+ ? appRequestBaseModeRefreshRate : defaultMode.getRefreshRate();
+ for (Display.Mode availableMode : availableModes) {
+ if (equalsWithinFloatTolerance(preferredRefreshRate, availableMode.getRefreshRate())) {
+ return availableMode;
+ }
+ }
+
+ // If we couldn't find a mode id based on the refresh rate, it means that the available
+ // modes were filtered by the app requested size, which is different that the default mode
+ // size, and the requested app refresh rate was dropped from the summary due to a higher
+ // priority vote. Since we don't have any other hint about the refresh rate,
+ // we just pick the first.
+ return !availableModes.isEmpty() ? availableModes.get(0) : null;
+ }
+
+ void disableModeSwitching(float fps) {
+ minPhysicalRefreshRate = maxPhysicalRefreshRate = fps;
+ maxRenderFrameRate = Math.min(maxRenderFrameRate, fps);
+
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "Disabled mode switching on summary: " + this);
+ }
+ }
+
+ void disableRenderRateSwitching(float fps) {
+ minRenderFrameRate = maxRenderFrameRate;
+
+ if (!isRenderRateAchievable(fps)) {
+ minRenderFrameRate = maxRenderFrameRate = fps;
+ }
+
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "Disabled render rate switching on summary: " + this);
+ }
+ }
+ private boolean validateModeSize(Display.Mode mode) {
+ if (mode.getPhysicalWidth() != width
+ || mode.getPhysicalHeight() != height) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId() + ", wrong size"
+ + ": desiredWidth=" + width
+ + ": desiredHeight=" + height
+ + ": actualWidth=" + mode.getPhysicalWidth()
+ + ": actualHeight=" + mode.getPhysicalHeight());
+ }
+ return false;
+ }
+ return true;
+ }
+
+ private boolean validateModeWithinPhysicalRefreshRange(Display.Mode mode) {
+ float refreshRate = mode.getRefreshRate();
+ // Some refresh rates are calculated based on frame timings, so they aren't *exactly*
+ // equal to expected refresh rate. Given that, we apply a bit of tolerance to this
+ // comparison.
+ if (refreshRate < (minPhysicalRefreshRate - FLOAT_TOLERANCE)
+ || refreshRate > (maxPhysicalRefreshRate + FLOAT_TOLERANCE)) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId()
+ + ", outside refresh rate bounds"
+ + ": minPhysicalRefreshRate=" + minPhysicalRefreshRate
+ + ", maxPhysicalRefreshRate=" + maxPhysicalRefreshRate
+ + ", modeRefreshRate=" + refreshRate);
+ }
+ return false;
+ }
+ return true;
+ }
+
+ private boolean validateModeWithinRenderRefreshRange(Display.Mode mode) {
+ float refreshRate = mode.getRefreshRate();
+ // The physical refresh rate must be in the render frame rate range, unless
+ // frame rate override is supported.
+ if (!mSupportsFrameRateOverride) {
+ if (refreshRate < (minRenderFrameRate - FLOAT_TOLERANCE)
+ || refreshRate > (maxRenderFrameRate + FLOAT_TOLERANCE)) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId()
+ + ", outside render rate bounds"
+ + ": minRenderFrameRate=" + minRenderFrameRate
+ + ", maxRenderFrameRate=" + maxRenderFrameRate
+ + ", modeRefreshRate=" + refreshRate);
+ }
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean validateModeRenderRateAchievable(Display.Mode mode) {
+ float refreshRate = mode.getRefreshRate();
+ if (!isRenderRateAchievable(refreshRate)) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId()
+ + ", outside frame rate bounds"
+ + ": minRenderFrameRate=" + minRenderFrameRate
+ + ", maxRenderFrameRate=" + maxRenderFrameRate
+ + ", modePhysicalRefreshRate=" + refreshRate);
+ }
+ return false;
+ }
+ return true;
+ }
+
+ private boolean validateModeSupported(Display.Mode mode) {
+ if (supportedModes == null || !mVsyncProximityVoteEnabled) {
+ return true;
+ }
+ for (SupportedModesVote.SupportedMode supportedMode : supportedModes) {
+ if (equalsWithinFloatTolerance(mode.getRefreshRate(), supportedMode.mPeakRefreshRate)
+ && equalsWithinFloatTolerance(mode.getVsyncRate(), supportedMode.mVsyncRate)) {
+ return true;
+ }
+ }
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId()
+ + ", supportedMode not found"
+ + ": mode.refreshRate=" + mode.getRefreshRate()
+ + ", mode.vsyncRate=" + mode.getVsyncRate()
+ + ", supportedModes=" + supportedModes);
+ }
+ return false;
+ }
+
+ private boolean isRenderRateAchievable(float physicalRefreshRate) {
+ // Check whether the render frame rate range is achievable by the mode's physical
+ // refresh rate, meaning that if a divisor of the physical refresh rate is in range
+ // of the render frame rate.
+ // For example for the render frame rate [50, 70]:
+ // - 120Hz is in range as we can render at 60hz by skipping every other frame,
+ // which is within the render rate range
+ // - 90hz is not in range as none of the even divisors (i.e. 90, 45, 30)
+ // fall within the acceptable render range.
+ final int divisor =
+ (int) Math.ceil((physicalRefreshRate / maxRenderFrameRate)
+ - FLOAT_TOLERANCE);
+ float adjustedPhysicalRefreshRate = physicalRefreshRate / divisor;
+ return adjustedPhysicalRefreshRate >= (minRenderFrameRate - FLOAT_TOLERANCE);
+ }
+
+ private boolean isValid() {
+ if (minRenderFrameRate > maxRenderFrameRate + FLOAT_TOLERANCE) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Vote summary resulted in empty set (invalid frame rate range)"
+ + ": minRenderFrameRate=" + minRenderFrameRate
+ + ", maxRenderFrameRate=" + maxRenderFrameRate);
+ }
+ return false;
+ }
+
+ if (supportedModes != null && mVsyncProximityVoteEnabled && supportedModes.isEmpty()) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Vote summary resulted in empty set (empty supportedModes)");
+ }
+ return false;
+ }
+ return true;
+ }
+
+ private void updateSummaryWithBestAllowedResolution(final Display.Mode[] supportedModes) {
+ int maxAllowedWidth = width;
+ int maxAllowedHeight = height;
+ width = Vote.INVALID_SIZE;
+ height = Vote.INVALID_SIZE;
+ int maxNumberOfPixels = 0;
+ for (Display.Mode mode : supportedModes) {
+ if (mode.getPhysicalWidth() > maxAllowedWidth
+ || mode.getPhysicalHeight() > maxAllowedHeight
+ || mode.getPhysicalWidth() < minWidth
+ || mode.getPhysicalHeight() < minHeight
+ || mode.getRefreshRate() < (minPhysicalRefreshRate - FLOAT_TOLERANCE)
+ || mode.getRefreshRate() > (maxPhysicalRefreshRate + FLOAT_TOLERANCE)
+ ) {
+ continue;
+ }
+
+ int numberOfPixels = mode.getPhysicalHeight() * mode.getPhysicalWidth();
+ if (numberOfPixels > maxNumberOfPixels || (mode.getPhysicalWidth() == maxAllowedWidth
+ && mode.getPhysicalHeight() == maxAllowedHeight)) {
+ maxNumberOfPixels = numberOfPixels;
+ width = mode.getPhysicalWidth();
+ height = mode.getPhysicalHeight();
+ }
+ }
+ }
+
+ private void reset() {
+ minPhysicalRefreshRate = 0f;
+ maxPhysicalRefreshRate = Float.POSITIVE_INFINITY;
+ minRenderFrameRate = 0f;
+ maxRenderFrameRate = Float.POSITIVE_INFINITY;
+ width = Vote.INVALID_SIZE;
+ height = Vote.INVALID_SIZE;
+ minWidth = 0;
+ minHeight = 0;
+ disableRefreshRateSwitching = false;
+ appRequestBaseModeRefreshRate = 0f;
+ supportedModes = null;
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "Summary reset: " + this);
+ }
+ }
+
+ private static boolean equalsWithinFloatTolerance(float a, float b) {
+ return a >= b - FLOAT_TOLERANCE && a <= b + FLOAT_TOLERANCE;
+ }
+
+ @Override
+ public String toString() {
+ return "VoteSummary{ minPhysicalRefreshRate=" + minPhysicalRefreshRate
+ + ", maxPhysicalRefreshRate=" + maxPhysicalRefreshRate
+ + ", minRenderFrameRate=" + minRenderFrameRate
+ + ", maxRenderFrameRate=" + maxRenderFrameRate
+ + ", width=" + width
+ + ", height=" + height
+ + ", minWidth=" + minWidth
+ + ", minHeight=" + minHeight
+ + ", disableRefreshRateSwitching=" + disableRefreshRateSwitching
+ + ", appRequestBaseModeRefreshRate=" + appRequestBaseModeRefreshRate
+ + ", supportedModes=" + supportedModes
+ + ", mIsDisplayResolutionRangeVotingEnabled="
+ + mIsDisplayResolutionRangeVotingEnabled
+ + ", mVsyncProximityVoteEnabled=" + mVsyncProximityVoteEnabled
+ + ", mSupportsFrameRateOverride=" + mSupportsFrameRateOverride + " }";
+ }
+}
diff --git a/services/core/java/com/android/server/input/KeyboardMetricsCollector.java b/services/core/java/com/android/server/input/KeyboardMetricsCollector.java
index 2dd2a16bed64..ebc784d763ef 100644
--- a/services/core/java/com/android/server/input/KeyboardMetricsCollector.java
+++ b/services/core/java/com/android/server/input/KeyboardMetricsCollector.java
@@ -369,15 +369,15 @@ public final class KeyboardMetricsCollector {
if (inputDevice == null || inputDevice.isVirtual() || !inputDevice.isFullKeyboard()) {
return;
}
- int vendorId = inputDevice.getVendorId();
- int productId = inputDevice.getProductId();
if (keyboardSystemEvent == null) {
Slog.w(TAG, "Invalid keyboard event logging, keycode = " + Arrays.toString(keyCodes)
+ ", modifier state = " + modifierState);
return;
}
FrameworkStatsLog.write(FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED,
- vendorId, productId, keyboardSystemEvent.getIntValue(), keyCodes, modifierState);
+ inputDevice.getVendorId(), inputDevice.getProductId(),
+ keyboardSystemEvent.getIntValue(), keyCodes, modifierState,
+ inputDevice.getDeviceBus());
if (DEBUG) {
Slog.d(TAG, "Logging Keyboard system event: " + keyboardSystemEvent.mName);
@@ -402,7 +402,7 @@ public final class KeyboardMetricsCollector {
// Push the atom to Statsd
FrameworkStatsLog.write(FrameworkStatsLog.KEYBOARD_CONFIGURED,
event.isFirstConfiguration(), event.getVendorId(), event.getProductId(),
- proto.getBytes());
+ proto.getBytes(), event.getDeviceBus());
if (DEBUG) {
Slog.d(TAG, "Logging Keyboard configuration event: " + event);
@@ -467,6 +467,10 @@ public final class KeyboardMetricsCollector {
return mInputDevice.getProductId();
}
+ public int getDeviceBus() {
+ return mInputDevice.getDeviceBus();
+ }
+
public boolean isFirstConfiguration() {
return mIsFirstConfiguration;
}
@@ -479,6 +483,7 @@ public final class KeyboardMetricsCollector {
public String toString() {
return "InputDevice = {VendorId = " + Integer.toHexString(getVendorId())
+ ", ProductId = " + Integer.toHexString(getProductId())
+ + ", Device Bus = " + Integer.toHexString(getDeviceBus())
+ "}, isFirstConfiguration = " + mIsFirstConfiguration
+ ", LayoutConfigurations = " + mLayoutConfigurations;
}
diff --git a/services/core/java/com/android/server/inputmethod/HandwritingModeController.java b/services/core/java/com/android/server/inputmethod/HandwritingModeController.java
index 749d6b0a7ef7..dcb86a7d1eb6 100644
--- a/services/core/java/com/android/server/inputmethod/HandwritingModeController.java
+++ b/services/core/java/com/android/server/inputmethod/HandwritingModeController.java
@@ -22,6 +22,8 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.UiThread;
+import android.content.ComponentName;
+import android.content.pm.PackageManagerInternal;
import android.hardware.input.InputManagerGlobal;
import android.os.Handler;
import android.os.IBinder;
@@ -66,6 +68,7 @@ final class HandwritingModeController {
private final Looper mLooper;
private final InputManagerInternal mInputManagerInternal;
private final WindowManagerInternal mWindowManagerInternal;
+ private final PackageManagerInternal mPackageManagerInternal;
private ArrayList<MotionEvent> mHandwritingBuffer;
private InputEventReceiver mHandwritingEventReceiver;
@@ -75,6 +78,7 @@ final class HandwritingModeController {
// when set, package names are used for handwriting delegation.
private @Nullable String mDelegatePackageName;
private @Nullable String mDelegatorPackageName;
+ private boolean mDelegatorFromDefaultHomePackage;
private Runnable mDelegationIdleTimeoutRunnable;
private Handler mDelegationIdleTimeoutHandler;
@@ -88,6 +92,7 @@ final class HandwritingModeController {
mCurrentDisplayId = Display.INVALID_DISPLAY;
mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
+ mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
mCurrentRequestId = 0;
mInkWindowInitRunnable = inkWindowInitRunnable;
}
@@ -151,9 +156,20 @@ final class HandwritingModeController {
* @see InputMethodManager#prepareStylusHandwritingDelegation(View, String)
*/
void prepareStylusHandwritingDelegation(
- @NonNull String delegatePackageName, @NonNull String delegatorPackageName) {
+ int userId, @NonNull String delegatePackageName, @NonNull String delegatorPackageName) {
mDelegatePackageName = delegatePackageName;
mDelegatorPackageName = delegatorPackageName;
+ mDelegatorFromDefaultHomePackage = false;
+ // mDelegatorFromDefaultHomeActivity is only used in the cross-package delegation case.
+ // For same-package delegation, it doesn't need to be checked.
+ if (!delegatorPackageName.equals(delegatePackageName)) {
+ ComponentName defaultHomeActivity =
+ mPackageManagerInternal.getDefaultHomeActivity(userId);
+ if (defaultHomeActivity != null) {
+ mDelegatorFromDefaultHomePackage =
+ delegatorPackageName.equals(defaultHomeActivity.getPackageName());
+ }
+ }
if (mHandwritingBuffer == null) {
mHandwritingBuffer = new ArrayList<>(getHandwritingBufferSize());
} else {
@@ -170,6 +186,10 @@ final class HandwritingModeController {
return mDelegatorPackageName;
}
+ boolean isDelegatorFromDefaultHomePackage() {
+ return mDelegatorFromDefaultHomePackage;
+ }
+
private void scheduleHandwritingDelegationTimeout() {
if (mDelegationIdleTimeoutHandler == null) {
mDelegationIdleTimeoutHandler = new Handler(mLooper);
@@ -210,6 +230,7 @@ final class HandwritingModeController {
mDelegationIdleTimeoutRunnable = null;
mDelegatorPackageName = null;
mDelegatePackageName = null;
+ mDelegatorFromDefaultHomePackage = false;
}
/**
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index ddb32fe09d6c..a0bc7c27ff4a 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -2085,7 +2085,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
new ArrayMap<>();
AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap, methodMap,
- methodList, directBootAwareness, mSettings.getEnabledInputMethodNames());
+ methodList, directBootAwareness);
settings = new InputMethodSettings(mContext, methodMap, userId, true /* copyOnWrite */);
}
// filter caller's access to input methods
@@ -2713,10 +2713,10 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
}
@AnyThread
- void schedulePrepareStylusHandwritingDelegation(
+ void schedulePrepareStylusHandwritingDelegation(@UserIdInt int userId,
@NonNull String delegatePackageName, @NonNull String delegatorPackageName) {
mHandler.obtainMessage(
- MSG_PREPARE_HANDWRITING_DELEGATION,
+ MSG_PREPARE_HANDWRITING_DELEGATION, userId, 0 /* unused */,
new Pair<>(delegatePackageName, delegatorPackageName)).sendToTarget();
}
@@ -3433,7 +3433,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
Slog.w(TAG, "prepareStylusHandwritingDelegation() fail");
throw new IllegalArgumentException("Delegator doesn't match Uid");
}
- schedulePrepareStylusHandwritingDelegation(delegatePackageName, delegatorPackageName);
+ schedulePrepareStylusHandwritingDelegation(
+ userId, delegatePackageName, delegatorPackageName);
}
@Override
@@ -3441,13 +3442,14 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
@NonNull IInputMethodClient client,
@UserIdInt int userId,
@NonNull String delegatePackageName,
- @NonNull String delegatorPackageName) {
+ @NonNull String delegatorPackageName,
+ @InputMethodManager.HandwritingDelegateFlags int flags) {
if (!isStylusHandwritingEnabled(mContext, userId)) {
Slog.w(TAG, "Can not accept stylus handwriting delegation. Stylus handwriting"
+ " pref is disabled for user: " + userId);
return false;
}
- if (!verifyDelegator(client, delegatePackageName, delegatorPackageName)) {
+ if (!verifyDelegator(client, delegatePackageName, delegatorPackageName, flags)) {
return false;
}
@@ -3471,14 +3473,20 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
private boolean verifyDelegator(
@NonNull IInputMethodClient client,
@NonNull String delegatePackageName,
- @NonNull String delegatorPackageName) {
+ @NonNull String delegatorPackageName,
+ @InputMethodManager.HandwritingDelegateFlags int flags) {
if (!verifyClientAndPackageMatch(client, delegatePackageName)) {
Slog.w(TAG, "Delegate package does not belong to the same user. Ignoring"
+ " startStylusHandwriting");
return false;
}
synchronized (ImfLock.class) {
- if (!delegatorPackageName.equals(mHwController.getDelegatorPackageName())) {
+ boolean homeDelegatorAllowed =
+ (flags & InputMethodManager.HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED)
+ != 0;
+ if (!delegatorPackageName.equals(mHwController.getDelegatorPackageName())
+ && !(homeDelegatorAllowed
+ && mHwController.isDelegatorFromDefaultHomePackage())) {
Slog.w(TAG,
"Delegator package does not match. Ignoring startStylusHandwriting");
return false;
@@ -4200,7 +4208,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
new ArrayMap<>();
AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap, methodMap,
- methodList, DirectBootAwareness.AUTO, mSettings.getEnabledInputMethodNames());
+ methodList, DirectBootAwareness.AUTO);
final InputMethodSettings settings = new InputMethodSettings(mContext, methodMap,
userId, false);
settings.setAdditionalInputMethodSubtypes(imiId, toBeAdded, additionalSubtypeMap,
@@ -4924,9 +4932,10 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
}
case MSG_PREPARE_HANDWRITING_DELEGATION:
synchronized (ImfLock.class) {
+ int userId = msg.arg1;
String delegate = (String) ((Pair) msg.obj).first;
String delegator = (String) ((Pair) msg.obj).second;
- mHwController.prepareStylusHandwritingDelegation(delegate, delegator);
+ mHwController.prepareStylusHandwritingDelegation(userId, delegate, delegator);
}
return true;
case MSG_START_HANDWRITING:
@@ -5025,7 +5034,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
static void queryInputMethodServicesInternal(Context context,
@UserIdInt int userId, ArrayMap<String, List<InputMethodSubtype>> additionalSubtypeMap,
ArrayMap<String, InputMethodInfo> methodMap, ArrayList<InputMethodInfo> methodList,
- @DirectBootAwareness int directBootAwareness, List<String> enabledInputMethodList) {
+ @DirectBootAwareness int directBootAwareness) {
final Context userAwareContext = context.getUserId() == userId
? context
: context.createContextAsUser(UserHandle.of(userId), 0 /* flags */);
@@ -5058,6 +5067,11 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
methodList.ensureCapacity(services.size());
methodMap.ensureCapacity(services.size());
+ // Note: This is a temporary solution for Bug 261723412. If there is any better solution,
+ // we should remove this data dependency.
+ final List<String> enabledInputMethodList =
+ InputMethodUtils.getEnabledInputMethodIdsForFiltering(context, userId);
+
filterInputMethodServices(additionalSubtypeMap, methodMap, methodList,
enabledInputMethodList, userAwareContext, services);
}
@@ -5124,8 +5138,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
mMyPackageMonitor.clearKnownImePackageNamesLocked();
queryInputMethodServicesInternal(mContext, mSettings.getCurrentUserId(),
- mAdditionalSubtypeMap, mMethodMap, mMethodList, DirectBootAwareness.AUTO,
- mSettings.getEnabledInputMethodNames());
+ mAdditionalSubtypeMap, mMethodMap, mMethodList, DirectBootAwareness.AUTO);
// Construct the set of possible IME packages for onPackageChanged() to avoid false
// negatives when the package state remains to be the same but only the component state is
@@ -5438,47 +5451,21 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
*/
@GuardedBy("ImfLock.class")
private InputMethodInfo queryDefaultInputMethodForUserIdLocked(@UserIdInt int userId) {
- final String imeId = mSettings.getSelectedInputMethodForUser(userId);
- if (TextUtils.isEmpty(imeId)) {
- Slog.e(TAG, "No default input method found for userId " + userId);
- return null;
- }
-
- InputMethodInfo curInputMethodInfo;
- if (userId == mSettings.getCurrentUserId()
- && (curInputMethodInfo = mMethodMap.get(imeId)) != null) {
- // clone the InputMethodInfo before returning.
- return new InputMethodInfo(curInputMethodInfo);
+ if (userId == mSettings.getCurrentUserId()) {
+ return mMethodMap.get(mSettings.getSelectedInputMethod());
}
+ final ArrayMap<String, InputMethodInfo> methodMap = new ArrayMap<>();
+ final ArrayList<InputMethodInfo> methodList = new ArrayList<>();
final ArrayMap<String, List<InputMethodSubtype>> additionalSubtypeMap = new ArrayMap<>();
AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
- Context userAwareContext =
- mContext.createContextAsUser(UserHandle.of(userId), 0 /* flags */);
-
- final int flags = PackageManager.GET_META_DATA
- | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
- | PackageManager.MATCH_DIRECT_BOOT_AUTO;
- final List<ResolveInfo> services =
- userAwareContext.getPackageManager().queryIntentServicesAsUser(
- new Intent(InputMethod.SERVICE_INTERFACE),
- PackageManager.ResolveInfoFlags.of(flags),
- userId);
- for (ResolveInfo ri : services) {
- final String imeIdResolved = InputMethodInfo.computeId(ri);
- if (imeId.equals(imeIdResolved)) {
- try {
- return new InputMethodInfo(
- userAwareContext, ri, additionalSubtypeMap.get(imeId));
- } catch (Exception e) {
- Slog.wtf(TAG, "Unable to load input method " + imeId, e);
- }
- }
- }
- // we didn't find the InputMethodInfo for imeId. This shouldn't happen.
- Slog.e(TAG, "Error while locating input method info for imeId: " + imeId);
- return null;
+ queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap, methodMap,
+ methodList, DirectBootAwareness.AUTO);
+ InputMethodSettings settings = new InputMethodSettings(mContext, methodMap, userId,
+ true /* copyOnWrite */);
+ return methodMap.get(settings.getSelectedInputMethod());
}
+
private ArrayMap<String, InputMethodInfo> queryMethodMapForUser(@UserIdInt int userId) {
final ArrayMap<String, InputMethodInfo> methodMap = new ArrayMap<>();
final ArrayList<InputMethodInfo> methodList = new ArrayList<>();
@@ -5486,8 +5473,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
new ArrayMap<>();
AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap,
- methodMap, methodList, DirectBootAwareness.AUTO,
- mSettings.getEnabledInputMethodNames());
+ methodMap, methodList, DirectBootAwareness.AUTO);
return methodMap;
}
@@ -6511,8 +6497,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
new ArrayMap<>();
AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap,
- methodMap, methodList, DirectBootAwareness.AUTO,
- mSettings.getEnabledInputMethodNames());
+ methodMap, methodList, DirectBootAwareness.AUTO);
final InputMethodSettings settings = new InputMethodSettings(mContext,
methodMap, userId, false);
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodUtils.java b/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
index c97d8e21eef1..984ae1f06711 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
@@ -330,17 +330,11 @@ final class InputMethodUtils {
@Nullable
private String getString(@NonNull String key, @Nullable String defaultValue) {
- return getStringForUser(key, defaultValue, mCurrentUserId);
- }
-
- @Nullable
- private String getStringForUser(
- @NonNull String key, @Nullable String defaultValue, @UserIdInt int userId) {
final String result;
if (mCopyOnWrite && mCopyOnWriteDataStore.containsKey(key)) {
result = mCopyOnWriteDataStore.get(key);
} else {
- result = Settings.Secure.getStringForUser(mResolver, key, userId);
+ result = Settings.Secure.getStringForUser(mResolver, key, mCurrentUserId);
}
return result != null ? result : defaultValue;
}
@@ -756,16 +750,6 @@ final class InputMethodUtils {
return imi;
}
- @Nullable
- String getSelectedInputMethodForUser(@UserIdInt int userId) {
- final String imi =
- getStringForUser(Settings.Secure.DEFAULT_INPUT_METHOD, null, userId);
- if (DEBUG) {
- Slog.d(TAG, "getSelectedInputMethodForUserStr: " + imi);
- }
- return imi;
- }
-
void putDefaultVoiceInputMethod(String imeId) {
if (DEBUG) {
Slog.d(TAG, "putDefaultVoiceInputMethodStr: " + imeId + ", " + mCurrentUserId);
@@ -1029,6 +1013,44 @@ final class InputMethodUtils {
}
/**
+ * Returns a list of enabled IME IDs to address Bug 261723412.
+ *
+ * <p>This is a temporary workaround until we come up with a better solution. Do not use this
+ * for anything other than Bug 261723412.</p>
+ *
+ * @param context {@link Context} object to query secure settings.
+ * @param userId User ID to query about.
+ * @return A list of enabled IME IDs.
+ */
+ @NonNull
+ static List<String> getEnabledInputMethodIdsForFiltering(@NonNull Context context,
+ @UserIdInt int userId) {
+ final String enabledInputMethodsStr = TextUtils.nullIfEmpty(
+ Settings.Secure.getStringForUser(
+ context.getContentResolver(),
+ Settings.Secure.ENABLED_INPUT_METHODS,
+ userId));
+ if (enabledInputMethodsStr == null) {
+ return List.of();
+ }
+ final TextUtils.SimpleStringSplitter inputMethodSplitter =
+ new TextUtils.SimpleStringSplitter(INPUT_METHOD_SEPARATOR);
+ final TextUtils.SimpleStringSplitter subtypeSplitter =
+ new TextUtils.SimpleStringSplitter(INPUT_METHOD_SUBTYPE_SEPARATOR);
+ inputMethodSplitter.setString(enabledInputMethodsStr);
+ final ArrayList<String> result = new ArrayList<>();
+ while (inputMethodSplitter.hasNext()) {
+ String nextImsStr = inputMethodSplitter.next();
+ subtypeSplitter.setString(nextImsStr);
+ if (subtypeSplitter.hasNext()) {
+ // The first element is ime id.
+ result.add(subtypeSplitter.next());
+ }
+ }
+ return result;
+ }
+
+ /**
* Convert the input method ID to a component name
*
* @param id A unique ID for this input method.
diff --git a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
index 35c61204d251..d359280c2a6f 100644
--- a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
+++ b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
@@ -467,8 +467,7 @@ public abstract class IContextHubWrapper {
}
public byte[] getUuid() throws RemoteException {
- //TODO(b/247124878): return the UUID defined in this file when the API is put in use
- throw new RemoteException("This API is not implemented yet.");
+ return UUID;
}
@Override
diff --git a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
index 6f9b7d6328c7..27b01a5424b8 100644
--- a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java
@@ -67,6 +67,7 @@ import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationRequest;
import android.location.LocationResult;
+import android.location.flags.Flags;
import android.location.provider.ProviderProperties;
import android.location.provider.ProviderRequest;
import android.location.util.identity.CallerIdentity;
@@ -1048,10 +1049,22 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
stopBatching();
if (mStarted && mGnssNative.getCapabilities().hasScheduling()) {
- // change period and/or lowPowerMode
- if (!setPositionMode(mPositionMode, GNSS_POSITION_RECURRENCE_PERIODIC,
- mFixInterval, mProviderRequest.isLowPower())) {
- Log.e(TAG, "set_position_mode failed in updateRequirements");
+ if (Flags.gnssCallStopBeforeSetPositionMode()) {
+ GnssPositionMode positionMode = new GnssPositionMode(mPositionMode,
+ GNSS_POSITION_RECURRENCE_PERIODIC, mFixInterval,
+ /* preferredAccuracy= */ 0,
+ /* preferredTime= */ 0,
+ mProviderRequest.isLowPower());
+ if (!positionMode.equals(mLastPositionMode)) {
+ stopNavigating();
+ startNavigating();
+ }
+ } else {
+ // change period and/or lowPowerMode
+ if (!setPositionMode(mPositionMode, GNSS_POSITION_RECURRENCE_PERIODIC,
+ mFixInterval, mProviderRequest.isLowPower())) {
+ Log.e(TAG, "set_position_mode failed in updateRequirements");
+ }
}
} else if (!mStarted) {
// start GPS
@@ -1234,11 +1247,32 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
}
int interval = mGnssNative.getCapabilities().hasScheduling() ? mFixInterval : 1000;
- if (!setPositionMode(mPositionMode, GNSS_POSITION_RECURRENCE_PERIODIC,
- interval, mProviderRequest.isLowPower())) {
- setStarted(false);
- Log.e(TAG, "set_position_mode failed in startNavigating()");
- return;
+
+ if (Flags.gnssCallStopBeforeSetPositionMode()) {
+ boolean success = mGnssNative.setPositionMode(mPositionMode,
+ GNSS_POSITION_RECURRENCE_PERIODIC, interval,
+ /* preferredAccuracy= */ 0,
+ /* preferredTime= */ 0,
+ mProviderRequest.isLowPower());
+ if (success) {
+ mLastPositionMode = new GnssPositionMode(mPositionMode,
+ GNSS_POSITION_RECURRENCE_PERIODIC, interval,
+ /* preferredAccuracy= */ 0,
+ /* preferredTime= */ 0,
+ mProviderRequest.isLowPower());
+ } else {
+ mLastPositionMode = null;
+ setStarted(false);
+ Log.e(TAG, "set_position_mode failed in startNavigating()");
+ return;
+ }
+ } else {
+ if (!setPositionMode(mPositionMode, GNSS_POSITION_RECURRENCE_PERIODIC,
+ interval, mProviderRequest.isLowPower())) {
+ setStarted(false);
+ Log.e(TAG, "set_position_mode failed in startNavigating()");
+ return;
+ }
}
if (!mGnssNative.start()) {
setStarted(false);
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 57e424d944f5..49095ceb5bdd 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -246,7 +246,7 @@ public class LockSettingsService extends ILockSettings.Stub {
private static final String MIGRATED_SP_FULL = "migrated_all_users_to_sp_and_bound_keys";
private static final boolean FIX_UNLOCKED_DEVICE_REQUIRED_KEYS =
- android.security.Flags.fixUnlockedDeviceRequiredKeys();
+ android.security.Flags.fixUnlockedDeviceRequiredKeysV2();
// Duration that LockSettingsService will store the gatekeeper password for. This allows
// multiple biometric enrollments without prompting the user to enter their password via
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
index 4bac872dbaa9..17f2fcc5b9d8 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
@@ -155,43 +155,45 @@ class LockSettingsShellCommand extends ShellCommand {
try (final PrintWriter pw = getOutPrintWriter();) {
pw.println("lockSettings service commands:");
pw.println("");
- pw.println("NOTE: when lock screen is set, all commands require the --old <CREDENTIAL>"
- + " argument.");
+ pw.println("NOTE: when a secure lock screen is set, most commands require the");
+ pw.println("--old <CREDENTIAL> option.");
pw.println("");
pw.println(" help");
pw.println(" Prints this help text.");
pw.println("");
- pw.println(" get-disabled [--old <CREDENTIAL>] [--user USER_ID]");
- pw.println(" Checks whether lock screen is disabled.");
+ pw.println(" get-disabled [--user USER_ID]");
+ pw.println(" Prints true if the lock screen is completely disabled, i.e. set to None.");
+ pw.println(" Otherwise prints false.");
pw.println("");
- pw.println(" set-disabled [--old <CREDENTIAL>] [--user USER_ID] <true|false>");
- pw.println(" When true, disables lock screen.");
+ pw.println(" set-disabled [--user USER_ID] <true|false>");
+ pw.println(" Sets whether the lock screen is disabled. If the lock screen is secure, this");
+ pw.println(" has no immediate effect. I.e. this can only change between Swipe and None.");
pw.println("");
pw.println(" set-pattern [--old <CREDENTIAL>] [--user USER_ID] <PATTERN>");
- pw.println(" Sets the lock screen as pattern, using the given PATTERN to unlock.");
+ pw.println(" Sets a secure lock screen that uses the given PATTERN. PATTERN is a series");
+ pw.println(" of digits 1-9 that identify the cells of the pattern.");
pw.println("");
pw.println(" set-pin [--old <CREDENTIAL>] [--user USER_ID] <PIN>");
- pw.println(" Sets the lock screen as PIN, using the given PIN to unlock.");
+ pw.println(" Sets a secure lock screen that uses the given PIN.");
pw.println("");
pw.println(" set-password [--old <CREDENTIAL>] [--user USER_ID] <PASSWORD>");
- pw.println(" Sets the lock screen as password, using the given PASSWORD to unlock.");
+ pw.println(" Sets a secure lock screen that uses the given PASSWORD.");
pw.println("");
pw.println(" clear [--old <CREDENTIAL>] [--user USER_ID]");
- pw.println(" Clears the lock credentials.");
+ pw.println(" Clears the lock credential.");
pw.println("");
pw.println(" verify [--old <CREDENTIAL>] [--user USER_ID]");
- pw.println(" Verifies the lock credentials.");
+ pw.println(" Verifies the lock credential.");
pw.println("");
pw.println(" remove-cache [--user USER_ID]");
pw.println(" Removes cached unified challenge for the managed profile.");
pw.println("");
pw.println(" set-resume-on-reboot-provider-package <package_name>");
- pw.println(" Sets the package name for server based resume on reboot service "
- + "provider.");
+ pw.println(" Sets the package name for server based resume on reboot service provider.");
pw.println("");
pw.println(" require-strong-auth [--user USER_ID] <reason>");
- pw.println(" Requires the strong authentication. The current supported reasons: "
- + "STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN.");
+ pw.println(" Requires strong authentication. The current supported reasons:");
+ pw.println(" STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN.");
pw.println("");
}
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index aa0b9b892220..3c6887c17e97 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -26,6 +26,7 @@ import static android.app.Notification.FLAG_BUBBLE;
import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
import static android.app.Notification.FLAG_FSI_REQUESTED_BUT_DENIED;
import static android.app.Notification.FLAG_INSISTENT;
+import static android.app.Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
import static android.app.Notification.FLAG_NO_CLEAR;
import static android.app.Notification.FLAG_NO_DISMISS;
import static android.app.Notification.FLAG_ONGOING_EVENT;
@@ -58,6 +59,7 @@ import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_PEEK;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_OFF;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_ON;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR;
+import static android.app.Flags.lifetimeExtensionRefactor;
import static android.content.Context.BIND_ALLOW_WHITELIST_MANAGEMENT;
import static android.content.Context.BIND_AUTO_CREATE;
import static android.content.Context.BIND_FOREGROUND_SERVICE;
@@ -1224,7 +1226,7 @@ public class NotificationManagerService extends SystemService {
public void onClearAll(int callingUid, int callingPid, int userId) {
synchronized (mNotificationLock) {
cancelAllLocked(callingUid, callingPid, userId, REASON_CANCEL_ALL, null,
- /*includeCurrentProfiles*/ true);
+ /*includeCurrentProfiles*/ true, FLAG_ONGOING_EVENT | FLAG_NO_CLEAR);
}
}
@@ -1498,6 +1500,7 @@ public class NotificationManagerService extends SystemService {
synchronized (mNotificationLock) {
NotificationRecord r = mNotificationsByKey.get(key);
if (r != null) {
+ r.recordSmartReplied();
LogMaker logMaker = r.getLogMaker()
.setCategory(MetricsEvent.SMART_REPLY_ACTION)
.setSubtype(replyIndex)
@@ -1804,11 +1807,22 @@ public class NotificationManagerService extends SystemService {
record = findNotificationByKeyLocked(intent.getStringExtra(EXTRA_KEY));
}
if (record != null) {
- cancelNotification(record.getSbn().getUid(), record.getSbn().getInitialPid(),
- record.getSbn().getPackageName(), record.getSbn().getTag(),
- record.getSbn().getId(), 0,
- FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB,
- true, record.getUserId(), REASON_TIMEOUT, null);
+ if (lifetimeExtensionRefactor()) {
+ cancelNotification(record.getSbn().getUid(),
+ record.getSbn().getInitialPid(),
+ record.getSbn().getPackageName(), record.getSbn().getTag(),
+ record.getSbn().getId(), 0,
+ FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB
+ | FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY,
+ true, record.getUserId(), REASON_TIMEOUT, null);
+ } else {
+ cancelNotification(record.getSbn().getUid(),
+ record.getSbn().getInitialPid(),
+ record.getSbn().getPackageName(), record.getSbn().getTag(),
+ record.getSbn().getId(), 0,
+ FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB,
+ true, record.getUserId(), REASON_TIMEOUT, null);
+ }
}
}
}
@@ -3728,8 +3742,16 @@ public class NotificationManagerService extends SystemService {
@Override
public void cancelNotificationWithTag(String pkg, String opPkg, String tag, int id,
int userId) {
+ // Don't allow client applications to cancel foreground service notifs, user-initiated
+ // job notifs, autobundled summaries, or notifs that have been replied to.
+ int mustNotHaveFlags = isCallingUidSystem() ? 0 :
+ (FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB | FLAG_AUTOGROUP_SUMMARY);
+ if (lifetimeExtensionRefactor()) {
+ mustNotHaveFlags |= FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+ }
+
cancelNotificationInternal(pkg, opPkg, Binder.getCallingUid(), Binder.getCallingPid(),
- tag, id, userId);
+ tag, id, userId, mustNotHaveFlags);
}
@Override
@@ -3740,9 +3762,16 @@ public class NotificationManagerService extends SystemService {
Binder.getCallingUid(), userId, true, false, "cancelAllNotifications", pkg);
// Don't allow the app to cancel active FGS or UIJ notifications
- cancelAllNotificationsInt(Binder.getCallingUid(), Binder.getCallingPid(),
- pkg, null, 0, FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB,
- userId, REASON_APP_CANCEL_ALL);
+ if (lifetimeExtensionRefactor()) {
+ cancelAllNotificationsInt(Binder.getCallingUid(), Binder.getCallingPid(),
+ pkg, null, 0, FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB
+ | FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY,
+ userId, REASON_APP_CANCEL_ALL);
+ } else {
+ cancelAllNotificationsInt(Binder.getCallingUid(), Binder.getCallingPid(),
+ pkg, null, 0, FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB,
+ userId, REASON_APP_CANCEL_ALL);
+ }
}
@Override
@@ -4808,8 +4837,16 @@ public class NotificationManagerService extends SystemService {
r.getSbn().getId(), userId, reason);
}
} else {
- cancelAllLocked(callingUid, callingPid, info.userid,
- REASON_LISTENER_CANCEL_ALL, info, info.supportsProfiles());
+ if (lifetimeExtensionRefactor()) {
+ cancelAllLocked(callingUid, callingPid, info.userid,
+ REASON_LISTENER_CANCEL_ALL, info, info.supportsProfiles(),
+ FLAG_ONGOING_EVENT | FLAG_NO_CLEAR
+ | FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY);
+ } else {
+ cancelAllLocked(callingUid, callingPid, info.userid,
+ REASON_LISTENER_CANCEL_ALL, info, info.supportsProfiles(),
+ FLAG_ONGOING_EVENT | FLAG_NO_CLEAR);
+ }
}
}
} finally {
@@ -4923,6 +4960,9 @@ public class NotificationManagerService extends SystemService {
int callingUid, int callingPid, String pkg, String tag, int id, int userId,
int reason) {
int mustNotHaveFlags = FLAG_ONGOING_EVENT;
+ if (lifetimeExtensionRefactor()) {
+ mustNotHaveFlags |= FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+ }
cancelNotification(callingUid, callingPid, pkg, tag, id, 0 /* mustHaveFlags */,
mustNotHaveFlags,
true,
@@ -6712,7 +6752,12 @@ public class NotificationManagerService extends SystemService {
@Override
public void cancelNotification(String pkg, String opPkg, int callingUid, int callingPid,
String tag, int id, int userId) {
- cancelNotificationInternal(pkg, opPkg, callingUid, callingPid, tag, id, userId);
+ // Don't allow client applications to cancel foreground service notifs,
+ // user-initiated job notifs or autobundled summaries.
+ final int mustNotHaveFlags = isCallingUidSystem() ? 0 :
+ (FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB | FLAG_AUTOGROUP_SUMMARY);
+ cancelNotificationInternal(pkg, opPkg, callingUid, callingPid, tag, id, userId,
+ mustNotHaveFlags);
}
@Override
@@ -6907,7 +6952,7 @@ public class NotificationManagerService extends SystemService {
}
void cancelNotificationInternal(String pkg, String opPkg, int callingUid, int callingPid,
- String tag, int id, int userId) {
+ String tag, int id, int userId, int mustNotHaveFlags) {
userId = ActivityManager.handleIncomingUser(callingPid,
callingUid, userId, true, false, "cancelNotificationWithTag", pkg);
@@ -6935,10 +6980,6 @@ public class NotificationManagerService extends SystemService {
}
}
- // Don't allow client applications to cancel foreground service notifs, user-initiated job
- // notifs or autobundled summaries.
- final int mustNotHaveFlags = isCallingUidSystem() ? 0 :
- (FLAG_FOREGROUND_SERVICE | FLAG_USER_INITIATED_JOB | FLAG_AUTOGROUP_SUMMARY);
cancelNotification(uid, callingPid, pkg, tag, id, 0,
mustNotHaveFlags, false, userId, REASON_APP_CANCEL, null);
}
@@ -7294,6 +7335,11 @@ public class NotificationManagerService extends SystemService {
notification.flags &= ~FLAG_FSI_REQUESTED_BUT_DENIED;
+ // Apps should not create notifications that are lifetime extended.
+ if (lifetimeExtensionRefactor()) {
+ notification.flags &= ~FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+ }
+
if (notification.fullScreenIntent != null) {
final AttributionSource attributionSource =
new AttributionSource.Builder(notificationUid).setPackageName(pkg).build();
@@ -10088,7 +10134,7 @@ public class NotificationManagerService extends SystemService {
@GuardedBy("mNotificationLock")
void cancelAllLocked(int callingUid, int callingPid, int userId, int reason,
- ManagedServiceInfo listener, boolean includeCurrentProfiles) {
+ ManagedServiceInfo listener, boolean includeCurrentProfiles, int mustNotHaveFlags) {
final long cancellationElapsedTimeMs = SystemClock.elapsedRealtime();
mHandler.post(new Runnable() {
@Override
@@ -10100,7 +10146,7 @@ public class NotificationManagerService extends SystemService {
null, userId, 0, 0, reason, listenerName);
FlagChecker flagChecker = (int flags) -> {
- int flagsToCheck = FLAG_ONGOING_EVENT | FLAG_NO_CLEAR;
+ int flagsToCheck = mustNotHaveFlags;
if (REASON_LISTENER_CANCEL_ALL == reason
|| REASON_CANCEL_ALL == reason) {
flagsToCheck |= FLAG_BUBBLE;
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 100c63863f7f..64d3a20e9281 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -24,7 +24,9 @@ import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL;
import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_POSITIVE;
+import android.annotation.FlaggedApi;
import android.annotation.Nullable;
+import android.app.Flags;
import android.app.KeyguardManager;
import android.app.Notification;
import android.app.NotificationChannel;
@@ -1257,10 +1259,27 @@ public final class NotificationRecord {
mStats.setExpanded();
}
+ /** Run when the notification is direct replied. */
public void recordDirectReplied() {
+ if (Flags.lifetimeExtensionRefactor()) {
+ // Mark the NotificationRecord as lifetime extended.
+ Notification notification = getSbn().getNotification();
+ notification.flags |= Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+ }
+
mStats.setDirectReplied();
}
+
+ /** Run when the notification is smart replied. */
+ @FlaggedApi(Flags.FLAG_LIFETIME_EXTENSION_REFACTOR)
+ public void recordSmartReplied() {
+ Notification notification = getSbn().getNotification();
+ notification.flags |= Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+
+ mStats.setSmartReplied();
+ }
+
public void recordDismissalSurface(@NotificationStats.DismissalSurface int surface) {
mStats.setDismissalSurface(surface);
}
diff --git a/services/core/java/com/android/server/pdb/TEST_MAPPING b/services/core/java/com/android/server/pdb/TEST_MAPPING
new file mode 100644
index 000000000000..e5f154a3d3c1
--- /dev/null
+++ b/services/core/java/com/android/server/pdb/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "postsubmit": [
+ {
+ "name": " PersistentDataBlockServiceTest"
+ }
+ ]
+}
diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java
index af6a002e66c4..b23ccb8bf826 100644
--- a/services/core/java/com/android/server/pm/ApkChecksums.java
+++ b/services/core/java/com/android/server/pm/ApkChecksums.java
@@ -397,6 +397,9 @@ public class ApkChecksums {
@Nullable Certificate[] trustedInstallers,
Map<Integer, ApkChecksum> checksums,
@NonNull Injector injector) {
+ if (!file.exists()) {
+ return;
+ }
final String filePath = file.getAbsolutePath();
// Always available: FSI or IncFs.
diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java
index 3b3d79e7dee1..07e0ddfac76b 100644
--- a/services/core/java/com/android/server/pm/DeletePackageHelper.java
+++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java
@@ -357,6 +357,12 @@ final class DeletePackageHelper {
final DeletePackageAction action;
synchronized (mPm.mLock) {
final PackageSetting ps = mPm.mSettings.getPackageLPr(packageName);
+ if (ps == null) {
+ if (DEBUG_REMOVE) {
+ Slog.d(TAG, "Attempted to remove non-existent package " + packageName);
+ }
+ return false;
+ }
final PackageSetting disabledPs = mPm.mSettings.getDisabledSystemPkgLPr(ps);
if (PackageManagerServiceUtils.isSystemApp(ps)
&& mPm.checkPermission(CONTROL_KEYGUARD, packageName, UserHandle.USER_SYSTEM)
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 448f215bb029..1a6529732a02 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -690,6 +690,9 @@ final class InstallPackageHelper {
pkgSetting.setInstallReason(installReason, userId);
pkgSetting.setUninstallReason(PackageManager.UNINSTALL_REASON_UNKNOWN, userId);
pkgSetting.setFirstInstallTime(System.currentTimeMillis(), userId);
+ // Clear any existing archive state.
+ pkgSetting.setArchiveTimeMillis(0, userId);
+ pkgSetting.setArchiveState(null, userId);
mPm.mSettings.writePackageRestrictionsLPr(userId);
mPm.mSettings.writeKernelMappingLPr(pkgSetting);
installed = true;
@@ -2263,6 +2266,9 @@ final class InstallPackageHelper {
ps.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, userId,
installerPackageName);
}
+ // Clear any existing archive state.
+ ps.setArchiveState(null, userId);
+ ps.setArchiveTimeMillis(0, userId);
} else if (allUsers != null) {
// The caller explicitly specified INSTALL_ALL_USERS flag.
// Thus, updating the settings to install the app for all users.
@@ -2285,6 +2291,9 @@ final class InstallPackageHelper {
ps.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, currentUserId,
installerPackageName);
}
+ // Clear any existing archive state.
+ ps.setArchiveState(null, currentUserId);
+ ps.setArchiveTimeMillis(0, currentUserId);
} else {
ps.setInstalled(false, currentUserId);
}
@@ -2861,10 +2870,11 @@ final class InstallPackageHelper {
? request.getRemovedInfo().mArgs : null;
if (args != null) {
if (!killApp) {
- // If we didn't kill the app, defer the deletion of code/resource files, since
- // they may still be in use by the running application. This mitigates problems
- // in cases where resources or code is loaded by a new Activity before
- // ApplicationInfo changes have propagated to all application threads.
+ // If we didn't kill the app, defer the deletion of code/resource files,
+ // since the old code/resource files may still be in use by the running
+ // application. This mitigates problems and cases where resources or
+ // code is loaded by a new Activity before ApplicationInfo changes have
+ // propagated to all application threads.
mPm.scheduleDeferredNoKillPostDelete(args);
} else {
mRemovePackageHelper.cleanUpResources(args.mCodeFile, args.mInstructionSets);
diff --git a/services/core/java/com/android/server/pm/InstallRequest.java b/services/core/java/com/android/server/pm/InstallRequest.java
index 0a81b2b9fabb..5494bd9808c8 100644
--- a/services/core/java/com/android/server/pm/InstallRequest.java
+++ b/services/core/java/com/android/server/pm/InstallRequest.java
@@ -539,6 +539,12 @@ final class InstallRequest {
}
@Nullable
+ public PackageSetting getScanRequestDisabledPackageSetting() {
+ assertScanResultExists();
+ return mScanResult.mRequest.mDisabledPkgSetting;
+ }
+
+ @Nullable
public String getRealPackageName() {
assertScanResultExists();
return mScanResult.mRequest.mRealPkgName;
diff --git a/services/core/java/com/android/server/pm/PackageArchiver.java b/services/core/java/com/android/server/pm/PackageArchiver.java
index c6e8a6463121..9f072f932a95 100644
--- a/services/core/java/com/android/server/pm/PackageArchiver.java
+++ b/services/core/java/com/android/server/pm/PackageArchiver.java
@@ -24,6 +24,8 @@ import static android.app.AppOpsManager.MODE_IGNORED;
import static android.app.ComponentOptions.MODE_BACKGROUND_ACTIVITY_START_DENIED;
import static android.content.pm.ArchivedActivityInfo.bytesFromBitmap;
import static android.content.pm.ArchivedActivityInfo.drawableToBitmap;
+import static android.content.pm.PackageInstaller.EXTRA_UNARCHIVE_STATUS;
+import static android.content.pm.PackageInstaller.UNARCHIVAL_OK;
import static android.content.pm.PackageManager.DELETE_ARCHIVE;
import static android.content.pm.PackageManager.DELETE_KEEP_DATA;
import static android.content.pm.PackageManager.INSTALL_UNARCHIVE_DRAFT;
@@ -38,6 +40,7 @@ import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
+import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.IIntentReceiver;
@@ -116,7 +119,17 @@ public class PackageArchiver {
private static final String ARCHIVE_ICONS_DIR = "package_archiver";
- private static final String ACTION_UNARCHIVE_DIALOG = "android.intent.action.UNARCHIVE_DIALOG";
+ private static final String ACTION_UNARCHIVE_DIALOG =
+ "com.android.intent.action.UNARCHIVE_DIALOG";
+ private static final String ACTION_UNARCHIVE_ERROR_DIALOG =
+ "com.android.intent.action.UNARCHIVE_ERROR_DIALOG";
+
+ private static final String EXTRA_REQUIRED_BYTES =
+ "com.android.content.pm.extra.UNARCHIVE_EXTRA_REQUIRED_BYTES";
+ private static final String EXTRA_INSTALLER_PACKAGE_NAME =
+ "com.android.content.pm.extra.UNARCHIVE_INSTALLER_PACKAGE_NAME";
+ private static final String EXTRA_INSTALLER_TITLE =
+ "com.android.content.pm.extra.UNARCHIVE_INSTALLER_TITLE";
private final Context mContext;
private final PackageManagerService mPm;
@@ -304,11 +317,14 @@ public class PackageArchiver {
/** Creates archived state for the package and user. */
private CompletableFuture<ArchiveState> createArchiveState(String packageName, int userId)
throws PackageManager.NameNotFoundException {
- PackageStateInternal ps = getPackageState(packageName, mPm.snapshotComputer(),
+ Computer snapshot = mPm.snapshotComputer();
+ PackageStateInternal ps = getPackageState(packageName, snapshot,
Binder.getCallingUid(), userId);
verifyNotSystemApp(ps.getFlags());
String responsibleInstallerPackage = getResponsibleInstallerPackage(ps);
verifyInstaller(responsibleInstallerPackage, userId);
+ ApplicationInfo installerInfo = snapshot.getApplicationInfo(
+ responsibleInstallerPackage, /* flags= */ 0, userId);
verifyOptOutStatus(packageName,
UserHandle.getUid(userId, UserHandle.getUid(userId, ps.getAppId())));
@@ -319,7 +335,7 @@ public class PackageArchiver {
try {
archiveState.complete(
createArchiveStateInternal(packageName, userId, mainActivities,
- responsibleInstallerPackage));
+ installerInfo.loadLabel(mContext.getPackageManager()).toString()));
} catch (IOException e) {
archiveState.completeExceptionally(e);
}
@@ -327,8 +343,17 @@ public class PackageArchiver {
return archiveState;
}
- static ArchiveState createArchiveState(@NonNull ArchivedPackageParcel archivedPackage,
+ @Nullable
+ ArchiveState createArchiveState(@NonNull ArchivedPackageParcel archivedPackage,
int userId, String installerPackage) {
+ ApplicationInfo installerInfo = mPm.snapshotComputer().getApplicationInfo(
+ installerPackage, /* flags= */ 0, userId);
+ if (installerInfo == null) {
+ // Should never happen because we just fetched the installerInfo.
+ Slog.e(TAG, "Couldnt find installer " + installerPackage);
+ return null;
+ }
+
try {
var packageName = archivedPackage.packageName;
var mainActivities = archivedPackage.archivedActivities;
@@ -345,7 +370,8 @@ public class PackageArchiver {
archiveActivityInfos.add(activityInfo);
}
- return new ArchiveState(archiveActivityInfos, installerPackage);
+ return new ArchiveState(archiveActivityInfos,
+ installerInfo.loadLabel(mContext.getPackageManager()).toString());
} catch (IOException e) {
Slog.e(TAG, "Failed to create archive state", e);
return null;
@@ -353,7 +379,7 @@ public class PackageArchiver {
}
ArchiveState createArchiveStateInternal(String packageName, int userId,
- List<LauncherActivityInfo> mainActivities, String installerPackage)
+ List<LauncherActivityInfo> mainActivities, String installerTitle)
throws IOException {
final int iconSize = mContext.getSystemService(
ActivityManager.class).getLauncherLargeIconSize();
@@ -371,7 +397,7 @@ public class PackageArchiver {
archiveActivityInfos.add(activityInfo);
}
- return new ArchiveState(archiveActivityInfos, installerPackage);
+ return new ArchiveState(archiveActivityInfos, installerTitle);
}
// TODO(b/298452477) Handle monochrome icons.
@@ -411,14 +437,14 @@ public class PackageArchiver {
return iconFile.toPath();
}
- private void verifyInstaller(String installerPackage, int userId)
+ private void verifyInstaller(String installerPackageName, int userId)
throws PackageManager.NameNotFoundException {
- if (TextUtils.isEmpty(installerPackage)) {
+ if (TextUtils.isEmpty(installerPackageName)) {
throw new PackageManager.NameNotFoundException("No installer found");
}
// Allow shell for easier development.
if ((Binder.getCallingUid() != Process.SHELL_UID)
- && !verifySupportsUnarchival(installerPackage, userId)) {
+ && !verifySupportsUnarchival(installerPackageName, userId)) {
throw new PackageManager.NameNotFoundException("Installer does not support unarchival");
}
}
@@ -587,7 +613,7 @@ public class PackageArchiver {
final Intent broadcastIntent = new Intent();
broadcastIntent.putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, packageName);
- broadcastIntent.putExtra(PackageInstaller.EXTRA_UNARCHIVE_STATUS,
+ broadcastIntent.putExtra(EXTRA_UNARCHIVE_STATUS,
PackageInstaller.STATUS_PENDING_USER_ACTION);
broadcastIntent.putExtra(Intent.EXTRA_INTENT, dialogIntent);
sendIntent(statusReceiver, packageName, /* message= */ "", broadcastIntent);
@@ -781,6 +807,83 @@ public class PackageArchiver {
: ps.getInstallSource().mUpdateOwnerPackageName;
}
+ void notifyUnarchivalListener(int status, String installerPackageName, String appPackageName,
+ long requiredStorageBytes, @Nullable PendingIntent userActionIntent,
+ IntentSender unarchiveIntentSender, int userId) {
+ final Intent broadcastIntent = new Intent();
+ broadcastIntent.putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, appPackageName);
+ broadcastIntent.putExtra(EXTRA_UNARCHIVE_STATUS, status);
+
+ if (status != UNARCHIVAL_OK) {
+ final Intent dialogIntent = createErrorDialogIntent(status, installerPackageName,
+ appPackageName,
+ requiredStorageBytes, userActionIntent, userId);
+ if (dialogIntent == null) {
+ // Error already logged.
+ return;
+ }
+ broadcastIntent.putExtra(Intent.EXTRA_INTENT, dialogIntent);
+ }
+
+ final BroadcastOptions options = BroadcastOptions.makeBasic();
+ options.setPendingIntentBackgroundActivityStartMode(
+ MODE_BACKGROUND_ACTIVITY_START_DENIED);
+ try {
+ unarchiveIntentSender.sendIntent(mContext, 0, broadcastIntent, /* onFinished= */ null,
+ /* handler= */ null, /* requiredPermission= */ null,
+ options.toBundle());
+ } catch (IntentSender.SendIntentException e) {
+ Slog.e(TAG, TextUtils.formatSimple("Failed to send unarchive intent"), e);
+ }
+ }
+
+ @Nullable
+ private Intent createErrorDialogIntent(int status, String installerPackageName,
+ String appPackageName,
+ long requiredStorageBytes, PendingIntent userActionIntent, int userId) {
+ final Intent dialogIntent = new Intent(ACTION_UNARCHIVE_ERROR_DIALOG);
+ dialogIntent.putExtra(EXTRA_UNARCHIVE_STATUS, status);
+ if (requiredStorageBytes > 0) {
+ dialogIntent.putExtra(EXTRA_REQUIRED_BYTES, requiredStorageBytes);
+ }
+ // Note that the userActionIntent is provided by the installer and is used only by the
+ // system package installer as a follow-up action after the user confirms the dialog.
+ if (userActionIntent != null) {
+ dialogIntent.putExtra(Intent.EXTRA_INTENT, userActionIntent);
+ }
+ dialogIntent.putExtra(EXTRA_INSTALLER_PACKAGE_NAME, installerPackageName);
+ // We fetch this label from the archive state because the installer might not be installed
+ // anymore in an edge case.
+ String installerTitle = getInstallerTitle(appPackageName, userId);
+ if (installerTitle == null) {
+ // Error already logged.
+ return null;
+ }
+ dialogIntent.putExtra(EXTRA_INSTALLER_TITLE, installerTitle);
+ return dialogIntent;
+ }
+
+ private String getInstallerTitle(String appPackageName, int userId) {
+ PackageStateInternal packageState;
+ try {
+ packageState = getPackageState(appPackageName,
+ mPm.snapshotComputer(),
+ Process.SYSTEM_UID, userId);
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.e(TAG, TextUtils.formatSimple(
+ "notifyUnarchivalListener: Couldn't fetch package state for %s.",
+ appPackageName), e);
+ return null;
+ }
+ ArchiveState archiveState = packageState.getUserStateOrDefault(userId).getArchiveState();
+ if (archiveState == null) {
+ Slog.e(TAG, TextUtils.formatSimple("notifyUnarchivalListener: App not archived %s.",
+ appPackageName));
+ return null;
+ }
+ return archiveState.getInstallerTitle();
+ }
+
@NonNull
private static PackageStateInternal getPackageState(String packageName,
Computer snapshot, int callingUid, int userId)
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 882e05dd778b..f731f95b404d 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -16,9 +16,10 @@
package com.android.server.pm;
-import static android.app.ComponentOptions.MODE_BACKGROUND_ACTIVITY_START_DENIED;
import static android.app.admin.DevicePolicyResources.Strings.Core.PACKAGE_DELETED_BY_DO;
import static android.content.pm.PackageInstaller.LOCATION_DATA_APP;
+import static android.content.pm.PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_DISABLED;
+import static android.content.pm.PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED;
import static android.content.pm.PackageInstaller.UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE;
import static android.content.pm.PackageInstaller.UNARCHIVAL_ERROR_NO_CONNECTIVITY;
import static android.content.pm.PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED;
@@ -1703,7 +1704,6 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
});
}
- // TODO(b/307299702) Implement error dialog and propagate userActionIntent.
@Override
public void reportUnarchivalStatus(
int unarchiveId,
@@ -1746,8 +1746,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
// Execute expensive calls outside the sync block.
mPm.mHandler.post(
- () -> notifyUnarchivalListener(status, session.params.appPackageName,
- unarchiveIntentSender));
+ () -> mPackageArchiver.notifyUnarchivalListener(status,
+ session.getInstallerPackageName(),
+ session.params.appPackageName, requiredStorageBytes, userActionIntent,
+ unarchiveIntentSender, userId));
session.params.unarchiveIntentSender = null;
if (status != UNARCHIVAL_OK) {
Binder.withCleanCallingIdentity(session::abandon);
@@ -1776,29 +1778,13 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
UNARCHIVAL_ERROR_USER_ACTION_NEEDED,
UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE,
UNARCHIVAL_ERROR_NO_CONNECTIVITY,
+ UNARCHIVAL_ERROR_INSTALLER_DISABLED,
+ UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED,
UNARCHIVAL_GENERIC_ERROR).contains(status)) {
throw new IllegalStateException("Invalid status code passed " + status);
}
}
- private void notifyUnarchivalListener(int status, String packageName,
- IntentSender unarchiveIntentSender) {
- final Intent fillIn = new Intent();
- fillIn.putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, packageName);
- fillIn.putExtra(PackageInstaller.EXTRA_UNARCHIVE_STATUS, status);
- // TODO(b/307299702) Attach failure dialog with EXTRA_INTENT and requiredStorageBytes here.
- final BroadcastOptions options = BroadcastOptions.makeBasic();
- options.setPendingIntentBackgroundActivityStartMode(
- MODE_BACKGROUND_ACTIVITY_START_DENIED);
- try {
- unarchiveIntentSender.sendIntent(mContext, 0, fillIn, /* onFinished= */ null,
- /* handler= */ null, /* requiredPermission= */ null,
- options.toBundle());
- } catch (SendIntentException e) {
- Slog.e(TAG, TextUtils.formatSimple("Failed to send unarchive intent"), e);
- }
- }
-
private static int getSessionCount(SparseArray<PackageInstallerSession> sessions,
int installerUid) {
int count = 0;
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 233bf4f9394c..5daada94d815 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -523,6 +523,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
private static final String PROPERTY_IS_UPDATE_OWNERSHIP_ENFORCEMENT_AVAILABLE =
"is_update_ownership_enforcement_available";
+ private static final String PROPERTY_DEFERRED_NO_KILL_POST_DELETE_DELAY_MS_EXTENDED =
+ "deferred_no_kill_post_delete_delay_ms_extended";
+
/**
* The default response for package verification timeout.
*
@@ -924,7 +927,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
static final int WRITE_USER_PACKAGE_RESTRICTIONS = 30;
- static final int DEFERRED_NO_KILL_POST_DELETE_DELAY_MS = 3 * 1000;
+ private static final int DEFERRED_NO_KILL_POST_DELETE_DELAY_MS = 3 * 1000;
+
+ private static final long DEFERRED_NO_KILL_POST_DELETE_DELAY_MS_EXTENDED =
+ TimeUnit.DAYS.toMillis(1);
+
private static final int DEFERRED_NO_KILL_INSTALL_OBSERVER_DELAY_MS = 500;
private static final int DEFERRED_PENDING_KILL_INSTALL_OBSERVER_DELAY_MS = 1000;
@@ -1288,7 +1295,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService
void scheduleDeferredNoKillPostDelete(InstallArgs args) {
Message message = mHandler.obtainMessage(DEFERRED_NO_KILL_POST_DELETE, args);
- mHandler.sendMessageDelayed(message, DEFERRED_NO_KILL_POST_DELETE_DELAY_MS);
+ // If the feature flag is on, retain the old files for a day. Otherwise, delete the old
+ // files after a few seconds.
+ long deleteDelayMillis = DEFERRED_NO_KILL_POST_DELETE_DELAY_MS;
+ if (Flags.improveInstallDontKill()) {
+ deleteDelayMillis = Binder.withCleanCallingIdentity(() -> {
+ return DeviceConfig.getLong(NAMESPACE_PACKAGE_MANAGER_SERVICE,
+ /* name= */ PROPERTY_DEFERRED_NO_KILL_POST_DELETE_DELAY_MS_EXTENDED,
+ /* defaultValue= */ DEFERRED_NO_KILL_POST_DELETE_DELAY_MS_EXTENDED);
+ });
+ Slog.w(TAG, "Delaying the deletion of <" + args.getCodePath() + "> by "
+ + deleteDelayMillis + "ms or till the next reboot");
+ }
+ mHandler.sendMessageDelayed(message, deleteDelayMillis);
}
void schedulePruneUnusedStaticSharedLibraries(boolean delay) {
@@ -1515,8 +1534,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return;
}
for (int userId : userIds) {
- var archiveState = PackageArchiver.createArchiveState(archivePackage, userId,
- responsibleInstallerPackage);
+ var archiveState = mInstallerService.mPackageArchiver.createArchiveState(
+ archivePackage, userId, responsibleInstallerPackage);
if (archiveState == null) {
continue;
}
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index 293b87317ced..26dc57649ddd 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -770,6 +770,11 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
onChanged();
}
+ void setArchiveState(ArchiveState archiveState, int userId) {
+ modifyUserState(userId).setArchiveState(archiveState);
+ onChanged();
+ }
+
void setArchiveTimeMillis(long value, int userId) {
modifyUserState(userId).setArchiveTimeMillis(value);
onChanged();
diff --git a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
index d0fdfa9bc775..9384c13e583b 100644
--- a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
+++ b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
@@ -856,9 +856,9 @@ public final class SharedLibrariesImpl implements SharedLibrariesRead, Watchable
// We may not yet have disabled the updated package yet, so be sure to grab the
// current setting if that's the case.
final PackageSetting updatedSystemPs = isUpdatedSystemApp
- ? installRequest.getDisabledPackageSetting() == null
+ ? installRequest.getScanRequestDisabledPackageSetting() == null
? installRequest.getScanRequestOldPackageSetting()
- : installRequest.getDisabledPackageSetting()
+ : installRequest.getScanRequestDisabledPackageSetting()
: null;
if (isUpdatedSystemApp && (updatedSystemPs.getPkg() == null
|| updatedSystemPs.getPkg().getLibraryNames() == null)) {
diff --git a/services/core/java/com/android/server/pm/UserDataPreparer.java b/services/core/java/com/android/server/pm/UserDataPreparer.java
index 6d58d3401675..8adb5661ad1d 100644
--- a/services/core/java/com/android/server/pm/UserDataPreparer.java
+++ b/services/core/java/com/android/server/pm/UserDataPreparer.java
@@ -23,10 +23,10 @@ import android.content.pm.UserInfo;
import android.os.Environment;
import android.os.FileUtils;
import android.os.RecoverySystem;
-import android.os.storage.StorageManager;
-import android.os.storage.VolumeInfo;
import android.os.SystemProperties;
import android.os.UserHandle;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
@@ -35,6 +35,7 @@ import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.utils.Slogf;
import java.io.File;
import java.io.IOException;
@@ -43,7 +44,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
-import java.util.Set;
/**
* Helper class for preparing and destroying user storage
@@ -65,31 +65,37 @@ class UserDataPreparer {
/**
* Prepare storage areas for given user on all mounted devices.
*/
- void prepareUserData(int userId, int userSerial, int flags) {
+ void prepareUserData(UserInfo userInfo, int flags) {
synchronized (mInstallLock) {
final StorageManager storage = mContext.getSystemService(StorageManager.class);
/*
* Internal storage must be prepared before adoptable storage, since the user's volume
* keys are stored in their internal storage.
*/
- prepareUserDataLI(null /* internal storage */, userId, userSerial, flags, true);
+ prepareUserDataLI(null /* internal storage */, userInfo, flags, true);
for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
final String volumeUuid = vol.getFsUuid();
if (volumeUuid != null) {
- prepareUserDataLI(volumeUuid, userId, userSerial, flags, true);
+ prepareUserDataLI(volumeUuid, userInfo, flags, true);
}
}
}
}
- private void prepareUserDataLI(String volumeUuid, int userId, int userSerial, int flags,
+ private void prepareUserDataLI(String volumeUuid, UserInfo userInfo, int flags,
boolean allowRecover) {
- // Prepare storage and verify that serial numbers are consistent; if
- // there's a mismatch we need to destroy to avoid leaking data
+ final int userId = userInfo.id;
+ final int userSerial = userInfo.serialNumber;
final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final boolean isNewUser = userInfo.lastLoggedInTime == 0;
+ Slogf.d(TAG, "Preparing user data; volumeUuid=%s, userId=%d, flags=0x%x, isNewUser=%s",
+ volumeUuid, userId, flags, isNewUser);
try {
+ // Prepare CE and/or DE storage.
storage.prepareUserStorage(volumeUuid, userId, userSerial, flags);
+ // Ensure that the data directories of a removed user with the same ID are not being
+ // reused. New users must get fresh data directories, to avoid leaking data.
if ((flags & StorageManager.FLAG_STORAGE_DE) != 0) {
enforceSerialNumber(getDataUserDeDirectory(volumeUuid, userId), userSerial);
if (Objects.equals(volumeUuid, StorageManager.UUID_PRIVATE_INTERNAL)) {
@@ -103,9 +109,10 @@ class UserDataPreparer {
}
}
+ // Prepare the app data directories.
mInstaller.createUserData(volumeUuid, userId, userSerial, flags);
- // CE storage is available after they are prepared.
+ // If applicable, record that the system user's CE storage has been prepared.
if ((flags & StorageManager.FLAG_STORAGE_CE) != 0 &&
(userId == UserHandle.USER_SYSTEM)) {
String propertyName = "sys.user." + userId + ".ce_available";
@@ -113,20 +120,31 @@ class UserDataPreparer {
SystemProperties.set(propertyName, "true");
}
} catch (Exception e) {
- logCriticalInfo(Log.WARN, "Destroying user " + userId + " on volume " + volumeUuid
- + " because we failed to prepare: " + e);
- destroyUserDataLI(volumeUuid, userId, flags);
-
+ // Failed to prepare user data. For new users, specifically users that haven't ever
+ // been unlocked, destroy the user data, and try again (if not already retried). This
+ // might be effective at resolving some errors, such as stale directories from a reused
+ // user ID. Don't auto-destroy data for existing users, since issues with existing
+ // users might be fixable via an OTA without having to wipe the user's data.
+ if (isNewUser) {
+ logCriticalInfo(Log.ERROR, "Destroying user " + userId + " on volume " + volumeUuid
+ + " because we failed to prepare: " + e);
+ destroyUserDataLI(volumeUuid, userId, flags);
+ } else {
+ logCriticalInfo(Log.ERROR, "Failed to prepare user " + userId + " on volume "
+ + volumeUuid + ": " + e);
+ }
if (allowRecover) {
// Try one last time; if we fail again we're really in trouble
- prepareUserDataLI(volumeUuid, userId, userSerial,
- flags | StorageManager.FLAG_STORAGE_DE, false);
+ prepareUserDataLI(volumeUuid, userInfo, flags | StorageManager.FLAG_STORAGE_DE,
+ false);
} else {
+ // If internal storage of the system user fails to prepare on first boot, then
+ // things are *really* broken, so we might as well reboot to recovery right away.
try {
Log.wtf(TAG, "prepareUserData failed for user " + userId, e);
- if (userId == UserHandle.USER_SYSTEM) {
+ if (isNewUser && userId == UserHandle.USER_SYSTEM && volumeUuid == null) {
RecoverySystem.rebootPromptAndWipeUserData(mContext,
- "prepareUserData failed for system user");
+ "failed to prepare internal storage for system user");
}
} catch (IOException e2) {
throw new RuntimeException("error rebooting into recovery", e2);
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index f90bf4b47644..139312170c04 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -1566,6 +1566,7 @@ public class UserManagerService extends IUserManager.Stub {
: now - userData.info.creationTime);
DevicePolicyEventLogger
.createEvent(DevicePolicyEnums.REQUEST_QUIET_MODE_ENABLED)
+ .setInt(UserJourneyLogger.getUserTypeForStatsd(userData.info.userType))
.setStrings(callingPackage)
.setBoolean(enableQuietMode)
.setTimePeriod(period)
@@ -5123,8 +5124,7 @@ public class UserManagerService extends IUserManager.Stub {
// unlocked. We do this to ensure that CE storage isn't prepared before the CE key is
// saved to disk. This also matches what is done for user 0.
t.traceBegin("prepareUserData");
- mUserDataPreparer.prepareUserData(userId, userInfo.serialNumber,
- StorageManager.FLAG_STORAGE_DE);
+ mUserDataPreparer.prepareUserData(userInfo, StorageManager.FLAG_STORAGE_DE);
t.traceEnd();
t.traceBegin("LSS.createNewUser");
@@ -6386,12 +6386,11 @@ public class UserManagerService extends IUserManager.Stub {
}
TimingsTraceAndSlog t = new TimingsTraceAndSlog();
t.traceBegin("onBeforeStartUser-" + userId);
- final int userSerial = userInfo.serialNumber;
// Migrate only if build fingerprints mismatch
boolean migrateAppsData = !PackagePartitions.FINGERPRINT.equals(
userInfo.lastLoggedInFingerprint);
t.traceBegin("prepareUserData");
- mUserDataPreparer.prepareUserData(userId, userSerial, StorageManager.FLAG_STORAGE_DE);
+ mUserDataPreparer.prepareUserData(userInfo, StorageManager.FLAG_STORAGE_DE);
t.traceEnd();
t.traceBegin("reconcileAppsData");
getPackageManagerInternal().reconcileAppsData(userId, StorageManager.FLAG_STORAGE_DE,
@@ -6417,14 +6416,13 @@ public class UserManagerService extends IUserManager.Stub {
if (userInfo == null) {
return;
}
- final int userSerial = userInfo.serialNumber;
// Migrate only if build fingerprints mismatch
boolean migrateAppsData = !PackagePartitions.FINGERPRINT.equals(
userInfo.lastLoggedInFingerprint);
final TimingsTraceAndSlog t = new TimingsTraceAndSlog();
t.traceBegin("prepareUserData-" + userId);
- mUserDataPreparer.prepareUserData(userId, userSerial, StorageManager.FLAG_STORAGE_CE);
+ mUserDataPreparer.prepareUserData(userInfo, StorageManager.FLAG_STORAGE_CE);
t.traceEnd();
StorageManagerInternal smInternal = LocalServices.getService(StorageManagerInternal.class);
diff --git a/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java b/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java
index d0c346a63889..57f4a5ddb2bd 100644
--- a/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java
+++ b/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java
@@ -337,7 +337,8 @@ public class ArtStatsLogUtils {
0, // deprecated, used to be durationIncludingSleepMs
0, // optimizedPackagesCount
0, // packagesDependingOnBootClasspathCount
- 0); // totalPackagesCount
+ 0, // totalPackagesCount
+ ArtStatsLog.BACKGROUND_DEXOPT_JOB_ENDED__PASS__PASS_UNKNOWN);
}
}
}
diff --git a/services/core/java/com/android/server/pm/permission/PermissionMigrationHelperImpl.java b/services/core/java/com/android/server/pm/permission/PermissionMigrationHelperImpl.java
index dbf404736655..28818f7d1c6b 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionMigrationHelperImpl.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionMigrationHelperImpl.java
@@ -93,7 +93,7 @@ public class PermissionMigrationHelperImpl implements PermissionMigrationHelper
Map<Integer, Map<String, LegacyPermissionState>> appIdPermissionStates = new ArrayMap<>();
RuntimePermissionsState legacyState =
- mPackageManagerInternal.getLegacyPermissionsState(userId);
+ (RuntimePermissionsState) mPackageManagerInternal.getLegacyPermissionsState(userId);
PackageManagerLocal packageManagerLocal =
LocalManagerRegistry.getManager(PackageManagerLocal.class);
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 73c422490330..30bce2f41cf7 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -22,6 +22,9 @@ import static android.Manifest.permission.SYSTEM_APPLICATION_OVERLAY;
import static android.app.AppOpsManager.OP_CREATE_ACCESSIBILITY_OVERLAY;
import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
import static android.app.AppOpsManager.OP_TOAST_WINDOW;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
import static android.content.pm.PackageManager.FEATURE_AUTOMOTIVE;
import static android.content.pm.PackageManager.FEATURE_HDMI_CEC;
import static android.content.pm.PackageManager.FEATURE_LEANBACK;
@@ -563,6 +566,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
int mShortPressOnWindowBehavior;
int mPowerVolUpBehavior;
boolean mStylusButtonsEnabled = true;
+ boolean mKidsModeEnabled;
boolean mHasSoftInput = false;
boolean mUseTvRouting;
boolean mAllowStartActivityForLongPressOnPowerDuringSetup;
@@ -887,6 +891,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.STYLUS_BUTTONS_ENABLED), false, this,
UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.NAV_BAR_KIDS_MODE), false, this,
+ UserHandle.USER_ALL);
updateSettings();
}
@@ -2964,12 +2971,44 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mStylusButtonsEnabled = Settings.Secure.getIntForUser(resolver,
Secure.STYLUS_BUTTONS_ENABLED, 1, UserHandle.USER_CURRENT) == 1;
mInputManagerInternal.setStylusButtonMotionEventsEnabled(mStylusButtonsEnabled);
+
+ final boolean kidsModeEnabled = Settings.Secure.getIntForUser(resolver,
+ Settings.Secure.NAV_BAR_KIDS_MODE, 0, UserHandle.USER_CURRENT) == 1;
+ if (mKidsModeEnabled != kidsModeEnabled) {
+ mKidsModeEnabled = kidsModeEnabled;
+ updateKidsModeSettings();
+ }
}
if (updateRotation) {
updateRotation(true);
}
}
+ private void updateKidsModeSettings() {
+ if (mKidsModeEnabled) {
+ // Needed since many Kids apps aren't optimised to support both orientations and it
+ // will be hard for kids to understand the app compat mode.
+ // TODO(229961548): Remove ignoreOrientationRequest exception for Kids Mode once
+ // possible.
+ if (mContext.getResources().getBoolean(R.bool.config_reverseDefaultRotation)) {
+ mWindowManagerInternal.setOrientationRequestPolicy(
+ true /* isIgnoreOrientationRequestDisabled */,
+ new int[]{SCREEN_ORIENTATION_LANDSCAPE,
+ SCREEN_ORIENTATION_REVERSE_LANDSCAPE},
+ new int[]{SCREEN_ORIENTATION_SENSOR_LANDSCAPE,
+ SCREEN_ORIENTATION_SENSOR_LANDSCAPE});
+ } else {
+ mWindowManagerInternal.setOrientationRequestPolicy(
+ true /* isIgnoreOrientationRequestDisabled */,
+ null /* fromOrientations */, null /* toOrientations */);
+ }
+ } else {
+ mWindowManagerInternal.setOrientationRequestPolicy(
+ false /* isIgnoreOrientationRequestDisabled */,
+ null /* fromOrientations */, null /* toOrientations */);
+ }
+ }
+
private DreamManagerInternal getDreamManagerInternal() {
if (mDreamManagerInternal == null) {
// If mDreamManagerInternal is null, attempt to re-fetch it.
@@ -3433,7 +3472,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
break;
case KeyEvent.KEYCODE_DEL:
- case KeyEvent.KEYCODE_GRAVE:
+ case KeyEvent.KEYCODE_ESCAPE:
if (firstDown && event.isMetaPressed()) {
logKeyboardSystemsEvent(event, KeyboardLogEvent.BACK);
injectBackGesture(event.getDownTime());
@@ -3638,15 +3677,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return true;
}
break;
- case KeyEvent.KEYCODE_SPACE:
- // Handle keyboard layout switching. (META + SPACE)
- if (firstDown && event.isMetaPressed()) {
- int direction = (metaState & KeyEvent.META_SHIFT_MASK) != 0 ? -1 : 1;
- sendSwitchKeyboardLayout(event, direction);
- logKeyboardSystemsEvent(event, KeyboardLogEvent.LANGUAGE_SWITCH);
- return true;
- }
- break;
case KeyEvent.KEYCODE_META_LEFT:
case KeyEvent.KEYCODE_META_RIGHT:
if (down) {
@@ -3941,7 +3971,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
return true;
case KeyEvent.KEYCODE_ESCAPE:
- if (down && repeatCount == 0) {
+ if (down
+ && KeyEvent.metaStateHasNoModifiers(metaState)
+ && repeatCount == 0) {
mContext.closeSystemDialogs();
}
return true;
@@ -6430,6 +6462,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
pw.print(!mAllowLockscreenWhenOnDisplays.isEmpty());
pw.print(" mLockScreenTimeout="); pw.print(mLockScreenTimeout);
pw.print(" mLockScreenTimerActive="); pw.println(mLockScreenTimerActive);
+ pw.print(prefix); pw.print("mKidsModeEnabled="); pw.println(mKidsModeEnabled);
mHapticFeedbackVibrationProvider.dump(prefix, pw);
mGlobalKeyManager.dump(prefix, pw);
diff --git a/services/core/java/com/android/server/power/LowPowerStandbyController.java b/services/core/java/com/android/server/power/LowPowerStandbyController.java
index fbad762ca28a..fa94b43b6d0e 100644
--- a/services/core/java/com/android/server/power/LowPowerStandbyController.java
+++ b/services/core/java/com/android/server/power/LowPowerStandbyController.java
@@ -33,6 +33,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
@@ -146,6 +147,7 @@ public class LowPowerStandbyController {
this::onStandbyTimeoutExpired;
private final LowPowerStandbyControllerInternal mLocalService = new LocalService();
private final SparseIntArray mUidAllowedReasons = new SparseIntArray();
+ private final List<String> mLowPowerStandbyManagingPackages = new ArrayList<>();
private final List<StandbyPortsLock> mStandbyPortLocks = new ArrayList<>();
@GuardedBy("mLock")
@@ -370,6 +372,14 @@ public class LowPowerStandbyController {
return;
}
+ List<PackageInfo> manageLowPowerStandbyPackages = mContext.getPackageManager()
+ .getPackagesHoldingPermissions(new String[]{
+ Manifest.permission.MANAGE_LOW_POWER_STANDBY
+ }, PackageManager.MATCH_SYSTEM_ONLY);
+ for (PackageInfo packageInfo : manageLowPowerStandbyPackages) {
+ mLowPowerStandbyManagingPackages.add(packageInfo.packageName);
+ }
+
mAlarmManager = mContext.getSystemService(AlarmManager.class);
mPowerManager = mContext.getSystemService(PowerManager.class);
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
@@ -756,9 +766,7 @@ public class LowPowerStandbyController {
Slog.d(TAG, "notifyEnabledChangedLocked, mIsEnabled=" + mIsEnabled);
}
- final Intent intent = new Intent(PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ sendExplicitBroadcast(PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
}
@GuardedBy("mLock")
@@ -772,10 +780,7 @@ public class LowPowerStandbyController {
Slog.d(TAG, "notifyPolicyChanged, policy=" + policy);
}
- final Intent intent = new Intent(
- PowerManager.ACTION_LOW_POWER_STANDBY_POLICY_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ sendExplicitBroadcast(PowerManager.ACTION_LOW_POWER_STANDBY_POLICY_CHANGED);
}
private void onStandbyTimeoutExpired() {
@@ -787,6 +792,22 @@ public class LowPowerStandbyController {
}
}
+ private void sendExplicitBroadcast(String intentType) {
+ final Intent intent = new Intent(intentType);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+
+ // Send explicit broadcast to holders of MANAGE_LOW_POWER_STANDBY
+ final Intent privilegedIntent = new Intent(intentType);
+ privilegedIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ for (String packageName : mLowPowerStandbyManagingPackages) {
+ final Intent explicitIntent = new Intent(privilegedIntent);
+ explicitIntent.setPackage(packageName);
+ mContext.sendBroadcastAsUser(explicitIntent, UserHandle.ALL,
+ Manifest.permission.MANAGE_LOW_POWER_STANDBY);
+ }
+ }
+
@GuardedBy("mLock")
private void enqueueNotifyActiveChangedLocked() {
final Message msg = mHandler.obtainMessage(MSG_NOTIFY_ACTIVE_CHANGED, mIsActive);
@@ -1360,7 +1381,7 @@ public class LowPowerStandbyController {
}
final Intent intent = new Intent(PowerManager.ACTION_LOW_POWER_STANDBY_PORTS_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
+ intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
Manifest.permission.MANAGE_LOW_POWER_STANDBY);
}
diff --git a/services/core/java/com/android/server/power/TEST_MAPPING b/services/core/java/com/android/server/power/TEST_MAPPING
index 05a0e85d790f..e64704a84cdf 100644
--- a/services/core/java/com/android/server/power/TEST_MAPPING
+++ b/services/core/java/com/android/server/power/TEST_MAPPING
@@ -45,6 +45,17 @@
{"include-filter": "com.android.server.power"},
{"exclude-annotation": "org.junit.Ignore"}
]
+ },
+ {
+ "name": "CtsStatsdAtomHostTestCases",
+ "options": [
+ {"exclude-annotation": "androidx.test.filters.FlakyTest"},
+ {"exclude-annotation": "org.junit.Ignore"},
+ {"include-filter": "android.cts.statsdatom.powermanager"}
+ ],
+ "file_patterns": [
+ "(/|^)ThermalManagerService.java"
+ ]
}
]
}
diff --git a/services/core/java/com/android/server/power/ThermalManagerService.java b/services/core/java/com/android/server/power/ThermalManagerService.java
index d17207b8f261..99653ae1cd72 100644
--- a/services/core/java/com/android/server/power/ThermalManagerService.java
+++ b/services/core/java/com/android/server/power/ThermalManagerService.java
@@ -16,8 +16,17 @@
package com.android.server.power;
+import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_HEADROOM_CALLED__API_STATUS__NO_TEMPERATURE_THRESHOLD;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__FEATURE_NOT_SUPPORTED;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__HAL_NOT_READY;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__SUCCESS;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_STATUS_CALLED__API_STATUS__HAL_NOT_READY;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_STATUS_CALLED__API_STATUS__SUCCESS;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.StatsManager;
import android.content.Context;
import android.hardware.thermal.IThermal;
import android.hardware.thermal.IThermalChangedCallback;
@@ -48,11 +57,13 @@ import android.os.Temperature;
import android.util.ArrayMap;
import android.util.EventLog;
import android.util.Slog;
+import android.util.StatsEvent;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.DumpUtils;
+import com.android.internal.util.FrameworkStatsLog;
import com.android.server.EventLogTags;
import com.android.server.FgThread;
import com.android.server.SystemService;
@@ -122,6 +133,8 @@ public class ThermalManagerService extends SystemService {
@VisibleForTesting
final TemperatureWatcher mTemperatureWatcher = new TemperatureWatcher();
+ private final Context mContext;
+
public ThermalManagerService(Context context) {
this(context, null);
}
@@ -129,6 +142,7 @@ public class ThermalManagerService extends SystemService {
@VisibleForTesting
ThermalManagerService(Context context, @Nullable ThermalHalWrapper halWrapper) {
super(context);
+ mContext = context;
mHalWrapper = halWrapper;
if (halWrapper != null) {
halWrapper.setCallback(this::onTemperatureChangedCallback);
@@ -146,6 +160,9 @@ public class ThermalManagerService extends SystemService {
if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
onActivityManagerReady();
}
+ if (phase == SystemService.PHASE_BOOT_COMPLETED) {
+ registerStatsCallbacks();
+ }
}
private void onActivityManagerReady() {
@@ -326,6 +343,31 @@ public class ThermalManagerService extends SystemService {
}
}
+ private void registerStatsCallbacks() {
+ final StatsManager statsManager = mContext.getSystemService(StatsManager.class);
+ if (statsManager != null) {
+ statsManager.setPullAtomCallback(
+ FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS,
+ null, // use default PullAtomMetadata values
+ DIRECT_EXECUTOR,
+ this::onPullAtom);
+ }
+ }
+
+ private int onPullAtom(int atomTag, @NonNull List<StatsEvent> data) {
+ if (atomTag == FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS) {
+ final float[] thresholds;
+ synchronized (mTemperatureWatcher.mSamples) {
+ thresholds = Arrays.copyOf(mTemperatureWatcher.mHeadroomThresholds,
+ mTemperatureWatcher.mHeadroomThresholds.length);
+ }
+ data.add(
+ FrameworkStatsLog.buildStatsEvent(FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS,
+ thresholds));
+ }
+ return android.app.StatsManager.PULL_SUCCESS;
+ }
+
@VisibleForTesting
final IThermalService.Stub mService = new IThermalService.Stub() {
@Override
@@ -449,6 +491,12 @@ public class ThermalManagerService extends SystemService {
synchronized (mLock) {
final long token = Binder.clearCallingIdentity();
try {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_STATUS_CALLED,
+ Binder.getCallingUid(),
+ mHalReady.get()
+ ? THERMAL_STATUS_CALLED__API_STATUS__SUCCESS
+ : THERMAL_STATUS_CALLED__API_STATUS__HAL_NOT_READY,
+ thermalSeverityToStatsdStatus(mStatus));
return mStatus;
} finally {
Binder.restoreCallingIdentity(token);
@@ -493,6 +541,9 @@ public class ThermalManagerService extends SystemService {
@Override
public float getThermalHeadroom(int forecastSeconds) {
if (!mHalReady.get()) {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED, getCallingUid(),
+ FrameworkStatsLog.THERMAL_HEADROOM_CALLED__API_STATUS__HAL_NOT_READY,
+ Float.NaN);
return Float.NaN;
}
@@ -500,6 +551,9 @@ public class ThermalManagerService extends SystemService {
if (DEBUG) {
Slog.d(TAG, "Invalid forecastSeconds: " + forecastSeconds);
}
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED, getCallingUid(),
+ FrameworkStatsLog.THERMAL_HEADROOM_CALLED__API_STATUS__INVALID_ARGUMENT,
+ Float.NaN);
return Float.NaN;
}
@@ -509,12 +563,21 @@ public class ThermalManagerService extends SystemService {
@Override
public float[] getThermalHeadroomThresholds() {
if (!mHalReady.get()) {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED,
+ Binder.getCallingUid(),
+ THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__HAL_NOT_READY);
throw new IllegalStateException("Thermal HAL connection is not initialized");
}
if (!Flags.allowThermalHeadroomThresholds()) {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED,
+ Binder.getCallingUid(),
+ THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__FEATURE_NOT_SUPPORTED);
throw new UnsupportedOperationException("Thermal headroom thresholds not enabled");
}
synchronized (mTemperatureWatcher.mSamples) {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED,
+ Binder.getCallingUid(),
+ THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__SUCCESS);
return Arrays.copyOf(mTemperatureWatcher.mHeadroomThresholds,
mTemperatureWatcher.mHeadroomThresholds.length);
}
@@ -544,6 +607,27 @@ public class ThermalManagerService extends SystemService {
};
+ private static int thermalSeverityToStatsdStatus(int severity) {
+ switch (severity) {
+ case PowerManager.THERMAL_STATUS_NONE:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__NONE;
+ case PowerManager.THERMAL_STATUS_LIGHT:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__LIGHT;
+ case PowerManager.THERMAL_STATUS_MODERATE:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__MODERATE;
+ case PowerManager.THERMAL_STATUS_SEVERE:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__SEVERE;
+ case PowerManager.THERMAL_STATUS_CRITICAL:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__CRITICAL;
+ case PowerManager.THERMAL_STATUS_EMERGENCY:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__EMERGENCY;
+ case PowerManager.THERMAL_STATUS_SHUTDOWN:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__SHUTDOWN;
+ default:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__NONE;
+ }
+ }
+
private static void dumpItemsLocked(PrintWriter pw, String prefix,
Collection<?> items) {
for (Iterator iterator = items.iterator(); iterator.hasNext();) {
@@ -1492,13 +1576,15 @@ public class ThermalManagerService extends SystemService {
threshold.hotThrottlingThresholds[ThrottlingSeverity.SEVERE];
if (!Float.isNaN(severeThreshold)) {
mSevereThresholds.put(threshold.name, severeThreshold);
- for (int severity = ThrottlingSeverity.LIGHT;
- severity <= ThrottlingSeverity.SHUTDOWN; severity++) {
- if (Flags.allowThermalHeadroomThresholds()
- && threshold.hotThrottlingThresholds.length > severity) {
- updateHeadroomThreshold(severity,
- threshold.hotThrottlingThresholds[severity],
- severeThreshold);
+ if (Flags.allowThermalHeadroomThresholds()) {
+ for (int severity = ThrottlingSeverity.LIGHT;
+ severity <= ThrottlingSeverity.SHUTDOWN; severity++) {
+ if (severity != ThrottlingSeverity.SEVERE
+ && threshold.hotThrottlingThresholds.length > severity) {
+ updateHeadroomThreshold(severity,
+ threshold.hotThrottlingThresholds[severity],
+ severeThreshold);
+ }
}
}
}
@@ -1506,11 +1592,15 @@ public class ThermalManagerService extends SystemService {
}
}
- // For a older device with multiple SKIN sensors, we will set a severity's headroom
+ // For an older device with multiple SKIN sensors, we will set a severity's headroom
// threshold based on the minimum value of all as a workaround.
void updateHeadroomThreshold(int severity, float threshold, float severeThreshold) {
if (!Float.isNaN(threshold)) {
synchronized (mSamples) {
+ if (severity == ThrottlingSeverity.SEVERE) {
+ mHeadroomThresholds[severity] = 1.0f;
+ return;
+ }
float headroom = normalizeTemperature(threshold, severeThreshold);
if (Float.isNaN(mHeadroomThresholds[severity])) {
mHeadroomThresholds[severity] = headroom;
@@ -1620,6 +1710,10 @@ public class ThermalManagerService extends SystemService {
// to sample, return early
if (mSamples.isEmpty()) {
Slog.e(TAG, "No temperature samples found");
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED,
+ Binder.getCallingUid(),
+ FrameworkStatsLog.THERMAL_HEADROOM_CALLED__API_STATUS__NO_TEMPERATURE,
+ Float.NaN);
return Float.NaN;
}
@@ -1627,16 +1721,22 @@ public class ThermalManagerService extends SystemService {
// so return early
if (mSevereThresholds.isEmpty()) {
Slog.e(TAG, "No temperature thresholds found");
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED,
+ Binder.getCallingUid(),
+ THERMAL_HEADROOM_CALLED__API_STATUS__NO_TEMPERATURE_THRESHOLD,
+ Float.NaN);
return Float.NaN;
}
float maxNormalized = Float.NaN;
+ int noThresholdSampleCount = 0;
for (Map.Entry<String, ArrayList<Sample>> entry : mSamples.entrySet()) {
String name = entry.getKey();
ArrayList<Sample> samples = entry.getValue();
Float threshold = mSevereThresholds.get(name);
if (threshold == null) {
+ noThresholdSampleCount++;
Slog.e(TAG, "No threshold found for " + name);
continue;
}
@@ -1659,7 +1759,17 @@ public class ThermalManagerService extends SystemService {
maxNormalized = normalized;
}
}
-
+ if (noThresholdSampleCount == mSamples.size()) {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED,
+ Binder.getCallingUid(),
+ THERMAL_HEADROOM_CALLED__API_STATUS__NO_TEMPERATURE_THRESHOLD,
+ Float.NaN);
+ } else {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED,
+ Binder.getCallingUid(),
+ FrameworkStatsLog.THERMAL_HEADROOM_CALLED__API_STATUS__SUCCESS,
+ maxNormalized);
+ }
return maxNormalized;
}
}
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
index e3f36385ef6c..5d9085144334 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
@@ -32,7 +32,6 @@ import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.IndentingPrintWriter;
-import android.util.KeyValueListParser;
import android.util.Slog;
import android.view.accessibility.AccessibilityManager;
@@ -41,6 +40,7 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ConcurrentUtils;
+import com.android.server.utils.UserSettingDeviceConfigMediator;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
@@ -809,12 +809,13 @@ public class BatterySaverPolicy extends ContentObserver implements
private static Policy fromSettings(String settings, String deviceSpecificSettings,
DeviceConfig.Properties properties, String configSuffix, Policy defaultPolicy) {
- final KeyValueListParser parser = new KeyValueListParser(',');
+ final UserSettingDeviceConfigMediator userSettingDeviceConfigMediator =
+ new UserSettingDeviceConfigMediator.SettingsOverridesIndividualMediator(',');
configSuffix = TextUtils.emptyIfNull(configSuffix);
// Device-specific parameters.
try {
- parser.setString(deviceSpecificSettings == null ? "" : deviceSpecificSettings);
+ userSettingDeviceConfigMediator.setSettingsString(deviceSpecificSettings);
} catch (IllegalArgumentException e) {
Slog.wtf(TAG, "Bad device specific battery saver constants: "
+ deviceSpecificSettings);
@@ -822,68 +823,58 @@ public class BatterySaverPolicy extends ContentObserver implements
// Non-device-specific parameters.
try {
- parser.setString(settings == null ? "" : settings);
+ userSettingDeviceConfigMediator.setSettingsString(settings);
+ userSettingDeviceConfigMediator.setDeviceConfigProperties(properties);
} catch (IllegalArgumentException e) {
Slog.wtf(TAG, "Bad battery saver constants: " + settings);
}
// The Settings value overrides everything, since that will be set by the user.
// The DeviceConfig value takes second place, with the default as the last choice.
- final float adjustBrightnessFactor = parser.getFloat(KEY_ADJUST_BRIGHTNESS_FACTOR,
- properties.getFloat(KEY_ADJUST_BRIGHTNESS_FACTOR + configSuffix,
- defaultPolicy.adjustBrightnessFactor));
- final boolean advertiseIsEnabled = parser.getBoolean(KEY_ADVERTISE_IS_ENABLED,
- properties.getBoolean(KEY_ADVERTISE_IS_ENABLED + configSuffix,
- defaultPolicy.advertiseIsEnabled));
- final boolean deferFullBackup = parser.getBoolean(KEY_DEFER_FULL_BACKUP,
- properties.getBoolean(KEY_DEFER_FULL_BACKUP + configSuffix,
- defaultPolicy.deferFullBackup));
- final boolean deferKeyValueBackup = parser.getBoolean(KEY_DEFER_KEYVALUE_BACKUP,
- properties.getBoolean(KEY_DEFER_KEYVALUE_BACKUP + configSuffix,
- defaultPolicy.deferKeyValueBackup));
- final boolean disableAnimation = parser.getBoolean(KEY_DISABLE_ANIMATION,
- properties.getBoolean(KEY_DISABLE_ANIMATION + configSuffix,
- defaultPolicy.disableAnimation));
- final boolean disableAod = parser.getBoolean(KEY_DISABLE_AOD,
- properties.getBoolean(KEY_DISABLE_AOD + configSuffix,
- defaultPolicy.disableAod));
- final boolean disableLaunchBoost = parser.getBoolean(KEY_DISABLE_LAUNCH_BOOST,
- properties.getBoolean(KEY_DISABLE_LAUNCH_BOOST + configSuffix,
- defaultPolicy.disableLaunchBoost));
- final boolean disableOptionalSensors = parser.getBoolean(KEY_DISABLE_OPTIONAL_SENSORS,
- properties.getBoolean(KEY_DISABLE_OPTIONAL_SENSORS + configSuffix,
- defaultPolicy.disableOptionalSensors));
- final boolean disableVibrationConfig = parser.getBoolean(KEY_DISABLE_VIBRATION,
- properties.getBoolean(KEY_DISABLE_VIBRATION + configSuffix,
- defaultPolicy.disableVibration));
- final boolean enableBrightnessAdjustment = parser.getBoolean(
- KEY_ENABLE_BRIGHTNESS_ADJUSTMENT,
- properties.getBoolean(KEY_ENABLE_BRIGHTNESS_ADJUSTMENT + configSuffix,
- defaultPolicy.enableAdjustBrightness));
- final boolean enableDataSaver = parser.getBoolean(KEY_ENABLE_DATASAVER,
- properties.getBoolean(KEY_ENABLE_DATASAVER + configSuffix,
- defaultPolicy.enableDataSaver));
- final boolean enableFirewall = parser.getBoolean(KEY_ENABLE_FIREWALL,
- properties.getBoolean(KEY_ENABLE_FIREWALL + configSuffix,
- defaultPolicy.enableFirewall));
- final boolean enableNightMode = parser.getBoolean(KEY_ENABLE_NIGHT_MODE,
- properties.getBoolean(KEY_ENABLE_NIGHT_MODE + configSuffix,
- defaultPolicy.enableNightMode));
- final boolean enableQuickDoze = parser.getBoolean(KEY_ENABLE_QUICK_DOZE,
- properties.getBoolean(KEY_ENABLE_QUICK_DOZE + configSuffix,
- defaultPolicy.enableQuickDoze));
- final boolean forceAllAppsStandby = parser.getBoolean(KEY_FORCE_ALL_APPS_STANDBY,
- properties.getBoolean(KEY_FORCE_ALL_APPS_STANDBY + configSuffix,
- defaultPolicy.forceAllAppsStandby));
- final boolean forceBackgroundCheck = parser.getBoolean(KEY_FORCE_BACKGROUND_CHECK,
- properties.getBoolean(KEY_FORCE_BACKGROUND_CHECK + configSuffix,
- defaultPolicy.forceBackgroundCheck));
- final int locationMode = parser.getInt(KEY_LOCATION_MODE,
- properties.getInt(KEY_LOCATION_MODE + configSuffix,
- defaultPolicy.locationMode));
- final int soundTriggerMode = parser.getInt(KEY_SOUNDTRIGGER_MODE,
- properties.getInt(KEY_SOUNDTRIGGER_MODE + configSuffix,
- defaultPolicy.soundTriggerMode));
+ final float adjustBrightnessFactor = userSettingDeviceConfigMediator.getFloat(
+ KEY_ADJUST_BRIGHTNESS_FACTOR + configSuffix,
+ defaultPolicy.adjustBrightnessFactor);
+ final boolean advertiseIsEnabled = userSettingDeviceConfigMediator.getBoolean(
+ KEY_ADVERTISE_IS_ENABLED + configSuffix,
+ defaultPolicy.advertiseIsEnabled);
+ final boolean deferFullBackup = userSettingDeviceConfigMediator.getBoolean(
+ KEY_DEFER_FULL_BACKUP + configSuffix, defaultPolicy.deferFullBackup);
+ final boolean deferKeyValueBackup = userSettingDeviceConfigMediator.getBoolean(
+ KEY_DEFER_KEYVALUE_BACKUP + configSuffix,
+ defaultPolicy.deferKeyValueBackup);
+ final boolean disableAnimation = userSettingDeviceConfigMediator.getBoolean(
+ KEY_DISABLE_ANIMATION + configSuffix, defaultPolicy.disableAnimation);
+ final boolean disableAod = userSettingDeviceConfigMediator.getBoolean(
+ KEY_DISABLE_AOD + configSuffix, defaultPolicy.disableAod);
+ final boolean disableLaunchBoost = userSettingDeviceConfigMediator.getBoolean(
+ KEY_DISABLE_LAUNCH_BOOST + configSuffix,
+ defaultPolicy.disableLaunchBoost);
+ final boolean disableOptionalSensors = userSettingDeviceConfigMediator.getBoolean(
+ KEY_DISABLE_OPTIONAL_SENSORS + configSuffix,
+ defaultPolicy.disableOptionalSensors);
+ final boolean disableVibrationConfig = userSettingDeviceConfigMediator.getBoolean(
+ KEY_DISABLE_VIBRATION + configSuffix, defaultPolicy.disableVibration);
+ final boolean enableBrightnessAdjustment = userSettingDeviceConfigMediator.getBoolean(
+ KEY_ENABLE_BRIGHTNESS_ADJUSTMENT + configSuffix,
+ defaultPolicy.enableAdjustBrightness);
+ final boolean enableDataSaver = userSettingDeviceConfigMediator.getBoolean(
+ KEY_ENABLE_DATASAVER + configSuffix, defaultPolicy.enableDataSaver);
+ final boolean enableFirewall = userSettingDeviceConfigMediator.getBoolean(
+ KEY_ENABLE_FIREWALL + configSuffix, defaultPolicy.enableFirewall);
+ final boolean enableNightMode = userSettingDeviceConfigMediator.getBoolean(
+ KEY_ENABLE_NIGHT_MODE + configSuffix, defaultPolicy.enableNightMode);
+ final boolean enableQuickDoze = userSettingDeviceConfigMediator.getBoolean(
+ KEY_ENABLE_QUICK_DOZE + configSuffix, defaultPolicy.enableQuickDoze);
+ final boolean forceAllAppsStandby = userSettingDeviceConfigMediator.getBoolean(
+ KEY_FORCE_ALL_APPS_STANDBY + configSuffix,
+ defaultPolicy.forceAllAppsStandby);
+ final boolean forceBackgroundCheck = userSettingDeviceConfigMediator.getBoolean(
+ KEY_FORCE_BACKGROUND_CHECK + configSuffix,
+ defaultPolicy.forceBackgroundCheck);
+ final int locationMode = userSettingDeviceConfigMediator.getInt(
+ KEY_LOCATION_MODE + configSuffix, defaultPolicy.locationMode);
+ final int soundTriggerMode = userSettingDeviceConfigMediator.getInt(
+ KEY_SOUNDTRIGGER_MODE + configSuffix, defaultPolicy.soundTriggerMode);
return new Policy(
adjustBrightnessFactor,
advertiseIsEnabled,
diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java
index dd39fb02573e..7c833cbe57d4 100644
--- a/services/core/java/com/android/server/power/hint/HintManagerService.java
+++ b/services/core/java/com/android/server/power/hint/HintManagerService.java
@@ -32,6 +32,8 @@ import android.os.PerformanceHintManager;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemProperties;
+import android.os.WorkDuration;
+import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.SparseIntArray;
@@ -51,6 +53,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
+import java.util.NoSuchElementException;
import java.util.Objects;
/** An hint service implementation that runs in System Server process. */
@@ -195,6 +198,9 @@ public final class HintManagerService extends SystemService {
private static native void nativeSetMode(long halPtr, int mode, boolean enabled);
+ private static native void nativeReportActualWorkDuration(long halPtr,
+ WorkDuration[] workDurations);
+
/** Wrapper for HintManager.nativeInit */
public void halInit() {
nativeInit();
@@ -252,6 +258,10 @@ public final class HintManagerService extends SystemService {
nativeSetMode(halPtr, mode, enabled);
}
+ /** Wrapper for HintManager.nativeReportActualWorkDuration */
+ public void halReportActualWorkDuration(long halPtr, WorkDuration[] workDurations) {
+ nativeReportActualWorkDuration(halPtr, workDurations);
+ }
}
@VisibleForTesting
@@ -544,7 +554,11 @@ public final class HintManagerService extends SystemService {
if (mHalSessionPtr == 0) return;
mNativeWrapper.halCloseHintSession(mHalSessionPtr);
mHalSessionPtr = 0;
- mToken.unlinkToDeath(this, 0);
+ try {
+ mToken.unlinkToDeath(this, 0);
+ } catch (NoSuchElementException ignored) {
+ Slogf.d(TAG, "Death link does not exist for session with UID " + mUid);
+ }
}
synchronized (mLock) {
ArrayMap<IBinder, ArraySet<AppHintSession>> tokenMap = mActiveSessions.get(mUid);
@@ -624,6 +638,56 @@ public final class HintManagerService extends SystemService {
}
}
+ @Override
+ public void reportActualWorkDuration2(WorkDuration[] workDurations) {
+ synchronized (this) {
+ if (mHalSessionPtr == 0 || !mUpdateAllowed) {
+ return;
+ }
+ Preconditions.checkArgument(workDurations.length != 0, "the count"
+ + " of work durations shouldn't be 0.");
+ for (WorkDuration workDuration : workDurations) {
+ validateWorkDuration(workDuration);
+ }
+ mNativeWrapper.halReportActualWorkDuration(mHalSessionPtr, workDurations);
+ }
+ }
+
+ void validateWorkDuration(WorkDuration workDuration) {
+ if (DEBUG) {
+ Slogf.d(TAG, "WorkDuration(" + workDuration.getTimestampNanos() + ", "
+ + workDuration.getWorkPeriodStartTimestampNanos() + ", "
+ + workDuration.getActualTotalDurationNanos() + ", "
+ + workDuration.getActualCpuDurationNanos() + ", "
+ + workDuration.getActualGpuDurationNanos() + ")");
+ }
+
+ // Allow work period start timestamp to be zero in system server side because
+ // legacy API call will use zero value. It can not be estimated with the timestamp
+ // the sample is received because the samples could stack up.
+ if (workDuration.getWorkPeriodStartTimestampNanos() < 0) {
+ throw new IllegalArgumentException(
+ TextUtils.formatSimple(
+ "Work period start timestamp (%d) should be greater than 0",
+ workDuration.getWorkPeriodStartTimestampNanos()));
+ }
+ if (workDuration.getActualTotalDurationNanos() <= 0) {
+ throw new IllegalArgumentException(
+ TextUtils.formatSimple("Actual total duration (%d) should be greater than 0",
+ workDuration.getActualTotalDurationNanos()));
+ }
+ if (workDuration.getActualCpuDurationNanos() <= 0) {
+ throw new IllegalArgumentException(
+ TextUtils.formatSimple("Actual CPU duration (%d) should be greater than 0",
+ workDuration.getActualCpuDurationNanos()));
+ }
+ if (workDuration.getActualGpuDurationNanos() < 0) {
+ throw new IllegalArgumentException(
+ TextUtils.formatSimple("Actual GPU duration (%d) should be non negative",
+ workDuration.getActualGpuDurationNanos()));
+ }
+ }
+
private void onProcStateChanged(boolean updateAllowed) {
updateHintAllowed(updateAllowed);
}
diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
index 0491c14e52bd..698f6ea4b443 100644
--- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
+++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
@@ -49,6 +49,7 @@ import android.os.BatteryUsageStatsQuery;
import android.os.Binder;
import android.os.BluetoothBatteryStats;
import android.os.Build;
+import android.os.ConditionVariable;
import android.os.Handler;
import android.os.IBatteryPropertiesRegistrar;
import android.os.Looper;
@@ -137,7 +138,6 @@ import com.android.internal.util.XmlUtils;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.net.module.util.NetworkCapabilitiesUtils;
-import com.android.server.power.optimization.Flags;
import com.android.server.power.stats.SystemServerCpuThreadReader.SystemServiceCpuThreadTimes;
import libcore.util.EmptyArray;
@@ -286,6 +286,7 @@ public class BatteryStatsImpl extends BatteryStats {
private final LongSparseArray<SamplingTimer> mKernelMemoryStats = new LongSparseArray<>();
private int[] mCpuPowerBracketMap;
private final CpuPowerStatsCollector mCpuPowerStatsCollector;
+ private boolean mPowerStatsCollectorEnabled;
public LongSparseArray<SamplingTimer> getKernelMemoryStats() {
return mKernelMemoryStats;
@@ -601,6 +602,10 @@ public class BatteryStatsImpl extends BatteryStats {
@SuppressWarnings("GuardedBy") // errorprone false positive on getProcStateTimeCounter
@VisibleForTesting
public void updateProcStateCpuTimesLocked(int uid, long elapsedRealtimeMs, long uptimeMs) {
+ if (mPowerStatsCollectorEnabled) {
+ return;
+ }
+
ensureKernelSingleUidTimeReaderLocked();
final Uid u = getUidStatsLocked(uid);
@@ -653,8 +658,9 @@ public class BatteryStatsImpl extends BatteryStats {
*/
@SuppressWarnings("GuardedBy") // errorprone false positive on getProcStateTimeCounter
public void updateCpuTimesForAllUids() {
- if (mCpuPowerStatsCollector != null) {
+ if (mPowerStatsCollectorEnabled && mCpuPowerStatsCollector != null) {
mCpuPowerStatsCollector.schedule();
+ return;
}
synchronized (BatteryStatsImpl.this) {
@@ -712,7 +718,7 @@ public class BatteryStatsImpl extends BatteryStats {
@GuardedBy("this")
private void ensureKernelSingleUidTimeReaderLocked() {
- if (mKernelSingleUidTimeReader != null) {
+ if (mPowerStatsCollectorEnabled || mKernelSingleUidTimeReader != null) {
return;
}
@@ -8213,6 +8219,10 @@ public class BatteryStatsImpl extends BatteryStats {
@GuardedBy("mBsi")
private void ensureMultiStateCounters(long timestampMs) {
+ if (mBsi.mPowerStatsCollectorEnabled) {
+ throw new IllegalStateException("Multi-state counters used in streamlined mode");
+ }
+
if (mProcStateTimeMs == null) {
mProcStateTimeMs =
new TimeInFreqMultiStateCounter(mBsi.mOnBatteryTimeBase,
@@ -10511,7 +10521,7 @@ public class BatteryStatsImpl extends BatteryStats {
mProcessStateTimer[uidRunningState].startRunningLocked(elapsedRealtimeMs);
}
- if (mBsi.trackPerProcStateCpuTimes()) {
+ if (!mBsi.mPowerStatsCollectorEnabled && mBsi.trackPerProcStateCpuTimes()) {
mBsi.updateProcStateCpuTimesLocked(mUid, elapsedRealtimeMs, uptimeMs);
LongArrayMultiStateCounter onBatteryCounter =
@@ -10533,7 +10543,7 @@ public class BatteryStatsImpl extends BatteryStats {
final int batteryConsumerProcessState =
mapUidProcessStateToBatteryConsumerProcessState(uidRunningState);
- if (mBsi.mSystemReady && Flags.streamlinedBatteryStats()) {
+ if (mBsi.mSystemReady && mBsi.mPowerStatsCollectorEnabled) {
mBsi.mHistory.recordProcessStateChange(elapsedRealtimeMs, uptimeMs, mUid,
batteryConsumerProcessState);
}
@@ -11702,6 +11712,10 @@ public class BatteryStatsImpl extends BatteryStats {
// Store the empty state to disk to ensure consistency
writeSyncLocked();
+ if (mPowerStatsCollectorEnabled) {
+ schedulePowerStatsSampleCollection();
+ }
+
// Flush external data, gathering snapshots, but don't process it since it is pre-reset data
mIgnoreNextExternalStats = true;
mExternalSync.scheduleSync("reset", ExternalStatsSync.UPDATE_ON_RESET);
@@ -14211,7 +14225,7 @@ public class BatteryStatsImpl extends BatteryStats {
mCpuUidFreqTimeReader.onSystemReady();
}
if (mCpuPowerStatsCollector != null) {
- mCpuPowerStatsCollector.onSystemReady();
+ mCpuPowerStatsCollector.setEnabled(mPowerStatsCollectorEnabled);
}
mSystemReady = true;
}
@@ -15232,6 +15246,15 @@ public class BatteryStatsImpl extends BatteryStats {
return mCpuUidFreqTimeReader.isFastCpuTimesReader();
}
+ /**
+ * Enables or disables the PowerStatsCollector mode.
+ */
+ public void setPowerStatsCollectorEnabled(boolean enabled) {
+ synchronized (this) {
+ mPowerStatsCollectorEnabled = enabled;
+ }
+ }
+
@GuardedBy("this")
public void systemServicesReady(Context context) {
mConstants.startObserving(context.getContentResolver());
@@ -15743,6 +15766,16 @@ public class BatteryStatsImpl extends BatteryStats {
}
/**
+ * Schedules an immediate collection of PowerStats samples and awaits the result.
+ */
+ public void collectPowerStatsSamples() {
+ schedulePowerStatsSampleCollection();
+ ConditionVariable done = new ConditionVariable();
+ mHandler.post(done::open);
+ done.block();
+ }
+
+ /**
* Grabs one sample of PowerStats and prints it.
*/
public void dumpStatsSample(PrintWriter pw) {
diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
index 303c2457165a..096c5e6697b7 100644
--- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
+++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
@@ -71,7 +71,7 @@ public class BatteryUsageStatsProvider {
// Power calculators are applied in the order of registration
mPowerCalculators.add(new BatteryChargeCalculator());
- if (mPowerStatsExporterEnabled) {
+ if (!mPowerStatsExporterEnabled) {
mPowerCalculators.add(
new CpuPowerCalculator(mCpuScalingPolicies, mPowerProfile));
}
@@ -126,6 +126,10 @@ public class BatteryUsageStatsProvider {
*/
public List<BatteryUsageStats> getBatteryUsageStats(BatteryStatsImpl stats,
List<BatteryUsageStatsQuery> queries) {
+ if (mPowerStatsExporterEnabled) {
+ stats.collectPowerStatsSamples();
+ }
+
ArrayList<BatteryUsageStats> results = new ArrayList<>(queries.size());
synchronized (stats) {
stats.prepareForDumpLocked();
@@ -168,15 +172,16 @@ public class BatteryUsageStatsProvider {
& BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS) != 0);
final double minConsumedPowerThreshold = query.getMinConsumedPowerThreshold();
- final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder(
- stats.getCustomEnergyConsumerNames(), includePowerModels,
- includeProcessStateData, minConsumedPowerThreshold);
- // TODO(b/188068523): use a monotonic clock to ensure resilience of order and duration
- // of batteryUsageStats sessions to wall-clock adjustments
- batteryUsageStatsBuilder.setStatsStartTimestamp(stats.getStartClockTime());
- batteryUsageStatsBuilder.setStatsEndTimestamp(currentTimeMs);
-
+ final BatteryUsageStats.Builder batteryUsageStatsBuilder;
synchronized (stats) {
+ batteryUsageStatsBuilder = new BatteryUsageStats.Builder(
+ stats.getCustomEnergyConsumerNames(), includePowerModels,
+ includeProcessStateData, minConsumedPowerThreshold);
+
+ // TODO(b/188068523): use a monotonic clock to ensure resilience of order and duration
+ // of batteryUsageStats sessions to wall-clock adjustments
+ batteryUsageStatsBuilder.setStatsStartTimestamp(stats.getStartClockTime());
+ batteryUsageStatsBuilder.setStatsEndTimestamp(currentTimeMs);
SparseArray<? extends BatteryStats.Uid> uidStats = stats.getUidStats();
for (int i = uidStats.size() - 1; i >= 0; i--) {
final BatteryStats.Uid uid = uidStats.valueAt(i);
@@ -385,7 +390,6 @@ public class BatteryUsageStatsProvider {
}
public void setPowerStatsExporterEnabled(boolean enabled) {
-
mPowerStatsExporterEnabled = enabled;
}
}
diff --git a/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java
index c05407cb6d17..4442845f83b2 100644
--- a/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java
+++ b/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java
@@ -35,7 +35,6 @@ import com.android.internal.os.CpuScalingPolicies;
import com.android.internal.os.PowerProfile;
import com.android.internal.os.PowerStats;
import com.android.server.LocalServices;
-import com.android.server.power.optimization.Flags;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -273,13 +272,6 @@ public class CpuPowerStatsCollector extends PowerStatsCollector {
mDefaultCpuPowerBracketsPerEnergyConsumer = defaultCpuPowerBracketsPerEnergyConsumer;
}
- /**
- * Initializes the collector during the boot sequence.
- */
- public void onSystemReady() {
- setEnabled(Flags.streamlinedBatteryStats());
- }
-
private boolean ensureInitialized() {
if (mIsInitialized) {
return true;
diff --git a/services/core/java/com/android/server/power/stats/PowerStatsExporter.java b/services/core/java/com/android/server/power/stats/PowerStatsExporter.java
index 70c24d58bb2a..1f6f11320f1b 100644
--- a/services/core/java/com/android/server/power/stats/PowerStatsExporter.java
+++ b/services/core/java/com/android/server/power/stats/PowerStatsExporter.java
@@ -60,6 +60,7 @@ public class PowerStatsExporter {
*/
public void exportAggregatedPowerStats(BatteryUsageStats.Builder batteryUsageStatsBuilder,
long monotonicStartTime, long monotonicEndTime) {
+ boolean hasStoredSpans = false;
long maxEndTime = monotonicStartTime;
List<PowerStatsSpan.Metadata> spans = mPowerStatsStore.getTableOfContents();
for (int i = spans.size() - 1; i >= 0; i--) {
@@ -99,13 +100,14 @@ public class PowerStatsExporter {
}
List<PowerStatsSpan.Section> sections = span.getSections();
for (int k = 0; k < sections.size(); k++) {
+ hasStoredSpans = true;
PowerStatsSpan.Section section = sections.get(k);
populateBatteryUsageStatsBuilder(batteryUsageStatsBuilder,
((AggregatedPowerStatsSection) section).getAggregatedPowerStats());
}
}
- if (maxEndTime < monotonicEndTime - mBatterySessionTimeSpanSlackMillis) {
+ if (!hasStoredSpans || maxEndTime < monotonicEndTime - mBatterySessionTimeSpanSlackMillis) {
mPowerStatsAggregator.aggregatePowerStats(maxEndTime, monotonicEndTime,
stats -> populateBatteryUsageStatsBuilder(batteryUsageStatsBuilder, stats));
}
diff --git a/services/core/java/com/android/server/power/stats/PowerStatsStore.java b/services/core/java/com/android/server/power/stats/PowerStatsStore.java
index 7123bcb2d095..7bcdc7129d10 100644
--- a/services/core/java/com/android/server/power/stats/PowerStatsStore.java
+++ b/services/core/java/com/android/server/power/stats/PowerStatsStore.java
@@ -171,7 +171,7 @@ public class PowerStatsStore {
try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file))) {
return PowerStatsSpan.read(inputStream, parser, mSectionReader, sectionTypes);
} catch (IOException | XmlPullParserException e) {
- Slog.wtf(TAG, "Cannot read PowerStatsSpan file: " + file);
+ Slog.wtf(TAG, "Cannot read PowerStatsSpan file: " + file, e);
}
} finally {
unlockStoreDirectory();
diff --git a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java
index 0656a6a7d3e9..59766ec7a175 100644
--- a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java
+++ b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java
@@ -35,6 +35,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NO_USER_ACTION;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.hardware.SensorPrivacyManager.EXTRA_ALL_SENSORS;
+import static android.hardware.SensorPrivacyManager.EXTRA_NOTIFICATION_ID;
import static android.hardware.SensorPrivacyManager.EXTRA_SENSOR;
import static android.hardware.SensorPrivacyManager.EXTRA_TOGGLE_TYPE;
import static android.hardware.SensorPrivacyManager.Sensors.CAMERA;
@@ -164,6 +165,7 @@ public final class SensorPrivacyService extends SystemService {
private final AppOpsManagerInternal mAppOpsManagerInternal;
private final TelephonyManager mTelephonyManager;
private final PackageManagerInternal mPackageManagerInternal;
+ private final NotificationManager mNotificationManager;
private CameraPrivacyLightController mCameraPrivacyLightController;
@@ -188,6 +190,7 @@ public final class SensorPrivacyService extends SystemService {
mActivityTaskManager = context.getSystemService(ActivityTaskManager.class);
mTelephonyManager = context.getSystemService(TelephonyManager.class);
mPackageManagerInternal = getLocalService(PackageManagerInternal.class);
+ mNotificationManager = mContext.getSystemService(NotificationManager.class);
mSensorPrivacyServiceImpl = new SensorPrivacyServiceImpl();
}
@@ -288,9 +291,18 @@ public final class SensorPrivacyService extends SystemService {
@Override
public void onReceive(Context context, Intent intent) {
setToggleSensorPrivacy(
- ((UserHandle) intent.getParcelableExtra(
- Intent.EXTRA_USER, android.os.UserHandle.class)).getIdentifier(), OTHER,
- intent.getIntExtra(EXTRA_SENSOR, UNKNOWN), false);
+ intent.getParcelableExtra(Intent.EXTRA_USER, UserHandle.class)
+ .getIdentifier(),
+ OTHER,
+ intent.getIntExtra(EXTRA_SENSOR, UNKNOWN),
+ false
+ );
+
+ int notificationId =
+ intent.getIntExtra(EXTRA_NOTIFICATION_ID, SystemMessage.NOTE_UNKNOWN);
+ if (notificationId != SystemMessage.NOTE_UNKNOWN) {
+ mNotificationManager.cancel(notificationId);
+ }
}
}, new IntentFilter(ACTION_DISABLE_TOGGLE_SENSOR_PRIVACY),
MANAGE_SENSOR_PRIVACY, null, Context.RECEIVER_EXPORTED);
@@ -635,8 +647,6 @@ public final class SensorPrivacyService extends SystemService {
notificationId = SystemMessage.NOTE_UNBLOCK_CAM_TOGGLE;
}
- NotificationManager notificationManager =
- mContext.getSystemService(NotificationManager.class);
NotificationChannel channel = new NotificationChannel(
SENSOR_PRIVACY_CHANNEL_ID,
getUiContext().getString(R.string.sensor_privacy_notification_channel_label),
@@ -646,7 +656,7 @@ public final class SensorPrivacyService extends SystemService {
channel.enableVibration(false);
channel.setBlockable(false);
- notificationManager.createNotificationChannel(channel);
+ mNotificationManager.createNotificationChannel(channel);
Icon icon = Icon.createWithResource(getUiContext().getResources(), iconRes);
@@ -669,10 +679,11 @@ public final class SensorPrivacyService extends SystemService {
new Intent(ACTION_DISABLE_TOGGLE_SENSOR_PRIVACY)
.setPackage(mContext.getPackageName())
.putExtra(EXTRA_SENSOR, sensor)
+ .putExtra(EXTRA_NOTIFICATION_ID, notificationId)
.putExtra(Intent.EXTRA_USER, user),
PendingIntent.FLAG_IMMUTABLE
| PendingIntent.FLAG_UPDATE_CURRENT);
- notificationManager.notify(notificationId,
+ mNotificationManager.notify(notificationId,
new Notification.Builder(mContext, SENSOR_PRIVACY_CHANNEL_ID)
.setContentTitle(contentTitle)
.setContentText(contentText)
diff --git a/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java b/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
index 8b57f87f5df3..8e9c889c8ef3 100644
--- a/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
+++ b/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
@@ -38,6 +38,7 @@ import android.speech.IRecognitionServiceManagerCallback;
import android.speech.IRecognitionSupportCallback;
import android.speech.RecognitionService;
import android.speech.SpeechRecognizer;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseIntArray;
@@ -253,6 +254,7 @@ final class SpeechRecognitionManagerServiceImpl extends
@GuardedBy("mLock")
private void incrementSessionCountForUidLocked(int uid) {
mSessionCountByUid.put(uid, mSessionCountByUid.get(uid, 0) + 1);
+ Log.i(TAG, "Client " + uid + " has opened " + mSessionCountByUid.get(uid, 0) + " sessions");
}
@GuardedBy("mLock")
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index 940feb580a96..e876241f385e 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -4871,7 +4871,7 @@ public class StatsPullAtomService extends SystemService {
}
private int pullCachedAppsHighWatermark(int atomTag, List<StatsEvent> pulledData) {
- pulledData.add(LocalServices.getService(ActivityManagerInternal.class)
+ pulledData.add((StatsEvent) LocalServices.getService(ActivityManagerInternal.class)
.getCachedAppsHighWatermarkStats(atomTag, true));
return StatsManager.PULL_SUCCESS;
}
diff --git a/services/core/java/com/android/server/timezonedetector/TEST_MAPPING b/services/core/java/com/android/server/timezonedetector/TEST_MAPPING
index 358618a71cbc..004d79964354 100644
--- a/services/core/java/com/android/server/timezonedetector/TEST_MAPPING
+++ b/services/core/java/com/android/server/timezonedetector/TEST_MAPPING
@@ -10,10 +10,7 @@
},
{
"name": "FrameworksTimeServicesTests"
- }
- ],
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ },
{
"name": "CtsLocationTimeZoneManagerHostTest"
}
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index f82f08bfc851..d172d3fd4139 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -827,7 +827,7 @@ public class TrustManagerService extends SystemService {
}
final boolean trusted;
- if (android.security.Flags.fixUnlockedDeviceRequiredKeys()) {
+ if (android.security.Flags.fixUnlockedDeviceRequiredKeysV2()) {
trusted = getUserTrustStateInner(id) == TrustState.TRUSTED;
} else {
trusted = aggregateIsTrusted(id);
@@ -1598,8 +1598,22 @@ public class TrustManagerService extends SystemService {
fout.printf(" User \"%s\" (id=%d, flags=%#x)",
user.name, user.id, user.flags);
if (!user.supportsSwitchToByUser()) {
- fout.println("(managed profile)");
- fout.println(" disabled because switching to this user is not possible.");
+ final boolean locked;
+ if (user.isProfile()) {
+ if (mLockPatternUtils.isSeparateProfileChallengeEnabled(user.id)) {
+ fout.print(" (profile with separate challenge)");
+ locked = isDeviceLockedInner(user.id);
+ } else {
+ fout.print(" (profile with unified challenge)");
+ locked = isDeviceLockedInner(resolveProfileParent(user.id));
+ }
+ } else {
+ fout.println(" (user that cannot be switched to)");
+ locked = isDeviceLockedInner(user.id);
+ }
+ fout.println(": deviceLocked=" + dumpBool(locked));
+ fout.println(
+ " Trust agents disabled because switching to this user is not possible.");
return;
}
if (isCurrent) {
diff --git a/services/core/java/com/android/server/tv/interactive/TvInteractiveAppManagerService.java b/services/core/java/com/android/server/tv/interactive/TvInteractiveAppManagerService.java
index e6273d331fce..0467d0cd351d 100644
--- a/services/core/java/com/android/server/tv/interactive/TvInteractiveAppManagerService.java
+++ b/services/core/java/com/android/server/tv/interactive/TvInteractiveAppManagerService.java
@@ -38,6 +38,7 @@ import android.media.tv.BroadcastInfoRequest;
import android.media.tv.BroadcastInfoResponse;
import android.media.tv.TvRecordingInfo;
import android.media.tv.TvTrackInfo;
+import android.media.tv.ad.ITvAdManager;
import android.media.tv.interactive.AppLinkInfo;
import android.media.tv.interactive.ITvInteractiveAppClient;
import android.media.tv.interactive.ITvInteractiveAppManager;
@@ -345,6 +346,7 @@ public class TvInteractiveAppManagerService extends SystemService {
Slogf.d(TAG, "onStart");
}
publishBinderService(Context.TV_INTERACTIVE_APP_SERVICE, new BinderService());
+ publishBinderService(Context.TV_AD_SERVICE, new TvAdBinderService());
}
@Override
@@ -688,6 +690,12 @@ public class TvInteractiveAppManagerService extends SystemService {
}
return session;
}
+ private final class TvAdBinderService extends ITvAdManager.Stub {
+ @Override
+ public void startAdService(IBinder sessionToken, int userId) {
+ }
+
+ }
private final class BinderService extends ITvInteractiveAppManager.Stub {
diff --git a/services/core/java/com/android/server/utils/UserSettingDeviceConfigMediator.java b/services/core/java/com/android/server/utils/UserSettingDeviceConfigMediator.java
new file mode 100644
index 000000000000..e5423496fb0e
--- /dev/null
+++ b/services/core/java/com/android/server/utils/UserSettingDeviceConfigMediator.java
@@ -0,0 +1,194 @@
+/*
+ * 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 com.android.server.utils;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.provider.DeviceConfig;
+import android.util.KeyValueListParser;
+
+/**
+ * Helper class to mediate the value to use when a constant exists in both a key=value pair Settings
+ * constant (that can be parsed by {@link KeyValueListParser})
+ * and the {@link DeviceConfig} properties.
+ */
+public abstract class UserSettingDeviceConfigMediator {
+ private static final String TAG = UserSettingDeviceConfigMediator.class.getSimpleName();
+
+ @Nullable
+ protected DeviceConfig.Properties mProperties;
+ @NonNull
+ protected final KeyValueListParser mSettingsParser;
+
+ /**
+ * @param keyValueListDelimiter The delimiter passed into the {@link KeyValueListParser}.
+ */
+ protected UserSettingDeviceConfigMediator(char keyValueListDelimiter) {
+ mSettingsParser = new KeyValueListParser(keyValueListDelimiter);
+ }
+
+ /**
+ * Sets the key=value list string to read from. Setting {@code null} will clear any previously
+ * set string.
+ */
+ public void setSettingsString(@Nullable String settings) {
+ mSettingsParser.setString(settings);
+ }
+
+ /**
+ * Sets the DeviceConfig Properties to read from. Setting {@code null} will clear any previously
+ * set properties.
+ */
+ public void setDeviceConfigProperties(@Nullable DeviceConfig.Properties properties) {
+ mProperties = properties;
+ }
+
+ /**
+ * Get the value for key as a boolean.
+ *
+ * @param key The key to lookup.
+ * @param defaultValue The value to return if the key was not found, or not properly defined.
+ */
+ public abstract boolean getBoolean(@NonNull String key, boolean defaultValue);
+
+ /**
+ * Get the value for key as a float.
+ *
+ * @param key The key to lookup.
+ * @param defaultValue The value to return if the key was not found, or not properly defined.
+ */
+ public abstract float getFloat(@NonNull String key, float defaultValue);
+
+ /**
+ * Get the value for key as an int.
+ *
+ * @param key The key to lookup.
+ * @param defaultValue The value to return if the key was not found, or not properly defined.
+ */
+ public abstract int getInt(@NonNull String key, int defaultValue);
+
+ /**
+ * Get the value for key as a long.
+ *
+ * @param key The key to lookup.
+ * @param defaultValue The value to return if the key was not found, or not properly defined.
+ */
+ public abstract long getLong(@NonNull String key, long defaultValue);
+
+ /**
+ * Get the value for key as a String.
+ *
+ * @param key The key to lookup.
+ * @param defaultValue The value to return if the key was not found, or not properly defined.
+ */
+ public abstract String getString(@NonNull String key, @Nullable String defaultValue);
+
+ /**
+ * A mediator in which the existence of a single settings key-value pair will override usage
+ * of DeviceConfig properties. That is, if the Settings constant has any values set,
+ * then everything in the DeviceConfig namespace will be ignored.
+ */
+ public static class SettingsOverridesAllMediator extends UserSettingDeviceConfigMediator {
+ public SettingsOverridesAllMediator(char keyValueListDelimiter) {
+ super(keyValueListDelimiter);
+ }
+
+ @Override
+ public boolean getBoolean(@NonNull String key, boolean defaultValue) {
+ if (mSettingsParser.size() == 0) {
+ return mProperties == null
+ ? defaultValue : mProperties.getBoolean(key, defaultValue);
+ }
+ return mSettingsParser.getBoolean(key, defaultValue);
+ }
+
+ @Override
+ public float getFloat(@NonNull String key, float defaultValue) {
+ if (mSettingsParser.size() == 0) {
+ return mProperties == null ? defaultValue : mProperties.getFloat(key, defaultValue);
+ }
+ return mSettingsParser.getFloat(key, defaultValue);
+ }
+
+ @Override
+ public int getInt(@NonNull String key, int defaultValue) {
+ if (mSettingsParser.size() == 0) {
+ return mProperties == null ? defaultValue : mProperties.getInt(key, defaultValue);
+ }
+ return mSettingsParser.getInt(key, defaultValue);
+ }
+
+ @Override
+ public long getLong(@NonNull String key, long defaultValue) {
+ if (mSettingsParser.size() == 0) {
+ return mProperties == null ? defaultValue : mProperties.getLong(key, defaultValue);
+ }
+ return mSettingsParser.getLong(key, defaultValue);
+ }
+
+ @Override
+ public String getString(@NonNull String key, @Nullable String defaultValue) {
+ if (mSettingsParser.size() == 0) {
+ return mProperties == null
+ ? defaultValue : mProperties.getString(key, defaultValue);
+ }
+ return mSettingsParser.getString(key, defaultValue);
+ }
+ }
+
+ /**
+ * A mediator in which only individual keys in the DeviceConfig namespace will be overridden
+ * by the same key in the Settings constant. If the Settings constant does not have a specific
+ * key set, then the DeviceConfig value will be used instead.
+ */
+ public static class SettingsOverridesIndividualMediator
+ extends UserSettingDeviceConfigMediator {
+ public SettingsOverridesIndividualMediator(char keyValueListDelimiter) {
+ super(keyValueListDelimiter);
+ }
+
+ @Override
+ public boolean getBoolean(@NonNull String key, boolean defaultValue) {
+ return mSettingsParser.getBoolean(key,
+ mProperties == null ? defaultValue : mProperties.getBoolean(key, defaultValue));
+ }
+
+ @Override
+ public float getFloat(@NonNull String key, float defaultValue) {
+ return mSettingsParser.getFloat(key,
+ mProperties == null ? defaultValue : mProperties.getFloat(key, defaultValue));
+ }
+
+ @Override
+ public int getInt(@NonNull String key, int defaultValue) {
+ return mSettingsParser.getInt(key,
+ mProperties == null ? defaultValue : mProperties.getInt(key, defaultValue));
+ }
+
+ @Override
+ public long getLong(@NonNull String key, long defaultValue) {
+ return mSettingsParser.getLong(key,
+ mProperties == null ? defaultValue : mProperties.getLong(key, defaultValue));
+ }
+
+ @Override
+ public String getString(@NonNull String key, @Nullable String defaultValue) {
+ return mSettingsParser.getString(key,
+ mProperties == null ? defaultValue : mProperties.getString(key, defaultValue));
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java
index b12da61d0b3f..e9c40964aee4 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java
@@ -258,6 +258,11 @@ public class WebViewUpdateService extends SystemService {
}
@Override // Binder call
+ public WebViewProviderInfo getDefaultWebViewPackage() {
+ return WebViewUpdateService.this.mImpl.getDefaultWebViewPackage();
+ }
+
+ @Override // Binder call
public WebViewProviderInfo[] getAllWebViewPackages() {
return WebViewUpdateService.this.mImpl.getWebViewPackages();
}
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java
index 26c3fba23bbc..60dc4ff224bc 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java
@@ -421,6 +421,13 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
return providers;
}
+ @Override
+ public WebViewProviderInfo getDefaultWebViewPackage() {
+ throw new IllegalStateException(
+ "getDefaultWebViewPackage shouldn't be called if update_service_v2 flag is"
+ + " disabled.");
+ }
+
private static class ProviderAndPackageInfo {
public final WebViewProviderInfo provider;
public final PackageInfo packageInfo;
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java
index 89cb4c802410..29782d9b8b88 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java
@@ -24,6 +24,7 @@ import android.os.AsyncTask;
import android.os.Trace;
import android.os.UserHandle;
import android.text.TextUtils;
+import android.util.AndroidRuntimeException;
import android.util.Slog;
import android.webkit.UserPackage;
import android.webkit.WebViewFactory;
@@ -374,6 +375,23 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
return providers;
}
+ /**
+ * Returns the default WebView provider which should be first availableByDefault option in the
+ * system config.
+ */
+ @Override
+ public WebViewProviderInfo getDefaultWebViewPackage() {
+ WebViewProviderInfo[] webviewProviders = getWebViewPackages();
+ for (WebViewProviderInfo provider : webviewProviders) {
+ if (provider.availableByDefault) {
+ return provider;
+ }
+ }
+ // This should be unreachable because the config parser enforces that there is at least one
+ // availableByDefault provider.
+ throw new AndroidRuntimeException("No available by default WebView Provider.");
+ }
+
private static class ProviderAndPackageInfo {
public final WebViewProviderInfo provider;
public final PackageInfo packageInfo;
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceInterface.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceInterface.java
index a9c3dc45842f..1772ef9c7405 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceInterface.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceInterface.java
@@ -40,6 +40,8 @@ interface WebViewUpdateServiceInterface {
WebViewProviderInfo[] getValidWebViewPackages();
+ WebViewProviderInfo getDefaultWebViewPackage();
+
PackageInfo getCurrentWebViewPackage();
boolean isMultiProcessEnabled();
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 75e6faf97294..0d06f5b256b0 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -3390,7 +3390,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
if (currentFocusedApp != null && currentFocusedApp.task == task
&& topFocusedDisplayId == mDisplayContent.getDisplayId()) {
final Task topFocusableTask = mDisplayContent.getTask(
- (t) -> t.isLeafTask() && t.isFocusable(), true /* traverseTopToBottom */);
+ (t) -> t.isLeafTask() && t.isFocusable() && !t.inPinnedWindowingMode(),
+ true /* traverseTopToBottom */);
if (task == topFocusableTask) {
if (currentFocusedApp == this) {
ProtoLog.d(WM_DEBUG_FOCUS, "moveFocusableActivityToTop: already on top "
@@ -5262,7 +5263,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
boolean canAffectSystemUiFlags() {
return task != null && task.canAffectSystemUiFlags() && isVisible()
- && !inPinnedWindowingMode();
+ && !mWaitForEnteringPinnedMode && !inPinnedWindowingMode();
}
@Override
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index d6302e08fedb..e5794a1f7efd 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1582,6 +1582,7 @@ class ActivityStarter {
// An activity has changed order/visibility or the task is occluded by a transient
// activity, so this isn't just deliver-to-top
&& mMovedToTopActivity == null
+ && !transitionController.hasOrderChanges()
&& !transitionController.isTransientHide(startedActivityRootTask)) {
// We just delivered to top, so there isn't an actual transition here.
if (!forceTransientTransition) {
@@ -1860,7 +1861,10 @@ class ActivityStarter {
+ "PendingIntent. However, only the creator of the PendingIntent allows BAL, "
+ "while the sender does not allow BAL. realCallingPackage: "
+ realCallingPackage + "; callingPackage: " + mRequest.callingPackage
- + "; mTargetRootTask:" + mTargetRootTask);
+ + "; mTargetRootTask:" + mTargetRootTask + "; mIntent: " + mIntent
+ + "; mTargetRootTask.getTopNonFinishingActivity: "
+ + mTargetRootTask.getTopNonFinishingActivity()
+ + "; mTargetRootTask.getRootActivity: " + mTargetRootTask.getRootActivity());
}
}
diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
index eafaf8cb3776..4625b4fe07ef 100644
--- a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
+++ b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
@@ -60,9 +60,9 @@ import android.widget.Toast;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.FrameworkStatsLog;
-import com.android.internal.util.Preconditions;
import com.android.server.UiThread;
import com.android.server.am.PendingIntentRecord;
+import com.android.window.flags.Flags;
import java.lang.annotation.Retention;
import java.util.HashMap;
@@ -236,6 +236,7 @@ public class BackgroundActivityStartController {
private final @ActivityManager.ProcessState int mCallingUidProcState;
private final boolean mIsCallingUidPersistentSystemProcess;
private final BackgroundStartPrivileges mBalAllowedByPiSender;
+ private final BackgroundStartPrivileges mBalAllowedByPiCreatorWithHardening;
private final BackgroundStartPrivileges mBalAllowedByPiCreator;
private final String mRealCallingPackage;
private final int mRealCallingUid;
@@ -267,20 +268,33 @@ public class BackgroundActivityStartController {
mIntent = intent;
mRealCallingPackage = mService.getPackageNameIfUnique(realCallingUid, realCallingPid);
if (originatingPendingIntent == null) {
- // grant creator BAL privileges unless explicitly opted out
- mBalAllowedByPiCreator =
+ // grant BAL privileges unless explicitly opted out
+ mBalAllowedByPiCreatorWithHardening = mBalAllowedByPiCreator =
checkedOptions.getPendingIntentCreatorBackgroundActivityStartMode()
== ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_DENIED
? BackgroundStartPrivileges.NONE
: BackgroundStartPrivileges.ALLOW_BAL;
+ mBalAllowedByPiSender =
+ checkedOptions.getPendingIntentBackgroundActivityStartMode()
+ == ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_DENIED
+ ? BackgroundStartPrivileges.NONE
+ : BackgroundStartPrivileges.ALLOW_BAL;
} else {
// for PendingIntents we restrict BAL based on target_sdk
- mBalAllowedByPiCreator = getBackgroundStartPrivilegesAllowedByCreator(
+ mBalAllowedByPiCreatorWithHardening = getBackgroundStartPrivilegesAllowedByCreator(
callingUid, callingPackage, checkedOptions);
+ final BackgroundStartPrivileges mBalAllowedByPiCreatorWithoutHardening =
+ checkedOptions.getPendingIntentCreatorBackgroundActivityStartMode()
+ == ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_DENIED
+ ? BackgroundStartPrivileges.NONE
+ : BackgroundStartPrivileges.ALLOW_BAL;
+ mBalAllowedByPiCreator = balRequireOptInByPendingIntentCreator()
+ ? mBalAllowedByPiCreatorWithHardening
+ : mBalAllowedByPiCreatorWithoutHardening;
+ mBalAllowedByPiSender =
+ PendingIntentRecord.getBackgroundStartPrivilegesAllowedByCaller(
+ checkedOptions, realCallingUid, mRealCallingPackage);
}
- mBalAllowedByPiSender =
- PendingIntentRecord.getBackgroundStartPrivilegesAllowedByCaller(
- checkedOptions, realCallingUid, mRealCallingPackage);
mAppSwitchState = mService.getBalAppSwitchesState();
mCallingUidProcState = mService.mActiveUids.getUidState(callingUid);
mIsCallingUidPersistentSystemProcess =
@@ -319,10 +333,6 @@ public class BackgroundActivityStartController {
return BackgroundStartPrivileges.NONE;
case ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED:
// no explicit choice by the app - let us decide what to do
- if (!balRequireOptInByPendingIntentCreator()) {
- // if feature is disabled allow
- return BackgroundStartPrivileges.ALLOW_BAL;
- }
if (callingPackage != null) {
// determine based on the calling/creating package
boolean changeEnabled = CompatChanges.isChangeEnabled(
@@ -367,11 +377,6 @@ public class BackgroundActivityStartController {
return mOriginatingPendingIntent != null && hasRealCaller();
}
- private String dump(BalVerdict resultIfPiCreatorAllowsBal) {
- Preconditions.checkState(!isPendingIntent());
- return dump(resultIfPiCreatorAllowsBal, null);
- }
-
private boolean callerIsRealCaller() {
return mCallingUid == mRealCallingUid;
}
@@ -396,6 +401,8 @@ public class BackgroundActivityStartController {
sb.append("; inVisibleTask: ").append(mCallerApp.hasActivityInVisibleTask());
}
sb.append("; balAllowedByPiCreator: ").append(mBalAllowedByPiCreator);
+ sb.append("; balAllowedByPiCreatorWithHardening: ")
+ .append(mBalAllowedByPiCreatorWithHardening);
sb.append("; resultIfPiCreatorAllowsBal: ").append(resultIfPiCreatorAllowsBal);
sb.append("; hasRealCaller: ").append(hasRealCaller());
sb.append("; isPendingIntent: ").append(isPendingIntent());
@@ -579,11 +586,12 @@ public class BackgroundActivityStartController {
resultForCaller.allows() && resultForRealCaller.blocks());
}
+ // Handle cases with explicit opt-in
if (resultForCaller.allows()
&& checkedOptions.getPendingIntentCreatorBackgroundActivityStartMode()
== ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) {
if (DEBUG_ACTIVITY_STARTS) {
- Slog.d(TAG, "Activity start explicitly allowed by PI creator. "
+ Slog.d(TAG, "Activity start explicitly allowed by caller. "
+ state.dump(resultForCaller, resultForRealCaller));
}
return statsLog(resultForCaller, state);
@@ -592,11 +600,12 @@ public class BackgroundActivityStartController {
&& checkedOptions.getPendingIntentBackgroundActivityStartMode()
== ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) {
if (DEBUG_ACTIVITY_STARTS) {
- Slog.d(TAG, "Activity start explicitly allowed by PI sender. "
+ Slog.d(TAG, "Activity start explicitly allowed by real caller. "
+ state.dump(resultForCaller, resultForRealCaller));
}
return statsLog(resultForRealCaller, state);
}
+ // Handle PendingIntent cases with default behavior next
boolean callerCanAllow = resultForCaller.allows()
&& checkedOptions.getPendingIntentCreatorBackgroundActivityStartMode()
== ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED;
@@ -807,13 +816,29 @@ public class BackgroundActivityStartController {
"realCallingUid has BAL permission.");
}
- // don't abort if the realCallingUid has a visible window
- // TODO(b/171459802): We should check appSwitchAllowed also
- if (state.mRealCallingUidHasAnyVisibleWindow) {
- return new BalVerdict(BAL_ALLOW_PENDING_INTENT,
- /*background*/ false,
- "realCallingUid has visible (non-toast) window.");
+ // Normal apps with visible app window will be allowed to start activity if app switching
+ // is allowed, or apps like live wallpaper with non app visible window will be allowed.
+ final boolean appSwitchAllowedOrFg = state.mAppSwitchState == APP_SWITCH_ALLOW
+ || state.mAppSwitchState == APP_SWITCH_FG_ONLY;
+ if (Flags.balImproveRealCallerVisibilityCheck()) {
+ if (appSwitchAllowedOrFg && state.mRealCallingUidHasAnyVisibleWindow) {
+ return new BalVerdict(BAL_ALLOW_PENDING_INTENT,
+ /*background*/ false, "realCallingUid has visible window");
+ }
+ if (mService.mActiveUids.hasNonAppVisibleWindow(state.mRealCallingUid)) {
+ return new BalVerdict(BAL_ALLOW_PENDING_INTENT,
+ /*background*/ false, "realCallingUid has non-app visible window");
+ }
+ } else {
+ // don't abort if the realCallingUid has a visible window
+ // TODO(b/171459802): We should check appSwitchAllowed also
+ if (state.mRealCallingUidHasAnyVisibleWindow) {
+ return new BalVerdict(BAL_ALLOW_PENDING_INTENT,
+ /*background*/ false,
+ "realCallingUid has visible (non-toast) window.");
+ }
}
+
// if the realCallingUid is a persistent system process, abort if the IntentSender
// wasn't allowed to start an activity
if (state.mForcedBalByPiSender.allowsBackgroundActivityStarts()
diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java
index 2fabb0ea686a..7ce9de4e1c24 100644
--- a/services/core/java/com/android/server/wm/Dimmer.java
+++ b/services/core/java/com/android/server/wm/Dimmer.java
@@ -83,6 +83,7 @@ public abstract class Dimmer {
/**
* Mark all dims as pending completion on the next call to {@link #updateDims}
*
+ * Called before iterating on mHost's children, first step of dimming.
* This is intended for us by the host container, to be called at the beginning of
* {@link WindowContainer#prepareSurfaces}. After calling this, the container should
* chain {@link WindowContainer#prepareSurfaces} down to it's children to give them
@@ -100,8 +101,7 @@ public abstract class Dimmer {
/**
* Call after invoking {@link WindowContainer#prepareSurfaces} on children as
- * described in {@link #resetDimStates}. The dim bounds returned by {@link #resetDimStates}
- * should be set before calling this method.
+ * described in {@link #resetDimStates}.
*
* @param t A transaction in which to update the dims.
* @return true if any Dims were updated.
diff --git a/services/core/java/com/android/server/wm/DimmerAnimationHelper.java b/services/core/java/com/android/server/wm/DimmerAnimationHelper.java
new file mode 100644
index 000000000000..e91857f1da82
--- /dev/null
+++ b/services/core/java/com/android/server/wm/DimmerAnimationHelper.java
@@ -0,0 +1,334 @@
+/*
+ * 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 com.android.server.wm;
+
+import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_DIMMER;
+import static com.android.server.wm.AlphaAnimationSpecProto.DURATION_MS;
+import static com.android.server.wm.AlphaAnimationSpecProto.FROM;
+import static com.android.server.wm.AlphaAnimationSpecProto.TO;
+import static com.android.server.wm.AnimationSpecProto.ALPHA;
+import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_DIMMER;
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
+
+import android.util.Log;
+import android.util.proto.ProtoOutputStream;
+import android.view.SurfaceControl;
+
+import com.android.internal.protolog.common.ProtoLog;
+
+import java.io.PrintWriter;
+
+/**
+ * Contains the information relative to the changes to apply to the dim layer
+ */
+public class DimmerAnimationHelper {
+ private static final String TAG = TAG_WITH_CLASS_NAME ? "DimmerAnimationHelper" : TAG_WM;
+ private static final int DEFAULT_DIM_ANIM_DURATION_MS = 200;
+
+ /**
+ * Contains the requested changes
+ */
+ static class Change {
+ private float mAlpha = -1f;
+ private int mBlurRadius = -1;
+ private WindowContainer mDimmingContainer = null;
+ private int mRelativeLayer = -1;
+ private static final float EPSILON = 0.0001f;
+
+ Change() {}
+
+ Change(Change other) {
+ mAlpha = other.mAlpha;
+ mBlurRadius = other.mBlurRadius;
+ mDimmingContainer = other.mDimmingContainer;
+ mRelativeLayer = other.mRelativeLayer;
+ }
+
+ // Same alpha and blur
+ boolean hasSameVisualProperties(Change other) {
+ return Math.abs(mAlpha - other.mAlpha) < EPSILON && mBlurRadius == other.mBlurRadius;
+ }
+
+ boolean hasSameDimmingContainer(Change other) {
+ return mDimmingContainer != null && mDimmingContainer == other.mDimmingContainer;
+ }
+
+ void inheritPropertiesFromAnimation(AnimationSpec anim) {
+ mAlpha = anim.mCurrentAlpha;
+ mBlurRadius = anim.mCurrentBlur;
+ }
+
+ @Override
+ public String toString() {
+ return "Dim state: alpha=" + mAlpha + ", blur=" + mBlurRadius + ", container="
+ + mDimmingContainer + ", relativePosition=" + mRelativeLayer;
+ }
+ }
+
+ private Change mCurrentProperties = new Change();
+ private Change mRequestedProperties = new Change();
+ private AnimationSpec mAlphaAnimationSpec;
+
+ private final AnimationAdapterFactory mAnimationAdapterFactory;
+ private AnimationAdapter mLocalAnimationAdapter;
+
+ DimmerAnimationHelper(AnimationAdapterFactory animationFactory) {
+ mAnimationAdapterFactory = animationFactory;
+ }
+
+ void setExitParameters() {
+ setRequestedRelativeParent(mRequestedProperties.mDimmingContainer, -1 /* relativeLayer */);
+ setRequestedAppearance(0f /* alpha */, 0 /* blur */);
+ }
+
+ // Sets a requested change without applying it immediately
+ void setRequestedRelativeParent(WindowContainer relativeParent, int relativeLayer) {
+ mRequestedProperties.mDimmingContainer = relativeParent;
+ mRequestedProperties.mRelativeLayer = relativeLayer;
+ }
+
+ // Sets a requested change without applying it immediately
+ void setRequestedAppearance(float alpha, int blurRadius) {
+ mRequestedProperties.mAlpha = alpha;
+ mRequestedProperties.mBlurRadius = blurRadius;
+ }
+
+ /**
+ * Commit the last changes we received. Called after
+ * {@link Change#setExitParameters()},
+ * {@link Change#setRequestedRelativeParent(WindowContainer, int)}, or
+ * {@link Change#setRequestedAppearance(float, int)}
+ */
+ void applyChanges(SurfaceControl.Transaction t, SmoothDimmer.DimState dim) {
+ if (mRequestedProperties.mDimmingContainer == null) {
+ Log.e(TAG, this + " does not have a dimming container. Have you forgotten to "
+ + "call adjustRelativeLayer?");
+ return;
+ }
+ if (mRequestedProperties.mDimmingContainer.mSurfaceControl == null) {
+ Log.w(TAG, "container " + mRequestedProperties.mDimmingContainer
+ + "does not have a surface");
+ dim.remove(t);
+ return;
+ }
+
+ dim.ensureVisible(t);
+ relativeReparent(dim.mDimSurface,
+ mRequestedProperties.mDimmingContainer.getSurfaceControl(),
+ mRequestedProperties.mRelativeLayer, t);
+
+ if (!mCurrentProperties.hasSameVisualProperties(mRequestedProperties)) {
+ stopCurrentAnimation(dim.mDimSurface);
+
+ if (dim.mSkipAnimation
+ // If the container doesn't change but requests a dim change, then it is
+ // directly providing us the animated values
+ || (mRequestedProperties.hasSameDimmingContainer(mCurrentProperties)
+ && dim.isDimming())) {
+ ProtoLog.d(WM_DEBUG_DIMMER,
+ "%s skipping animation and directly setting alpha=%f, blur=%d",
+ dim, mRequestedProperties.mAlpha,
+ mRequestedProperties.mBlurRadius);
+ setAlphaBlur(dim.mDimSurface, mRequestedProperties.mAlpha,
+ mRequestedProperties.mBlurRadius, t);
+ dim.mSkipAnimation = false;
+ } else {
+ startAnimation(t, dim);
+ }
+
+ } else if (!dim.isDimming()) {
+ // We are not dimming, so we tried the exit animation but the alpha is already 0,
+ // therefore, let's just remove this surface
+ dim.remove(t);
+ }
+ mCurrentProperties = new Change(mRequestedProperties);
+ }
+
+ private void startAnimation(
+ SurfaceControl.Transaction t, SmoothDimmer.DimState dim) {
+ ProtoLog.v(WM_DEBUG_DIMMER, "Starting animation on %s", dim);
+ mAlphaAnimationSpec = getRequestedAnimationSpec();
+ mLocalAnimationAdapter = mAnimationAdapterFactory.get(mAlphaAnimationSpec,
+ dim.mHostContainer.mWmService.mSurfaceAnimationRunner);
+
+ float targetAlpha = mRequestedProperties.mAlpha;
+ int targetBlur = mRequestedProperties.mBlurRadius;
+
+ mLocalAnimationAdapter.startAnimation(dim.mDimSurface, t,
+ ANIMATION_TYPE_DIMMER, /* finishCallback */ (type, animator) -> {
+ setAlphaBlur(dim.mDimSurface, targetAlpha, targetBlur, t);
+ if (targetAlpha == 0f && !dim.isDimming()) {
+ dim.remove(t);
+ }
+ mLocalAnimationAdapter = null;
+ mAlphaAnimationSpec = null;
+ });
+ }
+
+ private boolean isAnimating() {
+ return mAlphaAnimationSpec != null;
+ }
+
+ void stopCurrentAnimation(SurfaceControl surface) {
+ if (mLocalAnimationAdapter != null && isAnimating()) {
+ // Save the current animation progress and cancel the animation
+ mCurrentProperties.inheritPropertiesFromAnimation(mAlphaAnimationSpec);
+ mLocalAnimationAdapter.onAnimationCancelled(surface);
+ mLocalAnimationAdapter = null;
+ mAlphaAnimationSpec = null;
+ }
+ }
+
+ private AnimationSpec getRequestedAnimationSpec() {
+ final float startAlpha = Math.max(mCurrentProperties.mAlpha, 0f);
+ final int startBlur = Math.max(mCurrentProperties.mBlurRadius, 0);
+ long duration = (long) (getDimDuration(mRequestedProperties.mDimmingContainer)
+ * Math.abs(mRequestedProperties.mAlpha - startAlpha));
+
+ final AnimationSpec spec = new AnimationSpec(
+ new AnimationSpec.AnimationExtremes<>(startAlpha, mRequestedProperties.mAlpha),
+ new AnimationSpec.AnimationExtremes<>(startBlur, mRequestedProperties.mBlurRadius),
+ duration
+ );
+ ProtoLog.v(WM_DEBUG_DIMMER, "Dim animation requested: %s", spec);
+ return spec;
+ }
+
+ /**
+ * Change the relative parent of this dim layer
+ */
+ void relativeReparent(SurfaceControl dimLayer, SurfaceControl relativeParent,
+ int relativePosition, SurfaceControl.Transaction t) {
+ try {
+ t.setRelativeLayer(dimLayer, relativeParent, relativePosition);
+ } catch (NullPointerException e) {
+ Log.w(TAG, "Tried to change parent of dim " + dimLayer + " after remove", e);
+ }
+ }
+
+ void setAlphaBlur(SurfaceControl sc, float alpha, int blur, SurfaceControl.Transaction t) {
+ try {
+ t.setAlpha(sc, alpha);
+ t.setBackgroundBlurRadius(sc, blur);
+ } catch (NullPointerException e) {
+ Log.w(TAG , "Tried to change look of dim " + sc + " after remove", e);
+ }
+ }
+
+ private long getDimDuration(WindowContainer container) {
+ // Use the same duration as the animation on the WindowContainer
+ AnimationAdapter animationAdapter = container.mSurfaceAnimator.getAnimation();
+ final float durationScale = container.mWmService.getTransitionAnimationScaleLocked();
+ return animationAdapter == null ? (long) (DEFAULT_DIM_ANIM_DURATION_MS * durationScale)
+ : animationAdapter.getDurationHint();
+ }
+
+ /**
+ * Collects the animation specifics
+ */
+ static class AnimationSpec implements LocalAnimationAdapter.AnimationSpec {
+ private static final String TAG = TAG_WITH_CLASS_NAME ? "DimmerAnimationSpec" : TAG_WM;
+
+ static class AnimationExtremes<T> {
+ final T mStartValue;
+ final T mFinishValue;
+
+ AnimationExtremes(T fromValue, T toValue) {
+ mStartValue = fromValue;
+ mFinishValue = toValue;
+ }
+
+ @Override
+ public String toString() {
+ return "[" + mStartValue + "->" + mFinishValue + "]";
+ }
+ }
+
+ private final long mDuration;
+ private final AnimationSpec.AnimationExtremes<Float> mAlpha;
+ private final AnimationSpec.AnimationExtremes<Integer> mBlur;
+
+ float mCurrentAlpha = 0;
+ int mCurrentBlur = 0;
+ boolean mStarted = false;
+
+ AnimationSpec(AnimationSpec.AnimationExtremes<Float> alpha,
+ AnimationSpec.AnimationExtremes<Integer> blur, long duration) {
+ mAlpha = alpha;
+ mBlur = blur;
+ mDuration = duration;
+ }
+
+ @Override
+ public long getDuration() {
+ return mDuration;
+ }
+
+ @Override
+ public void apply(SurfaceControl.Transaction t, SurfaceControl sc, long currentPlayTime) {
+ if (!mStarted) {
+ // The first frame would end up in the sync transaction, and since this could be
+ // applied after the animation transaction, we avoid putting visible changes here.
+ // The initial state of the animation matches the current state of the dim anyway.
+ mStarted = true;
+ return;
+ }
+ final float fraction = getFraction(currentPlayTime);
+ mCurrentAlpha =
+ fraction * (mAlpha.mFinishValue - mAlpha.mStartValue) + mAlpha.mStartValue;
+ mCurrentBlur =
+ (int) fraction * (mBlur.mFinishValue - mBlur.mStartValue) + mBlur.mStartValue;
+ if (sc.isValid()) {
+ t.setAlpha(sc, mCurrentAlpha);
+ t.setBackgroundBlurRadius(sc, mCurrentBlur);
+ } else {
+ Log.w(TAG, "Dimmer#AnimationSpec tried to access " + sc + " after release");
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "Animation spec: alpha=" + mAlpha + ", blur=" + mBlur;
+ }
+
+ @Override
+ public void dump(PrintWriter pw, String prefix) {
+ pw.print(prefix); pw.print("from_alpha="); pw.print(mAlpha.mStartValue);
+ pw.print(" to_alpha="); pw.print(mAlpha.mFinishValue);
+ pw.print(prefix); pw.print("from_blur="); pw.print(mBlur.mStartValue);
+ pw.print(" to_blur="); pw.print(mBlur.mFinishValue);
+ pw.print(" duration="); pw.println(mDuration);
+ }
+
+ @Override
+ public void dumpDebugInner(ProtoOutputStream proto) {
+ final long token = proto.start(ALPHA);
+ proto.write(FROM, mAlpha.mStartValue);
+ proto.write(TO, mAlpha.mFinishValue);
+ proto.write(DURATION_MS, mDuration);
+ proto.end(token);
+ }
+ }
+
+ static class AnimationAdapterFactory {
+ public AnimationAdapter get(LocalAnimationAdapter.AnimationSpec alphaAnimationSpec,
+ SurfaceAnimationRunner runner) {
+ return new LocalAnimationAdapter(alphaAnimationSpec, runner);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index bb599363bdb5..50376fed2005 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1648,7 +1648,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
? new Transition.ReadyCondition("displayConfig", this) : null;
if (displayConfig != null) {
mTransitionController.waitFor(displayConfig);
- } else if (mTransitionController.isShellTransitionsEnabled()) {
+ } else if (mTransitionController.isShellTransitionsEnabled() && mLastHasContent) {
Slog.e(TAG, "Display reconfigured outside of a transition: " + this);
}
final boolean configUpdated = updateDisplayOverrideConfigurationLocked();
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index e6bbd52807bd..c089d107d07d 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -740,6 +740,8 @@ class InsetsPolicy {
private final Handler mHandler;
private final String mName;
+ private boolean mInsetsAnimationRunning;
+
Host(Handler handler, String name) {
mHandler = handler;
mName = name;
@@ -841,5 +843,10 @@ class InsetsPolicy {
public IBinder getWindowToken() {
return null;
}
+
+ @Override
+ public void notifyAnimationRunningStateChanged(boolean running) {
+ mInsetsAnimationRunning = running;
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/SmoothDimmer.java b/services/core/java/com/android/server/wm/SmoothDimmer.java
index 2549bbf70e9f..b5d94a2efbdf 100644
--- a/services/core/java/com/android/server/wm/SmoothDimmer.java
+++ b/services/core/java/com/android/server/wm/SmoothDimmer.java
@@ -17,397 +17,212 @@
package com.android.server.wm;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_DIMMER;
-import static com.android.server.wm.AlphaAnimationSpecProto.DURATION_MS;
-import static com.android.server.wm.AlphaAnimationSpecProto.FROM;
-import static com.android.server.wm.AlphaAnimationSpecProto.TO;
-import static com.android.server.wm.AnimationSpecProto.ALPHA;
-import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_DIMMER;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import android.graphics.Rect;
import android.util.Log;
-import android.util.proto.ProtoOutputStream;
import android.view.Surface;
import android.view.SurfaceControl;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.protolog.common.ProtoLog;
-import java.io.PrintWriter;
-
class SmoothDimmer extends Dimmer {
+
private static final String TAG = TAG_WITH_CLASS_NAME ? "Dimmer" : TAG_WM;
- private static final float EPSILON = 0.0001f;
- // This is in milliseconds.
- private static final int DEFAULT_DIM_ANIM_DURATION = 200;
DimState mDimState;
- private WindowContainer mLastRequestedDimContainer;
- private final AnimationAdapterFactory mAnimationAdapterFactory;
+ final DimmerAnimationHelper.AnimationAdapterFactory mAnimationAdapterFactory;
+ /**
+ * Controls the dim behaviour
+ */
@VisibleForTesting
class DimState {
- /**
- * The layer where property changes should be invoked on.
- */
- SurfaceControl mDimLayer;
- boolean mDimming;
- boolean mIsVisible;
-
+ /** Related objects */
+ SurfaceControl mDimSurface;
+ final WindowContainer mHostContainer;
+ // The last container to request to dim
+ private WindowContainer mLastRequestedDimContainer;
+ /** Animation */
+ private final DimmerAnimationHelper mAnimationHelper;
+ boolean mSkipAnimation = false;
+ // Determines whether the dim layer should animate before destroying.
+ boolean mAnimateExit = true;
+ /** Surface visibility and bounds */
+ private boolean mIsVisible = false;
// TODO(b/64816140): Remove after confirming dimmer layer always matches its container.
final Rect mDimBounds = new Rect();
- /**
- * Determines whether the dim layer should animate before destroying.
- */
- boolean mAnimateExit = true;
-
- /**
- * Used for Dims not associated with a WindowContainer.
- * See {@link Dimmer#adjustRelativeLayer(WindowContainer, int)} for details on Dim
- * lifecycle.
- */
- boolean mDontReset;
-
- Change mCurrentProperties;
- Change mRequestedProperties;
- private AnimationSpec mAlphaAnimationSpec;
- private AnimationAdapter mLocalAnimationAdapter;
-
- static class Change {
- private float mAlpha = -1f;
- private int mBlurRadius = -1;
- private WindowContainer mDimmingContainer = null;
- private int mRelativeLayer = -1;
- private boolean mSkipAnimation = false;
-
- Change() {}
-
- Change(Change other) {
- mAlpha = other.mAlpha;
- mBlurRadius = other.mBlurRadius;
- mDimmingContainer = other.mDimmingContainer;
- mRelativeLayer = other.mRelativeLayer;
- }
-
- @Override
- public String toString() {
- return "Dim state: alpha=" + mAlpha + ", blur=" + mBlurRadius + ", container="
- + mDimmingContainer + ", relativePosition=" + mRelativeLayer
- + ", skipAnimation=" + mSkipAnimation;
+ DimState() {
+ mHostContainer = mHost;
+ mAnimationHelper = new DimmerAnimationHelper(mAnimationAdapterFactory);
+ try {
+ mDimSurface = makeDimLayer();
+ } catch (Surface.OutOfResourcesException e) {
+ Log.w(TAG, "OutOfResourcesException creating dim surface");
}
}
- DimState(SurfaceControl dimLayer) {
- mDimLayer = dimLayer;
- mDimming = true;
- mCurrentProperties = new Change();
- mRequestedProperties = new Change();
- }
-
- void setExitParameters(WindowContainer container) {
- setRequestedRelativeParent(container, -1 /* relativeLayer */);
- setRequestedAppearance(0f /* alpha */, 0 /* blur */);
+ void ensureVisible(SurfaceControl.Transaction t) {
+ if (!mIsVisible) {
+ t.show(mDimSurface);
+ t.setAlpha(mDimSurface, 0f);
+ mIsVisible = true;
+ }
}
- // Sets a requested change without applying it immediately
- void setRequestedRelativeParent(WindowContainer relativeParent, int relativeLayer) {
- mRequestedProperties.mDimmingContainer = relativeParent;
- mRequestedProperties.mRelativeLayer = relativeLayer;
+ void adjustSurfaceLayout(SurfaceControl.Transaction t) {
+ // TODO: Once we use geometry from hierarchy this falls away.
+ t.setPosition(mDimSurface, mDimBounds.left, mDimBounds.top);
+ t.setWindowCrop(mDimSurface, mDimBounds.width(), mDimBounds.height());
}
- // Sets a requested change without applying it immediately
- void setRequestedAppearance(float alpha, int blurRadius) {
- mRequestedProperties.mAlpha = alpha;
- mRequestedProperties.mBlurRadius = blurRadius;
+ /**
+ * Set the parameters to prepare the dim to change its appearance
+ */
+ void prepareLookChange(float alpha, int blurRadius) {
+ mAnimationHelper.setRequestedAppearance(alpha, blurRadius);
}
/**
- * Commit the last changes we received. Called after
- * {@link Change#setExitParameters(WindowContainer)},
- * {@link Change#setRequestedRelativeParent(WindowContainer, int)}, or
- * {@link Change#setRequestedAppearance(float, int)}
+ * Prepare the dim for the exit animation
*/
- void applyChanges(SurfaceControl.Transaction t) {
- if (mRequestedProperties.mDimmingContainer == null) {
- Log.e(TAG, this + " does not have a dimming container. Have you forgotten to "
- + "call adjustRelativeLayer?");
- return;
- }
- if (mRequestedProperties.mDimmingContainer.mSurfaceControl == null) {
- Log.w(TAG, "container " + mRequestedProperties.mDimmingContainer
- + "does not have a surface");
- return;
- }
- if (!mDimState.mIsVisible) {
- mDimState.mIsVisible = true;
- t.show(mDimState.mDimLayer);
+ void exit(SurfaceControl.Transaction t) {
+ if (!mAnimateExit) {
+ remove(t);
+ } else {
+ mAnimationHelper.setExitParameters();
+ setReady(t);
}
- t.setRelativeLayer(mDimLayer,
- mRequestedProperties.mDimmingContainer.getSurfaceControl(),
- mRequestedProperties.mRelativeLayer);
+ }
- if (aspectChanged()) {
- if (isAnimating()) {
- mLocalAnimationAdapter.onAnimationCancelled(mDimLayer);
- }
- if (mRequestedProperties.mSkipAnimation
- || (!dimmingContainerChanged() && mDimming)) {
- // If the dimming container has not changed, then it is running its own
- // animation, thus we can directly set the values we get requested, unless it's
- // the exiting animation
- ProtoLog.d(WM_DEBUG_DIMMER,
- "Dim %s skipping animation and directly setting alpha=%f, blur=%d",
- mDimLayer, mRequestedProperties.mAlpha,
- mRequestedProperties.mBlurRadius);
- t.setAlpha(mDimLayer, mRequestedProperties.mAlpha);
- t.setBackgroundBlurRadius(mDimLayer, mRequestedProperties.mBlurRadius);
- mRequestedProperties.mSkipAnimation = false;
- } else {
- startAnimation(t);
- }
+ void remove(SurfaceControl.Transaction t) {
+ mAnimationHelper.stopCurrentAnimation(mDimSurface);
+ if (mDimSurface.isValid()) {
+ t.remove(mDimSurface);
+ ProtoLog.d(WM_DEBUG_DIMMER,
+ "Removing dim surface %s on transaction %s", this, t);
+ } else {
+ Log.w(TAG, "Tried to remove " + mDimSurface + " multiple times\n");
}
- mCurrentProperties = new Change(mRequestedProperties);
}
- private void startAnimation(SurfaceControl.Transaction t) {
- mAlphaAnimationSpec = getRequestedAnimationSpec(mRequestedProperties.mAlpha,
- mRequestedProperties.mBlurRadius);
- mLocalAnimationAdapter = mAnimationAdapterFactory.get(mAlphaAnimationSpec,
- mHost.mWmService.mSurfaceAnimationRunner);
-
- mLocalAnimationAdapter.startAnimation(mDimLayer, t,
- ANIMATION_TYPE_DIMMER, (type, animator) -> {
- t.setAlpha(mDimLayer, mRequestedProperties.mAlpha);
- t.setBackgroundBlurRadius(mDimLayer, mRequestedProperties.mBlurRadius);
- if (mRequestedProperties.mAlpha == 0f && !mDimming) {
- ProtoLog.d(WM_DEBUG_DIMMER,
- "Removing dim surface %s on transaction %s", mDimLayer, t);
- t.remove(mDimLayer);
- }
- mLocalAnimationAdapter = null;
- mAlphaAnimationSpec = null;
- });
+ @Override
+ public String toString() {
+ return "SmoothDimmer#DimState with host=" + mHostContainer + ", surface=" + mDimSurface;
}
- private boolean isAnimating() {
- return mAlphaAnimationSpec != null;
+ /**
+ * Set the parameters to prepare the dim to be relative parented to the dimming container
+ */
+ void prepareReparent(WindowContainer relativeParent, int relativeLayer) {
+ mAnimationHelper.setRequestedRelativeParent(relativeParent, relativeLayer);
}
- private boolean aspectChanged() {
- return Math.abs(mRequestedProperties.mAlpha - mCurrentProperties.mAlpha) > EPSILON
- || mRequestedProperties.mBlurRadius != mCurrentProperties.mBlurRadius;
+ /**
+ * Call when all the changes have been requested to have them applied
+ * @param t The transaction in which to apply the changes
+ */
+ void setReady(SurfaceControl.Transaction t) {
+ mAnimationHelper.applyChanges(t, this);
}
- private boolean dimmingContainerChanged() {
- return mRequestedProperties.mDimmingContainer != mCurrentProperties.mDimmingContainer;
+ /**
+ * Whether anyone is currently requesting the dim
+ */
+ boolean isDimming() {
+ return mLastRequestedDimContainer != null;
}
- private AnimationSpec getRequestedAnimationSpec(float targetAlpha, int targetBlur) {
- final float startAlpha;
- final int startBlur;
- if (mAlphaAnimationSpec != null) {
- startAlpha = mAlphaAnimationSpec.mCurrentAlpha;
- startBlur = mAlphaAnimationSpec.mCurrentBlur;
- } else {
- startAlpha = Math.max(mCurrentProperties.mAlpha, 0f);
- startBlur = Math.max(mCurrentProperties.mBlurRadius, 0);
- }
- long duration = (long) (getDimDuration(mRequestedProperties.mDimmingContainer)
- * Math.abs(targetAlpha - startAlpha));
-
- ProtoLog.v(WM_DEBUG_DIMMER, "Starting animation on dim layer %s, requested by %s, "
- + "alpha: %f -> %f, blur: %d -> %d",
- mDimLayer, mRequestedProperties.mDimmingContainer, startAlpha, targetAlpha,
- startBlur, targetBlur);
- return new AnimationSpec(
- new AnimationExtremes<>(startAlpha, targetAlpha),
- new AnimationExtremes<>(startBlur, targetBlur),
- duration
- );
+ private SurfaceControl makeDimLayer() {
+ return mHost.makeChildSurface(null)
+ .setParent(mHost.getSurfaceControl())
+ .setColorLayer()
+ .setName("Dim Layer for - " + mHost.getName())
+ .setCallsite("DimLayer.makeDimLayer")
+ .build();
}
}
protected SmoothDimmer(WindowContainer host) {
- this(host, new AnimationAdapterFactory());
+ this(host, new DimmerAnimationHelper.AnimationAdapterFactory());
}
@VisibleForTesting
- SmoothDimmer(WindowContainer host, AnimationAdapterFactory animationFactory) {
+ SmoothDimmer(WindowContainer host,
+ DimmerAnimationHelper.AnimationAdapterFactory animationFactory) {
super(host);
mAnimationAdapterFactory = animationFactory;
}
- private DimState obtainDimState(WindowContainer container) {
- if (mDimState == null) {
- try {
- final SurfaceControl ctl = makeDimLayer();
- mDimState = new DimState(ctl);
- } catch (Surface.OutOfResourcesException e) {
- Log.w(TAG, "OutOfResourcesException creating dim surface");
- }
- }
-
- mLastRequestedDimContainer = container;
- return mDimState;
- }
-
- private SurfaceControl makeDimLayer() {
- return mHost.makeChildSurface(null)
- .setParent(mHost.getSurfaceControl())
- .setColorLayer()
- .setName("Dim Layer for - " + mHost.getName())
- .setCallsite("Dimmer.makeDimLayer")
- .build();
- }
-
- @Override
- SurfaceControl getDimLayer() {
- return mDimState != null ? mDimState.mDimLayer : null;
- }
-
@Override
void resetDimStates() {
- if (mDimState == null) {
- return;
- }
- if (!mDimState.mDontReset) {
- mDimState.mDimming = false;
- }
- }
-
- @Override
- Rect getDimBounds() {
- return mDimState != null ? mDimState.mDimBounds : null;
- }
-
- @Override
- void dontAnimateExit() {
if (mDimState != null) {
- mDimState.mAnimateExit = false;
+ mDimState.mLastRequestedDimContainer = null;
}
}
@Override
protected void adjustAppearance(WindowContainer container, float alpha, int blurRadius) {
final DimState d = obtainDimState(container);
- mDimState.setRequestedAppearance(alpha, blurRadius);
- d.mDimming = true;
+ d.prepareLookChange(alpha, blurRadius);
}
@Override
protected void adjustRelativeLayer(WindowContainer container, int relativeLayer) {
if (mDimState != null) {
- mDimState.setRequestedRelativeParent(container, relativeLayer);
+ mDimState.prepareReparent(container, relativeLayer);
}
}
+ @Override
boolean updateDims(SurfaceControl.Transaction t) {
if (mDimState == null) {
return false;
}
-
- if (!mDimState.mDimming) {
- // No one is dimming anymore, fade out dim and remove
- if (!mDimState.mAnimateExit) {
- if (mDimState.mDimLayer.isValid()) {
- t.remove(mDimState.mDimLayer);
- }
- } else {
- mDimState.setExitParameters(
- mDimState.mRequestedProperties.mDimmingContainer);
- mDimState.applyChanges(t);
- }
+ if (!mDimState.isDimming()) {
+ // No one is dimming, fade out and remove the dim
+ mDimState.exit(t);
mDimState = null;
return false;
+ } else {
+ // Someone is dimming, show the requested changes
+ mDimState.adjustSurfaceLayout(t);
+ final WindowState ws = mDimState.mLastRequestedDimContainer.asWindowState();
+ if (!mDimState.mIsVisible && ws != null && ws.mActivityRecord != null
+ && ws.mActivityRecord.mStartingData != null) {
+ // Skip enter animation while starting window is on top of its activity
+ mDimState.mSkipAnimation = true;
+ }
+ mDimState.setReady(t);
+ return true;
}
- final Rect bounds = mDimState.mDimBounds;
- // TODO: Once we use geometry from hierarchy this falls away.
- t.setPosition(mDimState.mDimLayer, bounds.left, bounds.top);
- t.setWindowCrop(mDimState.mDimLayer, bounds.width(), bounds.height());
- // Skip enter animation while starting window is on top of its activity
- final WindowState ws = mLastRequestedDimContainer.asWindowState();
- if (!mDimState.mIsVisible && ws != null && ws.mActivityRecord != null
- && ws.mActivityRecord.mStartingData != null) {
- mDimState.mRequestedProperties.mSkipAnimation = true;
- }
- mDimState.applyChanges(t);
- return true;
- }
-
- private long getDimDuration(WindowContainer container) {
- // Use the same duration as the animation on the WindowContainer
- AnimationAdapter animationAdapter = container.mSurfaceAnimator.getAnimation();
- final float durationScale = container.mWmService.getTransitionAnimationScaleLocked();
- return animationAdapter == null ? (long) (DEFAULT_DIM_ANIM_DURATION * durationScale)
- : animationAdapter.getDurationHint();
}
- private static class AnimationExtremes<T> {
- final T mStartValue;
- final T mFinishValue;
-
- AnimationExtremes(T fromValue, T toValue) {
- mStartValue = fromValue;
- mFinishValue = toValue;
+ private DimState obtainDimState(WindowContainer container) {
+ if (mDimState == null) {
+ mDimState = new DimState();
}
+ mDimState.mLastRequestedDimContainer = container;
+ return mDimState;
}
- private static class AnimationSpec implements LocalAnimationAdapter.AnimationSpec {
- private final long mDuration;
- private final AnimationExtremes<Float> mAlpha;
- private final AnimationExtremes<Integer> mBlur;
-
- float mCurrentAlpha = 0;
- int mCurrentBlur = 0;
-
- AnimationSpec(AnimationExtremes<Float> alpha,
- AnimationExtremes<Integer> blur, long duration) {
- mAlpha = alpha;
- mBlur = blur;
- mDuration = duration;
- }
-
- @Override
- public long getDuration() {
- return mDuration;
- }
-
- @Override
- public void apply(SurfaceControl.Transaction t, SurfaceControl sc, long currentPlayTime) {
- final float fraction = getFraction(currentPlayTime);
- mCurrentAlpha =
- fraction * (mAlpha.mFinishValue - mAlpha.mStartValue) + mAlpha.mStartValue;
- mCurrentBlur =
- (int) fraction * (mBlur.mFinishValue - mBlur.mStartValue) + mBlur.mStartValue;
- t.setAlpha(sc, mCurrentAlpha);
- t.setBackgroundBlurRadius(sc, mCurrentBlur);
- }
-
- @Override
- public void dump(PrintWriter pw, String prefix) {
- pw.print(prefix); pw.print("from_alpha="); pw.print(mAlpha.mStartValue);
- pw.print(" to_alpha="); pw.print(mAlpha.mFinishValue);
- pw.print(prefix); pw.print("from_blur="); pw.print(mBlur.mStartValue);
- pw.print(" to_blur="); pw.print(mBlur.mFinishValue);
- pw.print(" duration="); pw.println(mDuration);
- }
-
- @Override
- public void dumpDebugInner(ProtoOutputStream proto) {
- final long token = proto.start(ALPHA);
- proto.write(FROM, mAlpha.mStartValue);
- proto.write(TO, mAlpha.mFinishValue);
- proto.write(DURATION_MS, mDuration);
- proto.end(token);
- }
+ @Override
+ @VisibleForTesting
+ SurfaceControl getDimLayer() {
+ return mDimState != null ? mDimState.mDimSurface : null;
}
- static class AnimationAdapterFactory {
+ @Override
+ Rect getDimBounds() {
+ return mDimState != null ? mDimState.mDimBounds : null;
+ }
- public AnimationAdapter get(LocalAnimationAdapter.AnimationSpec alphaAnimationSpec,
- SurfaceAnimationRunner runner) {
- return new LocalAnimationAdapter(alphaAnimationSpec, runner);
+ @Override
+ void dontAnimateExit() {
+ if (mDimState != null) {
+ mDimState.mAnimateExit = false;
}
}
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index de802b9b0e4d..5f082124dbcb 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -422,6 +422,11 @@ class Task extends TaskFragment {
// TODO: remove this once the recents animation is moved to the Shell
SurfaceControl mLastRecentsAnimationOverlay;
+ // A surface that is used by TaskFragmentOrganizer to place content on top of own activities and
+ // trusted TaskFragments.
+ @Nullable
+ DecorSurfaceContainer mDecorSurfaceContainer;
+
static final int LAYER_RANK_INVISIBLE = -1;
// Ranking (from top) of this task among all visible tasks. (-1 means it's not visible)
// This number will be assigned when we evaluate OOM scores for all visible tasks.
@@ -1540,6 +1545,11 @@ class Task extends TaskFragment {
mAtmService.getTaskChangeNotificationController().notifyTaskStackChanged();
}
+ if (mDecorSurfaceContainer != null && r == mDecorSurfaceContainer.mOwnerTaskFragment) {
+ // Remove the decor surface if the owner TaskFragment is removed;
+ removeDecorSurface();
+ }
+
if (hasChild()) {
updateEffectiveIntent();
@@ -2638,6 +2648,9 @@ class Task extends TaskFragment {
}
// If applicable let the TaskOrganizer know the Task is vanishing.
setTaskOrganizer(null);
+ if (mDecorSurfaceContainer != null) {
+ mDecorSurfaceContainer.release();
+ }
super.removeImmediately();
mRemoving = false;
@@ -3644,7 +3657,8 @@ class Task extends TaskFragment {
*/
TaskFragmentParentInfo getTaskFragmentParentInfo() {
return new TaskFragmentParentInfo(getConfiguration(), getDisplayId(),
- shouldBeVisible(null /* starting */), hasNonFinishingDirectActivity());
+ shouldBeVisible(null /* starting */), hasNonFinishingDirectActivity(),
+ getDecorSurface());
}
@Override
@@ -3666,6 +3680,62 @@ class Task extends TaskFragment {
}
}
+ @Override
+ void assignChildLayers(@NonNull SurfaceControl.Transaction t) {
+ int layer = 0;
+ boolean decorSurfacePlaced = false;
+
+ // We use two passes as a way to promote children which
+ // need Z-boosting to the end of the list.
+ for (int j = 0; j < mChildren.size(); ++j) {
+ final WindowContainer wc = mChildren.get(j);
+ wc.assignChildLayers(t);
+ if (!wc.needsZBoost()) {
+ // Place the decor surface under any untrusted content.
+ if (mDecorSurfaceContainer != null && !decorSurfacePlaced
+ && shouldPlaceDecorSurfaceBelowContainer(wc)) {
+ mDecorSurfaceContainer.assignLayer(t, layer++);
+ decorSurfacePlaced = true;
+ }
+ wc.assignLayer(t, layer++);
+
+ // Place the decor surface just above the owner TaskFragment.
+ if (mDecorSurfaceContainer != null && !decorSurfacePlaced
+ && wc == mDecorSurfaceContainer.mOwnerTaskFragment) {
+ mDecorSurfaceContainer.assignLayer(t, layer++);
+ decorSurfacePlaced = true;
+ }
+ }
+ }
+
+ // If not placed yet, the decor surface should be on top of all non-boosted children.
+ if (mDecorSurfaceContainer != null && !decorSurfacePlaced) {
+ mDecorSurfaceContainer.assignLayer(t, layer++);
+ decorSurfacePlaced = true;
+ }
+
+ for (int j = 0; j < mChildren.size(); ++j) {
+ final WindowContainer wc = mChildren.get(j);
+ if (wc.needsZBoost()) {
+ wc.assignLayer(t, layer++);
+ }
+ }
+ if (mOverlayHost != null) {
+ mOverlayHost.setLayer(t, layer++);
+ }
+ }
+
+ boolean shouldPlaceDecorSurfaceBelowContainer(@NonNull WindowContainer wc) {
+ boolean isOwnActivity =
+ wc.asActivityRecord() != null
+ && wc.asActivityRecord().isUid(effectiveUid);
+ boolean isTrustedTaskFragment =
+ wc.asTaskFragment() != null
+ && wc.asTaskFragment().isEmbedded()
+ && wc.asTaskFragment().isAllowedToBeEmbeddedInTrustedMode();
+ return !isOwnActivity && !isTrustedTaskFragment;
+ }
+
boolean isTaskId(int taskId) {
return mTaskId == taskId;
}
@@ -6673,4 +6743,77 @@ class Task extends TaskFragment {
mOverlayHost.dispatchInsetsChanged(s, mTmpRect);
}
}
+
+ /**
+ * Associates the decor surface with the given TF, or create one if there
+ * isn't one in the Task yet. The surface will be removed with the TF,
+ * and become invisible if the TF is invisible. */
+ void moveOrCreateDecorSurfaceFor(TaskFragment taskFragment) {
+ if (mDecorSurfaceContainer != null) {
+ mDecorSurfaceContainer.mOwnerTaskFragment = taskFragment;
+ } else {
+ mDecorSurfaceContainer = new DecorSurfaceContainer(taskFragment);
+ assignChildLayers();
+ sendTaskFragmentParentInfoChangedIfNeeded();
+ }
+ }
+
+ void removeDecorSurface() {
+ if (mDecorSurfaceContainer == null) {
+ return;
+ }
+ mDecorSurfaceContainer.release();
+ mDecorSurfaceContainer = null;
+ sendTaskFragmentParentInfoChangedIfNeeded();
+ }
+
+ @Nullable SurfaceControl getDecorSurface() {
+ return mDecorSurfaceContainer != null ? mDecorSurfaceContainer.mDecorSurface : null;
+ }
+
+ /**
+ * A decor surface that is requested by a {@code TaskFragmentOrganizer} which will be placed
+ * below children windows except for own Activities and TaskFragment in fully trusted mode.
+ */
+ @VisibleForTesting
+ class DecorSurfaceContainer {
+ @VisibleForTesting
+ @NonNull final SurfaceControl mContainerSurface;
+
+ @VisibleForTesting
+ @NonNull final SurfaceControl mDecorSurface;
+
+ // The TaskFragment that requested the decor surface. If it is destroyed, the decor surface
+ // is also released.
+ @VisibleForTesting
+ @NonNull TaskFragment mOwnerTaskFragment;
+
+ private DecorSurfaceContainer(@NonNull TaskFragment initialOwner) {
+ mOwnerTaskFragment = initialOwner;
+ mContainerSurface = makeSurface().setContainerLayer()
+ .setParent(mSurfaceControl)
+ .setName(mSurfaceControl + " - decor surface container")
+ .setEffectLayer()
+ .setHidden(false)
+ .setCallsite("Task.DecorSurfaceContainer")
+ .build();
+
+ mDecorSurface = makeSurface()
+ .setParent(mContainerSurface)
+ .setName(mSurfaceControl + " - decor surface")
+ .setHidden(false)
+ .setCallsite("Task.DecorSurfaceContainer")
+ .build();
+ }
+
+ private void assignLayer(@NonNull SurfaceControl.Transaction t, int layer) {
+ t.setLayer(mContainerSurface, layer);
+ t.setVisibility(mContainerSurface, mOwnerTaskFragment.isVisible());
+ }
+
+ private void release() {
+ mDecorSurface.release();
+ mContainerSurface.release();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index 8bc461f05387..39b4480a7da0 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -316,7 +316,8 @@ class TaskFragment extends WindowContainer<WindowContainer> {
/** Organizer that organizing this TaskFragment. */
@Nullable
private ITaskFragmentOrganizer mTaskFragmentOrganizer;
- private int mTaskFragmentOrganizerUid = INVALID_UID;
+ @VisibleForTesting
+ int mTaskFragmentOrganizerUid = INVALID_UID;
private @Nullable String mTaskFragmentOrganizerProcessName;
/** Client assigned unique token for this TaskFragment if this is created by an organizer. */
diff --git a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
index e7a1cf106a44..707f9fc9ea5f 100644
--- a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java
@@ -762,6 +762,8 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
.setTask(task)
.build());
}
+ // Make sure the parent info changed event will be dispatched if there are no other changes.
+ mAtmService.mWindowManager.mWindowPlacerLocked.requestTraversal();
}
boolean isSystemOrganizer(@NonNull IBinder organizerToken) {
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index 3a711b2c7046..27cc2d6b4aac 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -1182,22 +1182,6 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
}
}
- @Override
- public void setOrientationRequestPolicy(boolean isIgnoreOrientationRequestDisabled,
- @Nullable int[] fromOrientations, @Nullable int[] toOrientations) {
- enforceTaskPermission("setOrientationRequestPolicy()");
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (mGlobalLock) {
- mService.mWindowManager
- .setOrientationRequestPolicy(isIgnoreOrientationRequestDisabled,
- fromOrientations, toOrientations);
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
public boolean handleInterceptBackPressedOnTaskRoot(Task task) {
if (!shouldInterceptBackPressedOnRootTask(task)) {
return false;
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 388f77dee262..424394872821 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -1737,8 +1737,8 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
// Since we created root-leash but no longer reference it from core, release it now
info.releaseAnimSurfaces();
- mLogger.logOnSendAsync(mController.mLoggerHandler);
if (mLogger.mInfo != null) {
+ mLogger.logOnSendAsync(mController.mLoggerHandler);
mController.mTransitionTracer.logSentTransition(this, mTargets);
}
}
@@ -1756,6 +1756,27 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
}
/**
+ * Checks if the transition contains order changes.
+ *
+ * This is a shallow check that doesn't account for collection in parallel, unlike
+ * {@code collectOrderChanges}
+ */
+ boolean hasOrderChanges() {
+ ArrayList<Task> onTopTasks = new ArrayList<>();
+ // Iterate over target displays to get up to date on top tasks.
+ // Cannot use `mOnTopTasksAtReady` as it's not populated before the `applyReady` is called.
+ for (DisplayContent dc : mTargetDisplays) {
+ addOnTopTasks(dc, onTopTasks);
+ }
+ for (Task task : onTopTasks) {
+ if (!mOnTopTasksStart.contains(task)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* Collect tasks which moved-to-top as part of this transition. This also updates the
* controller's latest-reported when relevant.
*
@@ -3326,7 +3347,6 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
*/
void addGroup(WindowContainer wc) {
if (mReadyGroups.containsKey(wc)) {
- Slog.e(TAG, "Trying to add a ready-group twice: " + wc);
return;
}
mReadyGroups.put(wc, false);
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java
index bacfda5fc528..e648d6417e88 100644
--- a/services/core/java/com/android/server/wm/TransitionController.java
+++ b/services/core/java/com/android/server/wm/TransitionController.java
@@ -792,6 +792,12 @@ class TransitionController {
mCollectingTransition.recordTaskOrder(wc);
}
+ /** @see Transition#hasOrderChanges */
+ boolean hasOrderChanges() {
+ if (mCollectingTransition == null) return false;
+ return mCollectingTransition.hasOrderChanges();
+ }
+
/**
* Collects the window containers which need to be synced with the changing display area into
* the current collecting transition.
diff --git a/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java b/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java
new file mode 100644
index 000000000000..e82dc37c2b6a
--- /dev/null
+++ b/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java
@@ -0,0 +1,448 @@
+/*
+ * Copyright 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 com.android.server.wm;
+
+import static android.graphics.Matrix.MSCALE_X;
+import static android.graphics.Matrix.MSCALE_Y;
+import static android.graphics.Matrix.MSKEW_X;
+import static android.graphics.Matrix.MSKEW_Y;
+
+import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TPL;
+
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Region;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.IntArray;
+import android.util.Pair;
+import android.util.Size;
+import android.view.InputWindowHandle;
+import android.window.ITrustedPresentationListener;
+import android.window.TrustedPresentationThresholds;
+import android.window.WindowInfosListener;
+
+import com.android.internal.protolog.common.ProtoLog;
+import com.android.server.wm.utils.RegionUtils;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Optional;
+
+/**
+ * Class to handle TrustedPresentationListener registrations in a thread safe manner. This class
+ * also takes care of cleaning up listeners when the remote process dies.
+ */
+public class TrustedPresentationListenerController {
+
+ // Should only be accessed by the posting to the handler
+ private class Listeners {
+ private final class ListenerDeathRecipient implements IBinder.DeathRecipient {
+ IBinder mListenerBinder;
+ int mInstances;
+
+ ListenerDeathRecipient(IBinder listenerBinder) {
+ mListenerBinder = listenerBinder;
+ mInstances = 0;
+ try {
+ mListenerBinder.linkToDeath(this, 0);
+ } catch (RemoteException ignore) {
+ }
+ }
+
+ void addInstance() {
+ mInstances++;
+ }
+
+ // return true if there are no instances alive
+ boolean removeInstance() {
+ mInstances--;
+ if (mInstances > 0) {
+ return false;
+ }
+ mListenerBinder.unlinkToDeath(this, 0);
+ return true;
+ }
+
+ public void binderDied() {
+ mHandler.post(() -> {
+ mUniqueListeners.remove(mListenerBinder);
+ removeListeners(mListenerBinder, Optional.empty());
+ });
+ }
+ }
+
+ // tracks binder deaths for cleanup
+ ArrayMap<IBinder, ListenerDeathRecipient> mUniqueListeners = new ArrayMap<>();
+ ArrayMap<IBinder /*window*/, ArrayList<TrustedPresentationInfo>> mWindowToListeners =
+ new ArrayMap<>();
+
+ void register(IBinder window, ITrustedPresentationListener listener,
+ TrustedPresentationThresholds thresholds, int id) {
+ var listenersForWindow = mWindowToListeners.computeIfAbsent(window,
+ iBinder -> new ArrayList<>());
+ listenersForWindow.add(new TrustedPresentationInfo(thresholds, id, listener));
+
+ // register death listener
+ var listenerBinder = listener.asBinder();
+ var deathRecipient = mUniqueListeners.computeIfAbsent(listenerBinder,
+ ListenerDeathRecipient::new);
+ deathRecipient.addInstance();
+ }
+
+ void unregister(ITrustedPresentationListener trustedPresentationListener, int id) {
+ var listenerBinder = trustedPresentationListener.asBinder();
+ var deathRecipient = mUniqueListeners.get(listenerBinder);
+ if (deathRecipient == null) {
+ ProtoLog.e(WM_DEBUG_TPL, "unregister failed, couldn't find"
+ + " deathRecipient for %s with id=%d", trustedPresentationListener, id);
+ return;
+ }
+
+ if (deathRecipient.removeInstance()) {
+ mUniqueListeners.remove(listenerBinder);
+ }
+ removeListeners(listenerBinder, Optional.of(id));
+ }
+
+ boolean isEmpty() {
+ return mWindowToListeners.isEmpty();
+ }
+
+ ArrayList<TrustedPresentationInfo> get(IBinder windowToken) {
+ return mWindowToListeners.get(windowToken);
+ }
+
+ private void removeListeners(IBinder listenerBinder, Optional<Integer> id) {
+ for (int i = mWindowToListeners.size() - 1; i >= 0; i--) {
+ var listeners = mWindowToListeners.valueAt(i);
+ for (int j = listeners.size() - 1; j >= 0; j--) {
+ var listener = listeners.get(j);
+ if (listener.mListener.asBinder() == listenerBinder && (id.isEmpty()
+ || listener.mId == id.get())) {
+ listeners.remove(j);
+ }
+ }
+ if (listeners.isEmpty()) {
+ mWindowToListeners.removeAt(i);
+ }
+ }
+ }
+ }
+
+ private final Object mHandlerThreadLock = new Object();
+ private HandlerThread mHandlerThread;
+ private Handler mHandler;
+
+ private WindowInfosListener mWindowInfosListener;
+
+ Listeners mRegisteredListeners = new Listeners();
+
+ private InputWindowHandle[] mLastWindowHandles;
+
+ private final Object mIgnoredWindowTokensLock = new Object();
+
+ private final ArraySet<IBinder> mIgnoredWindowTokens = new ArraySet<>();
+
+ private void startHandlerThreadIfNeeded() {
+ synchronized (mHandlerThreadLock) {
+ if (mHandler == null) {
+ mHandlerThread = new HandlerThread("WindowInfosListenerForTpl");
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper());
+ }
+ }
+ }
+
+ void addIgnoredWindowTokens(IBinder token) {
+ synchronized (mIgnoredWindowTokensLock) {
+ mIgnoredWindowTokens.add(token);
+ }
+ }
+
+ void removeIgnoredWindowTokens(IBinder token) {
+ synchronized (mIgnoredWindowTokensLock) {
+ mIgnoredWindowTokens.remove(token);
+ }
+ }
+
+ void registerListener(IBinder window, ITrustedPresentationListener listener,
+ TrustedPresentationThresholds thresholds, int id) {
+ startHandlerThreadIfNeeded();
+ mHandler.post(() -> {
+ ProtoLog.d(WM_DEBUG_TPL, "Registering listener=%s with id=%d for window=%s with %s",
+ listener, id, window, thresholds);
+
+ mRegisteredListeners.register(window, listener, thresholds, id);
+ registerWindowInfosListener();
+ // Update the initial state for the new registered listener
+ computeTpl(mLastWindowHandles);
+ });
+ }
+
+ void unregisterListener(ITrustedPresentationListener listener, int id) {
+ startHandlerThreadIfNeeded();
+ mHandler.post(() -> {
+ ProtoLog.d(WM_DEBUG_TPL, "Unregistering listener=%s with id=%d",
+ listener, id);
+
+ mRegisteredListeners.unregister(listener, id);
+ if (mRegisteredListeners.isEmpty()) {
+ unregisterWindowInfosListener();
+ }
+ });
+ }
+
+ void dump(PrintWriter pw) {
+ final String innerPrefix = " ";
+ pw.println("TrustedPresentationListenerController:");
+ pw.println(innerPrefix + "Active unique listeners ("
+ + mRegisteredListeners.mUniqueListeners.size() + "):");
+ for (int i = 0; i < mRegisteredListeners.mWindowToListeners.size(); i++) {
+ pw.println(
+ innerPrefix + " window=" + mRegisteredListeners.mWindowToListeners.keyAt(i));
+ final var listeners = mRegisteredListeners.mWindowToListeners.valueAt(i);
+ for (int j = 0; j < listeners.size(); j++) {
+ final var listener = listeners.get(j);
+ pw.println(innerPrefix + innerPrefix + " listener=" + listener.mListener.asBinder()
+ + " id=" + listener.mId
+ + " thresholds=" + listener.mThresholds);
+ }
+ }
+ }
+
+ private void registerWindowInfosListener() {
+ if (mWindowInfosListener != null) {
+ return;
+ }
+
+ mWindowInfosListener = new WindowInfosListener() {
+ @Override
+ public void onWindowInfosChanged(InputWindowHandle[] windowHandles,
+ DisplayInfo[] displayInfos) {
+ mHandler.post(() -> computeTpl(windowHandles));
+ }
+ };
+ mLastWindowHandles = mWindowInfosListener.register().first;
+ }
+
+ private void unregisterWindowInfosListener() {
+ if (mWindowInfosListener == null) {
+ return;
+ }
+
+ mWindowInfosListener.unregister();
+ mWindowInfosListener = null;
+ mLastWindowHandles = null;
+ }
+
+ private void computeTpl(InputWindowHandle[] windowHandles) {
+ mLastWindowHandles = windowHandles;
+ if (mLastWindowHandles == null || mLastWindowHandles.length == 0
+ || mRegisteredListeners.isEmpty()) {
+ return;
+ }
+
+ Rect tmpRect = new Rect();
+ Matrix tmpInverseMatrix = new Matrix();
+ float[] tmpMatrix = new float[9];
+ Region coveredRegionsAbove = new Region();
+ long currTimeMs = System.currentTimeMillis();
+ ProtoLog.v(WM_DEBUG_TPL, "Checking %d windows", mLastWindowHandles.length);
+
+ ArrayMap<ITrustedPresentationListener, Pair<IntArray, IntArray>> listenerUpdates =
+ new ArrayMap<>();
+ ArraySet<IBinder> ignoredWindowTokens;
+ synchronized (mIgnoredWindowTokensLock) {
+ ignoredWindowTokens = new ArraySet<>(mIgnoredWindowTokens);
+ }
+ for (var windowHandle : mLastWindowHandles) {
+ if (ignoredWindowTokens.contains(windowHandle.getWindowToken())) {
+ ProtoLog.v(WM_DEBUG_TPL, "Skipping %s", windowHandle.name);
+ continue;
+ }
+ tmpRect.set(windowHandle.frame);
+ var listeners = mRegisteredListeners.get(windowHandle.getWindowToken());
+ if (listeners != null) {
+ Region region = new Region();
+ region.op(tmpRect, coveredRegionsAbove, Region.Op.DIFFERENCE);
+ windowHandle.transform.invert(tmpInverseMatrix);
+ tmpInverseMatrix.getValues(tmpMatrix);
+ float scaleX = (float) Math.sqrt(tmpMatrix[MSCALE_X] * tmpMatrix[MSCALE_X]
+ + tmpMatrix[MSKEW_X] * tmpMatrix[MSKEW_X]);
+ float scaleY = (float) Math.sqrt(tmpMatrix[MSCALE_Y] * tmpMatrix[MSCALE_Y]
+ + tmpMatrix[MSKEW_Y] * tmpMatrix[MSKEW_Y]);
+
+ float fractionRendered = computeFractionRendered(region, new RectF(tmpRect),
+ windowHandle.contentSize,
+ scaleX, scaleY);
+
+ checkIfInThreshold(listeners, listenerUpdates, fractionRendered, windowHandle.alpha,
+ currTimeMs);
+ }
+
+ coveredRegionsAbove.op(tmpRect, Region.Op.UNION);
+ ProtoLog.v(WM_DEBUG_TPL, "coveredRegionsAbove updated with %s frame:%s region:%s",
+ windowHandle.name, tmpRect.toShortString(), coveredRegionsAbove);
+ }
+
+ for (int i = 0; i < listenerUpdates.size(); i++) {
+ var updates = listenerUpdates.valueAt(i);
+ var listener = listenerUpdates.keyAt(i);
+ try {
+ listener.onTrustedPresentationChanged(updates.first.toArray(),
+ updates.second.toArray());
+ } catch (RemoteException ignore) {
+ }
+ }
+ }
+
+ private void addListenerUpdate(
+ ArrayMap<ITrustedPresentationListener, Pair<IntArray, IntArray>> listenerUpdates,
+ ITrustedPresentationListener listener, int id, boolean presentationState) {
+ var updates = listenerUpdates.get(listener);
+ if (updates == null) {
+ updates = new Pair<>(new IntArray(), new IntArray());
+ listenerUpdates.put(listener, updates);
+ }
+ if (presentationState) {
+ updates.first.add(id);
+ } else {
+ updates.second.add(id);
+ }
+ }
+
+
+ private void checkIfInThreshold(
+ ArrayList<TrustedPresentationInfo> listeners,
+ ArrayMap<ITrustedPresentationListener, Pair<IntArray, IntArray>> listenerUpdates,
+ float fractionRendered, float alpha, long currTimeMs) {
+ ProtoLog.v(WM_DEBUG_TPL, "checkIfInThreshold fractionRendered=%f alpha=%f currTimeMs=%d",
+ fractionRendered, alpha, currTimeMs);
+ for (int i = 0; i < listeners.size(); i++) {
+ var trustedPresentationInfo = listeners.get(i);
+ var listener = trustedPresentationInfo.mListener;
+ boolean lastState = trustedPresentationInfo.mLastComputedTrustedPresentationState;
+ boolean newState =
+ (alpha >= trustedPresentationInfo.mThresholds.mMinAlpha) && (fractionRendered
+ >= trustedPresentationInfo.mThresholds.mMinFractionRendered);
+ trustedPresentationInfo.mLastComputedTrustedPresentationState = newState;
+
+ ProtoLog.v(WM_DEBUG_TPL,
+ "lastState=%s newState=%s alpha=%f minAlpha=%f fractionRendered=%f "
+ + "minFractionRendered=%f",
+ lastState, newState, alpha, trustedPresentationInfo.mThresholds.mMinAlpha,
+ fractionRendered, trustedPresentationInfo.mThresholds.mMinFractionRendered);
+
+ if (lastState && !newState) {
+ // We were in the trusted presentation state, but now we left it,
+ // emit the callback if needed
+ if (trustedPresentationInfo.mLastReportedTrustedPresentationState) {
+ trustedPresentationInfo.mLastReportedTrustedPresentationState = false;
+ addListenerUpdate(listenerUpdates, listener,
+ trustedPresentationInfo.mId, /*presentationState*/ false);
+ ProtoLog.d(WM_DEBUG_TPL, "Adding untrusted state listener=%s with id=%d",
+ listener, trustedPresentationInfo.mId);
+ }
+ // Reset the timer
+ trustedPresentationInfo.mEnteredTrustedPresentationStateTime = -1;
+ } else if (!lastState && newState) {
+ // We were not in the trusted presentation state, but we entered it, begin the timer
+ // and make sure this gets called at least once more!
+ trustedPresentationInfo.mEnteredTrustedPresentationStateTime = currTimeMs;
+ mHandler.postDelayed(() -> {
+ computeTpl(mLastWindowHandles);
+ }, (long) (trustedPresentationInfo.mThresholds.mStabilityRequirementMs * 1.5));
+ }
+
+ // Has the timer elapsed, but we are still in the state? Emit a callback if needed
+ if (!trustedPresentationInfo.mLastReportedTrustedPresentationState && newState && (
+ currTimeMs - trustedPresentationInfo.mEnteredTrustedPresentationStateTime
+ > trustedPresentationInfo.mThresholds.mStabilityRequirementMs)) {
+ trustedPresentationInfo.mLastReportedTrustedPresentationState = true;
+ addListenerUpdate(listenerUpdates, listener,
+ trustedPresentationInfo.mId, /*presentationState*/ true);
+ ProtoLog.d(WM_DEBUG_TPL, "Adding trusted state listener=%s with id=%d",
+ listener, trustedPresentationInfo.mId);
+ }
+ }
+ }
+
+ private float computeFractionRendered(Region visibleRegion, RectF screenBounds,
+ Size contentSize,
+ float sx, float sy) {
+ ProtoLog.v(WM_DEBUG_TPL,
+ "computeFractionRendered: visibleRegion=%s screenBounds=%s contentSize=%s "
+ + "scale=%f,%f",
+ visibleRegion, screenBounds, contentSize, sx, sy);
+
+ if (contentSize.getWidth() == 0 || contentSize.getHeight() == 0) {
+ return -1;
+ }
+ if (screenBounds.width() == 0 || screenBounds.height() == 0) {
+ return -1;
+ }
+
+ float fractionRendered = Math.min(sx * sy, 1.0f);
+ ProtoLog.v(WM_DEBUG_TPL, "fractionRendered scale=%f", fractionRendered);
+
+ float boundsOverSourceW = screenBounds.width() / (float) contentSize.getWidth();
+ float boundsOverSourceH = screenBounds.height() / (float) contentSize.getHeight();
+ fractionRendered *= boundsOverSourceW * boundsOverSourceH;
+ ProtoLog.v(WM_DEBUG_TPL, "fractionRendered boundsOverSource=%f", fractionRendered);
+ // Compute the size of all the rects since they may be disconnected.
+ float[] visibleSize = new float[1];
+ RegionUtils.forEachRect(visibleRegion, rect -> {
+ float size = rect.width() * rect.height();
+ visibleSize[0] += size;
+ });
+
+ fractionRendered *= visibleSize[0] / (screenBounds.width() * screenBounds.height());
+ return fractionRendered;
+ }
+
+ private static class TrustedPresentationInfo {
+ boolean mLastComputedTrustedPresentationState = false;
+ boolean mLastReportedTrustedPresentationState = false;
+ long mEnteredTrustedPresentationStateTime = -1;
+ final TrustedPresentationThresholds mThresholds;
+
+ final ITrustedPresentationListener mListener;
+ final int mId;
+
+ private TrustedPresentationInfo(TrustedPresentationThresholds thresholds, int id,
+ ITrustedPresentationListener listener) {
+ mThresholds = thresholds;
+ mId = id;
+ mListener = listener;
+ checkValid(thresholds);
+ }
+
+ private void checkValid(TrustedPresentationThresholds thresholds) {
+ if (thresholds.mMinAlpha <= 0 || thresholds.mMinFractionRendered <= 0
+ || thresholds.mStabilityRequirementMs < 1) {
+ throw new IllegalArgumentException(
+ "TrustedPresentationThresholds values are invalid");
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index ae171a0d8030..808a11d4adae 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -993,4 +993,18 @@ public abstract class WindowManagerInternal {
* @param displayId the id of display to check if there is a software navigation bar.
*/
public abstract boolean hasNavigationBar(int displayId);
+
+ /**
+ * Controls whether the app-requested screen orientation is always respected.
+ *
+ * @param respected If {@code true}, the app requested orientation is always respected.
+ * Otherwise, the system might ignore the request due to
+ * {@link com.android.server.wm.DisplayArea#getIgnoreOrientationRequest}.
+ * @param fromOrientations The orientations we want to map to the correspondent orientations
+ * in toOrientation.
+ * @param toOrientations The orientations we map to the ones in fromOrientations at the same
+ * index
+ */
+ public abstract void setOrientationRequestPolicy(boolean respected,
+ int[] fromOrientations, int[] toOrientations);
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index dd2b48bb5a3d..0c57036a3b02 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -303,9 +303,11 @@ import android.window.AddToSurfaceSyncGroupResult;
import android.window.ClientWindowFrames;
import android.window.ISurfaceSyncGroupCompletedListener;
import android.window.ITaskFpsCallback;
+import android.window.ITrustedPresentationListener;
import android.window.ScreenCapture;
import android.window.SystemPerformanceHinter;
import android.window.TaskSnapshot;
+import android.window.TrustedPresentationThresholds;
import android.window.WindowContainerToken;
import android.window.WindowContextInfo;
@@ -764,6 +766,9 @@ public class WindowManagerService extends IWindowManager.Stub
private final SurfaceSyncGroupController mSurfaceSyncGroupController =
new SurfaceSyncGroupController();
+ final TrustedPresentationListenerController mTrustedPresentationListenerController =
+ new TrustedPresentationListenerController();
+
@VisibleForTesting
final class SettingsObserver extends ContentObserver {
private final Uri mDisplayInversionEnabledUri =
@@ -7171,6 +7176,7 @@ public class WindowManagerService extends IWindowManager.Stub
pw.println(separator);
}
mSystemPerformanceHinter.dump(pw, "");
+ mTrustedPresentationListenerController.dump(pw);
}
}
@@ -8523,6 +8529,15 @@ public class WindowManagerService extends IWindowManager.Stub
mImeTargetChangeListener = listener;
}
}
+
+ @Override
+ public void setOrientationRequestPolicy(boolean respected,
+ int[] fromOrientations, int[] toOrientations) {
+ synchronized (mGlobalLock) {
+ WindowManagerService.this.setOrientationRequestPolicy(respected,
+ fromOrientations, toOrientations);
+ }
+ }
}
private final class ImeTargetVisibilityPolicyImpl extends ImeTargetVisibilityPolicy {
@@ -9762,4 +9777,17 @@ public class WindowManagerService extends IWindowManager.Stub
Binder.restoreCallingIdentity(origId);
}
}
+
+ @Override
+ public void registerTrustedPresentationListener(IBinder window,
+ ITrustedPresentationListener listener,
+ TrustedPresentationThresholds thresholds, int id) {
+ mTrustedPresentationListenerController.registerListener(window, listener, thresholds, id);
+ }
+
+ @Override
+ public void unregisterTrustedPresentationListener(ITrustedPresentationListener listener,
+ int id) {
+ mTrustedPresentationListenerController.unregisterListener(listener, id);
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 2e4114467f5c..a872fd0baaae 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -23,7 +23,9 @@ import static android.app.WindowConfiguration.WINDOW_CONFIG_BOUNDS;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.window.TaskFragmentOperation.OP_TYPE_CLEAR_ADJACENT_TASK_FRAGMENTS;
import static android.window.TaskFragmentOperation.OP_TYPE_CREATE_TASK_FRAGMENT;
+import static android.window.TaskFragmentOperation.OP_TYPE_CREATE_TASK_FRAGMENT_DECOR_SURFACE;
import static android.window.TaskFragmentOperation.OP_TYPE_DELETE_TASK_FRAGMENT;
+import static android.window.TaskFragmentOperation.OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE;
import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_BOTTOM_OF_TASK;
import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_FRONT;
import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_TOP_OF_TASK;
@@ -1485,6 +1487,16 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
}
break;
}
+ case OP_TYPE_CREATE_TASK_FRAGMENT_DECOR_SURFACE: {
+ final Task task = taskFragment.getTask();
+ task.moveOrCreateDecorSurfaceFor(taskFragment);
+ break;
+ }
+ case OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE: {
+ final Task task = taskFragment.getTask();
+ task.removeDecorSurface();
+ break;
+ }
}
return effects;
}
@@ -1524,6 +1536,19 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
return false;
}
+ // TODO (b/293654166) remove the decor surface checks once we clear security reviews
+ if ((opType == OP_TYPE_CREATE_TASK_FRAGMENT_DECOR_SURFACE
+ || opType == OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE)
+ && !mTaskFragmentOrganizerController.isSystemOrganizer(organizer.asBinder())) {
+ final Throwable exception = new SecurityException(
+ "Only a system organizer can perform OP_TYPE_CREATE_TASK_FRAGMENT_DECOR_SURFACE"
+ + " or OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE."
+ );
+ sendTaskFragmentOperationFailure(organizer, errorCallbackToken, taskFragment,
+ opType, exception);
+ return false;
+ }
+
final IBinder secondaryFragmentToken = operation.getSecondaryFragmentToken();
return secondaryFragmentToken == null
|| validateTaskFragment(mLaunchTaskFragments.get(secondaryFragmentToken), opType,
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index e1f1f662c5aa..7bc7e2cb780b 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1189,6 +1189,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
ProtoLog.v(WM_DEBUG_ADD_REMOVE, "Adding %s to %s", this, parentWindow);
parentWindow.addChild(this, sWindowSubLayerComparator);
}
+
+ if (token.mRoundedCornerOverlay) {
+ mWmService.mTrustedPresentationListenerController.addIgnoredWindowTokens(
+ getWindowToken());
+ }
}
@Override
@@ -2393,6 +2398,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
mWmService.postWindowRemoveCleanupLocked(this);
+
+ mWmService.mTrustedPresentationListenerController.removeIgnoredWindowTokens(
+ getWindowToken());
}
@Override
diff --git a/services/core/jni/com_android_server_hint_HintManagerService.cpp b/services/core/jni/com_android_server_hint_HintManagerService.cpp
index 7edf445d7604..ccd9bd0a50ca 100644
--- a/services/core/jni/com_android_server_hint_HintManagerService.cpp
+++ b/services/core/jni/com_android_server_hint_HintManagerService.cpp
@@ -20,6 +20,7 @@
#include <aidl/android/hardware/power/IPower.h>
#include <android-base/stringprintf.h>
+#include <inttypes.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedPrimitiveArray.h>
#include <powermanager/PowerHalController.h>
@@ -38,6 +39,15 @@ using android::base::StringPrintf;
namespace android {
+static struct {
+ jclass clazz{};
+ jfieldID workPeriodStartTimestampNanos{};
+ jfieldID actualTotalDurationNanos{};
+ jfieldID actualCpuDurationNanos{};
+ jfieldID actualGpuDurationNanos{};
+ jfieldID timestampNanos{};
+} gWorkDurationInfo;
+
static power::PowerHalController gPowerHalController;
static std::unordered_map<jlong, std::shared_ptr<IPowerHintSession>> gSessionMap;
static std::mutex gSessionMapLock;
@@ -180,6 +190,26 @@ static void nativeSetMode(JNIEnv* env, jclass /* clazz */, jlong session_ptr, ji
setMode(session_ptr, static_cast<SessionMode>(mode), enabled);
}
+static void nativeReportActualWorkDuration2(JNIEnv* env, jclass /* clazz */, jlong session_ptr,
+ jobjectArray jWorkDurations) {
+ int size = env->GetArrayLength(jWorkDurations);
+ std::vector<WorkDuration> workDurations(size);
+ for (int i = 0; i < size; i++) {
+ jobject workDuration = env->GetObjectArrayElement(jWorkDurations, i);
+ workDurations[i].workPeriodStartTimestampNanos =
+ env->GetLongField(workDuration, gWorkDurationInfo.workPeriodStartTimestampNanos);
+ workDurations[i].durationNanos =
+ env->GetLongField(workDuration, gWorkDurationInfo.actualTotalDurationNanos);
+ workDurations[i].cpuDurationNanos =
+ env->GetLongField(workDuration, gWorkDurationInfo.actualCpuDurationNanos);
+ workDurations[i].gpuDurationNanos =
+ env->GetLongField(workDuration, gWorkDurationInfo.actualGpuDurationNanos);
+ workDurations[i].timeStampNanos =
+ env->GetLongField(workDuration, gWorkDurationInfo.timestampNanos);
+ }
+ reportActualWorkDuration(session_ptr, workDurations);
+}
+
// ----------------------------------------------------------------------------
static const JNINativeMethod sHintManagerServiceMethods[] = {
/* name, signature, funcPtr */
@@ -194,9 +224,23 @@ static const JNINativeMethod sHintManagerServiceMethods[] = {
{"nativeSendHint", "(JI)V", (void*)nativeSendHint},
{"nativeSetThreads", "(J[I)V", (void*)nativeSetThreads},
{"nativeSetMode", "(JIZ)V", (void*)nativeSetMode},
+ {"nativeReportActualWorkDuration", "(J[Landroid/os/WorkDuration;)V",
+ (void*)nativeReportActualWorkDuration2},
};
int register_android_server_HintManagerService(JNIEnv* env) {
+ gWorkDurationInfo.clazz = env->FindClass("android/os/WorkDuration");
+ gWorkDurationInfo.workPeriodStartTimestampNanos =
+ env->GetFieldID(gWorkDurationInfo.clazz, "mWorkPeriodStartTimestampNanos", "J");
+ gWorkDurationInfo.actualTotalDurationNanos =
+ env->GetFieldID(gWorkDurationInfo.clazz, "mActualTotalDurationNanos", "J");
+ gWorkDurationInfo.actualCpuDurationNanos =
+ env->GetFieldID(gWorkDurationInfo.clazz, "mActualCpuDurationNanos", "J");
+ gWorkDurationInfo.actualGpuDurationNanos =
+ env->GetFieldID(gWorkDurationInfo.clazz, "mActualGpuDurationNanos", "J");
+ gWorkDurationInfo.timestampNanos =
+ env->GetFieldID(gWorkDurationInfo.clazz, "mTimestampNanos", "J");
+
return jniRegisterNativeMethods(env,
"com/android/server/power/hint/"
"HintManagerService$NativeWrapper",
diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd
index cca4261795ab..c625b1e1eef7 100644
--- a/services/core/xsd/display-device-config/display-device-config.xsd
+++ b/services/core/xsd/display-device-config/display-device-config.xsd
@@ -159,6 +159,12 @@
<xs:element type="usiVersion" name="usiVersion">
<xs:annotation name="final"/>
</xs:element>
+ <!-- Maximum screen brightness setting when screen brightness capped in
+ Wear Bedtime mode. This must be a non-negative decimal within the range defined by
+ the first and the last brightness value in screenBrightnessMap. -->
+ <xs:element type="nonNegativeDecimal" name="screenBrightnessCapForWearBedtimeMode">
+ <xs:annotation name="final"/>
+ </xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
@@ -586,42 +592,39 @@
minOccurs="0" maxOccurs="1">
<xs:annotation name="final"/>
</xs:element>
- <!-- Sets the brightness mapping of the desired screen brightness in nits to the
- corresponding lux for the current display -->
- <xs:element name="displayBrightnessMapping" type="displayBrightnessMapping"
+ <!-- Sets the brightness mapping of the desired screen brightness to the corresponding
+ lux for the current display -->
+ <xs:element name="luxToBrightnessMapping" type="luxToBrightnessMapping"
minOccurs="0" maxOccurs="1">
<xs:annotation name="final"/>
</xs:element>
</xs:sequence>
</xs:complexType>
- <!-- Represents the brightness mapping of the desired screen brightness in nits to the
- corresponding lux for the current display -->
- <xs:complexType name="displayBrightnessMapping">
- <xs:sequence>
- <!-- Sets the list of display brightness points, each representing the desired screen
- brightness in nits to the corresponding lux for the current display
-
- The N entries of this array define N + 1 control points as follows:
- (1-based arrays)
-
- Point 1: (0, nits[1]): currentLux <= 0
- Point 2: (lux[1], nits[2]): 0 < currentLux <= lux[1]
- Point 3: (lux[2], nits[3]): lux[2] < currentLux <= lux[3]
- ...
- Point N+1: (lux[N], nits[N+1]): lux[N] < currentLux
-
- The control points must be strictly increasing. Each control point
- corresponds to an entry in the brightness backlight values arrays.
- For example, if currentLux == lux[1] (first element of the levels array)
- then the brightness will be determined by nits[2] (second element
- of the brightness values array).
- -->
- <xs:element name="displayBrightnessPoint" type="displayBrightnessPoint"
- minOccurs="1" maxOccurs="unbounded">
- <xs:annotation name="final"/>
- </xs:element>
- </xs:sequence>
+ <!-- Sets the list of display brightness points, each representing the desired screen brightness
+ in a certain lux environment.
+
+ The first value of each point is the lux value and the second value is the brightness value.
+
+ The first lux value must be 0.
+
+ The control points must be strictly increasing.
+
+ Example: if currentLux == the second lux value in the mapping then the brightness will be
+ determined by the second brightness value in the mapping. Spline interpolation is used
+ to determine the auto-brightness values for lux levels between these control points.
+
+ The brightness values must be non-negative decimals within the range between the first and
+ the last brightness values in screenBrightnessMap.
+
+ This is used in place of config_autoBrightnessLevels and config_autoBrightnessLcdBacklightValues
+ defined in the config XML resource.
+ -->
+ <xs:complexType name="luxToBrightnessMapping">
+ <xs:element name="map" type="nonNegativeFloatToFloatMap">
+ <xs:annotation name="nonnull"/>
+ <xs:annotation name="final"/>
+ </xs:element>
</xs:complexType>
<!-- Represents a point in the display brightness mapping, representing the lux level from the
diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt
index f767291b4953..8c8c1230f944 100644
--- a/services/core/xsd/display-device-config/schema/current.txt
+++ b/services/core/xsd/display-device-config/schema/current.txt
@@ -7,14 +7,14 @@ package com.android.server.display.config {
method public final java.math.BigInteger getBrighteningLightDebounceMillis();
method public final java.math.BigInteger getDarkeningLightDebounceIdleMillis();
method public final java.math.BigInteger getDarkeningLightDebounceMillis();
- method public final com.android.server.display.config.DisplayBrightnessMapping getDisplayBrightnessMapping();
method public boolean getEnabled();
+ method public final com.android.server.display.config.LuxToBrightnessMapping getLuxToBrightnessMapping();
method public final void setBrighteningLightDebounceIdleMillis(java.math.BigInteger);
method public final void setBrighteningLightDebounceMillis(java.math.BigInteger);
method public final void setDarkeningLightDebounceIdleMillis(java.math.BigInteger);
method public final void setDarkeningLightDebounceMillis(java.math.BigInteger);
- method public final void setDisplayBrightnessMapping(com.android.server.display.config.DisplayBrightnessMapping);
method public void setEnabled(boolean);
+ method public final void setLuxToBrightnessMapping(com.android.server.display.config.LuxToBrightnessMapping);
}
public class BlockingZoneConfig {
@@ -78,11 +78,6 @@ package com.android.server.display.config {
method public java.util.List<com.android.server.display.config.Density> getDensity();
}
- public class DisplayBrightnessMapping {
- ctor public DisplayBrightnessMapping();
- method public final java.util.List<com.android.server.display.config.DisplayBrightnessPoint> getDisplayBrightnessPoint();
- }
-
public class DisplayBrightnessPoint {
ctor public DisplayBrightnessPoint();
method public final java.math.BigInteger getLux();
@@ -110,6 +105,7 @@ package com.android.server.display.config {
method public final com.android.server.display.config.SensorDetails getProxSensor();
method public com.android.server.display.config.DisplayQuirks getQuirks();
method public com.android.server.display.config.RefreshRateConfigs getRefreshRate();
+ method public final java.math.BigDecimal getScreenBrightnessCapForWearBedtimeMode();
method @NonNull public final java.math.BigDecimal getScreenBrightnessDefault();
method @NonNull public final com.android.server.display.config.NitsMap getScreenBrightnessMap();
method public final java.math.BigInteger getScreenBrightnessRampDecreaseMaxIdleMillis();
@@ -143,6 +139,7 @@ package com.android.server.display.config {
method public final void setProxSensor(com.android.server.display.config.SensorDetails);
method public void setQuirks(com.android.server.display.config.DisplayQuirks);
method public void setRefreshRate(com.android.server.display.config.RefreshRateConfigs);
+ method public final void setScreenBrightnessCapForWearBedtimeMode(java.math.BigDecimal);
method public final void setScreenBrightnessDefault(@NonNull java.math.BigDecimal);
method public final void setScreenBrightnessMap(@NonNull com.android.server.display.config.NitsMap);
method public final void setScreenBrightnessRampDecreaseMaxIdleMillis(java.math.BigInteger);
@@ -220,6 +217,12 @@ package com.android.server.display.config {
method @NonNull public final java.util.List<com.android.server.display.config.BrightnessLimitMap> getBrightnessLimitMap();
}
+ public class LuxToBrightnessMapping {
+ ctor public LuxToBrightnessMapping();
+ method @NonNull public final com.android.server.display.config.NonNegativeFloatToFloatMap getMap();
+ method public final void setMap(@NonNull com.android.server.display.config.NonNegativeFloatToFloatMap);
+ }
+
public class NitsMap {
ctor public NitsMap();
method public String getInterpolation();
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 0a2e80606e96..59e95e7571d0 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -268,6 +268,8 @@ public final class SystemServer implements Dumpable {
"com.android.server.backup.BackupManagerService$Lifecycle";
private static final String APPWIDGET_SERVICE_CLASS =
"com.android.server.appwidget.AppWidgetService";
+ private static final String ARC_PERSISTENT_DATA_BLOCK_SERVICE_CLASS =
+ "com.android.server.arc.persistent_data_block.ArcPersistentDataBlockService";
private static final String ARC_SYSTEM_HEALTH_SERVICE =
"com.android.server.arc.health.ArcSystemHealthService";
private static final String VOICE_RECOGNITION_MANAGER_SERVICE_CLASS =
@@ -1489,8 +1491,6 @@ public final class SystemServer implements Dumpable {
boolean disableCameraService = SystemProperties.getBoolean("config.disable_cameraservice",
false);
- boolean isEmulator = SystemProperties.get("ro.boot.qemu").equals("1");
-
boolean isWatch = context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_WATCH);
@@ -1892,6 +1892,12 @@ public final class SystemServer implements Dumpable {
t.traceEnd();
}
+ if (Build.IS_ARC && SystemProperties.getInt("ro.boot.dev_mode", 0) == 1) {
+ t.traceBegin("StartArcPersistentDataBlock");
+ mSystemServiceManager.startService(ARC_PERSISTENT_DATA_BLOCK_SERVICE_CLASS);
+ t.traceEnd();
+ }
+
t.traceBegin("StartTestHarnessMode");
mSystemServiceManager.startService(TestHarnessModeService.class);
t.traceEnd();
@@ -2112,6 +2118,15 @@ public final class SystemServer implements Dumpable {
networkPolicy.bindConnectivityManager();
t.traceEnd();
+ t.traceBegin("StartSecurityStateManagerService");
+ try {
+ ServiceManager.addService(Context.SECURITY_STATE_SERVICE,
+ new SecurityStateManagerService(context));
+ } catch (Throwable e) {
+ reportWtf("starting SecurityStateManagerService", e);
+ }
+ t.traceEnd();
+
t.traceBegin("StartVpnManagerService");
try {
vpnManager = VpnManagerService.create(context);
@@ -2309,7 +2324,7 @@ public final class SystemServer implements Dumpable {
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
|| mPackageManager.hasSystemFeature(
PackageManager.FEATURE_USB_ACCESSORY)
- || isEmulator) {
+ || Build.IS_EMULATOR) {
// Manage USB host and device support
t.traceBegin("StartUsbService");
mSystemServiceManager.startService(USB_SERVICE_CLASS);
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java
index afbe352ad676..e5be4d9aa755 100644
--- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java
@@ -21,6 +21,8 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isNull;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -56,6 +58,7 @@ public class UserDataPreparerTest {
private static final int TEST_USER_SERIAL = 1000;
private static final int TEST_USER_ID = 10;
+ private static final UserInfo TEST_USER = new UserInfo();
private TestUserDataPreparer mUserDataPreparer;
@@ -72,6 +75,8 @@ public class UserDataPreparerTest {
@Before
public void setup() {
+ TEST_USER.id = TEST_USER_ID;
+ TEST_USER.serialNumber = TEST_USER_SERIAL;
Context ctx = InstrumentationRegistry.getContext();
FileUtils.deleteContents(ctx.getCacheDir());
mInstallLock = new Object();
@@ -92,8 +97,7 @@ public class UserDataPreparerTest {
userDeDir.mkdirs();
File systemDeDir = mUserDataPreparer.getDataSystemDeDirectory(TEST_USER_ID);
systemDeDir.mkdirs();
- mUserDataPreparer
- .prepareUserData(TEST_USER_ID, TEST_USER_SERIAL, StorageManager.FLAG_STORAGE_DE);
+ mUserDataPreparer.prepareUserData(TEST_USER, StorageManager.FLAG_STORAGE_DE);
verify(mStorageManagerMock).prepareUserStorage(isNull(String.class), eq(TEST_USER_ID),
eq(TEST_USER_SERIAL), eq(StorageManager.FLAG_STORAGE_DE));
verify(mInstaller).createUserData(isNull(String.class), eq(TEST_USER_ID),
@@ -110,8 +114,7 @@ public class UserDataPreparerTest {
userCeDir.mkdirs();
File systemCeDir = mUserDataPreparer.getDataSystemCeDirectory(TEST_USER_ID);
systemCeDir.mkdirs();
- mUserDataPreparer
- .prepareUserData(TEST_USER_ID, TEST_USER_SERIAL, StorageManager.FLAG_STORAGE_CE);
+ mUserDataPreparer.prepareUserData(TEST_USER, StorageManager.FLAG_STORAGE_CE);
verify(mStorageManagerMock).prepareUserStorage(isNull(String.class), eq(TEST_USER_ID),
eq(TEST_USER_SERIAL), eq(StorageManager.FLAG_STORAGE_CE));
verify(mInstaller).createUserData(isNull(String.class), eq(TEST_USER_ID),
@@ -123,6 +126,28 @@ public class UserDataPreparerTest {
}
@Test
+ public void testPrepareUserData_forNewUser_destroysOnFailure() throws Exception {
+ TEST_USER.lastLoggedInTime = 0;
+ doThrow(new IllegalStateException("expected exception for test")).when(mStorageManagerMock)
+ .prepareUserStorage(isNull(String.class), eq(TEST_USER_ID), eq(TEST_USER_SERIAL),
+ eq(StorageManager.FLAG_STORAGE_CE));
+ mUserDataPreparer.prepareUserData(TEST_USER, StorageManager.FLAG_STORAGE_CE);
+ verify(mStorageManagerMock).destroyUserStorage(isNull(String.class), eq(TEST_USER_ID),
+ eq(StorageManager.FLAG_STORAGE_CE));
+ }
+
+ @Test
+ public void testPrepareUserData_forExistingUser_doesNotDestroyOnFailure() throws Exception {
+ TEST_USER.lastLoggedInTime = System.currentTimeMillis();
+ doThrow(new IllegalStateException("expected exception for test")).when(mStorageManagerMock)
+ .prepareUserStorage(isNull(String.class), eq(TEST_USER_ID), eq(TEST_USER_SERIAL),
+ eq(StorageManager.FLAG_STORAGE_CE));
+ mUserDataPreparer.prepareUserData(TEST_USER, StorageManager.FLAG_STORAGE_CE);
+ verify(mStorageManagerMock, never()).destroyUserStorage(isNull(String.class),
+ eq(TEST_USER_ID), eq(StorageManager.FLAG_STORAGE_CE));
+ }
+
+ @Test
public void testDestroyUserData_De_DoesNotDestroyCe() throws Exception {
// Add file in CE storage
File systemCeDir = mUserDataPreparer.getDataSystemCeDirectory(TEST_USER_ID);
diff --git a/services/tests/displayservicetests/src/com/android/server/display/BrightnessMappingStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/BrightnessMappingStrategyTest.java
index 97e582607133..a2e80f0d9b9b 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/BrightnessMappingStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/BrightnessMappingStrategyTest.java
@@ -104,7 +104,7 @@ public class BrightnessMappingStrategyTest {
468.5f,
};
- private static final int[] DISPLAY_LEVELS_BACKLIGHT = {
+ private static final int[] DISPLAY_LEVELS_INT = {
9,
30,
45,
@@ -118,6 +118,20 @@ public class BrightnessMappingStrategyTest {
255
};
+ private static final float[] DISPLAY_LEVELS = {
+ 0.03f,
+ 0.11f,
+ 0.17f,
+ 0.24f,
+ 0.3f,
+ 0.37f,
+ 0.46f,
+ 0.57f,
+ 0.7f,
+ 0.87f,
+ 1
+ };
+
private static final float[] DISPLAY_RANGE_NITS = { 2.685f, 478.5f };
private static final float[] BACKLIGHT_RANGE_ZERO_TO_ONE = { 0.0f, 1.0f };
private static final float[] DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT = { 0.03149606299f, 1.0f };
@@ -155,23 +169,23 @@ public class BrightnessMappingStrategyTest {
DisplayWhiteBalanceController mMockDwbc;
@Test
- public void testSimpleStrategyMappingAtControlPoints() {
- Resources res = createResources(DISPLAY_LEVELS_BACKLIGHT);
+ public void testSimpleStrategyMappingAtControlPoints_IntConfig() {
+ Resources res = createResources(DISPLAY_LEVELS_INT);
DisplayDeviceConfig ddc = createDdc();
BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
assertNotNull("BrightnessMappingStrategy should not be null", simple);
for (int i = 0; i < LUX_LEVELS.length; i++) {
final float expectedLevel = MathUtils.map(PowerManager.BRIGHTNESS_OFF + 1,
PowerManager.BRIGHTNESS_ON, PowerManager.BRIGHTNESS_MIN,
- PowerManager.BRIGHTNESS_MAX, DISPLAY_LEVELS_BACKLIGHT[i]);
+ PowerManager.BRIGHTNESS_MAX, DISPLAY_LEVELS_INT[i]);
assertEquals(expectedLevel,
simple.getBrightness(LUX_LEVELS[i]), 0.0001f /*tolerance*/);
}
}
@Test
- public void testSimpleStrategyMappingBetweenControlPoints() {
- Resources res = createResources(DISPLAY_LEVELS_BACKLIGHT);
+ public void testSimpleStrategyMappingBetweenControlPoints_IntConfig() {
+ Resources res = createResources(DISPLAY_LEVELS_INT);
DisplayDeviceConfig ddc = createDdc();
BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
assertNotNull("BrightnessMappingStrategy should not be null", simple);
@@ -179,14 +193,42 @@ public class BrightnessMappingStrategyTest {
final float lux = (LUX_LEVELS[i - 1] + LUX_LEVELS[i]) / 2;
final float backlight = simple.getBrightness(lux) * PowerManager.BRIGHTNESS_ON;
assertTrue("Desired brightness should be between adjacent control points.",
- backlight > DISPLAY_LEVELS_BACKLIGHT[i - 1]
- && backlight < DISPLAY_LEVELS_BACKLIGHT[i]);
+ backlight > DISPLAY_LEVELS_INT[i - 1]
+ && backlight < DISPLAY_LEVELS_INT[i]);
+ }
+ }
+
+ @Test
+ public void testSimpleStrategyMappingAtControlPoints_FloatConfig() {
+ Resources res = createResources(EMPTY_INT_ARRAY);
+ DisplayDeviceConfig ddc = createDdc(EMPTY_FLOAT_ARRAY, EMPTY_FLOAT_ARRAY, LUX_LEVELS,
+ EMPTY_FLOAT_ARRAY, DISPLAY_LEVELS);
+ BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
+ assertNotNull("BrightnessMappingStrategy should not be null", simple);
+ for (int i = 0; i < LUX_LEVELS.length; i++) {
+ assertEquals(DISPLAY_LEVELS[i], simple.getBrightness(LUX_LEVELS[i]),
+ /* tolerance= */ 0.0001f);
+ }
+ }
+
+ @Test
+ public void testSimpleStrategyMappingBetweenControlPoints_FloatConfig() {
+ Resources res = createResources(EMPTY_INT_ARRAY);
+ DisplayDeviceConfig ddc = createDdc(EMPTY_FLOAT_ARRAY, EMPTY_FLOAT_ARRAY, LUX_LEVELS,
+ EMPTY_FLOAT_ARRAY, DISPLAY_LEVELS);
+ BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
+ assertNotNull("BrightnessMappingStrategy should not be null", simple);
+ for (int i = 1; i < LUX_LEVELS.length; i++) {
+ final float lux = (LUX_LEVELS[i - 1] + LUX_LEVELS[i]) / 2;
+ final float brightness = simple.getBrightness(lux);
+ assertTrue("Desired brightness should be between adjacent control points.",
+ brightness > DISPLAY_LEVELS[i - 1] && brightness < DISPLAY_LEVELS[i]);
}
}
@Test
public void testSimpleStrategyIgnoresNewConfiguration() {
- Resources res = createResources(DISPLAY_LEVELS_BACKLIGHT);
+ Resources res = createResources(DISPLAY_LEVELS_INT);
DisplayDeviceConfig ddc = createDdc();
BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
@@ -201,14 +243,14 @@ public class BrightnessMappingStrategyTest {
@Test
public void testSimpleStrategyIgnoresNullConfiguration() {
- Resources res = createResources(DISPLAY_LEVELS_BACKLIGHT);
+ Resources res = createResources(DISPLAY_LEVELS_INT);
DisplayDeviceConfig ddc = createDdc();
BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
strategy.setBrightnessConfiguration(null);
- final int n = DISPLAY_LEVELS_BACKLIGHT.length;
+ final int n = DISPLAY_LEVELS_INT.length;
final float expectedBrightness =
- (float) DISPLAY_LEVELS_BACKLIGHT[n - 1] / PowerManager.BRIGHTNESS_ON;
+ (float) DISPLAY_LEVELS_INT[n - 1] / PowerManager.BRIGHTNESS_ON;
assertEquals(expectedBrightness,
strategy.getBrightness(LUX_LEVELS[n - 1]), 0.0001f /*tolerance*/);
}
@@ -322,7 +364,7 @@ public class BrightnessMappingStrategyTest {
@Test
public void testDefaultStrategyIsPhysical() {
- Resources res = createResources(DISPLAY_LEVELS_BACKLIGHT);
+ Resources res = createResources(DISPLAY_LEVELS_INT);
DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS,
DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, LUX_LEVELS, DISPLAY_LEVELS_NITS);
BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
@@ -363,13 +405,13 @@ public class BrightnessMappingStrategyTest {
BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
assertNull(strategy);
- res = createResources(DISPLAY_LEVELS_BACKLIGHT);
+ res = createResources(DISPLAY_LEVELS_INT);
strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc);
assertNull(strategy);
// Extra backlight level
final int[] backlight = Arrays.copyOf(
- DISPLAY_LEVELS_BACKLIGHT, DISPLAY_LEVELS_BACKLIGHT.length + 1);
+ DISPLAY_LEVELS_INT, DISPLAY_LEVELS_INT.length + 1);
backlight[backlight.length - 1] = backlight[backlight.length - 2] + 1;
res = createResources(backlight);
ddc = createDdc(DISPLAY_RANGE_NITS,
@@ -410,7 +452,7 @@ public class BrightnessMappingStrategyTest {
LUX_LEVELS, DISPLAY_LEVELS_NITS);
assertStrategyAdaptsToUserDataPoints(BrightnessMappingStrategy.create(res, ddc, mMockDwbc));
ddc = createDdc(DISPLAY_RANGE_NITS, BACKLIGHT_RANGE_ZERO_TO_ONE);
- res = createResources(DISPLAY_LEVELS_BACKLIGHT);
+ res = createResources(DISPLAY_LEVELS_INT);
assertStrategyAdaptsToUserDataPoints(BrightnessMappingStrategy.create(res, ddc, mMockDwbc));
}
@@ -546,16 +588,24 @@ public class BrightnessMappingStrategyTest {
when(mockDdc.getBrightness()).thenReturn(backlightArray);
when(mockDdc.getAutoBrightnessBrighteningLevelsLux()).thenReturn(LUX_LEVELS);
when(mockDdc.getAutoBrightnessBrighteningLevelsNits()).thenReturn(EMPTY_FLOAT_ARRAY);
+ when(mockDdc.getAutoBrightnessBrighteningLevels()).thenReturn(EMPTY_FLOAT_ARRAY);
return mockDdc;
}
private DisplayDeviceConfig createDdc(float[] nitsArray, float[] backlightArray,
float[] luxLevelsFloat, float[] brightnessLevelsNits) {
+ return createDdc(nitsArray, backlightArray, luxLevelsFloat, brightnessLevelsNits,
+ EMPTY_FLOAT_ARRAY);
+ }
+
+ private DisplayDeviceConfig createDdc(float[] nitsArray, float[] backlightArray,
+ float[] luxLevelsFloat, float[] brightnessLevelsNits, float[] brightnessLevels) {
DisplayDeviceConfig mockDdc = mock(DisplayDeviceConfig.class);
when(mockDdc.getNits()).thenReturn(nitsArray);
when(mockDdc.getBrightness()).thenReturn(backlightArray);
when(mockDdc.getAutoBrightnessBrighteningLevelsLux()).thenReturn(luxLevelsFloat);
when(mockDdc.getAutoBrightnessBrighteningLevelsNits()).thenReturn(brightnessLevelsNits);
+ when(mockDdc.getAutoBrightnessBrighteningLevels()).thenReturn(brightnessLevels);
return mockDdc;
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java
index 0bcbeb9b8a85..31d7e88e671b 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java
@@ -47,8 +47,10 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import com.android.internal.R;
+import com.android.internal.display.BrightnessSynchronizer;
import com.android.server.display.config.HdrBrightnessData;
import com.android.server.display.config.ThermalStatus;
+import com.android.server.display.feature.DisplayManagerFlags;
import org.junit.Before;
import org.junit.Test;
@@ -92,10 +94,14 @@ public final class DisplayDeviceConfigTest {
@Mock
private Resources mResources;
+ @Mock
+ private DisplayManagerFlags mFlags;
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mContext.getResources()).thenReturn(mResources);
+ when(mFlags.areAutoBrightnessModesEnabled()).thenReturn(true);
mockDeviceConfigs();
}
@@ -110,10 +116,6 @@ public final class DisplayDeviceConfigTest {
assertArrayEquals(mDisplayDeviceConfig.getBrightness(), BRIGHTNESS, ZERO_DELTA);
assertArrayEquals(mDisplayDeviceConfig.getNits(), NITS, ZERO_DELTA);
assertArrayEquals(mDisplayDeviceConfig.getBacklight(), BRIGHTNESS, ZERO_DELTA);
- assertArrayEquals(mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(), new
- float[]{0.0f, 50.0f, 80.0f}, ZERO_DELTA);
- assertArrayEquals(mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(), new
- float[]{45.32f, 75.43f}, ZERO_DELTA);
// Test thresholds
assertEquals(10, mDisplayDeviceConfig.getAmbientLuxBrighteningMinThreshold(),
@@ -606,7 +608,7 @@ public final class DisplayDeviceConfigTest {
assertArrayEquals(mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(), new
float[]{2.0f, 200.0f, 600.0f}, ZERO_DELTA);
assertArrayEquals(mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(), new
- float[]{0.0f, 0.0f, 110.0f, 500.0f}, ZERO_DELTA);
+ float[]{0.0f, 110.0f, 500.0f}, ZERO_DELTA);
// Test thresholds
assertEquals(0, mDisplayDeviceConfig.getAmbientLuxBrighteningMinThreshold(), ZERO_DELTA);
@@ -671,6 +673,9 @@ public final class DisplayDeviceConfigTest {
assertEquals("test_light_sensor", mDisplayDeviceConfig.getAmbientLightSensor().type);
assertEquals("", mDisplayDeviceConfig.getAmbientLightSensor().name);
+
+ assertEquals(BrightnessSynchronizer.brightnessIntToFloat(35),
+ mDisplayDeviceConfig.getBrightnessCapForWearBedtimeMode(), ZERO_DELTA);
}
@Test
@@ -716,6 +721,38 @@ public final class DisplayDeviceConfigTest {
assertEquals(mDisplayDeviceConfig.getBrightnessRampSlowIncreaseIdle(), 0.04f, ZERO_DELTA);
}
+ @Test
+ public void testBrightnessCapForWearBedtimeMode() throws IOException {
+ setupDisplayDeviceConfigFromDisplayConfigFile(getContent(getValidLuxThrottling(),
+ getValidProxSensor(), /* includeIdleMode= */ false));
+ assertEquals(0.1f, mDisplayDeviceConfig.getBrightnessCapForWearBedtimeMode(), ZERO_DELTA);
+ }
+
+ @Test
+ public void testAutoBrightnessBrighteningLevels() throws IOException {
+ setupDisplayDeviceConfigFromDisplayConfigFile(getContent(getValidLuxThrottling(),
+ getValidProxSensor(), /* includeIdleMode= */ false));
+
+ assertArrayEquals(new float[]{0.0f, 80},
+ mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(), ZERO_DELTA);
+ assertArrayEquals(new float[]{0.2f, 0.3f},
+ mDisplayDeviceConfig.getAutoBrightnessBrighteningLevels(), SMALL_DELTA);
+ }
+
+ @Test
+ public void testAutoBrightnessBrighteningLevels_FeatureFlagOff() throws IOException {
+ when(mFlags.areAutoBrightnessModesEnabled()).thenReturn(false);
+ setupDisplayDeviceConfigFromConfigResourceFile();
+ setupDisplayDeviceConfigFromDisplayConfigFile(getContent(getValidLuxThrottling(),
+ getValidProxSensor(), /* includeIdleMode= */ false));
+
+ assertNull(mDisplayDeviceConfig.getAutoBrightnessBrighteningLevels());
+ assertArrayEquals(new float[]{0, 110, 500},
+ mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(), ZERO_DELTA);
+ assertArrayEquals(new float[]{2, 200, 600},
+ mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(), SMALL_DELTA);
+ }
+
private String getValidLuxThrottling() {
return "<luxThrottling>\n"
+ " <brightnessLimitMap>\n"
@@ -1037,8 +1074,8 @@ public final class DisplayDeviceConfigTest {
+ "<screenBrightnessRampDecreaseMaxIdleMillis>"
+ "5000"
+ "</screenBrightnessRampDecreaseMaxIdleMillis>\n";
-
}
+
private String getContent() {
return getContent(getValidLuxThrottling(), getValidProxSensor(),
/* includeIdleMode= */ true);
@@ -1089,16 +1126,18 @@ public final class DisplayDeviceConfigTest {
+ "<brighteningLightDebounceMillis>2000</brighteningLightDebounceMillis>\n"
+ "<darkeningLightDebounceMillis>1000</darkeningLightDebounceMillis>\n"
+ (includeIdleMode ? getRampSpeedsIdle() : "")
- + "<displayBrightnessMapping>\n"
- + "<displayBrightnessPoint>\n"
- + "<lux>50</lux>\n"
- + "<nits>45.32</nits>\n"
- + "</displayBrightnessPoint>\n"
- + "<displayBrightnessPoint>\n"
- + "<lux>80</lux>\n"
- + "<nits>75.43</nits>\n"
- + "</displayBrightnessPoint>\n"
- + "</displayBrightnessMapping>\n"
+ + "<luxToBrightnessMapping>\n"
+ + "<map>\n"
+ + "<point>\n"
+ + "<first>0</first>\n"
+ + "<second>0.2</second>\n"
+ + "</point>\n"
+ + "<point>\n"
+ + "<first>80</first>\n"
+ + "<second>0.3</second>\n"
+ + "</point>\n"
+ + "</map>\n"
+ + "</luxToBrightnessMapping>\n"
+ "</autoBrightness>\n"
+ getPowerThrottlingConfig()
+ "<highBrightnessMode enabled=\"true\">\n"
@@ -1355,6 +1394,9 @@ public final class DisplayDeviceConfigTest {
+ "<majorVersion>2</majorVersion>\n"
+ "<minorVersion>0</minorVersion>\n"
+ "</usiVersion>\n"
+ + "<screenBrightnessCapForWearBedtimeMode>"
+ + "0.1"
+ + "</screenBrightnessCapForWearBedtimeMode>"
+ "</displayConfiguration>\n";
}
@@ -1372,7 +1414,7 @@ public final class DisplayDeviceConfigTest {
private void setupDisplayDeviceConfigFromDisplayConfigFile(String content) throws IOException {
Path tempFile = Files.createTempFile("display_config", ".tmp");
Files.write(tempFile, content.getBytes(StandardCharsets.UTF_8));
- mDisplayDeviceConfig = new DisplayDeviceConfig(mContext);
+ mDisplayDeviceConfig = new DisplayDeviceConfig(mContext, mFlags);
mDisplayDeviceConfig.initFromFile(tempFile.toFile());
}
@@ -1381,25 +1423,15 @@ public final class DisplayDeviceConfigTest {
when(mResources.obtainTypedArray(
com.android.internal.R.array.config_screenBrightnessNits))
.thenReturn(screenBrightnessNits);
- TypedArray screenBrightnessBacklight = createFloatTypedArray(new
- float[]{0.0f, 120.0f, 255.0f});
- when(mResources.obtainTypedArray(
- com.android.internal.R.array.config_screenBrightnessBacklight))
- .thenReturn(screenBrightnessBacklight);
when(mResources.getIntArray(com.android.internal.R.array
.config_screenBrightnessBacklight)).thenReturn(new int[]{0, 120, 255});
- when(mResources.getIntArray(com.android.internal.R.array
- .config_autoBrightnessLevels)).thenReturn(new int[]{30, 80});
- when(mResources.getIntArray(com.android.internal.R.array
- .config_autoBrightnessDisplayValuesNits)).thenReturn(new int[]{25, 55});
-
TypedArray screenBrightnessLevelNits = createFloatTypedArray(new
float[]{2.0f, 200.0f, 600.0f});
when(mResources.obtainTypedArray(
com.android.internal.R.array.config_autoBrightnessDisplayValuesNits))
.thenReturn(screenBrightnessLevelNits);
- int[] screenBrightnessLevelLux = new int[]{0, 110, 500};
+ int[] screenBrightnessLevelLux = new int[]{110, 500};
when(mResources.getIntArray(
com.android.internal.R.array.config_autoBrightnessLevels))
.thenReturn(screenBrightnessLevelLux);
@@ -1457,7 +1489,12 @@ public final class DisplayDeviceConfigTest {
R.integer.config_autoBrightnessDarkeningLightDebounce))
.thenReturn(4000);
- mDisplayDeviceConfig = DisplayDeviceConfig.create(mContext, true);
+ when(mResources.getInteger(
+ R.integer.config_screenBrightnessCapForWearBedtimeMode))
+ .thenReturn(35);
+
+ mDisplayDeviceConfig = DisplayDeviceConfig.create(mContext, /* useConfigXml= */ true,
+ mFlags);
}
private TypedArray createFloatTypedArray(float[] vals) {
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceTest.java
index 4fd8f26d91a8..dc6abf1981c0 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceTest.java
@@ -57,6 +57,9 @@ public class DisplayDeviceTest {
@Mock
private SurfaceControl.Transaction mMockTransaction;
+ @Mock
+ private DisplayAdapter mMockDisplayAdapter;
+
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
@@ -67,34 +70,39 @@ public class DisplayDeviceTest {
@Test
public void testGetDisplaySurfaceDefaultSizeLocked_notRotated() {
- DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo);
+ DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
+ mMockDisplayAdapter);
assertThat(displayDevice.getDisplaySurfaceDefaultSizeLocked()).isEqualTo(PORTRAIT_SIZE);
}
@Test
public void testGetDisplaySurfaceDefaultSizeLocked_rotation0() {
- DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo);
+ DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
+ mMockDisplayAdapter);
displayDevice.setProjectionLocked(mMockTransaction, ROTATION_0, new Rect(), new Rect());
assertThat(displayDevice.getDisplaySurfaceDefaultSizeLocked()).isEqualTo(PORTRAIT_SIZE);
}
@Test
public void testGetDisplaySurfaceDefaultSizeLocked_rotation90() {
- DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo);
+ DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
+ mMockDisplayAdapter);
displayDevice.setProjectionLocked(mMockTransaction, ROTATION_90, new Rect(), new Rect());
assertThat(displayDevice.getDisplaySurfaceDefaultSizeLocked()).isEqualTo(LANDSCAPE_SIZE);
}
@Test
public void testGetDisplaySurfaceDefaultSizeLocked_rotation180() {
- DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo);
+ DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
+ mMockDisplayAdapter);
displayDevice.setProjectionLocked(mMockTransaction, ROTATION_180, new Rect(), new Rect());
assertThat(displayDevice.getDisplaySurfaceDefaultSizeLocked()).isEqualTo(PORTRAIT_SIZE);
}
@Test
public void testGetDisplaySurfaceDefaultSizeLocked_rotation270() {
- DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo);
+ DisplayDevice displayDevice = new FakeDisplayDevice(mDisplayDeviceInfo,
+ mMockDisplayAdapter);
displayDevice.setProjectionLocked(mMockTransaction, ROTATION_270, new Rect(), new Rect());
assertThat(displayDevice.getDisplaySurfaceDefaultSizeLocked()).isEqualTo(LANDSCAPE_SIZE);
}
@@ -102,8 +110,9 @@ public class DisplayDeviceTest {
private static class FakeDisplayDevice extends DisplayDevice {
private final DisplayDeviceInfo mDisplayDeviceInfo;
- FakeDisplayDevice(DisplayDeviceInfo displayDeviceInfo) {
- super(null, null, "", InstrumentationRegistry.getInstrumentation().getContext());
+ FakeDisplayDevice(DisplayDeviceInfo displayDeviceInfo, DisplayAdapter displayAdapter) {
+ super(displayAdapter, /* displayToken= */ null, /* uniqueId= */ "",
+ InstrumentationRegistry.getInstrumentation().getContext());
mDisplayDeviceInfo = displayDeviceInfo;
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java
index 55f56e93fea5..02e3ef4d5f0b 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java
@@ -212,7 +212,8 @@ public class DisplayManagerServiceTest {
new DisplayManagerService.Injector() {
@Override
VirtualDisplayAdapter getVirtualDisplayAdapter(SyncRoot syncRoot,
- Context context, Handler handler, DisplayAdapter.Listener listener) {
+ Context context, Handler handler, DisplayAdapter.Listener listener,
+ DisplayManagerFlags flags) {
return mMockVirtualDisplayAdapter;
}
@@ -251,7 +252,8 @@ public class DisplayManagerServiceTest {
@Override
VirtualDisplayAdapter getVirtualDisplayAdapter(SyncRoot syncRoot, Context context,
- Handler handler, DisplayAdapter.Listener displayAdapterListener) {
+ Handler handler, DisplayAdapter.Listener displayAdapterListener,
+ DisplayManagerFlags flags) {
return new VirtualDisplayAdapter(syncRoot, context, handler, displayAdapterListener,
new VirtualDisplayAdapter.SurfaceControlDisplayFactory() {
@Override
@@ -263,7 +265,7 @@ public class DisplayManagerServiceTest {
@Override
public void destroyDisplay(IBinder displayToken) {
}
- });
+ }, flags);
}
@Override
@@ -329,6 +331,7 @@ public class DisplayManagerServiceTest {
@Mock SensorManager mSensorManager;
@Mock DisplayDeviceConfig mMockDisplayDeviceConfig;
@Mock PackageManagerInternal mMockPackageManagerInternal;
+ @Mock DisplayAdapter mMockDisplayAdapter;
@Captor ArgumentCaptor<ContentRecordingSession> mContentRecordingSessionCaptor;
@Mock DisplayManagerFlags mMockFlags;
@@ -788,7 +791,8 @@ public class DisplayManagerServiceTest {
new DisplayManagerService.Injector() {
@Override
VirtualDisplayAdapter getVirtualDisplayAdapter(SyncRoot syncRoot,
- Context context, Handler handler, DisplayAdapter.Listener listener) {
+ Context context, Handler handler, DisplayAdapter.Listener listener,
+ DisplayManagerFlags flags) {
return null; // return null for the adapter. This should cause a failure.
}
@@ -3194,7 +3198,7 @@ public class DisplayManagerServiceTest {
private DisplayDeviceInfo mDisplayDeviceInfo;
FakeDisplayDevice() {
- super(null, null, "", mContext);
+ super(mMockDisplayAdapter, /* displayToken= */ null, /* uniqueId= */ "", mContext);
}
public void setDisplayDeviceInfo(DisplayDeviceInfo displayDeviceInfo) {
diff --git a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
index 8270845657c6..f36854b1ea78 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
@@ -1455,8 +1455,8 @@ public class LocalDisplayAdapterTest {
// mMockContext and values will be loaded from mMockResources.
@Override
public DisplayDeviceConfig createDisplayDeviceConfig(Context context,
- long physicalDisplayId, boolean isFirstDisplay) {
- return DisplayDeviceConfig.create(context, isFirstDisplay);
+ long physicalDisplayId, boolean isFirstDisplay, DisplayManagerFlags flags) {
+ return DisplayDeviceConfig.create(context, isFirstDisplay, flags);
}
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayMapperTest.java b/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayMapperTest.java
index 43d2b8f741ae..28ec89629df0 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayMapperTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/LogicalDisplayMapperTest.java
@@ -119,8 +119,8 @@ public class LogicalDisplayMapperTest {
@Mock IThermalService mIThermalServiceMock;
@Spy DeviceStateToLayoutMap mDeviceStateToLayoutMapSpy =
new DeviceStateToLayoutMap(mIdProducer, NON_EXISTING_FILE);
- @Mock
- DisplayManagerFlags mFlagsMock;
+ @Mock DisplayManagerFlags mFlagsMock;
+ @Mock DisplayAdapter mDisplayAdapterMock;
@Captor ArgumentCaptor<LogicalDisplay> mDisplayCaptor;
@Captor ArgumentCaptor<Integer> mDisplayEventCaptor;
@@ -1075,7 +1075,8 @@ public class LogicalDisplayMapperTest {
private int mState;
TestDisplayDevice() {
- super(null, null, "test_display_" + sUniqueTestDisplayId++, mContextMock);
+ super(mDisplayAdapterMock, /* displayToken= */ null,
+ "test_display_" + sUniqueTestDisplayId++, mContextMock);
mInfo = new DisplayDeviceInfo();
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/PersistentDataStoreTest.java b/services/tests/displayservicetests/src/com/android/server/display/PersistentDataStoreTest.java
index 9f91916a4046..5676a388acff 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/PersistentDataStoreTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/PersistentDataStoreTest.java
@@ -32,9 +32,12 @@ import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -51,8 +54,12 @@ public class PersistentDataStoreTest {
private TestInjector mInjector;
private TestLooper mTestLooper;
+ @Mock
+ private DisplayAdapter mDisplayAdapter;
+
@Before
public void setUp() {
+ MockitoAnnotations.initMocks(this);
mInjector = new TestInjector();
mTestLooper = new TestLooper();
Handler handler = new Handler(mTestLooper.getLooper());
@@ -62,8 +69,8 @@ public class PersistentDataStoreTest {
@Test
public void testLoadBrightness() {
final String uniqueDisplayId = "test:123";
- final DisplayDevice testDisplayDevice = new DisplayDevice(
- null, null, uniqueDisplayId, null) {
+ final DisplayDevice testDisplayDevice = new DisplayDevice(mDisplayAdapter,
+ /* displayToken= */ null, uniqueDisplayId, /* context= */ null) {
@Override
public boolean hasStableUniqueId() {
return true;
@@ -100,7 +107,8 @@ public class PersistentDataStoreTest {
public void testSetBrightness_brightnessTagWithNoUserId_updatesToBrightnessTagWithUserId() {
final String uniqueDisplayId = "test:123";
final DisplayDevice testDisplayDevice =
- new DisplayDevice(null, null, uniqueDisplayId, null) {
+ new DisplayDevice(mDisplayAdapter, /* displayToken= */ null, uniqueDisplayId,
+ /* context= */ null) {
@Override
public boolean hasStableUniqueId() {
return true;
@@ -273,7 +281,8 @@ public class PersistentDataStoreTest {
assertNull(mDataStore.getBrightnessConfigurationForDisplayLocked(uniqueDisplayId,
userSerial));
- DisplayDevice testDisplayDevice = new DisplayDevice(null, null, uniqueDisplayId, null) {
+ DisplayDevice testDisplayDevice = new DisplayDevice(mDisplayAdapter,
+ /* displayToken= */ null, uniqueDisplayId, /* context= */ null) {
@Override
public boolean hasStableUniqueId() {
return true;
@@ -319,7 +328,8 @@ public class PersistentDataStoreTest {
assertNull(mDataStore.getBrightnessConfigurationForDisplayLocked(uniqueDisplayId,
userSerial));
- DisplayDevice testDisplayDevice = new DisplayDevice(null, null, uniqueDisplayId, null) {
+ DisplayDevice testDisplayDevice = new DisplayDevice(mDisplayAdapter,
+ /* displayToken= */ null, uniqueDisplayId, /* context= */ null) {
@Override
public boolean hasStableUniqueId() {
return false;
@@ -386,7 +396,8 @@ public class PersistentDataStoreTest {
@Test
public void testStoreAndRestoreResolution() {
final String uniqueDisplayId = "test:123";
- DisplayDevice testDisplayDevice = new DisplayDevice(null, null, uniqueDisplayId, null) {
+ DisplayDevice testDisplayDevice = new DisplayDevice(mDisplayAdapter,
+ /* displayToken= */ null, uniqueDisplayId, /* context= */ null) {
@Override
public boolean hasStableUniqueId() {
return true;
@@ -422,7 +433,8 @@ public class PersistentDataStoreTest {
@Test
public void testStoreAndRestoreRefreshRate() {
final String uniqueDisplayId = "test:123";
- DisplayDevice testDisplayDevice = new DisplayDevice(null, null, uniqueDisplayId, null) {
+ DisplayDevice testDisplayDevice = new DisplayDevice(mDisplayAdapter,
+ /* displayToken= */ null, uniqueDisplayId, /* context= */ null) {
@Override
public boolean hasStableUniqueId() {
return true;
@@ -455,7 +467,8 @@ public class PersistentDataStoreTest {
@Test
public void testBrightnessInitialisesWithInvalidFloat() {
final String uniqueDisplayId = "test:123";
- DisplayDevice testDisplayDevice = new DisplayDevice(null, null, uniqueDisplayId, null) {
+ DisplayDevice testDisplayDevice = new DisplayDevice(mDisplayAdapter,
+ /* displayToken= */ null, uniqueDisplayId, /* context= */ null) {
@Override
public boolean hasStableUniqueId() {
return true;
diff --git a/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java b/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java
index b7cbac5a7f18..5c50acb13f30 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java
@@ -72,27 +72,14 @@ public class RefreshRateSettingsUtilsTest {
@Test
public void testFindHighestRefreshRateForDefaultDisplay() {
- when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mDisplayMock);
- assertEquals(120,
+ when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(null);
+ assertEquals(DEFAULT_REFRESH_RATE,
RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext),
/* delta= */ 0);
- }
- @Test
- public void testFindHighestRefreshRate() {
- int displayId = 13;
- when(mDisplayManagerMock.getDisplay(displayId)).thenReturn(mDisplayMock);
+ when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mDisplayMock);
assertEquals(120,
- RefreshRateSettingsUtils.findHighestRefreshRate(mContext, displayId),
- /* delta= */ 0);
- }
-
- @Test
- public void testFindHighestRefreshRate_DisplayIsNull() {
- when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(null);
- assertEquals(DEFAULT_REFRESH_RATE,
RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext),
/* delta= */ 0);
-
}
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java b/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java
index 73e7ba0750e0..c01b15c17483 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/VirtualDisplayAdapterTest.java
@@ -28,6 +28,7 @@ import android.os.IBinder;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
+import com.android.server.display.feature.DisplayManagerFlags;
import com.android.server.testutils.TestHandler;
import org.junit.Before;
@@ -59,13 +60,17 @@ public class VirtualDisplayAdapterTest {
private VirtualDisplayAdapter mVirtualDisplayAdapter;
+ @Mock
+ private DisplayManagerFlags mFeatureFlags;
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mHandler = new TestHandler(null);
mVirtualDisplayAdapter = new VirtualDisplayAdapter(new DisplayManagerService.SyncRoot(),
- mContextMock, mHandler, mMockListener, mMockSufaceControlDisplayFactory);
+ mContextMock, mHandler, mMockListener, mMockSufaceControlDisplayFactory,
+ mFeatureFlags);
when(mMockCallback.asBinder()).thenReturn(mMockBinder);
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java
index ff2b1f466a5c..6ba7368f8f26 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java
@@ -262,7 +262,7 @@ public class BrightnessClamperControllerTest {
Handler handler,
BrightnessClamperController.ClamperChangeListener clamperChangeListener,
BrightnessClamperController.DisplayDeviceData data,
- DisplayManagerFlags flags) {
+ DisplayManagerFlags flags, Context context) {
mCapturedChangeListener = clamperChangeListener;
return mClampers;
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessWearBedtimeModeClamperTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessWearBedtimeModeClamperTest.java
new file mode 100644
index 000000000000..3458b08245a2
--- /dev/null
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessWearBedtimeModeClamperTest.java
@@ -0,0 +1,126 @@
+/*
+ * 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 com.android.server.display.brightness.clamper;
+
+import static com.android.server.display.brightness.clamper.BrightnessWearBedtimeModeClamper.BEDTIME_MODE_OFF;
+import static com.android.server.display.brightness.clamper.BrightnessWearBedtimeModeClamper.BEDTIME_MODE_ON;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.verify;
+
+import android.content.ContentResolver;
+import android.database.ContentObserver;
+import android.provider.Settings;
+import android.testing.TestableContext;
+
+import androidx.annotation.NonNull;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.internal.display.BrightnessSynchronizer;
+import com.android.server.testutils.TestHandler;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class BrightnessWearBedtimeModeClamperTest {
+
+ private static final float BRIGHTNESS_CAP = 0.3f;
+
+ @Mock
+ private BrightnessClamperController.ClamperChangeListener mMockClamperChangeListener;
+
+ @Rule
+ public final TestableContext mContext = new TestableContext(
+ InstrumentationRegistry.getInstrumentation().getContext());
+
+ private final TestHandler mTestHandler = new TestHandler(null);
+ private final TestInjector mInjector = new TestInjector();
+ private BrightnessWearBedtimeModeClamper mClamper;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mClamper = new BrightnessWearBedtimeModeClamper(mInjector, mTestHandler, mContext,
+ mMockClamperChangeListener, () -> BRIGHTNESS_CAP);
+ mTestHandler.flush();
+ }
+
+ @Test
+ public void testBrightnessCap() {
+ assertEquals(BRIGHTNESS_CAP, mClamper.getBrightnessCap(), BrightnessSynchronizer.EPSILON);
+ }
+
+ @Test
+ public void testBedtimeModeOn() {
+ setBedtimeModeEnabled(true);
+ assertTrue(mClamper.isActive());
+ verify(mMockClamperChangeListener).onChanged();
+ }
+
+ @Test
+ public void testBedtimeModeOff() {
+ setBedtimeModeEnabled(false);
+ assertFalse(mClamper.isActive());
+ verify(mMockClamperChangeListener).onChanged();
+ }
+
+ @Test
+ public void testType() {
+ assertEquals(BrightnessClamper.Type.BEDTIME_MODE, mClamper.getType());
+ }
+
+ @Test
+ public void testOnDisplayChanged() {
+ float newBrightnessCap = 0.61f;
+
+ mClamper.onDisplayChanged(() -> newBrightnessCap);
+ mTestHandler.flush();
+
+ assertEquals(newBrightnessCap, mClamper.getBrightnessCap(), BrightnessSynchronizer.EPSILON);
+ verify(mMockClamperChangeListener).onChanged();
+ }
+
+ private void setBedtimeModeEnabled(boolean enabled) {
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.Wearable.BEDTIME_MODE,
+ enabled ? BEDTIME_MODE_ON : BEDTIME_MODE_OFF);
+ mInjector.notifyBedtimeModeChanged();
+ mTestHandler.flush();
+ }
+
+ private static class TestInjector extends BrightnessWearBedtimeModeClamper.Injector {
+
+ private ContentObserver mObserver;
+
+ @Override
+ void registerBedtimeModeObserver(@NonNull ContentResolver cr,
+ @NonNull ContentObserver observer) {
+ mObserver = observer;
+ }
+
+ private void notifyBedtimeModeChanged() {
+ if (mObserver != null) {
+ mObserver.dispatchChange(/* selfChange= */ false,
+ Settings.Global.getUriFor(Settings.Global.Wearable.BEDTIME_MODE));
+ }
+ }
+ }
+}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/BaseModeRefreshRateVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/BaseModeRefreshRateVoteTest.kt
index 3f72364005ab..bf2edfed03dc 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/BaseModeRefreshRateVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/BaseModeRefreshRateVoteTest.kt
@@ -18,7 +18,6 @@ package com.android.server.display.mode
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -41,7 +40,7 @@ class BaseModeRefreshRateVoteTest {
@Test
fun `updates summary with base mode refresh rate if not set`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
baseModeVote.updateSummary(summary)
@@ -50,7 +49,7 @@ class BaseModeRefreshRateVoteTest {
@Test
fun `keeps summary base mode refresh rate if set`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.appRequestBaseModeRefreshRate = OTHER_BASE_REFRESH_RATE
baseModeVote.updateSummary(summary)
@@ -61,7 +60,7 @@ class BaseModeRefreshRateVoteTest {
@Test
fun `keeps summary with base mode refresh rate if vote refresh rate is negative`() {
val invalidBaseModeVote = BaseModeRefreshRateVote(-10f)
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
invalidBaseModeVote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/CombinedVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/CombinedVoteTest.kt
index 7f8da88ca996..209e5a30d4ff 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/CombinedVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/CombinedVoteTest.kt
@@ -18,7 +18,6 @@ package com.android.server.display.mode
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -47,7 +46,7 @@ class CombinedVoteTest {
@Test
fun `delegates update to children`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
combinedVote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/DisableRefreshRateSwitchingVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/DisableRefreshRateSwitchingVoteTest.kt
index c624325d773c..38782c21fd69 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/DisableRefreshRateSwitchingVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/DisableRefreshRateSwitchingVoteTest.kt
@@ -17,7 +17,6 @@
package com.android.server.display.mode
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import com.google.testing.junit.testparameterinjector.TestParameter
import com.google.testing.junit.testparameterinjector.TestParameterInjector
@@ -32,7 +31,7 @@ class DisableRefreshRateSwitchingVoteTest {
fun `disabled refresh rate switching is not changed`(
@TestParameter voteDisableSwitching: Boolean
) {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.disableRefreshRateSwitching = true
val vote = DisableRefreshRateSwitchingVote(voteDisableSwitching)
@@ -43,7 +42,7 @@ class DisableRefreshRateSwitchingVoteTest {
@Test
fun `disables refresh rate switching if requested`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
val vote = DisableRefreshRateSwitchingVote(true)
vote.updateSummary(summary)
@@ -53,7 +52,7 @@ class DisableRefreshRateSwitchingVoteTest {
@Test
fun `does not disable refresh rate switching if not requested`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
val vote = DisableRefreshRateSwitchingVote(false)
vote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java b/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java
index d0859232778d..60a0c039dd03 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java
@@ -290,7 +290,6 @@ public class DisplayModeDirectorTest {
};
private static final int DISPLAY_ID = Display.DEFAULT_DISPLAY;
- private static final int DISPLAY_ID_2 = Display.DEFAULT_DISPLAY + 1;
private static final int MODE_ID = 1;
private static final float TRANSITION_POINT = 0.763f;
@@ -1551,12 +1550,9 @@ public class DisplayModeDirectorTest {
public void testPeakRefreshRate_FlagEnabled() {
when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled())
.thenReturn(true);
- float highestRefreshRate1 = 130;
- float highestRefreshRate2 = 132;
- doReturn(highestRefreshRate1).when(() ->
- RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
- doReturn(highestRefreshRate2).when(() ->
- RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID_2));
+ float highestRefreshRate = 130;
+ doReturn(highestRefreshRate).when(() ->
+ RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext));
DisplayModeDirector director =
createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
@@ -1567,14 +1563,10 @@ public class DisplayModeDirectorTest {
setPeakRefreshRate(Float.POSITIVE_INFINITY);
- Vote vote1 = director.getVote(DISPLAY_ID,
+ Vote vote = director.getVote(Display.DEFAULT_DISPLAY,
Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE);
- Vote vote2 = director.getVote(DISPLAY_ID_2,
- Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE);
- assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 0,
- /* frameRateHigh= */ highestRefreshRate1);
- assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0,
- /* frameRateHigh= */ highestRefreshRate2);
+ assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, /* frameRateHigh= */
+ highestRefreshRate);
}
@Test
@@ -1592,54 +1584,19 @@ public class DisplayModeDirectorTest {
setPeakRefreshRate(peakRefreshRate);
- Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE);
- assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0,
- /* frameRateHigh= */ peakRefreshRate);
- }
-
- @Test
- public void testPeakRefreshRate_DisplayChanged() {
- when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled())
- .thenReturn(true);
- float highestRefreshRate = 130;
- doReturn(highestRefreshRate).when(() ->
- RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
- DisplayModeDirector director =
- createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
- director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
-
- Sensor lightSensor = createLightSensor();
- SensorManager sensorManager = createMockSensorManager(lightSensor);
- director.start(sensorManager);
-
- setPeakRefreshRate(Float.POSITIVE_INFINITY);
-
- Vote vote = director.getVote(DISPLAY_ID,
+ Vote vote = director.getVote(Display.DEFAULT_DISPLAY,
Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE);
- assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0,
- /* frameRateHigh= */ highestRefreshRate);
-
- // The highest refresh rate of the display changes
- highestRefreshRate = 140;
- doReturn(highestRefreshRate).when(() ->
- RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
- director.getDisplayObserver().onDisplayChanged(DISPLAY_ID);
-
- vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE);
- assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0,
- /* frameRateHigh= */ highestRefreshRate);
+ assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, /* frameRateHigh= */
+ peakRefreshRate);
}
@Test
public void testMinRefreshRate_FlagEnabled() {
when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled())
.thenReturn(true);
- float highestRefreshRate1 = 130;
- float highestRefreshRate2 = 132;
- doReturn(highestRefreshRate1).when(() ->
- RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
- doReturn(highestRefreshRate2).when(() ->
- RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID_2));
+ float highestRefreshRate = 130;
+ doReturn(highestRefreshRate).when(() ->
+ RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext));
DisplayModeDirector director =
createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
@@ -1650,12 +1607,9 @@ public class DisplayModeDirectorTest {
setMinRefreshRate(Float.POSITIVE_INFINITY);
- Vote vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
- Vote vote2 = director.getVote(DISPLAY_ID_2,
+ Vote vote = director.getVote(Display.DEFAULT_DISPLAY,
Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
- assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ highestRefreshRate1,
- /* frameRateHigh= */ Float.POSITIVE_INFINITY);
- assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ highestRefreshRate2,
+ assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ highestRefreshRate,
/* frameRateHigh= */ Float.POSITIVE_INFINITY);
}
@@ -1674,44 +1628,13 @@ public class DisplayModeDirectorTest {
setMinRefreshRate(minRefreshRate);
- Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
+ Vote vote = director.getVote(Display.DEFAULT_DISPLAY,
+ Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ minRefreshRate,
/* frameRateHigh= */ Float.POSITIVE_INFINITY);
}
@Test
- public void testMinRefreshRate_DisplayChanged() {
- when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled())
- .thenReturn(true);
- float highestRefreshRate = 130;
- doReturn(highestRefreshRate).when(() ->
- RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
- DisplayModeDirector director =
- createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
- director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
-
- Sensor lightSensor = createLightSensor();
- SensorManager sensorManager = createMockSensorManager(lightSensor);
- director.start(sensorManager);
-
- setMinRefreshRate(Float.POSITIVE_INFINITY);
-
- Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
- assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ highestRefreshRate,
- /* frameRateHigh= */ Float.POSITIVE_INFINITY);
-
- // The highest refresh rate of the display changes
- highestRefreshRate = 140;
- doReturn(highestRefreshRate).when(() ->
- RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
- director.getDisplayObserver().onDisplayChanged(DISPLAY_ID);
-
- vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
- assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ highestRefreshRate,
- /* frameRateHigh= */ Float.POSITIVE_INFINITY);
- }
-
- @Test
public void testSensorRegistration() {
// First, configure brightness zones or DMD won't register for sensor data.
final FakeDeviceConfig config = mInjector.getDeviceConfig();
@@ -3406,7 +3329,7 @@ public class DisplayModeDirectorTest {
public static class FakesInjector implements DisplayModeDirector.Injector {
private final FakeDeviceConfig mDeviceConfig;
private final DisplayInfo mDisplayInfo;
- private final Map<Integer, Display> mDisplays;
+ private final Display mDisplay;
private boolean mDisplayInfoValid = true;
private final DisplayManagerInternal mDisplayManagerInternal;
private final StatusBarManagerInternal mStatusBarManagerInternal;
@@ -3427,8 +3350,7 @@ public class DisplayModeDirectorTest {
mDisplayInfo.defaultModeId = MODE_ID;
mDisplayInfo.supportedModes = new Display.Mode[] {new Display.Mode(MODE_ID,
800, 600, /* refreshRate= */ 60)};
- mDisplays = Map.of(DISPLAY_ID, createDisplay(DISPLAY_ID),
- DISPLAY_ID_2, createDisplay(DISPLAY_ID_2));
+ mDisplay = createDisplay(DISPLAY_ID);
mDisplayManagerInternal = displayManagerInternal;
mStatusBarManagerInternal = statusBarManagerInternal;
mSensorManagerInternal = sensorManagerInternal;
@@ -3459,12 +3381,12 @@ public class DisplayModeDirectorTest {
@Override
public Display getDisplay(int displayId) {
- return mDisplays.get(displayId);
+ return mDisplay;
}
@Override
public Display[] getDisplays() {
- return mDisplays.values().toArray(new Display[0]);
+ return new Display[] { mDisplay };
}
@Override
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/PhysicalVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/PhysicalVoteTest.kt
index 547008e2fe56..9edcc328e53e 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/PhysicalVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/PhysicalVoteTest.kt
@@ -17,7 +17,6 @@
package com.android.server.display.mode
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import com.google.testing.junit.testparameterinjector.TestParameterInjector
import org.junit.Before
@@ -39,7 +38,7 @@ class PhysicalVoteTest {
@Test
fun `updates minPhysicalRefreshRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minPhysicalRefreshRate = 45f
physicalVote.updateSummary(summary)
@@ -49,7 +48,7 @@ class PhysicalVoteTest {
@Test
fun `does not update minPhysicalRefreshRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minPhysicalRefreshRate = 75f
physicalVote.updateSummary(summary)
@@ -59,7 +58,7 @@ class PhysicalVoteTest {
@Test
fun `updates maxPhysicalRefreshRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxPhysicalRefreshRate = 120f
physicalVote.updateSummary(summary)
@@ -69,7 +68,7 @@ class PhysicalVoteTest {
@Test
fun `does not update maxPhysicalRefreshRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxPhysicalRefreshRate = 75f
physicalVote.updateSummary(summary)
@@ -79,7 +78,7 @@ class PhysicalVoteTest {
@Test
fun `updates maxRenderFrameRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxRenderFrameRate = 120f
physicalVote.updateSummary(summary)
@@ -89,7 +88,7 @@ class PhysicalVoteTest {
@Test
fun `does not update maxRenderFrameRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxRenderFrameRate = 75f
physicalVote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/RenderVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/RenderVoteTest.kt
index 868a89393d5f..2d65f1c2c45e 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/RenderVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/RenderVoteTest.kt
@@ -17,7 +17,6 @@
package com.android.server.display.mode
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import com.google.testing.junit.testparameterinjector.TestParameterInjector
import org.junit.Before
@@ -40,7 +39,7 @@ class RenderVoteTest {
@Test
fun `updates minRenderFrameRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minRenderFrameRate = 45f
renderVote.updateSummary(summary)
@@ -50,7 +49,7 @@ class RenderVoteTest {
@Test
fun `does not update minRenderFrameRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minRenderFrameRate = 75f
renderVote.updateSummary(summary)
@@ -60,7 +59,7 @@ class RenderVoteTest {
@Test
fun `updates maxRenderFrameRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxRenderFrameRate = 120f
renderVote.updateSummary(summary)
@@ -70,7 +69,7 @@ class RenderVoteTest {
@Test
fun `does not update maxRenderFrameRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxRenderFrameRate = 75f
renderVote.updateSummary(summary)
@@ -80,7 +79,7 @@ class RenderVoteTest {
@Test
fun `updates minPhysicalRefreshRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minPhysicalRefreshRate = 45f
renderVote.updateSummary(summary)
@@ -90,7 +89,7 @@ class RenderVoteTest {
@Test
fun `does not update minPhysicalRefreshRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minPhysicalRefreshRate = 75f
renderVote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/SizeVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/SizeVoteTest.kt
index 1c631b07a2ff..1be2fbffbe79 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/SizeVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/SizeVoteTest.kt
@@ -18,7 +18,6 @@ package com.android.server.display.mode
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -41,7 +40,7 @@ class SizeVoteTest {
@Test
fun `updates size if width and height not set and display resolution voting disabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ false)
+ val summary = createVotesSummary(isDisplayResolutionRangeVotingEnabled = false)
summary.width = Vote.INVALID_SIZE
summary.height = Vote.INVALID_SIZE
summary.minWidth = 100
@@ -57,7 +56,7 @@ class SizeVoteTest {
@Test
fun `does not update size if width set and display resolution voting disabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ false)
+ val summary = createVotesSummary(isDisplayResolutionRangeVotingEnabled = false)
summary.width = 150
summary.height = Vote.INVALID_SIZE
summary.minWidth = 100
@@ -73,7 +72,7 @@ class SizeVoteTest {
@Test
fun `does not update size if height set and display resolution voting disabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ false)
+ val summary = createVotesSummary(isDisplayResolutionRangeVotingEnabled = false)
summary.width = Vote.INVALID_SIZE
summary.height = 250
summary.minWidth = 100
@@ -89,7 +88,7 @@ class SizeVoteTest {
@Test
fun `updates width if summary has more and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 850
sizeVote.updateSummary(summary)
@@ -99,7 +98,7 @@ class SizeVoteTest {
@Test
fun `does not update width if summary has less and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 750
sizeVote.updateSummary(summary)
@@ -109,7 +108,7 @@ class SizeVoteTest {
@Test
fun `updates height if summary has more and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.height = 1650
sizeVote.updateSummary(summary)
@@ -119,7 +118,7 @@ class SizeVoteTest {
@Test
fun `does not update height if summary has less and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.height = 1550
sizeVote.updateSummary(summary)
@@ -129,7 +128,7 @@ class SizeVoteTest {
@Test
fun `updates minWidth if summary has less and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 150
summary.minWidth = 350
@@ -140,7 +139,7 @@ class SizeVoteTest {
@Test
fun `does not update minWidth if summary has more and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 150
summary.minWidth = 450
@@ -151,7 +150,7 @@ class SizeVoteTest {
@Test
fun `updates minHeight if summary has less and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 150
summary.minHeight = 1150
@@ -162,7 +161,7 @@ class SizeVoteTest {
@Test
fun `does not update minHeight if summary has more and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 150
summary.minHeight = 1250
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/SupportedModesVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/SupportedModesVoteTest.kt
index cc8800395d1e..04e626536eba 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/SupportedModesVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/SupportedModesVoteTest.kt
@@ -18,7 +18,6 @@ package com.android.server.display.mode
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -44,7 +43,7 @@ class SupportedModesVoteTest {
@Test
fun `adds supported modes if supportedModes in summary is null`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
supportedModesVote.updateSummary(summary)
@@ -53,7 +52,7 @@ class SupportedModesVoteTest {
@Test
fun `does not add supported modes if summary has empty list of modes`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.supportedModes = ArrayList()
supportedModesVote.updateSummary(summary)
@@ -63,7 +62,7 @@ class SupportedModesVoteTest {
@Test
fun `filters out modes that does not match vote`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.supportedModes = ArrayList(listOf(otherMode, supportedModes[0]))
supportedModesVote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/TestUtils.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/TestUtils.kt
new file mode 100644
index 000000000000..910e03c5db85
--- /dev/null
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/TestUtils.kt
@@ -0,0 +1,27 @@
+/*
+ * 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 com.android.server.display.mode
+
+internal fun createVotesSummary(
+ isDisplayResolutionRangeVotingEnabled: Boolean = true,
+ vsyncProximityVoteEnabled: Boolean = true,
+ loggingEnabled: Boolean = true,
+ supportsFrameRateOverride: Boolean = true
+): VoteSummary {
+ return VoteSummary(isDisplayResolutionRangeVotingEnabled, vsyncProximityVoteEnabled,
+ loggingEnabled, supportsFrameRateOverride)
+} \ No newline at end of file
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt
new file mode 100644
index 000000000000..d6c84690e65f
--- /dev/null
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt
@@ -0,0 +1,107 @@
+/*
+ * 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 com.android.server.display.mode
+
+import android.view.Display
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import com.google.testing.junit.testparameterinjector.TestParameter
+import com.google.testing.junit.testparameterinjector.TestParameterInjector
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(TestParameterInjector::class)
+class VoteSummaryTest {
+
+ enum class SupportedModesVoteTestCase(
+ val vsyncProximityVoteEnabled: Boolean,
+ internal val summarySupportedModes: List<SupportedModesVote.SupportedMode>?,
+ val modesToFilter: Array<Display.Mode>,
+ val expectedModeIds: List<Int>
+ ) {
+ HAS_NO_MATCHING_VOTE(true,
+ listOf(SupportedModesVote.SupportedMode(60f, 60f)),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf()
+ ),
+ HAS_SINGLE_MATCHING_VOTE(true,
+ listOf(SupportedModesVote.SupportedMode(60f, 90f)),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf(3)
+ ),
+ HAS_MULTIPLE_MATCHING_VOTES(true,
+ listOf(SupportedModesVote.SupportedMode(60f, 90f),
+ SupportedModesVote.SupportedMode(90f, 90f)),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf(1, 3)
+ ),
+ HAS_NO_SUPPORTED_MODES(true,
+ listOf(),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf()
+ ),
+ HAS_NULL_SUPPORTED_MODES(true,
+ null,
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf(1, 2, 3)
+ ),
+ HAS_VSYNC_PROXIMITY_DISABLED(false,
+ listOf(),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf(1, 2, 3)
+ ),
+ }
+
+ @Test
+ fun `filters modes for summary supportedModes`(
+ @TestParameter testCase: SupportedModesVoteTestCase
+ ) {
+ val summary = createSummary(testCase.vsyncProximityVoteEnabled)
+ summary.supportedModes = testCase.summarySupportedModes
+
+ val result = summary.filterModes(testCase.modesToFilter)
+
+ assertThat(result.map { it.modeId }).containsExactlyElementsIn(testCase.expectedModeIds)
+ }
+}
+private fun createMode(modeId: Int, refreshRate: Float, vsyncRate: Float): Display.Mode {
+ return Display.Mode(modeId, 600, 800, refreshRate, vsyncRate,
+ FloatArray(0), IntArray(0))
+}
+
+private fun createSummary(vsyncVoteEnabled: Boolean): VoteSummary {
+ val summary = createVotesSummary(vsyncProximityVoteEnabled = vsyncVoteEnabled)
+ summary.width = 600
+ summary.height = 800
+ summary.maxPhysicalRefreshRate = Float.POSITIVE_INFINITY
+ summary.maxRenderFrameRate = Float.POSITIVE_INFINITY
+
+ return summary
+}
diff --git a/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java
index be29163e7677..cbc8538cf9fb 100644
--- a/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java
@@ -46,6 +46,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
@@ -61,6 +62,7 @@ import static org.mockito.Mockito.verify;
import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
import android.app.IActivityManager;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
@@ -128,6 +130,8 @@ public class DeviceIdleControllerTest {
@Mock
private ConnectivityManager mConnectivityManager;
@Mock
+ private ContentResolver mContentResolver;
+ @Mock
private IActivityManager mIActivityManager;
@Mock
private LocationManager mLocationManager;
@@ -332,7 +336,7 @@ public class DeviceIdleControllerTest {
anyString(), any(Executor.class),
any(DeviceConfig.OnPropertiesChangedListener.class)));
doAnswer((Answer<DeviceConfig.Properties>) invocationOnMock
- -> mock(DeviceConfig.Properties.class))
+ -> new DeviceConfig.Properties.Builder(DeviceConfig.NAMESPACE_DEVICE_IDLE).build())
.when(() -> DeviceConfig.getProperties(
anyString(), ArgumentMatchers.<String>any()));
when(mPowerManager.newWakeLock(anyInt(), anyString())).thenReturn(mWakeLock);
@@ -347,6 +351,7 @@ public class DeviceIdleControllerTest {
mAppStateTracker = new AppStateTrackerForTest(getContext(), Looper.getMainLooper());
mAnyMotionDetector = new AnyMotionDetectorForTest();
mInjector = new InjectorForTest(getContext());
+ doNothing().when(mContentResolver).registerContentObserver(any(), anyBoolean(), any());
doReturn(mWearModeManagerInternal)
.when(() -> LocalServices.getService(WearModeManagerInternal.class));
@@ -366,7 +371,8 @@ public class DeviceIdleControllerTest {
mDeviceIdleController.setLightEnabledForTest(true);
// Get the same Constants object that mDeviceIdleController got.
- mConstants = mInjector.getConstants(mDeviceIdleController);
+ mConstants = mInjector.getConstants(mDeviceIdleController,
+ mInjector.getHandler(mDeviceIdleController), mContentResolver);
final ArgumentCaptor<TelephonyCallback> telephonyCallbackCaptor =
ArgumentCaptor.forClass(TelephonyCallback.class);
@@ -2164,9 +2170,8 @@ public class DeviceIdleControllerTest {
public void testStationaryDetection_QuickDozeOff() {
setQuickDozeEnabled(false);
enterDeepState(STATE_IDLE);
- // Regular progression through states, so time should have increased appropriately.
- mInjector.nowElapsed += mConstants.IDLE_AFTER_INACTIVE_TIMEOUT + mConstants.SENSING_TIMEOUT
- + mConstants.LOCATING_TIMEOUT;
+ // Indicate that enough time has passed for the device to be considered stationary.
+ mInjector.nowElapsed += mConstants.MOTION_INACTIVE_TIMEOUT;
StationaryListenerForTest stationaryListener = new StationaryListenerForTest();
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
index 21e3b34ed61a..b39cd04f5be2 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -3397,6 +3397,8 @@ public final class AlarmManagerServiceTest {
bOptions.getTemporaryAppAllowlistType());
assertEquals(PowerExemptionManager.REASON_TIMEZONE_CHANGED,
bOptions.getTemporaryAppAllowlistReasonCode());
+ assertEquals(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT,
+ bOptions.getDeliveryGroupPolicy());
}
@Test
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
index 33645455ca98..918bc5d27d67 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
@@ -1665,7 +1665,8 @@ public class BroadcastQueueTest extends BaseBroadcastQueueTest {
enqueueBroadcast(makeBroadcastRecord(airplane, callerApp,
List.of(makeManifestReceiver(PACKAGE_BLUE, CLASS_RED))));
enqueueBroadcast(makeOrderedBroadcastRecord(timezoneSecond, callerApp,
- List.of(makeManifestReceiver(PACKAGE_BLUE, CLASS_GREEN)),
+ List.of(makeManifestReceiver(PACKAGE_BLUE, CLASS_BLUE),
+ makeManifestReceiver(PACKAGE_BLUE, CLASS_GREEN)),
resultToSecond, null));
waitForIdle();
@@ -1681,6 +1682,11 @@ public class BroadcastQueueTest extends BaseBroadcastQueueTest {
anyInt(), anyInt(), any());
// We deliver second broadcast to app
+ timezoneSecond.setClassName(PACKAGE_BLUE, CLASS_BLUE);
+ inOrder.verify(blueThread).scheduleReceiver(
+ argThat(filterAndExtrasEquals(timezoneSecond)), any(), any(),
+ anyInt(), any(), any(), eq(true), eq(false), anyInt(),
+ anyInt(), anyInt(), any());
timezoneSecond.setClassName(PACKAGE_BLUE, CLASS_GREEN);
inOrder.verify(blueThread).scheduleReceiver(
argThat(filterAndExtrasEquals(timezoneSecond)), any(), any(),
@@ -1797,9 +1803,15 @@ public class BroadcastQueueTest extends BaseBroadcastQueueTest {
waitForIdle();
- verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, airplane);
- verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, airplane);
- verifyScheduleRegisteredReceiver(never(), receiverYellowApp, airplane);
+ if (mImpl == Impl.MODERN) {
+ verifyScheduleRegisteredReceiver(times(2), receiverGreenApp, airplane);
+ verifyScheduleRegisteredReceiver(times(2), receiverBlueApp, airplane);
+ verifyScheduleRegisteredReceiver(times(1), receiverYellowApp, airplane);
+ } else {
+ verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, airplane);
+ verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, airplane);
+ verifyScheduleRegisteredReceiver(never(), receiverYellowApp, airplane);
+ }
}
@Test
@@ -1830,6 +1842,39 @@ public class BroadcastQueueTest extends BaseBroadcastQueueTest {
}
@Test
+ public void testReplacePending_existingDiffReceivers() throws Exception {
+ final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
+ final ProcessRecord receiverGreenApp = makeActiveProcessRecord(PACKAGE_GREEN);
+ final ProcessRecord receiverBlueApp = makeActiveProcessRecord(PACKAGE_BLUE);
+ final BroadcastFilter receiverGreen = makeRegisteredReceiver(receiverGreenApp);
+ final BroadcastFilter receiverBlue = makeRegisteredReceiver(receiverBlueApp);
+
+ final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED)
+ .addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
+ final Intent timeTick = new Intent(Intent.ACTION_TIME_TICK);
+
+ enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, List.of(
+ withPriority(receiverGreen, 5))));
+ enqueueBroadcast(makeBroadcastRecord(timeTick, callerApp, List.of(
+ withPriority(receiverGreen, 10),
+ withPriority(receiverBlue, 5))));
+ enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, List.of(
+ withPriority(receiverBlue, 10),
+ withPriority(receiverGreen, 5))));
+
+ waitForIdle();
+
+ verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, timeTick);
+ verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, timeTick);
+ if (mImpl == Impl.MODERN) {
+ verifyScheduleRegisteredReceiver(times(2), receiverGreenApp, airplane);
+ } else {
+ verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, airplane);
+ }
+ verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, airplane);
+ }
+
+ @Test
public void testIdleAndBarrier() throws Exception {
final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
final ProcessRecord receiverApp = makeActiveProcessRecord(PACKAGE_GREEN);
diff --git a/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java
index 646f4862d75d..79b39b82ee56 100644
--- a/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java
@@ -20,7 +20,9 @@ import static android.app.AppOpsManager.MODE_ERRORED;
import static android.app.AppOpsManager.OP_COARSE_LOCATION;
import static android.app.AppOpsManager.OP_FLAGS_ALL;
import static android.app.AppOpsManager.OP_FLAG_SELF;
+import static android.app.AppOpsManager.OP_READ_DEVICE_IDENTIFIERS;
import static android.app.AppOpsManager.OP_READ_SMS;
+import static android.app.AppOpsManager.OP_TAKE_AUDIO_FOCUS;
import static android.app.AppOpsManager.OP_WIFI_SCAN;
import static android.app.AppOpsManager.OP_WRITE_SMS;
import static android.os.UserHandle.getAppId;
@@ -49,8 +51,10 @@ import static org.mockito.ArgumentMatchers.nullable;
import android.app.AppOpsManager;
import android.app.AppOpsManager.OpEntry;
import android.app.AppOpsManager.PackageOps;
+import android.app.SyncNotedAppOp;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.os.Handler;
import android.os.HandlerThread;
@@ -58,6 +62,7 @@ import android.os.Process;
import android.permission.PermissionManager;
import android.provider.Settings;
import android.util.ArrayMap;
+import android.util.Log;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -79,7 +84,6 @@ import org.junit.runner.RunWith;
import org.mockito.quality.Strictness;
import java.io.File;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -99,12 +103,15 @@ public class AppOpsServiceTest {
private static final Context sContext = InstrumentationRegistry.getTargetContext();
private static final String sMyPackageName = sContext.getOpPackageName();
+ private static final String sSdkSandboxPackageName = sContext.getPackageManager()
+ .getSdkSandboxPackageName();
private File mStorageFile;
private File mRecentAccessesFile;
private Handler mHandler;
private AppOpsService mAppOpsService;
private int mMyUid;
+ private int mSdkSandboxPackageUid;
private long mTestStartMillis;
private StaticMockitoSession mMockingSession;
@@ -132,6 +139,7 @@ public class AppOpsServiceTest {
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper());
mMyUid = Process.myUid();
+ mSdkSandboxPackageUid = resolveSdkSandboxPackageUid();
initializeStaticMocks();
@@ -152,6 +160,39 @@ public class AppOpsServiceTest {
mMockingSession.finishMocking();
}
+ private static int resolveSdkSandboxPackageUid() {
+ try {
+ return sContext.getPackageManager().getPackageUid(
+ sSdkSandboxPackageName,
+ PackageManager.PackageInfoFlags.of(0)
+ );
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "Can't resolve sandbox package uid", e);
+ return Process.INVALID_UID;
+ }
+ }
+
+ private static void mockGetPackage(
+ PackageManagerInternal managerMock,
+ String packageName
+ ) {
+ AndroidPackage packageMock = mock(AndroidPackage.class);
+ when(managerMock.getPackage(packageName)).thenReturn(packageMock);
+ }
+
+ private static void mockGetPackageStateInternal(
+ PackageManagerInternal managerMock,
+ String packageName,
+ int uid
+ ) {
+ PackageStateInternal packageStateInternalMock = mock(PackageStateInternal.class);
+ when(packageStateInternalMock.isPrivileged()).thenReturn(false);
+ when(packageStateInternalMock.getAppId()).thenReturn(uid);
+ when(packageStateInternalMock.getAndroidPackage()).thenReturn(mock(AndroidPackage.class));
+ when(managerMock.getPackageStateInternal(packageName))
+ .thenReturn(packageStateInternalMock);
+ }
+
private void initializeStaticMocks() {
mMockingSession = mockitoSession()
.strictness(Strictness.LENIENT)
@@ -163,16 +204,11 @@ public class AppOpsServiceTest {
// Mock LocalServices.getService(PackageManagerInternal.class).getPackageStateInternal
// and getPackage dependency needed by AppOpsService
PackageManagerInternal mockPackageManagerInternal = mock(PackageManagerInternal.class);
- AndroidPackage mockMyPkg = mock(AndroidPackage.class);
- when(mockMyPkg.getAttributions()).thenReturn(Collections.emptyList());
- PackageStateInternal mockMyPSInternal = mock(PackageStateInternal.class);
- when(mockMyPSInternal.isPrivileged()).thenReturn(false);
- when(mockMyPSInternal.getAppId()).thenReturn(mMyUid);
- when(mockMyPSInternal.getAndroidPackage()).thenReturn(mockMyPkg);
-
- when(mockPackageManagerInternal.getPackageStateInternal(sMyPackageName))
- .thenReturn(mockMyPSInternal);
- when(mockPackageManagerInternal.getPackage(sMyPackageName)).thenReturn(mockMyPkg);
+ mockGetPackage(mockPackageManagerInternal, sMyPackageName);
+ mockGetPackageStateInternal(mockPackageManagerInternal, sMyPackageName, mMyUid);
+ mockGetPackage(mockPackageManagerInternal, sSdkSandboxPackageName);
+ mockGetPackageStateInternal(mockPackageManagerInternal, sSdkSandboxPackageName,
+ mSdkSandboxPackageUid);
when(mockPackageManagerInternal.getPackageUid(eq(sMyPackageName), anyLong(),
eq(getUserId(mMyUid)))).thenReturn(mMyUid);
doReturn(mockPackageManagerInternal).when(
@@ -233,6 +269,21 @@ public class AppOpsServiceTest {
assertContainsOp(loggedOps, OP_WRITE_SMS, -1, mTestStartMillis, MODE_ERRORED);
}
+ @Test
+ public void testNoteOperationFromSdkSandbox() {
+ int sandboxUid = Process.toSdkSandboxUid(mMyUid);
+
+ // Note an op that's allowed.
+ SyncNotedAppOp allowedResult = mAppOpsService.noteOperation(OP_TAKE_AUDIO_FOCUS, sandboxUid,
+ sSdkSandboxPackageName, null, false, null, false);
+ assertThat(allowedResult.getOpMode()).isEqualTo(MODE_ALLOWED);
+
+ // Note another op that's not allowed.
+ SyncNotedAppOp erroredResult = mAppOpsService.noteOperation(OP_READ_DEVICE_IDENTIFIERS,
+ sandboxUid, sSdkSandboxPackageName, null, false, null, false);
+ assertThat(erroredResult.getOpMode()).isEqualTo(MODE_ERRORED);
+ }
+
/**
* Tests the scenario where an operation's permission is controlled by another operation.
* For example the results of a WIFI_SCAN can be used to infer the location of a user, so the
diff --git a/services/tests/mockingservicestests/src/com/android/server/backup/restore/PerformUnifiedRestoreTaskTest.java b/services/tests/mockingservicestests/src/com/android/server/backup/restore/PerformUnifiedRestoreTaskTest.java
index c84797febcfd..940469f89b16 100644
--- a/services/tests/mockingservicestests/src/com/android/server/backup/restore/PerformUnifiedRestoreTaskTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/backup/restore/PerformUnifiedRestoreTaskTest.java
@@ -53,7 +53,6 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
-import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.ArrayDeque;
@@ -75,14 +74,10 @@ public class PerformUnifiedRestoreTaskTest {
private static final String SYSTEM_PACKAGE_NAME = "android";
private static final String NON_SYSTEM_PACKAGE_NAME = "package";
- @Mock
- private BackupDataInput mBackupDataInput;
- @Mock
- private BackupDataOutput mBackupDataOutput;
- @Mock
- private UserBackupManagerService mBackupManagerService;
- @Mock
- private TransportConnection mTransportConnection;
+ @Mock private BackupDataInput mBackupDataInput;
+ @Mock private BackupDataOutput mBackupDataOutput;
+ @Mock private UserBackupManagerService mBackupManagerService;
+ @Mock private TransportConnection mTransportConnection;
private Set<String> mExcludedkeys = new HashSet<>();
private Map<String, String> mBackupData = new HashMap<>();
@@ -93,8 +88,8 @@ public class PerformUnifiedRestoreTaskTest {
private PerformUnifiedRestoreTask mRestoreTask;
@Rule
- public TestableDeviceConfig.TestableDeviceConfigRule
- mDeviceConfigRule = new TestableDeviceConfig.TestableDeviceConfigRule();
+ public TestableDeviceConfig.TestableDeviceConfigRule mDeviceConfigRule =
+ new TestableDeviceConfig.TestableDeviceConfigRule();
private Context mContext;
@@ -107,30 +102,21 @@ public class PerformUnifiedRestoreTaskTest {
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
mBackupDataSource = new ArrayDeque<>(mBackupData.keySet());
- when(mBackupDataInput.readNextHeader()).then(new Answer<Boolean>() {
- @Override
- public Boolean answer(InvocationOnMock invocation) throws Throwable {
- return !mBackupDataSource.isEmpty();
- }
- });
- when(mBackupDataInput.getKey()).then(new Answer<String>() {
- @Override
- public String answer(InvocationOnMock invocation) throws Throwable {
- return mBackupDataSource.poll();
- }
- });
+ when(mBackupDataInput.readNextHeader())
+ .then((Answer<Boolean>) invocation -> !mBackupDataSource.isEmpty());
+ when(mBackupDataInput.getKey())
+ .then((Answer<String>) invocation -> mBackupDataSource.poll());
when(mBackupDataInput.getDataSize()).thenReturn(0);
mBackupDataDump = new HashSet<>();
ArgumentCaptor<String> keyCaptor = ArgumentCaptor.forClass(String.class);
- when(mBackupDataOutput.writeEntityHeader(keyCaptor.capture(), anyInt())).then(
- new Answer<Void>() {
- @Override
- public Void answer(InvocationOnMock invocation) throws Throwable {
- mBackupDataDump.add(keyCaptor.getValue());
- return null;
- }
- });
+ when(mBackupDataOutput.writeEntityHeader(keyCaptor.capture(), anyInt()))
+ .then(
+ (Answer<Void>)
+ invocation -> {
+ mBackupDataDump.add(keyCaptor.getValue());
+ return null;
+ });
mRestoreTask = new PerformUnifiedRestoreTask(mBackupManagerService, mTransportConnection);
}
@@ -148,8 +134,8 @@ public class PerformUnifiedRestoreTaskTest {
@Test
public void testFilterExcludedKeys() throws Exception {
- when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME))).thenReturn(
- mExcludedkeys);
+ when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME)))
+ .thenReturn(mExcludedkeys);
mRestoreTask.filterExcludedKeys(PACKAGE_NAME, mBackupDataInput, mBackupDataOutput);
@@ -162,46 +148,45 @@ public class PerformUnifiedRestoreTaskTest {
@Test
public void testGetExcludedKeysForPackage_alwaysReturnsLatestKeys() {
Set<String> firstExcludedKeys = new HashSet<>(Collections.singletonList(EXCLUDED_KEY_1));
- when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME))).thenReturn(
- firstExcludedKeys);
+ when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME)))
+ .thenReturn(firstExcludedKeys);
assertEquals(firstExcludedKeys, mRestoreTask.getExcludedKeysForPackage(PACKAGE_NAME));
-
- Set<String> secondExcludedKeys = new HashSet<>(Arrays.asList(EXCLUDED_KEY_1,
- EXCLUDED_KEY_2));
- when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME))).thenReturn(
- secondExcludedKeys);
+ Set<String> secondExcludedKeys =
+ new HashSet<>(Arrays.asList(EXCLUDED_KEY_1, EXCLUDED_KEY_2));
+ when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME)))
+ .thenReturn(secondExcludedKeys);
assertEquals(secondExcludedKeys, mRestoreTask.getExcludedKeysForPackage(PACKAGE_NAME));
}
@Test
public void testStageBackupData_stageForNonSystemPackageWithKeysToExclude() {
- when(mBackupManagerService.getExcludedRestoreKeys(eq(NON_SYSTEM_PACKAGE_NAME))).thenReturn(
- mExcludedkeys);
+ when(mBackupManagerService.getExcludedRestoreKeys(eq(NON_SYSTEM_PACKAGE_NAME)))
+ .thenReturn(mExcludedkeys);
assertTrue(mRestoreTask.shouldStageBackupData(NON_SYSTEM_PACKAGE_NAME));
}
@Test
public void testStageBackupData_stageForNonSystemPackageWithNoKeysToExclude() {
- when(mBackupManagerService.getExcludedRestoreKeys(any())).thenReturn(
- Collections.emptySet());
+ when(mBackupManagerService.getExcludedRestoreKeys(any()))
+ .thenReturn(Collections.emptySet());
assertTrue(mRestoreTask.shouldStageBackupData(NON_SYSTEM_PACKAGE_NAME));
}
@Test
public void testStageBackupData_doNotStageForSystemPackageWithNoKeysToExclude() {
- when(mBackupManagerService.getExcludedRestoreKeys(any())).thenReturn(
- Collections.emptySet());
+ when(mBackupManagerService.getExcludedRestoreKeys(any()))
+ .thenReturn(Collections.emptySet());
assertFalse(mRestoreTask.shouldStageBackupData(SYSTEM_PACKAGE_NAME));
}
@Test
public void testStageBackupData_stageForSystemPackageWithKeysToExclude() {
- when(mBackupManagerService.getExcludedRestoreKeys(eq(SYSTEM_PACKAGE_NAME))).thenReturn(
- mExcludedkeys);
+ when(mBackupManagerService.getExcludedRestoreKeys(eq(SYSTEM_PACKAGE_NAME)))
+ .thenReturn(mExcludedkeys);
assertTrue(mRestoreTask.shouldStageBackupData(SYSTEM_PACKAGE_NAME));
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java
index e5291d31d524..eaf0ffdc3cbd 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java
@@ -113,7 +113,7 @@ public class JobSchedulerServiceTest {
}
@Before
- public void setUp() {
+ public void setUp() throws Exception {
mMockingSession = mockitoSession()
.initMocks(this)
.strictness(Strictness.LENIENT)
@@ -178,6 +178,7 @@ public class JobSchedulerServiceTest {
when(mContext.getSystemService(UiModeManager.class)).thenReturn(mock(UiModeManager.class));
mService = new TestJobSchedulerService(mContext);
+ mService.waitOnAsyncLoadingForTesting();
}
@After
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java
index 3ba5d1eccaa1..d4ef64703ae2 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java
@@ -109,6 +109,7 @@ public class BatteryControllerTest {
mFlexibilityController =
new FlexibilityController(mJobSchedulerService, mock(PrefetchController.class));
mBatteryController = new BatteryController(mJobSchedulerService, mFlexibilityController);
+ mBatteryController.startTrackingLocked();
verify(mContext).registerReceiver(receiverCaptor.capture(),
ArgumentMatchers.argThat(filter ->
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java
index 0659f7e9a064..4fb9472021c5 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/FlexibilityControllerTest.java
@@ -23,6 +23,7 @@ import static android.app.job.JobInfo.NETWORK_TYPE_CELLULAR;
import static android.app.job.JobInfo.NETWORK_TYPE_NONE;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
+import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -69,6 +70,8 @@ import com.android.server.LocalServices;
import com.android.server.job.JobSchedulerService;
import com.android.server.job.JobStore;
+import libcore.junit.util.compat.CoreCompatChangeRule;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -268,19 +271,19 @@ public class FlexibilityControllerTest {
@Test
public void testOnConstantsUpdated_PercentsToDropConstraintsInvalidValues() {
- JobInfo.Builder jb = createJob(0).setOverrideDeadline(100L);
+ JobInfo.Builder jb = createJob(0).setOverrideDeadline(HOUR_IN_MILLIS);
JobStatus js = createJobStatus("testPercentsToDropConstraintsConfig", jb);
- js.enqueueTime = 100L;
- assertEquals(150L,
+ js.enqueueTime = JobSchedulerService.sElapsedRealtimeClock.millis();
+ assertEquals(js.enqueueTime + HOUR_IN_MILLIS / 2,
mFlexibilityController.getNextConstraintDropTimeElapsedLocked(js));
setDeviceConfigString(KEY_PERCENTS_TO_DROP_NUM_FLEXIBLE_CONSTRAINTS, "10,20a,030,40");
- assertEquals(150L,
+ assertEquals(js.enqueueTime + HOUR_IN_MILLIS / 2,
mFlexibilityController.getNextConstraintDropTimeElapsedLocked(js));
setDeviceConfigString(KEY_PERCENTS_TO_DROP_NUM_FLEXIBLE_CONSTRAINTS, "10,40");
- assertEquals(150L,
+ assertEquals(js.enqueueTime + HOUR_IN_MILLIS / 2,
mFlexibilityController.getNextConstraintDropTimeElapsedLocked(js));
setDeviceConfigString(KEY_PERCENTS_TO_DROP_NUM_FLEXIBLE_CONSTRAINTS, "50,40,10,40");
- assertEquals(150L,
+ assertEquals(js.enqueueTime + HOUR_IN_MILLIS / 2,
mFlexibilityController.getNextConstraintDropTimeElapsedLocked(js));
}
@@ -368,7 +371,7 @@ public class FlexibilityControllerTest {
@Test
public void testCurPercent() {
- long deadline = 1000;
+ long deadline = 100 * MINUTE_IN_MILLIS;
long nowElapsed;
JobInfo.Builder jb = createJob(0).setOverrideDeadline(deadline);
JobStatus js = createJobStatus("time", jb);
@@ -376,17 +379,17 @@ public class FlexibilityControllerTest {
assertEquals(FROZEN_TIME, mFlexibilityController.getLifeCycleBeginningElapsedLocked(js));
assertEquals(deadline + FROZEN_TIME,
mFlexibilityController.getLifeCycleEndElapsedLocked(js, FROZEN_TIME));
- nowElapsed = 600 + FROZEN_TIME;
+ nowElapsed = FROZEN_TIME + 60 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(60, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
- nowElapsed = 1400;
+ nowElapsed = FROZEN_TIME + 130 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(100, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
- nowElapsed = 950 + FROZEN_TIME;
+ nowElapsed = FROZEN_TIME + 95 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(95, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
@@ -394,8 +397,8 @@ public class FlexibilityControllerTest {
nowElapsed = FROZEN_TIME;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
- long delay = 100;
- deadline = 1100;
+ long delay = MINUTE_IN_MILLIS;
+ deadline = 101 * MINUTE_IN_MILLIS;
jb = createJob(0).setOverrideDeadline(deadline).setMinimumLatency(delay);
js = createJobStatus("time", jb);
@@ -404,24 +407,84 @@ public class FlexibilityControllerTest {
assertEquals(deadline + FROZEN_TIME,
mFlexibilityController.getLifeCycleEndElapsedLocked(js, FROZEN_TIME + delay));
- nowElapsed = 600 + FROZEN_TIME + delay;
+ nowElapsed = FROZEN_TIME + delay + 60 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(60, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
- nowElapsed = 1400;
+ nowElapsed = FROZEN_TIME + 130 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(100, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
- nowElapsed = 950 + FROZEN_TIME + delay;
+ nowElapsed = FROZEN_TIME + delay + 95 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(95, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
}
@Test
+ public void testGetLifeCycleBeginningElapsedLocked_Periodic() {
+ // Periodic with lifecycle
+ JobInfo.Builder jbBasic = createJob(0).setPeriodic(HOUR_IN_MILLIS);
+ JobInfo.Builder jbFlex = createJob(0)
+ .setPeriodic(HOUR_IN_MILLIS, 20 * MINUTE_IN_MILLIS);
+ JobStatus jsBasic =
+ createJobStatus("testGetLifeCycleBeginningElapsedLocked_Periodic", jbBasic);
+ JobStatus jsFlex =
+ createJobStatus("testGetLifeCycleBeginningElapsedLocked_Periodic", jbFlex);
+
+ final long nowElapsed = JobSchedulerService.sElapsedRealtimeClock.millis();
+ // Base case, no start adjustment
+ assertEquals(nowElapsed,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsBasic));
+ assertEquals(nowElapsed + 40 * MINUTE_IN_MILLIS,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsFlex));
+
+ // Rescheduled with start adjustment
+ final long adjustmentMs = 4 * MINUTE_IN_MILLIS;
+ jsBasic = new JobStatus(jsBasic,
+ // "True" start is nowElapsed + HOUR_IN_MILLIS
+ nowElapsed + HOUR_IN_MILLIS + adjustmentMs,
+ nowElapsed + 2 * HOUR_IN_MILLIS,
+ 0 /* numFailures */, 0 /* numSystemStops */,
+ JobSchedulerService.sSystemClock.millis() /* lastSuccessfulRunTime */,
+ 0, 0);
+ jsFlex = new JobStatus(jsFlex,
+ // "True" start is nowElapsed + 2 * HOUR_IN_MILLIS - 20 * MINUTE_IN_MILLIS
+ nowElapsed + 2 * HOUR_IN_MILLIS - 20 * MINUTE_IN_MILLIS + adjustmentMs,
+ nowElapsed + 2 * HOUR_IN_MILLIS,
+ 0 /* numFailures */, 0 /* numSystemStops */,
+ JobSchedulerService.sSystemClock.millis() /* lastSuccessfulRunTime */,
+ 0, 0);
+
+ assertEquals(nowElapsed + HOUR_IN_MILLIS + adjustmentMs / 2,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsBasic));
+ assertEquals(nowElapsed + 2 * HOUR_IN_MILLIS - 20 * MINUTE_IN_MILLIS + adjustmentMs / 2,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsFlex));
+
+ // Rescheduled for failure
+ jsBasic = new JobStatus(jsBasic,
+ nowElapsed + 30 * MINUTE_IN_MILLIS,
+ NO_LATEST_RUNTIME,
+ 1 /* numFailures */, 1 /* numSystemStops */,
+ JobSchedulerService.sSystemClock.millis() /* lastSuccessfulRunTime */,
+ 0, 0);
+ jsFlex = new JobStatus(jsFlex,
+ nowElapsed + 30 * MINUTE_IN_MILLIS,
+ NO_LATEST_RUNTIME,
+ 1 /* numFailures */, 1 /* numSystemStops */,
+ JobSchedulerService.sSystemClock.millis() /* lastSuccessfulRunTime */,
+ 0, 0);
+
+ assertEquals(nowElapsed + 30 * MINUTE_IN_MILLIS,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsBasic));
+ assertEquals(nowElapsed + 30 * MINUTE_IN_MILLIS,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsFlex));
+ }
+
+ @Test
public void testGetLifeCycleBeginningElapsedLocked_Prefetch() {
// prefetch with lifecycle
when(mPrefetchController.getLaunchTimeThresholdMs()).thenReturn(700L);
@@ -480,20 +543,20 @@ public class FlexibilityControllerTest {
@Test
public void testGetLifeCycleEndElapsedLocked_NonPrefetch() {
// deadline
- JobInfo.Builder jb = createJob(0).setOverrideDeadline(1000L);
+ JobInfo.Builder jb = createJob(0).setOverrideDeadline(HOUR_IN_MILLIS);
JobStatus js = createJobStatus("time", jb);
- assertEquals(1000L + FROZEN_TIME,
+ assertEquals(HOUR_IN_MILLIS + FROZEN_TIME,
mFlexibilityController.getLifeCycleEndElapsedLocked(js, 0));
// no deadline
jb = createJob(0);
js = createJobStatus("time", jb);
- assertEquals(100L + DEFAULT_FALLBACK_FLEXIBILITY_DEADLINE_MS,
+ assertEquals(FROZEN_TIME + DEFAULT_FALLBACK_FLEXIBILITY_DEADLINE_MS,
mFlexibilityController.getLifeCycleEndElapsedLocked(js, 100L));
}
@Test
public void testGetLifeCycleEndElapsedLocked_Rescheduled() {
- JobInfo.Builder jb = createJob(0).setOverrideDeadline(1000L);
+ JobInfo.Builder jb = createJob(0).setOverrideDeadline(HOUR_IN_MILLIS);
JobStatus js = createJobStatus("time", jb);
js = new JobStatus(
js, FROZEN_TIME, NO_LATEST_RUNTIME, /* numFailures */ 2, /* numSystemStops */ 0,
@@ -632,6 +695,7 @@ public class FlexibilityControllerTest {
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testExceptions_ShortWindow() {
JobInfo.Builder jb = createJob(0);
jb.setMinimumLatency(1);
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
index 92aa982c3dd1..8397b87706d6 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
@@ -16,6 +16,8 @@
package com.android.server.job.controllers;
+import static android.text.format.DateUtils.HOUR_IN_MILLIS;
+
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
@@ -261,7 +263,7 @@ public class JobStatusTest {
public void testMediaBackupExemption_lateConstraint() {
final JobInfo triggerContentJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT)
.addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0))
- .setOverrideDeadline(12)
+ .setOverrideDeadline(HOUR_IN_MILLIS)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build();
when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE);
@@ -869,7 +871,7 @@ public class JobStatusTest {
public void testWouldBeReadyWithConstraint_RequestedOverrideDeadline() {
final JobInfo jobInfo =
new JobInfo.Builder(101, new ComponentName("foo", "bar"))
- .setOverrideDeadline(300_000)
+ .setOverrideDeadline(HOUR_IN_MILLIS)
.build();
final JobStatus job = createJobStatus(jobInfo);
@@ -1025,7 +1027,7 @@ public class JobStatusTest {
final JobInfo jobInfo =
new JobInfo.Builder(101, new ComponentName("foo", "bar"))
.setRequiresCharging(true)
- .setOverrideDeadline(300_000)
+ .setOverrideDeadline(HOUR_IN_MILLIS)
.addTriggerContentUri(new JobInfo.TriggerContentUri(
MediaStore.Images.Media.INTERNAL_CONTENT_URI,
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
index 4329b6fbc8e3..1a95d66dd2b0 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
@@ -158,6 +158,7 @@ public class PrefetchControllerTest {
ArgumentCaptor<EstimatedLaunchTimeChangedListener> eltListenerCaptor =
ArgumentCaptor.forClass(EstimatedLaunchTimeChangedListener.class);
mPrefetchController = new PrefetchController(mJobSchedulerService);
+ mPrefetchController.startTrackingLocked();
mPcConstants = mPrefetchController.getPcConstants();
setDeviceConfigLong(PcConstants.KEY_LAUNCH_TIME_THRESHOLD_MS, 7 * HOUR_IN_MILLIS);
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/TimeControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/TimeControllerTest.java
index 27efcfabea0c..8fb7bd2a6643 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/TimeControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/TimeControllerTest.java
@@ -48,6 +48,8 @@ import com.android.server.LocalServices;
import com.android.server.job.JobSchedulerService;
import com.android.server.job.JobSchedulerService.Constants;
+import libcore.junit.util.compat.CoreCompatChangeRule;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -141,6 +143,7 @@ public class TimeControllerTest {
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testMaybeStartTrackingJobLocked_AlreadySatisfied() {
JobStatus delaySatisfied = createJobStatus(
"testMaybeStartTrackingJobLocked_AlreadySatisfied",
@@ -294,6 +297,7 @@ public class TimeControllerTest {
runTestMaybeStartTrackingJobLocked_DeadlineInOrder();
}
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
private void runTestMaybeStartTrackingJobLocked_DeadlineInOrder() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -319,6 +323,7 @@ public class TimeControllerTest {
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testMaybeStartTrackingJobLocked_DeadlineInOrder_SomeNotReady() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -357,6 +362,7 @@ public class TimeControllerTest {
runTestMaybeStartTrackingJobLocked_DeadlineReverseOrder();
}
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
private void runTestMaybeStartTrackingJobLocked_DeadlineReverseOrder() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -387,6 +393,7 @@ public class TimeControllerTest {
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testMaybeStartTrackingJobLocked_DeadlineReverseOrder_SomeNotReady() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -535,6 +542,7 @@ public class TimeControllerTest {
runTestCheckExpiredDeadlinesAndResetAlarm();
}
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
private void runTestCheckExpiredDeadlinesAndResetAlarm() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -585,6 +593,7 @@ public class TimeControllerTest {
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testCheckExpiredDeadlinesAndResetAlarm_SomeNotReady() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -740,6 +749,7 @@ public class TimeControllerTest {
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testEvaluateStateLocked_Deadline() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
diff --git a/services/tests/mockingservicestests/src/com/android/server/location/gnss/GnssLocationProviderTest.java b/services/tests/mockingservicestests/src/com/android/server/location/gnss/GnssLocationProviderTest.java
new file mode 100644
index 000000000000..c5e6824099ed
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/location/gnss/GnssLocationProviderTest.java
@@ -0,0 +1,179 @@
+/*
+ * 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 com.android.server.location.gnss;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.app.AlarmManager;
+import android.app.AppOpsManager;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.location.GnssCapabilities;
+import android.location.LocationManager;
+import android.location.LocationManagerInternal;
+import android.location.flags.Flags;
+import android.location.provider.ProviderRequest;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.platform.test.annotations.Presubmit;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.modules.utils.testing.ExtendedMockitoRule;
+import com.android.server.LocalServices;
+import com.android.server.location.gnss.hal.FakeGnssHal;
+import com.android.server.location.gnss.hal.GnssNative;
+import com.android.server.location.injector.Injector;
+import com.android.server.location.injector.TestInjector;
+import com.android.server.timedetector.TimeDetectorInternal;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.quality.Strictness;
+
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+@Presubmit
+@androidx.test.filters.SmallTest
+@RunWith(AndroidJUnit4.class)
+public class GnssLocationProviderTest {
+
+ @Rule
+ public final ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this)
+ .setStrictness(Strictness.WARN)
+ .mockStatic(Settings.Global.class)
+ .build();
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ private @Mock Context mContext;
+ private @Mock LocationManagerInternal mLocationManagerInternal;
+ private @Mock LocationManager mLocationManager;
+ private @Mock TimeDetectorInternal mTimeDetectorInternal;
+ private @Mock GnssConfiguration mMockConfiguration;
+ private @Mock GnssMetrics mGnssMetrics;
+ private @Mock PowerManager mPowerManager;
+ private @Mock TelephonyManager mTelephonyManager;
+ private @Mock AppOpsManager mAppOpsManager;
+ private @Mock AlarmManager mAlarmManager;
+ private @Mock PowerManager.WakeLock mWakeLock;
+ private @Mock ContentResolver mContentResolver;
+ private @Mock UserManager mUserManager;
+ private @Mock UserHandle mUserHandle;
+ private Set<UserHandle> mUserHandleSet = new HashSet<>();
+
+ private GnssNative mGnssNative;
+
+ private GnssLocationProvider mTestProvider;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ doReturn("mypackage").when(mContext).getPackageName();
+ doReturn("attribution").when(mContext).getAttributionTag();
+ doReturn(mPowerManager).when(mContext).getSystemService(PowerManager.class);
+ doReturn(mPowerManager).when(mContext).getSystemService("power");
+ doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class);
+ doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
+ doReturn(mAlarmManager).when(mContext).getSystemService(Context.ALARM_SERVICE);
+ doReturn(mLocationManager).when(mContext).getSystemService(LocationManager.class);
+ doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
+ mUserHandleSet.add(mUserHandle);
+ doReturn(true).when(mLocationManager).isLocationEnabledForUser(eq(mUserHandle));
+ doReturn(mUserHandleSet).when(mUserManager).getVisibleUsers();
+ doReturn(mContentResolver).when(mContext).getContentResolver();
+ doReturn(mWakeLock).when(mPowerManager).newWakeLock(anyInt(), anyString());
+ LocalServices.addService(LocationManagerInternal.class, mLocationManagerInternal);
+ LocalServices.addService(TimeDetectorInternal.class, mTimeDetectorInternal);
+ FakeGnssHal fakeGnssHal = new FakeGnssHal();
+ GnssNative.setGnssHalForTest(fakeGnssHal);
+ Injector injector = new TestInjector(mContext);
+ mGnssNative = spy(Objects.requireNonNull(
+ GnssNative.create(injector, mMockConfiguration)));
+ doReturn(true).when(mGnssNative).init();
+ GnssCapabilities gnssCapabilities = new GnssCapabilities.Builder().setHasScheduling(
+ true).build();
+ doReturn(gnssCapabilities).when(mGnssNative).getCapabilities();
+
+ mTestProvider = new GnssLocationProvider(mContext, mGnssNative, mGnssMetrics);
+ mGnssNative.register();
+ }
+
+ @After
+ public void tearDown() {
+ LocalServices.removeServiceForTest(LocationManagerInternal.class);
+ LocalServices.removeServiceForTest(TimeDetectorInternal.class);
+ }
+
+ @Test
+ public void testStartNavigating() {
+ ProviderRequest providerRequest = new ProviderRequest.Builder().setIntervalMillis(
+ 0).build();
+
+ mTestProvider.onSetRequest(providerRequest);
+ verify(mGnssNative).start();
+ }
+
+ @Test
+ public void testUpdateRequirements_sameRequest() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_GNSS_CALL_STOP_BEFORE_SET_POSITION_MODE);
+ ProviderRequest providerRequest = new ProviderRequest.Builder().setIntervalMillis(
+ 0).build();
+
+ mTestProvider.onSetRequest(providerRequest);
+ verify(mGnssNative).start();
+
+ // set the same request
+ mTestProvider.onSetRequest(providerRequest);
+ verify(mGnssNative, never()).stop();
+ verify(mGnssNative, times(1)).start();
+ }
+
+ @Test
+ public void testUpdateRequirements_differentRequest() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_GNSS_CALL_STOP_BEFORE_SET_POSITION_MODE);
+ ProviderRequest providerRequest = new ProviderRequest.Builder().setIntervalMillis(
+ 0).build();
+
+ mTestProvider.onSetRequest(providerRequest);
+ verify(mGnssNative).start();
+
+ // set a different request
+ providerRequest = new ProviderRequest.Builder().setIntervalMillis(2000).build();
+ mTestProvider.onSetRequest(providerRequest);
+ verify(mGnssNative).stop();
+ verify(mGnssNative, times(2)).start();
+ }
+}
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/DeletePackageHelperTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/DeletePackageHelperTest.kt
index 931b38dc2951..f8fe97e9af13 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/DeletePackageHelperTest.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/DeletePackageHelperTest.kt
@@ -22,12 +22,14 @@ import android.content.pm.PackageManager.PERMISSION_DENIED
import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.content.pm.UserInfo
import android.os.Build
+import android.os.UserHandle
import android.os.UserHandle.USER_SYSTEM
import android.util.Log
import com.android.server.testutils.any
import com.android.server.testutils.spy
import com.android.server.testutils.whenever
import com.google.common.truth.Truth.assertThat
+import org.junit.Assert.assertFalse
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -177,4 +179,13 @@ class DeletePackageHelperTest {
assertThat(result).isEqualTo(PackageManager.DELETE_FAILED_INTERNAL_ERROR)
}
+
+ @Test
+ fun deletePackageLIFWithNonExistantPackage_isFalse() {
+ val dph = DeletePackageHelper(mPms, mock(RemovePackageHelper::class.java),
+ mock(BroadcastHelper::class.java))
+ val result = dph.deletePackageLIF("a.nonexistent.package", UserHandle.of(USER_SYSTEM), true,
+ intArrayOf(0), 0, PackageRemovedInfo(), true)
+ assertFalse(result)
+ }
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java
index 733a43329478..a3ec936273b4 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java
@@ -45,6 +45,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
import android.content.pm.LauncherActivityInfo;
import android.content.pm.LauncherApps;
import android.content.pm.PackageInstaller;
@@ -92,6 +93,7 @@ public class PackageArchiverTest {
private static final String PACKAGE = "com.example";
private static final String CALLER_PACKAGE = "com.caller";
private static final String INSTALLER_PACKAGE = "com.installer";
+ private static final String INSTALLER_LABEL = "Installer";
private static final Path ICON_PATH = Path.of("icon.png");
@Rule
@@ -198,6 +200,10 @@ public class PackageArchiverTest {
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mPackageManager.getResourcesForApplication(eq(PACKAGE))).thenReturn(
mock(Resources.class));
+ ApplicationInfo installerAi = mock(ApplicationInfo.class);
+ when(mComputer.getApplicationInfo(eq(INSTALLER_PACKAGE), anyLong(), anyInt())).thenReturn(
+ installerAi);
+ when(installerAi.loadLabel(any())).thenReturn(INSTALLER_LABEL);
when(mInstallerService.createSessionInternal(any(), any(), any(), anyInt(),
anyInt())).thenReturn(1);
when(mInstallerService.getExistingDraftSessionId(anyInt(), any(), anyInt())).thenReturn(
@@ -545,7 +551,7 @@ public class PackageArchiverTest {
ICON_PATH, null);
activityInfos.add(activityInfo);
}
- return new ArchiveState(activityInfos, INSTALLER_PACKAGE);
+ return new ArchiveState(activityInfos, INSTALLER_LABEL);
}
private static List<LauncherActivityInfo> createLauncherActivities() {
diff --git a/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java b/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java
index 8e328ca75580..0e815d0eab95 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java
@@ -49,8 +49,11 @@ import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
import android.app.IActivityManager;
import android.app.IForegroundServiceObserver;
+import android.content.BroadcastReceiver;
+import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
@@ -68,7 +71,7 @@ import android.provider.Settings;
import android.test.mock.MockContentResolver;
import android.util.ArraySet;
-import androidx.test.InstrumentationRegistry;
+import androidx.test.platform.app.InstrumentationRegistry;
import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.internal.util.test.FakeSettingsProvider;
@@ -85,9 +88,11 @@ import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.io.File;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -145,7 +150,8 @@ public class LowPowerStandbyControllerTest {
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mContextSpy = spy(new BroadcastInterceptingContext(InstrumentationRegistry.getContext()));
+ mContextSpy = spy(new BroadcastInterceptingContext(InstrumentationRegistry
+ .getInstrumentation().getTargetContext()));
when(mContextSpy.getPackageManager()).thenReturn(mPackageManagerMock);
when(mContextSpy.getSystemService(AlarmManager.class)).thenReturn(mAlarmManagerMock);
when(mContextSpy.getSystemService(UserManager.class)).thenReturn(mUserManagerMock);
@@ -395,26 +401,65 @@ public class LowPowerStandbyControllerTest {
setLowPowerStandbySupportedConfig(true);
mController.systemReady();
+ TestReceiver receiver = new TestReceiver();
+ mContextSpy.registerReceiver(receiver,
+ new IntentFilter(PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED));
+
BroadcastInterceptingContext.FutureIntent futureIntent = mContextSpy.nextBroadcastIntent(
PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
mController.setEnabled(false);
futureIntent.assertNotReceived();
+ assertThat(receiver.receivedCount).isEqualTo(0);
+ receiver.reset();
futureIntent = mContextSpy.nextBroadcastIntent(
PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
mController.setEnabled(true);
assertThat(futureIntent.get(1, TimeUnit.SECONDS)).isNotNull();
+ assertThat(receiver.receivedCount).isEqualTo(1);
+ receiver.reset();
futureIntent = mContextSpy.nextBroadcastIntent(
PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
mController.setEnabled(true);
futureIntent.assertNotReceived();
+ assertThat(receiver.receivedCount).isEqualTo(0);
+ receiver.reset();
futureIntent = mContextSpy.nextBroadcastIntent(
PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
-
mController.setEnabled(false);
assertThat(futureIntent.get(1, TimeUnit.SECONDS)).isNotNull();
+ assertThat(receiver.receivedCount).isEqualTo(1);
+ receiver.reset();
+ }
+
+ @Test
+ public void testLowPowerStandbyEnabled_EnabledChangedExplicitBroadcastSent() throws Exception {
+ setLowPowerStandbySupportedConfig(true);
+ List<PackageInfo> packagesHoldingPermission = new ArrayList<>();
+
+ when(mPackageManagerMock.getPackagesHoldingPermissions(Mockito.any(),
+ Mockito.anyInt())).thenReturn(packagesHoldingPermission);
+
+ PackageInfo testInfo = new PackageInfo();
+ testInfo.packageName = mContextSpy.getPackageName();
+ packagesHoldingPermission.add(testInfo);
+ mController.systemReady();
+ TestReceiver receiver = new TestReceiver();
+ mContextSpy.registerReceiver(receiver,
+ new IntentFilter(PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED));
+
+ mController.setEnabled(false);
+ assertThat(receiver.receivedCount).isEqualTo(0);
+ receiver.reset();
+
+ mController.setEnabled(true);
+ // Since we added a package manually to the packages that are allowed to
+ // manage LPS, the interceptor should have intercepted two broadcasts, one
+ // implicit via registration and one explicit to the package added above.
+ assertThat(receiver.receivedCount).isEqualTo(2);
+ receiver.reset();
}
@Test
@@ -906,4 +951,19 @@ public class LowPowerStandbyControllerTest {
LocalServices.removeServiceForTest(clazz);
LocalServices.addService(clazz, mock);
}
+
+ public static class TestReceiver extends BroadcastReceiver {
+ public int receivedCount = 0;
+
+ /**
+ * Resets the count of this receiver
+ */
+ public void reset() {
+ receivedCount = 0;
+ }
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ receivedCount++;
+ }
+ }
}
diff --git a/services/tests/powerservicetests/src/com/android/server/power/ShutdownThreadTest.java b/services/tests/powerservicetests/src/com/android/server/power/ShutdownThreadTest.java
index 2d1b545a9e6d..62075b828a62 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/ShutdownThreadTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/ShutdownThreadTest.java
@@ -51,31 +51,31 @@ public class ShutdownThreadTest {
private static final String WAVEFORM_VIB_10MS_SERIALIZATION =
"""
- <vibration>
+ <vibration-effect>
<waveform-effect>
<waveform-entry durationMs="10" amplitude="100"/>
</waveform-effect>
- </vibration>
+ </vibration-effect>
""";
private static final VibrationEffect WAVEFORM_VIB_10MS = VibrationEffect.createOneShot(10, 100);
private static final String REPEATING_VIB_SERIALIZATION =
"""
- <vibration>
+ <vibration-effect>
<waveform-effect>
<repeating>
<waveform-entry durationMs="10" amplitude="100"/>
</repeating>
</waveform-effect>
- </vibration>
+ </vibration-effect>
""";
private static final String CLICK_VIB_SERIALIZATION =
"""
- <vibration>
+ <vibration-effect>
<predefined-effect name="click"/>
- </vibration>
+ </vibration-effect>
""";
private static final VibrationEffect CLILCK_VIB =
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
index 7148b164efa9..2e0ba0083850 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java
@@ -82,6 +82,15 @@ public class BatteryUsageStatsProviderTest {
.isEqualTo(20 * MINUTE_IN_MS);
assertThat(uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND))
.isEqualTo(40 * MINUTE_IN_MS);
+ assertThat(uidBatteryConsumer
+ .getTimeInProcessStateMs(UidBatteryConsumer.PROCESS_STATE_FOREGROUND))
+ .isEqualTo(20 * MINUTE_IN_MS);
+ assertThat(uidBatteryConsumer
+ .getTimeInProcessStateMs(UidBatteryConsumer.PROCESS_STATE_BACKGROUND))
+ .isEqualTo(20 * MINUTE_IN_MS);
+ assertThat(uidBatteryConsumer
+ .getTimeInProcessStateMs(UidBatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE))
+ .isEqualTo(20 * MINUTE_IN_MS);
assertThat(uidBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO))
.isWithin(PRECISION).of(2.0);
assertThat(
diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java
index 07c486c6ce58..079ea2c7832f 100644
--- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java
+++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java
@@ -193,14 +193,14 @@ public class BatteryUsageStatsTest {
for (UidBatteryConsumer uidBatteryConsumer : uidBatteryConsumers) {
if (uidBatteryConsumer.getUid() == APP_UID1) {
assertUidBatteryConsumer(uidBatteryConsumer, 2124, null,
- 5321, 7432, 423, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 745,
+ 5321, 6900, 532, 423, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 745,
POWER_MODEL_UNDEFINED,
956, 1167, 1478,
true, 3554, 3776, 3998, 444, 3554, 15542, 3776, 17762, 3998, 19982,
444, 1110);
} else if (uidBatteryConsumer.getUid() == APP_UID2) {
assertUidBatteryConsumer(uidBatteryConsumer, 1332, "bar",
- 1111, 2222, 333, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 444,
+ 1111, 2220, 2, 333, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 444,
BatteryConsumer.POWER_MODEL_POWER_PROFILE,
555, 666, 777,
true, 1777, 1888, 1999, 321, 1777, 7771, 1888, 8881, 1999, 9991,
@@ -269,7 +269,7 @@ public class BatteryUsageStatsTest {
.setStatsEndTimestamp(3000);
addUidBatteryConsumer(builder, batteryStats, APP_UID1, "foo",
- 1000, 2000,
+ 1000, 1500, 500,
300, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 400,
BatteryConsumer.POWER_MODEL_POWER_PROFILE, 500, 600, 800,
1777, 7771, 1888, 8881, 1999, 9991, 123, 456);
@@ -312,13 +312,13 @@ public class BatteryUsageStatsTest {
.setStatsEndTimestamp(5000);
addUidBatteryConsumer(builder, batteryStats, APP_UID1, null,
- 4321, 5432,
+ 4321, 5400, 32,
123, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 345, POWER_MODEL_ENERGY_CONSUMPTION,
456, 567, 678,
1777, 7771, 1888, 8881, 1999, 9991, 321, 654);
addUidBatteryConsumer(builder, batteryStats, APP_UID2, "bar",
- 1111, 2222,
+ 1111, 2220, 2,
333, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 444,
BatteryConsumer.POWER_MODEL_POWER_PROFILE, 555, 666, 777,
1777, 7771, 1888, 8881, 1999, 9991, 321, 654);
@@ -338,7 +338,8 @@ public class BatteryUsageStatsTest {
private void addUidBatteryConsumer(BatteryUsageStats.Builder builder,
MockBatteryStatsImpl batteryStats, int uid, String packageWithHighestDrain,
- int timeInStateForeground, int timeInStateBackground, double screenPower,
+ int timeInProcessStateForeground, int timeInProcessStateBackground,
+ int timeInProcessStateForegroundService, double screenPower,
int screenPowerModel, double cpuPower, int cpuPowerModel, double customComponentPower,
int cpuDuration, int customComponentDuration, double cpuPowerForeground,
int cpuDurationForeground, double cpuPowerBackground, int cpuDurationBackground,
@@ -348,8 +349,10 @@ public class BatteryUsageStatsTest {
builder.getOrCreateUidBatteryConsumerBuilder(batteryStatsUid);
uidBuilder
.setPackageWithHighestDrain(packageWithHighestDrain)
- .setTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND, timeInStateForeground)
- .setTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND, timeInStateBackground)
+ .setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND, timeInProcessStateForeground)
+ .setTimeInProcessStateMs(PROCESS_STATE_BACKGROUND, timeInProcessStateBackground)
+ .setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE,
+ timeInProcessStateForegroundService)
.setConsumedPower(
BatteryConsumer.POWER_COMPONENT_SCREEN, screenPower, screenPowerModel)
.setConsumedPower(
@@ -446,7 +449,7 @@ public class BatteryUsageStatsTest {
for (UidBatteryConsumer uidBatteryConsumer : uidBatteryConsumers) {
if (uidBatteryConsumer.getUid() == APP_UID1) {
assertUidBatteryConsumer(uidBatteryConsumer, 1200, "foo",
- 1000, 2000, 300, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 400,
+ 1000, 1500, 500, 300, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 400,
BatteryConsumer.POWER_MODEL_POWER_PROFILE,
500, 600, 800,
true, 1777, 1888, 1999, 123, 1777, 7771, 1888, 8881, 1999, 9991, 123, 456);
@@ -496,8 +499,9 @@ public class BatteryUsageStatsTest {
}
private void assertUidBatteryConsumer(UidBatteryConsumer uidBatteryConsumer,
- double consumedPower, String packageWithHighestDrain, int timeInStateForeground,
- int timeInStateBackground, int screenPower, int screenPowerModel, double cpuPower,
+ double consumedPower, String packageWithHighestDrain, int timeInProcessStateForeground,
+ int timeInProcessStateBackground, int timeInProcessStateForegroundService,
+ int screenPower, int screenPowerModel, double cpuPower,
int cpuPowerModel, double customComponentPower, int cpuDuration,
int customComponentDuration, boolean processStateDataIncluded,
double totalPowerForeground, double totalPowerBackground, double totalPowerFgs,
@@ -509,9 +513,16 @@ public class BatteryUsageStatsTest {
assertThat(uidBatteryConsumer.getPackageWithHighestDrain()).isEqualTo(
packageWithHighestDrain);
assertThat(uidBatteryConsumer.getTimeInStateMs(
- UidBatteryConsumer.STATE_FOREGROUND)).isEqualTo(timeInStateForeground);
+ UidBatteryConsumer.STATE_FOREGROUND)).isEqualTo(timeInProcessStateForeground);
assertThat(uidBatteryConsumer.getTimeInStateMs(
- UidBatteryConsumer.STATE_BACKGROUND)).isEqualTo(timeInStateBackground);
+ UidBatteryConsumer.STATE_BACKGROUND)).isEqualTo(
+ timeInProcessStateBackground + timeInProcessStateForegroundService);
+ assertThat(uidBatteryConsumer.getTimeInProcessStateMs(
+ PROCESS_STATE_FOREGROUND)).isEqualTo(timeInProcessStateForeground);
+ assertThat(uidBatteryConsumer.getTimeInProcessStateMs(
+ PROCESS_STATE_BACKGROUND)).isEqualTo(timeInProcessStateBackground);
+ assertThat(uidBatteryConsumer.getTimeInProcessStateMs(
+ PROCESS_STATE_FOREGROUND_SERVICE)).isEqualTo(timeInProcessStateForegroundService);
assertThat(uidBatteryConsumer.getConsumedPower(
BatteryConsumer.POWER_COMPONENT_SCREEN)).isEqualTo(screenPower);
assertThat(uidBatteryConsumer.getPowerModel(
diff --git a/services/tests/servicestests/src/com/android/server/SecurityStateTest.java b/services/tests/servicestests/src/com/android/server/SecurityStateTest.java
new file mode 100644
index 000000000000..fc91e47534f1
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/SecurityStateTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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 com.android.server;
+
+import static android.os.SecurityStateManager.KEY_KERNEL_VERSION;
+import static android.os.SecurityStateManager.KEY_SYSTEM_SPL;
+import static android.os.SecurityStateManager.KEY_VENDOR_SPL;
+
+import static com.android.server.SecurityStateManagerService.KERNEL_RELEASE_PATTERN;
+import static com.android.server.SecurityStateManagerService.VENDOR_SECURITY_PATCH_PROPERTY_KEY;
+
+import static junit.framework.Assert.assertEquals;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.os.VintfRuntimeInfo;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.R;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import java.util.regex.Matcher;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SecurityStateTest {
+ @Rule
+ public MockitoRule mockitoRule = MockitoJUnit.rule();
+
+ @Mock
+ private Context mMockContext;
+
+ @Mock
+ private PackageManager mMockPackageManager;
+
+ @Mock
+ private Resources mMockResources;
+
+ private static final String DEFAULT_MODULE_METADATA_PROVIDER = "com.android.modulemetadata";
+ private static final String DEFAULT_MODULE_METADATA_PROVIDER_VERSION = "2023-12-01";
+ private static final String DEFAULT_SECURITY_STATE_PACKAGE = "com.google.android.gms";
+ private static final String DEFAULT_SECURITY_STATE_PACKAGE_VERSION = "2023-12-05";
+ private static final String[] SECURITY_STATE_PACKAGES =
+ new String[]{DEFAULT_SECURITY_STATE_PACKAGE};
+
+ @Before
+ public void setUp() throws Exception {
+ when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager);
+ when(mMockContext.getResources()).thenReturn(mMockResources);
+ when(mMockContext.getString(R.string.config_defaultModuleMetadataProvider))
+ .thenReturn(DEFAULT_MODULE_METADATA_PROVIDER);
+ when(mMockPackageManager.getPackageInfo(anyString(), anyInt()))
+ .thenReturn(new PackageInfo());
+ PackageInfo moduleMetadataPackageInfo = new PackageInfo();
+ moduleMetadataPackageInfo.versionName = DEFAULT_MODULE_METADATA_PROVIDER_VERSION;
+ when(mMockPackageManager.getPackageInfo(DEFAULT_MODULE_METADATA_PROVIDER, 0))
+ .thenReturn(moduleMetadataPackageInfo);
+ PackageInfo securityStatePackageInfo = new PackageInfo();
+ securityStatePackageInfo.versionName = DEFAULT_SECURITY_STATE_PACKAGE_VERSION;
+ when(mMockPackageManager.getPackageInfo(DEFAULT_SECURITY_STATE_PACKAGE, 0))
+ .thenReturn(securityStatePackageInfo);
+ when(mMockResources.getStringArray(R.array.config_securityStatePackages))
+ .thenReturn(SECURITY_STATE_PACKAGES);
+ }
+
+ @Test
+ public void testGetGlobalSecurityState_returnsBundle() {
+ SecurityStateManagerService securityState = new SecurityStateManagerService(mMockContext);
+
+ Bundle bundle = securityState.getGlobalSecurityState();
+
+ assertEquals(bundle.getString(KEY_SYSTEM_SPL), Build.VERSION.SECURITY_PATCH);
+ assertEquals(bundle.getString(KEY_VENDOR_SPL),
+ SystemProperties.get(VENDOR_SECURITY_PATCH_PROPERTY_KEY, ""));
+ Matcher matcher = KERNEL_RELEASE_PATTERN.matcher(VintfRuntimeInfo.getKernelVersion());
+ String kernelVersion = "";
+ if (matcher.matches()) {
+ kernelVersion = matcher.group(1);
+ }
+ assertEquals(bundle.getString(KEY_KERNEL_VERSION), kernelVersion);
+ assertEquals(bundle.getString(DEFAULT_MODULE_METADATA_PROVIDER),
+ DEFAULT_MODULE_METADATA_PROVIDER_VERSION);
+ assertEquals(bundle.getString(DEFAULT_SECURITY_STATE_PACKAGE),
+ DEFAULT_SECURITY_STATE_PACKAGE_VERSION);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/WatchdogTest.java b/services/tests/servicestests/src/com/android/server/WatchdogTest.java
new file mode 100644
index 000000000000..34ac47e1fe96
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/WatchdogTest.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2009 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;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import android.os.Handler;
+import android.os.SimpleClock;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.server.Watchdog.HandlerChecker;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.time.ZoneOffset;
+
+/** Test class for {@link Watchdog}. */
+@RunWith(AndroidJUnit4.class)
+public class WatchdogTest {
+ private static final int TIMEOUT_MS = 10;
+
+ private TestClock mClock;
+ private Handler mHandler;
+ private HandlerChecker mChecker;
+
+ @Before
+ public void setUp() {
+ mClock = new TestClock();
+ mHandler = mock(Handler.class);
+ mChecker =
+ new HandlerChecker(mHandler, "monitor thread", new Object(), mClock) {
+ @Override
+ public boolean isHandlerPolling() {
+ return false;
+ }
+ };
+ }
+
+ @Test
+ public void checkerPausedUntilResume() {
+ Watchdog.Monitor monitor = mock(Watchdog.Monitor.class);
+ mChecker.addMonitorLocked(monitor);
+
+ mChecker.pauseLocked("pausing");
+ mChecker.scheduleCheckLocked(TIMEOUT_MS);
+ verifyNoMoreInteractions(mHandler);
+ assertEquals(Watchdog.COMPLETED, mChecker.getCompletionStateLocked());
+
+ mChecker.resumeLocked("resuming");
+ mChecker.scheduleCheckLocked(10);
+ assertEquals(Watchdog.WAITING, mChecker.getCompletionStateLocked());
+ }
+
+ @Test
+ public void checkerPausedUntilDeadline() {
+ Watchdog.Monitor monitor = mock(Watchdog.Monitor.class);
+ mChecker.addMonitorLocked(monitor);
+
+ mChecker.pauseForLocked(10, "pausing");
+ mChecker.scheduleCheckLocked(TIMEOUT_MS);
+ verifyNoMoreInteractions(mHandler);
+ assertEquals(Watchdog.COMPLETED, mChecker.getCompletionStateLocked());
+
+ mClock.advanceBy(5);
+ verifyNoMoreInteractions(mHandler);
+ assertEquals(Watchdog.COMPLETED, mChecker.getCompletionStateLocked());
+
+ // Above the 10s timeout. Watchdog should not be paused anymore.
+ mClock.advanceBy(6);
+ mChecker.scheduleCheckLocked(TIMEOUT_MS);
+ assertEquals(Watchdog.WAITING, mChecker.getCompletionStateLocked());
+ }
+
+ @Test
+ public void checkerPausedDuringScheduledRun() {
+ Watchdog.Monitor monitor = mock(Watchdog.Monitor.class);
+ mChecker.addMonitorLocked(monitor);
+
+ mChecker.scheduleCheckLocked(TIMEOUT_MS);
+ mClock.advanceBy(5);
+ mChecker.pauseForLocked(10, "pausing");
+ verifyNoMoreInteractions(mHandler);
+ assertEquals(Watchdog.COMPLETED, mChecker.getCompletionStateLocked());
+
+ // Above the 10s timeout. Watchdog should not be paused anymore.
+ mClock.advanceBy(11);
+ mChecker.scheduleCheckLocked(TIMEOUT_MS);
+ assertEquals(Watchdog.WAITING, mChecker.getCompletionStateLocked());
+ }
+
+ @Test
+ public void blockedThread() {
+ mChecker.scheduleCheckLocked(TIMEOUT_MS);
+ assertEquals(mChecker.getCompletionStateLocked(), Watchdog.WAITING);
+
+ mClock.advanceBy(6);
+ assertEquals(Watchdog.WAITED_UNTIL_PRE_WATCHDOG, mChecker.getCompletionStateLocked());
+
+ // Above the 10s timeout.
+ mClock.advanceBy(6);
+ assertEquals(Watchdog.OVERDUE, mChecker.getCompletionStateLocked());
+ }
+
+ @Test
+ public void checkNothingBlocked() {
+ Watchdog.Monitor monitor = mock(Watchdog.Monitor.class);
+ mChecker.addMonitorLocked(monitor);
+
+ mChecker.scheduleCheckLocked(TIMEOUT_MS);
+ // scheduleCheckLocked calls #postAtFrontOfQueue which will call mChecker.run().
+ mChecker.run();
+ assertEquals(Watchdog.COMPLETED, mChecker.getCompletionStateLocked());
+ verify(monitor).monitor();
+ }
+
+ private static class TestClock extends SimpleClock {
+ long mNowMillis = 1;
+
+ TestClock() {
+ super(ZoneOffset.UTC);
+ }
+
+ @Override
+ public long millis() {
+ return mNowMillis;
+ }
+
+ public void advanceBy(long millis) {
+ mNowMillis += millis;
+ }
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
index 82efdd3ce40a..800350a7d326 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
@@ -85,9 +85,9 @@ import com.android.internal.compat.IPlatformCompat;
import com.android.server.LocalServices;
import com.android.server.accessibility.AccessibilityManagerService.AccessibilityDisplayListener;
import com.android.server.accessibility.magnification.FullScreenMagnificationController;
+import com.android.server.accessibility.magnification.MagnificationConnectionManager;
import com.android.server.accessibility.magnification.MagnificationController;
import com.android.server.accessibility.magnification.MagnificationProcessor;
-import com.android.server.accessibility.magnification.WindowMagnificationManager;
import com.android.server.accessibility.test.MessageCapturingHandler;
import com.android.server.pm.UserManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -156,7 +156,7 @@ public class AccessibilityManagerServiceTest {
@Mock private UserManagerInternal mMockUserManagerInternal;
@Mock private IBinder mMockBinder;
@Mock private IAccessibilityServiceClient mMockServiceClient;
- @Mock private WindowMagnificationManager mMockWindowMagnificationMgr;
+ @Mock private MagnificationConnectionManager mMockMagnificationConnectionManager;
@Mock private MagnificationController mMockMagnificationController;
@Mock private FullScreenMagnificationController mMockFullScreenMagnificationController;
@Mock private ProxyManager mProxyManager;
@@ -180,8 +180,8 @@ public class AccessibilityManagerServiceTest {
UserManagerInternal.class, mMockUserManagerInternal);
mInputFilter = Mockito.mock(FakeInputFilter.class);
- when(mMockMagnificationController.getWindowMagnificationMgr()).thenReturn(
- mMockWindowMagnificationMgr);
+ when(mMockMagnificationController.getMagnificationConnectionManager()).thenReturn(
+ mMockMagnificationConnectionManager);
when(mMockMagnificationController.getFullScreenMagnificationController()).thenReturn(
mMockFullScreenMagnificationController);
when(mMockMagnificationController.supportWindowMagnification()).thenReturn(true);
@@ -530,7 +530,7 @@ public class AccessibilityManagerServiceTest {
// Invokes client change to trigger onUserStateChanged.
mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false);
- verify(mMockWindowMagnificationMgr).requestConnection(true);
+ verify(mMockMagnificationConnectionManager).requestConnection(true);
}
@SmallTest
@@ -547,7 +547,7 @@ public class AccessibilityManagerServiceTest {
// Invokes client change to trigger onUserStateChanged.
mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false);
- verify(mMockWindowMagnificationMgr).requestConnection(true);
+ verify(mMockMagnificationConnectionManager).requestConnection(true);
}
@SmallTest
@@ -565,7 +565,7 @@ public class AccessibilityManagerServiceTest {
// Invokes client change to trigger onUserStateChanged.
mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false);
- verify(mMockWindowMagnificationMgr).requestConnection(false);
+ verify(mMockMagnificationConnectionManager).requestConnection(false);
}
@SmallTest
@@ -583,7 +583,7 @@ public class AccessibilityManagerServiceTest {
// Invokes client change to trigger onUserStateChanged.
mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false);
- verify(mMockWindowMagnificationMgr).requestConnection(true);
+ verify(mMockMagnificationConnectionManager).requestConnection(true);
}
@SmallTest
@@ -602,7 +602,7 @@ public class AccessibilityManagerServiceTest {
// Invokes client change to trigger onUserStateChanged.
mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false);
- verify(mMockWindowMagnificationMgr).requestConnection(false);
+ verify(mMockMagnificationConnectionManager).requestConnection(false);
}
@SmallTest
@@ -616,7 +616,7 @@ public class AccessibilityManagerServiceTest {
// Invokes client change to trigger onUserStateChanged.
mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false);
- verify(mMockWindowMagnificationMgr).requestConnection(true);
+ verify(mMockMagnificationConnectionManager).requestConnection(true);
}
@SmallTest
@@ -630,7 +630,8 @@ public class AccessibilityManagerServiceTest {
// Invokes client change to trigger onUserStateChanged.
mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false);
- verify(mMockWindowMagnificationMgr, atLeastOnce()).removeMagnificationButton(anyInt());
+ verify(mMockMagnificationConnectionManager, atLeastOnce())
+ .removeMagnificationButton(anyInt());
}
@SmallTest
@@ -644,7 +645,7 @@ public class AccessibilityManagerServiceTest {
// Invokes client change to trigger onUserStateChanged.
mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false);
- verify(mMockWindowMagnificationMgr, never()).removeMagnificationButton(anyInt());
+ verify(mMockMagnificationConnectionManager, never()).removeMagnificationButton(anyInt());
}
@SmallTest
@@ -659,7 +660,8 @@ public class AccessibilityManagerServiceTest {
// Invokes client change to trigger onUserStateChanged.
mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false);
- verify(mMockWindowMagnificationMgr, atLeastOnce()).removeMagnificationButton(anyInt());
+ verify(mMockMagnificationConnectionManager, atLeastOnce())
+ .removeMagnificationButton(anyInt());
}
@SmallTest
@@ -674,7 +676,7 @@ public class AccessibilityManagerServiceTest {
// Invokes client change to trigger onUserStateChanged.
mA11yms.onClientChangeLocked(/* serviceInfoChanged= */false);
- verify(mMockWindowMagnificationMgr, never()).removeMagnificationButton(anyInt());
+ verify(mMockMagnificationConnectionManager, never()).removeMagnificationButton(anyInt());
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java
index a02807fe766c..7829fcc4b44d 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java
@@ -39,9 +39,9 @@ import android.accessibilityservice.MagnificationConfig;
import android.graphics.Region;
import com.android.server.accessibility.magnification.FullScreenMagnificationController;
+import com.android.server.accessibility.magnification.MagnificationConnectionManager;
import com.android.server.accessibility.magnification.MagnificationController;
import com.android.server.accessibility.magnification.MagnificationProcessor;
-import com.android.server.accessibility.magnification.WindowMagnificationManager;
import org.junit.Before;
import org.junit.Test;
@@ -66,21 +66,21 @@ public class MagnificationProcessorTest {
@Mock
private FullScreenMagnificationController mMockFullScreenMagnificationController;
@Mock
- private WindowMagnificationManager mMockWindowMagnificationManager;
+ private MagnificationConnectionManager mMockMagnificationConnectionManager;
FullScreenMagnificationControllerStub mFullScreenMagnificationControllerStub;
- WindowMagnificationManagerStub mWindowMagnificationManagerStub;
+ MagnificationManagerStub mMagnificationManagerStub;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mFullScreenMagnificationControllerStub = new FullScreenMagnificationControllerStub(
mMockFullScreenMagnificationController);
- mWindowMagnificationManagerStub = new WindowMagnificationManagerStub(
- mMockWindowMagnificationManager);
+ mMagnificationManagerStub = new MagnificationManagerStub(
+ mMockMagnificationConnectionManager);
when(mMockMagnificationController.getFullScreenMagnificationController()).thenReturn(
mMockFullScreenMagnificationController);
- when(mMockMagnificationController.getWindowMagnificationMgr()).thenReturn(
- mMockWindowMagnificationManager);
+ when(mMockMagnificationController.getMagnificationConnectionManager()).thenReturn(
+ mMockMagnificationConnectionManager);
mMagnificationProcessor = new MagnificationProcessor(mMockMagnificationController);
}
@@ -194,7 +194,7 @@ public class MagnificationProcessorTest {
doAnswer((invocation) -> {
((Region) invocation.getArguments()[1]).set(region);
return null;
- }).when(mMockWindowMagnificationManager).getMagnificationSourceBounds(eq(TEST_DISPLAY),
+ }).when(mMockMagnificationConnectionManager).getMagnificationSourceBounds(eq(TEST_DISPLAY),
any());
final Region result = new Region();
@@ -286,7 +286,7 @@ public class MagnificationProcessorTest {
mMagnificationProcessor.resetCurrentMagnification(TEST_DISPLAY, /* animate= */false);
- verify(mMockWindowMagnificationManager).disableWindowMagnification(TEST_DISPLAY, false,
+ verify(mMockMagnificationConnectionManager).disableWindowMagnification(TEST_DISPLAY, false,
null);
}
@@ -296,7 +296,7 @@ public class MagnificationProcessorTest {
mMagnificationProcessor.resetAllIfNeeded(connectionId);
verify(mMockFullScreenMagnificationController).resetAllIfNeeded(eq(connectionId));
- verify(mMockWindowMagnificationManager).resetAllIfNeeded(eq(connectionId));
+ verify(mMockMagnificationConnectionManager).resetAllIfNeeded(eq(connectionId));
}
@Test
@@ -450,7 +450,7 @@ public class MagnificationProcessorTest {
.setActivated(false).build();
mMagnificationProcessor.setMagnificationConfig(TEST_DISPLAY, config, false, SERVICE_ID);
- verify(mMockWindowMagnificationManager)
+ verify(mMockMagnificationConnectionManager)
.disableWindowMagnification(eq(TEST_DISPLAY), anyBoolean());
}
@@ -481,11 +481,11 @@ public class MagnificationProcessorTest {
mFullScreenMagnificationControllerStub.resetAndStubMethods();
mMockFullScreenMagnificationController.setScaleAndCenter(displayId, config.getScale(),
config.getCenterX(), config.getCenterY(), false, SERVICE_ID);
- mWindowMagnificationManagerStub.deactivateIfNeed();
+ mMagnificationManagerStub.deactivateIfNeed();
} else if (config.getMode() == MAGNIFICATION_MODE_WINDOW) {
- mWindowMagnificationManagerStub.resetAndStubMethods();
- mMockWindowMagnificationManager.enableWindowMagnification(displayId, config.getScale(),
- config.getCenterX(), config.getCenterY());
+ mMagnificationManagerStub.resetAndStubMethods();
+ mMockMagnificationConnectionManager.enableWindowMagnification(
+ displayId, config.getScale(), config.getCenterX(), config.getCenterY());
mFullScreenMagnificationControllerStub.deactivateIfNeed();
}
}
@@ -568,26 +568,26 @@ public class MagnificationProcessorTest {
}
}
- private static class WindowMagnificationManagerStub {
- private final WindowMagnificationManager mWindowMagnificationManager;
+ private static class MagnificationManagerStub {
+ private final MagnificationConnectionManager mMagnificationConnectionManager;
private float mScale = 1.0f;
private float mCenterX = 0;
private float mCenterY = 0;
private boolean mIsEnabled = false;
- WindowMagnificationManagerStub(
- WindowMagnificationManager windowMagnificationManager) {
- mWindowMagnificationManager = windowMagnificationManager;
+ MagnificationManagerStub(
+ MagnificationConnectionManager magnificationConnectionManager) {
+ mMagnificationConnectionManager = magnificationConnectionManager;
}
private void stubMethods() {
- doAnswer(invocation -> mScale).when(mWindowMagnificationManager).getScale(
+ doAnswer(invocation -> mScale).when(mMagnificationConnectionManager).getScale(
TEST_DISPLAY);
- doAnswer(invocation -> mCenterX).when(mWindowMagnificationManager).getCenterX(
+ doAnswer(invocation -> mCenterX).when(mMagnificationConnectionManager).getCenterX(
TEST_DISPLAY);
- doAnswer(invocation -> mCenterY).when(mWindowMagnificationManager).getCenterY(
+ doAnswer(invocation -> mCenterY).when(mMagnificationConnectionManager).getCenterY(
TEST_DISPLAY);
- doAnswer(invocation -> mIsEnabled).when(mWindowMagnificationManager)
+ doAnswer(invocation -> mIsEnabled).when(mMagnificationConnectionManager)
.isWindowMagnifierEnabled(TEST_DISPLAY);
Answer enableWindowMagnificationStubAnswer = invocation -> {
@@ -598,10 +598,10 @@ public class MagnificationProcessorTest {
return true;
};
doAnswer(enableWindowMagnificationStubAnswer).when(
- mWindowMagnificationManager).enableWindowMagnification(eq(TEST_DISPLAY),
+ mMagnificationConnectionManager).enableWindowMagnification(eq(TEST_DISPLAY),
anyFloat(), anyFloat(), anyFloat());
doAnswer(enableWindowMagnificationStubAnswer).when(
- mWindowMagnificationManager).enableWindowMagnification(eq(TEST_DISPLAY),
+ mMagnificationConnectionManager).enableWindowMagnification(eq(TEST_DISPLAY),
anyFloat(), anyFloat(), anyFloat(), any(), anyInt());
Answer disableWindowMagnificationStubAnswer = invocation -> {
@@ -609,15 +609,15 @@ public class MagnificationProcessorTest {
return true;
};
doAnswer(disableWindowMagnificationStubAnswer).when(
- mWindowMagnificationManager).disableWindowMagnification(eq(TEST_DISPLAY),
+ mMagnificationConnectionManager).disableWindowMagnification(eq(TEST_DISPLAY),
anyBoolean());
doAnswer(disableWindowMagnificationStubAnswer).when(
- mWindowMagnificationManager).disableWindowMagnification(eq(TEST_DISPLAY),
+ mMagnificationConnectionManager).disableWindowMagnification(eq(TEST_DISPLAY),
anyBoolean(), any());
}
public void resetAndStubMethods() {
- Mockito.reset(mWindowMagnificationManager);
+ Mockito.reset(mMagnificationConnectionManager);
stubMethods();
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
index 3b39160643d1..91140276cde0 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
@@ -588,6 +588,38 @@ public class FullScreenMagnificationGestureHandlerTest {
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ public void testTwoFingerTap_StateIsActivated_shouldInDelegating() {
+ assumeTrue(mMgh.mIsSinglePanningEnabled);
+ mMgh.setSinglePanningEnabled(false);
+ goFromStateIdleTo(STATE_ACTIVATED);
+ allowEventDelegation();
+
+ send(downEvent());
+ send(pointerEvent(ACTION_POINTER_DOWN, DEFAULT_X * 2, DEFAULT_Y));
+ send(upEvent());
+ fastForward(ViewConfiguration.getDoubleTapTimeout());
+
+ assertTrue(mMgh.mCurrentState == mMgh.mDelegatingState);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ public void testTwoFingerTap_StateIsIdle_shouldInDelegating() {
+ assumeTrue(mMgh.mIsSinglePanningEnabled);
+ mMgh.setSinglePanningEnabled(false);
+ goFromStateIdleTo(STATE_IDLE);
+ allowEventDelegation();
+
+ send(downEvent());
+ send(pointerEvent(ACTION_POINTER_DOWN, DEFAULT_X * 2, DEFAULT_Y));
+ send(upEvent());
+ fastForward(ViewConfiguration.getDoubleTapTimeout());
+
+ assertTrue(mMgh.mCurrentState == mMgh.mDelegatingState);
+ }
+
+ @Test
public void testMultiTap_outOfDistanceSlop_shouldInIdle() {
// All delay motion events should be sent, if multi-tap with out of distance slop.
// STATE_IDLE will check if tapCount() < 2.
@@ -719,6 +751,20 @@ public class FullScreenMagnificationGestureHandlerTest {
}
@Test
+ public void testTwoFingerDown_twoPointerDownAndActivatedState_panningState() {
+ goFromStateIdleTo(STATE_ACTIVATED);
+ PointF pointer1 = DEFAULT_POINT;
+ PointF pointer2 = new PointF(DEFAULT_X * 1.5f, DEFAULT_Y);
+
+ send(downEvent());
+ send(pointerEvent(ACTION_POINTER_DOWN, new PointF[] {pointer1, pointer2}, 1));
+ fastForward(ViewConfiguration.getTapTimeout());
+ assertIn(STATE_PANNING);
+
+ returnToNormalFrom(STATE_PANNING);
+ }
+
+ @Test
public void testActivatedWithTripleTap_invokeShowWindowPromptAction() {
goFromStateIdleTo(STATE_ACTIVATED);
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java
index 24ad976f6e45..3843e2507df6 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java
@@ -33,8 +33,6 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import static java.lang.Float.NaN;
@@ -76,7 +74,7 @@ import org.mockito.invocation.InvocationOnMock;
/**
* Tests for WindowMagnificationManager.
*/
-public class WindowMagnificationManagerTest {
+public class MagnificationConnectionManagerTest {
private static final int CURRENT_USER_ID = UserHandle.USER_SYSTEM;
private static final int SERVICE_ID = 1;
@@ -91,9 +89,9 @@ public class WindowMagnificationManagerTest {
@Mock
private MagnificationAnimationCallback mAnimationCallback;
@Mock
- private WindowMagnificationManager.Callback mMockCallback;
+ private MagnificationConnectionManager.Callback mMockCallback;
private MockContentResolver mResolver;
- private WindowMagnificationManager mWindowMagnificationManager;
+ private MagnificationConnectionManager mMagnificationConnectionManager;
@Before
public void setUp() throws RemoteException {
@@ -102,7 +100,7 @@ public class WindowMagnificationManagerTest {
LocalServices.addService(StatusBarManagerInternal.class, mMockStatusBarManagerInternal);
mResolver = new MockContentResolver();
mMockConnection = new MockWindowMagnificationConnection();
- mWindowMagnificationManager = new WindowMagnificationManager(mContext, new Object(),
+ mMagnificationConnectionManager = new MagnificationConnectionManager(mContext, new Object(),
mMockCallback, mMockTrace, new MagnificationScaleProvider(mContext));
when(mContext.getContentResolver()).thenReturn(mResolver);
@@ -122,11 +120,11 @@ public class WindowMagnificationManagerTest {
final Context context = ApplicationProvider.getApplicationContext();
context.getMainThreadHandler().postDelayed(
() -> {
- mWindowMagnificationManager.setConnection(
+ mMagnificationConnectionManager.setConnection(
connect ? mMockConnection.getConnection() : null);
}, 10);
} else {
- mWindowMagnificationManager.setConnection(
+ mMagnificationConnectionManager.setConnection(
connect ? mMockConnection.getConnection() : null);
}
return true;
@@ -135,17 +133,17 @@ public class WindowMagnificationManagerTest {
@Test
public void setConnection_connectionIsNull_wrapperIsNullAndLinkToDeath() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- assertNotNull(mWindowMagnificationManager.mConnectionWrapper);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ assertTrue(mMagnificationConnectionManager.isConnected());
verify(mMockConnection.asBinder()).linkToDeath(any(IBinder.DeathRecipient.class), eq(0));
}
@Test
public void setConnection_connectionIsNull_setMirrorWindowCallbackAndHasWrapper()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
- assertNotNull(mWindowMagnificationManager.mConnectionWrapper);
+ assertTrue(mMagnificationConnectionManager.isConnected());
verify(mMockConnection.asBinder()).linkToDeath(any(IBinder.DeathRecipient.class), eq(0));
verify(mMockConnection.getConnection()).setConnectionCallback(
any(IWindowMagnificationConnectionCallback.class));
@@ -153,31 +151,31 @@ public class WindowMagnificationManagerTest {
@Test
public void binderDied_hasConnection_wrapperIsNullAndUnlinkToDeath() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
mMockConnection.getDeathRecipient().binderDied();
- assertNull(mWindowMagnificationManager.mConnectionWrapper);
+ assertFalse(mMagnificationConnectionManager.isConnected());
verify(mMockConnection.asBinder()).unlinkToDeath(mMockConnection.getDeathRecipient(),
0);
}
/**
- * This test simulates {@link WindowMagnificationManager#setConnection} is called by thread A
- * and then the former connection is called by thread B. In this situation we should keep the
+ * This test simulates {@link MagnificationConnectionManager#setConnection} is called by thread
+ * A and then the former connection is called by thread B. In this situation we should keep the
* new connection.
*/
@Test
public void setSecondConnectionAndFormerConnectionBinderDead_hasWrapperAndNotCallUnlinkToDeath()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
MockWindowMagnificationConnection secondConnection =
new MockWindowMagnificationConnection();
- mWindowMagnificationManager.setConnection(secondConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(secondConnection.getConnection());
mMockConnection.getDeathRecipient().binderDied();
- assertNotNull(mWindowMagnificationManager.mConnectionWrapper);
+ assertTrue(mMagnificationConnectionManager.isConnected());
verify(mMockConnection.asBinder()).unlinkToDeath(mMockConnection.getDeathRecipient(), 0);
verify(secondConnection.asBinder(), never()).unlinkToDeath(
secondConnection.getDeathRecipient(), 0);
@@ -185,20 +183,20 @@ public class WindowMagnificationManagerTest {
@Test
public void setNullConnection_hasConnection_wrapperIsNull() throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.setConnection(null);
+ mMagnificationConnectionManager.setConnection(null);
- assertNull(mWindowMagnificationManager.mConnectionWrapper);
+ assertFalse(mMagnificationConnectionManager.isConnected());
verify(mMockConnection.getConnection()).setConnectionCallback(null);
}
@Test
public void enableWithAnimation_hasConnection_enableWindowMagnification()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 2f, 200f, 300f);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 2f, 200f, 300f);
verify(mMockConnection.getConnection()).enableWindowMagnification(eq(TEST_DISPLAY), eq(2f),
eq(200f), eq(300f), eq(0f), eq(0f), notNull());
@@ -207,9 +205,9 @@ public class WindowMagnificationManagerTest {
@Test
public void enableWithCallback_hasConnection_enableWindowMagnification()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 2f, 200f, 300f,
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 2f, 200f, 300f,
mAnimationCallback, SERVICE_ID);
verify(mMockConnection.getConnection()).enableWindowMagnification(eq(TEST_DISPLAY), eq(2f),
@@ -221,10 +219,10 @@ public class WindowMagnificationManagerTest {
@Test
public void disable_hasConnectionAndEnabled_disableWindowMagnification()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f, NaN, NaN);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f, NaN, NaN);
- mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false);
+ mMagnificationConnectionManager.disableWindowMagnification(TEST_DISPLAY, false);
verify(mMockConnection.getConnection()).disableWindowMagnification(eq(TEST_DISPLAY),
notNull());
@@ -233,10 +231,10 @@ public class WindowMagnificationManagerTest {
@Test
public void disableWithCallback_hasConnectionAndEnabled_disableWindowMagnification()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f, NaN, NaN);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f, NaN, NaN);
- mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false,
+ mMagnificationConnectionManager.disableWindowMagnification(TEST_DISPLAY, false,
mAnimationCallback);
verify(mMockConnection.getConnection()).disableWindowMagnification(eq(TEST_DISPLAY),
@@ -246,28 +244,28 @@ public class WindowMagnificationManagerTest {
@Test
public void isWindowMagnifierEnabled_hasConnectionAndEnabled_returnExpectedValue() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 2f, NaN, NaN);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 2f, NaN, NaN);
- assertTrue(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertTrue(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
}
@Test
public void getPersistedScale() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
- assertEquals(mWindowMagnificationManager.getPersistedScale(TEST_DISPLAY), 2.5f);
+ assertEquals(mMagnificationConnectionManager.getPersistedScale(TEST_DISPLAY), 2.5f);
}
@Test
public void persistScale_setValue_expectedValueInProvider() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 2.0f, NaN, NaN);
- mWindowMagnificationManager.setScale(TEST_DISPLAY, 2.5f);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 2.0f, NaN, NaN);
+ mMagnificationConnectionManager.setScale(TEST_DISPLAY, 2.5f);
- mWindowMagnificationManager.persistScale(TEST_DISPLAY);
+ mMagnificationConnectionManager.persistScale(TEST_DISPLAY);
assertEquals(Settings.Secure.getFloatForUser(mResolver,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, 0f,
@@ -276,11 +274,12 @@ public class WindowMagnificationManagerTest {
@Test
public void persistScale_setValueWhenScaleIsOne_nothingChanged() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- final float persistedScale = mWindowMagnificationManager.getPersistedScale(TEST_DISPLAY);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ final float persistedScale =
+ mMagnificationConnectionManager.getPersistedScale(TEST_DISPLAY);
- mWindowMagnificationManager.setScale(TEST_DISPLAY, 1.0f);
- mWindowMagnificationManager.persistScale(TEST_DISPLAY);
+ mMagnificationConnectionManager.setScale(TEST_DISPLAY, 1.0f);
+ mMagnificationConnectionManager.persistScale(TEST_DISPLAY);
assertEquals(Settings.Secure.getFloatForUser(mResolver,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, 0f,
@@ -289,50 +288,53 @@ public class WindowMagnificationManagerTest {
@Test
public void scaleSetterGetter_enabledOnTestDisplay_expectedValue() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 2.0f, NaN, NaN);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 2.0f, NaN, NaN);
- mWindowMagnificationManager.setScale(TEST_DISPLAY, 2.5f);
+ mMagnificationConnectionManager.setScale(TEST_DISPLAY, 2.5f);
- assertEquals(mWindowMagnificationManager.getScale(TEST_DISPLAY), 2.5f);
+ assertEquals(mMagnificationConnectionManager.getScale(TEST_DISPLAY), 2.5f);
}
@Test
public void scaleSetterGetter_scaleIsOutOfRang_getNormalizeValue() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 2.5f, NaN, NaN);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 2.5f, NaN, NaN);
- mWindowMagnificationManager.setScale(TEST_DISPLAY, 10.0f);
+ mMagnificationConnectionManager.setScale(TEST_DISPLAY, 10.0f);
- assertEquals(mWindowMagnificationManager.getScale(TEST_DISPLAY),
+ assertEquals(mMagnificationConnectionManager.getScale(TEST_DISPLAY),
MagnificationScaleProvider.MAX_SCALE);
}
@FlakyTest(bugId = 297879435)
@Test
public void logTrackingTypingFocus_processScroll_logDuration() {
- WindowMagnificationManager spyWindowMagnificationManager = spy(mWindowMagnificationManager);
- spyWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
- spyWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, /* shown */ true);
+ MagnificationConnectionManager spyMagnificationConnectionManager = spy(
+ mMagnificationConnectionManager);
+ spyMagnificationConnectionManager.enableWindowMagnification(
+ TEST_DISPLAY, 3.0f, 50f, 50f);
+ spyMagnificationConnectionManager.onImeWindowVisibilityChanged(
+ TEST_DISPLAY, /* shown */ true);
- spyWindowMagnificationManager.processScroll(TEST_DISPLAY, 10f, 10f);
+ spyMagnificationConnectionManager.processScroll(TEST_DISPLAY, 10f, 10f);
- verify(spyWindowMagnificationManager).logTrackingTypingFocus(anyLong());
+ verify(spyMagnificationConnectionManager).logTrackingTypingFocus(anyLong());
}
@Test
public void onRectangleOnScreenRequested_trackingDisabledByOnDrag_withoutMovingMagnifier()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
- mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
+ mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
final Region outRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
final Rect requestedRect = outRegion.getBounds();
requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
mMockConnection.getConnectionCallback().onMove(TEST_DISPLAY);
- mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY,
+ mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
verify(mMockConnection.getConnection(), never())
@@ -345,16 +347,16 @@ public class WindowMagnificationManagerTest {
throws RemoteException {
final float distanceX = 10f;
final float distanceY = 10f;
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
- mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
+ mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
final Region outRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
final Rect requestedRect = outRegion.getBounds();
requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
- mWindowMagnificationManager.processScroll(TEST_DISPLAY, distanceX, distanceY);
+ mMagnificationConnectionManager.processScroll(TEST_DISPLAY, distanceX, distanceY);
- mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY,
+ mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
verify(mMockConnection.getConnection(), never())
@@ -364,15 +366,15 @@ public class WindowMagnificationManagerTest {
@Test
public void onRectangleOnScreenRequested_requestRectangleInBound_withoutMovingMagnifier()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
- mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
+ mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
final Region outRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
final Rect requestedRect = outRegion.getBounds();
requestedRect.inset(-10, -10);
- mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY,
+ mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
verify(mMockConnection.getConnection(), never())
@@ -381,14 +383,14 @@ public class WindowMagnificationManagerTest {
@Test
public void onRectangleOnScreenRequested_imeVisibilityDefaultInvisible_withoutMovingMagnifier()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
final Region outRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
final Rect requestedRect = outRegion.getBounds();
requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
- mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY,
+ mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
verify(mMockConnection.getConnection(), never())
@@ -398,15 +400,15 @@ public class WindowMagnificationManagerTest {
@Test
public void onRectangleOnScreenRequested_trackingEnabledByDefault_movingMagnifier()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
- mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
+ mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
final Region outRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
final Rect requestedRect = outRegion.getBounds();
requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
- mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY,
+ mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
verify(mMockConnection.getConnection()).moveWindowMagnifierToPosition(eq(TEST_DISPLAY),
@@ -417,16 +419,16 @@ public class WindowMagnificationManagerTest {
@Test
public void onRectangleOnScreenRequested_imeInvisible_withoutMovingMagnifier()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
- mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
+ mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
final Region outRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
final Rect requestedRect = outRegion.getBounds();
requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
- mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, false);
+ mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, false);
- mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY,
+ mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
verify(mMockConnection.getConnection(), never())
@@ -436,17 +438,17 @@ public class WindowMagnificationManagerTest {
@Test
public void onRectangleOnScreenRequested_trackingEnabledByDragAndReset_movingMagnifier()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
- mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
+ mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
mMockConnection.getConnectionCallback().onMove(TEST_DISPLAY);
- mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
+ mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
final Region outRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion);
final Rect requestedRect = outRegion.getBounds();
requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
- mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY,
+ mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
verify(mMockConnection.getConnection()).moveWindowMagnifierToPosition(eq(TEST_DISPLAY),
@@ -456,58 +458,58 @@ public class WindowMagnificationManagerTest {
@Test
public void onRectangleOnScreenRequested_followTypingIsDisabled_withoutMovingMagnifier() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
- mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
+ mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
final Region beforeRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion);
final Rect requestedRect = beforeRegion.getBounds();
requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
- mWindowMagnificationManager.setMagnificationFollowTypingEnabled(false);
+ mMagnificationConnectionManager.setMagnificationFollowTypingEnabled(false);
- mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY,
+ mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
final Region afterRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, afterRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, afterRegion);
assertEquals(afterRegion, beforeRegion);
}
@Test
public void onRectangleOnScreenRequested_trackingDisabled_withoutMovingMagnifier() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
- mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
- mWindowMagnificationManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
+ mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
+ mMagnificationConnectionManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false);
final Region beforeRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion);
final Rect requestedRect = beforeRegion.getBounds();
requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
- mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY,
+ mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
final Region afterRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, afterRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, afterRegion);
assertEquals(afterRegion, beforeRegion);
}
@Test
public void onRectangleOnScreenRequested_trackingDisabledAndEnabledMagnifier_movingMagnifier()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
- mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
- mWindowMagnificationManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
+ mMagnificationConnectionManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true);
+ mMagnificationConnectionManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false);
final Region beforeRegion = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion);
final Rect requestedRect = beforeRegion.getBounds();
requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
- mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false);
+ mMagnificationConnectionManager.disableWindowMagnification(TEST_DISPLAY, false);
// Enabling a window magnifier again will turn on the tracking typing focus functionality.
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, NaN, NaN, NaN);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, NaN, NaN, NaN);
- mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY,
+ mMagnificationConnectionManager.onRectangleOnScreenRequested(TEST_DISPLAY,
requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
verify(mMockConnection.getConnection()).moveWindowMagnifierToPosition(eq(TEST_DISPLAY),
@@ -517,43 +519,43 @@ public class WindowMagnificationManagerTest {
@Test
public void moveWindowMagnifier_enabled_invokeConnectionMethod() throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 2f, NaN, NaN);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 2f, NaN, NaN);
- mWindowMagnificationManager.moveWindowMagnification(TEST_DISPLAY, 200, 300);
+ mMagnificationConnectionManager.moveWindowMagnification(TEST_DISPLAY, 200, 300);
verify(mMockConnection.getConnection()).moveWindowMagnifier(TEST_DISPLAY, 200, 300);
}
@Test
public void showMagnificationButton_hasConnection_invokeConnectionMethod()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.showMagnificationButton(TEST_DISPLAY,
+ mMagnificationConnectionManager.showMagnificationButton(TEST_DISPLAY,
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
verify(mMockConnection.getConnection()).showMagnificationButton(TEST_DISPLAY,
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
- mWindowMagnificationManager.removeMagnificationButton(TEST_DISPLAY);
+ mMagnificationConnectionManager.removeMagnificationButton(TEST_DISPLAY);
verify(mMockConnection.getConnection()).removeMagnificationButton(TEST_DISPLAY);
}
@Test
public void removeMagnificationSettingsPanel_hasConnection_invokeConnectionMethod()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.removeMagnificationSettingsPanel(TEST_DISPLAY);
+ mMagnificationConnectionManager.removeMagnificationSettingsPanel(TEST_DISPLAY);
verify(mMockConnection.getConnection()).removeMagnificationSettingsPanel(TEST_DISPLAY);
}
@Test
public void onUserMagnificationScaleChanged_hasConnection_invokeConnectionMethod()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
final float testScale = 3f;
- mWindowMagnificationManager.onUserMagnificationScaleChanged(
+ mMagnificationConnectionManager.onUserMagnificationScaleChanged(
CURRENT_USER_ID, TEST_DISPLAY, testScale);
verify(mMockConnection.getConnection()).onUserMagnificationScaleChanged(
eq(CURRENT_USER_ID), eq(TEST_DISPLAY), eq(testScale));
@@ -561,8 +563,8 @@ public class WindowMagnificationManagerTest {
@Test
public void pointersInWindow_magnifierEnabled_returnCorrectValue() throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN);
mMockConnection.getConnectionCallback().onWindowMagnifierBoundsChanged(TEST_DISPLAY,
new Rect(0, 0, 500, 500));
PointF[] pointersLocation = new PointF[2];
@@ -570,15 +572,15 @@ public class WindowMagnificationManagerTest {
pointersLocation[1] = new PointF(300, 400);
MotionEvent event = generatePointersDownEvent(pointersLocation);
- assertEquals(mWindowMagnificationManager.pointersInWindow(TEST_DISPLAY, event), 1);
+ assertEquals(mMagnificationConnectionManager.pointersInWindow(TEST_DISPLAY, event), 1);
}
@Test
public void onPerformScaleAction_magnifierEnabled_notifyAction() throws RemoteException {
final float newScale = 4.0f;
final boolean updatePersistence = true;
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN);
mMockConnection.getConnectionCallback().onPerformScaleAction(
TEST_DISPLAY, newScale, updatePersistence);
@@ -590,8 +592,8 @@ public class WindowMagnificationManagerTest {
@Test
public void onAccessibilityActionPerformed_magnifierEnabled_notifyAction()
throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN);
mMockConnection.getConnectionCallback().onAccessibilityActionPerformed(TEST_DISPLAY);
@@ -600,22 +602,22 @@ public class WindowMagnificationManagerTest {
@Test
public void binderDied_windowMagnifierIsEnabled_resetState() throws RemoteException {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f, NaN, NaN);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f, NaN, NaN);
mMockConnection.getDeathRecipient().binderDied();
- assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
}
@Test
public void
requestConnectionToNull_disableAllMagnifiersAndRequestWindowMagnificationConnection()
throws RemoteException {
- assertTrue(mWindowMagnificationManager.requestConnection(true));
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f, NaN, NaN);
+ assertTrue(mMagnificationConnectionManager.requestConnection(true));
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f, NaN, NaN);
- assertTrue(mWindowMagnificationManager.requestConnection(false));
+ assertTrue(mMagnificationConnectionManager.requestConnection(false));
verify(mMockConnection.getConnection()).disableWindowMagnification(TEST_DISPLAY, null);
verify(mMockStatusBarManagerInternal).requestWindowMagnificationConnection(false);
@@ -623,40 +625,40 @@ public class WindowMagnificationManagerTest {
@Test
public void requestConnection_requestWindowMagnificationConnection() throws RemoteException {
- assertTrue(mWindowMagnificationManager.requestConnection(true));
+ assertTrue(mMagnificationConnectionManager.requestConnection(true));
verify(mMockStatusBarManagerInternal).requestWindowMagnificationConnection(true);
}
@Test
public void isConnected_requestConnection_expectedValue() throws RemoteException {
- mWindowMagnificationManager.requestConnection(true);
- assertTrue(mWindowMagnificationManager.isConnected());
+ mMagnificationConnectionManager.requestConnection(true);
+ assertTrue(mMagnificationConnectionManager.isConnected());
- mWindowMagnificationManager.requestConnection(false);
- assertFalse(mWindowMagnificationManager.isConnected());
+ mMagnificationConnectionManager.requestConnection(false);
+ assertFalse(mMagnificationConnectionManager.isConnected());
}
@Test
public void requestConnection_registerAndUnregisterBroadcastReceiver() {
- assertTrue(mWindowMagnificationManager.requestConnection(true));
+ assertTrue(mMagnificationConnectionManager.requestConnection(true));
verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
- assertTrue(mWindowMagnificationManager.requestConnection(false));
+ assertTrue(mMagnificationConnectionManager.requestConnection(false));
verify(mContext).unregisterReceiver(any(BroadcastReceiver.class));
}
@Test
public void requestConnectionToNull_expectedGetterResults() {
- mWindowMagnificationManager.requestConnection(true);
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f, 1, 1);
+ mMagnificationConnectionManager.requestConnection(true);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f, 1, 1);
- mWindowMagnificationManager.requestConnection(false);
+ mMagnificationConnectionManager.requestConnection(false);
- assertEquals(1f, mWindowMagnificationManager.getScale(TEST_DISPLAY), 0);
- assertTrue(Float.isNaN(mWindowMagnificationManager.getCenterX(TEST_DISPLAY)));
- assertTrue(Float.isNaN(mWindowMagnificationManager.getCenterY(TEST_DISPLAY)));
+ assertEquals(1f, mMagnificationConnectionManager.getScale(TEST_DISPLAY), 0);
+ assertTrue(Float.isNaN(mMagnificationConnectionManager.getCenterX(TEST_DISPLAY)));
+ assertTrue(Float.isNaN(mMagnificationConnectionManager.getCenterY(TEST_DISPLAY)));
final Region bounds = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, bounds);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, bounds);
assertTrue(bounds.isEmpty());
}
@@ -664,9 +666,10 @@ public class WindowMagnificationManagerTest {
public void enableWindowMagnification_connecting_invokeConnectionMethodAfterConnected()
throws RemoteException {
stubSetConnection(true);
- mWindowMagnificationManager.requestConnection(true);
+ mMagnificationConnectionManager.requestConnection(true);
- assertTrue(mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f, 1, 1));
+ assertTrue(mMagnificationConnectionManager.enableWindowMagnification(
+ TEST_DISPLAY, 3f, 1, 1));
// Invoke enableWindowMagnification if the connection is connected.
verify(mMockConnection.getConnection()).enableWindowMagnification(
@@ -676,69 +679,73 @@ public class WindowMagnificationManagerTest {
@Test
public void resetAllMagnification_enabledBySameId_windowMagnifiersDisabled() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f,
- 100f, 200f, null, WindowMagnificationManager.WINDOW_POSITION_AT_CENTER, SERVICE_ID);
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY_2, 3f,
- 100f, 200f, null, WindowMagnificationManager.WINDOW_POSITION_AT_CENTER, SERVICE_ID);
- assertTrue(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
- assertTrue(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY_2));
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f,
+ 100f, 200f, null,
+ MagnificationConnectionManager.WINDOW_POSITION_AT_CENTER, SERVICE_ID);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY_2, 3f,
+ 100f, 200f, null,
+ MagnificationConnectionManager.WINDOW_POSITION_AT_CENTER, SERVICE_ID);
+ assertTrue(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertTrue(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY_2));
- mWindowMagnificationManager.resetAllIfNeeded(SERVICE_ID);
+ mMagnificationConnectionManager.resetAllIfNeeded(SERVICE_ID);
- assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
- assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY_2));
+ assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY_2));
}
@Test
public void resetAllMagnification_enabledByDifferentId_windowMagnifierDisabled() {
final int serviceId2 = SERVICE_ID + 1;
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f,
- 100f, 200f, null, WindowMagnificationManager.WINDOW_POSITION_AT_CENTER, SERVICE_ID);
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY_2, 3f,
- 100f, 200f, null, WindowMagnificationManager.WINDOW_POSITION_AT_CENTER, serviceId2);
- assertTrue(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
- assertTrue(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY_2));
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f,
+ 100f, 200f, null,
+ MagnificationConnectionManager.WINDOW_POSITION_AT_CENTER, SERVICE_ID);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY_2, 3f,
+ 100f, 200f, null,
+ MagnificationConnectionManager.WINDOW_POSITION_AT_CENTER, serviceId2);
+ assertTrue(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertTrue(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY_2));
- mWindowMagnificationManager.resetAllIfNeeded(SERVICE_ID);
+ mMagnificationConnectionManager.resetAllIfNeeded(SERVICE_ID);
- assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
- assertTrue(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY_2));
+ assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertTrue(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY_2));
}
@Test
public void onScreenOff_windowMagnifierIsEnabled_removeButtonAndDisableWindowMagnification()
throws RemoteException {
- mWindowMagnificationManager.requestConnection(true);
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 2.5f, NaN, NaN);
+ mMagnificationConnectionManager.requestConnection(true);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 2.5f, NaN, NaN);
- mWindowMagnificationManager.mScreenStateReceiver.onReceive(mContext,
+ mMagnificationConnectionManager.mScreenStateReceiver.onReceive(mContext,
new Intent(Intent.ACTION_SCREEN_OFF));
verify(mMockConnection.getConnection()).removeMagnificationButton(TEST_DISPLAY);
verify(mMockConnection.getConnection()).disableWindowMagnification(TEST_DISPLAY, null);
- assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
}
@Test
public void centerGetter_enabledOnTestDisplay_expectedValues() {
- mWindowMagnificationManager.requestConnection(true);
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f, 100f, 200f);
+ mMagnificationConnectionManager.requestConnection(true);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f, 100f, 200f);
- assertEquals(mWindowMagnificationManager.getCenterX(TEST_DISPLAY), 100f);
- assertEquals(mWindowMagnificationManager.getCenterY(TEST_DISPLAY), 200f);
+ assertEquals(mMagnificationConnectionManager.getCenterX(TEST_DISPLAY), 100f);
+ assertEquals(mMagnificationConnectionManager.getCenterY(TEST_DISPLAY), 200f);
}
@Test
public void centerGetter_enabledOnTestDisplayWindowAtCenter_expectedValues()
throws RemoteException {
- mWindowMagnificationManager.requestConnection(true);
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f,
- 100f, 200f, WindowMagnificationManager.WINDOW_POSITION_AT_CENTER);
+ mMagnificationConnectionManager.requestConnection(true);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f,
+ 100f, 200f, MagnificationConnectionManager.WINDOW_POSITION_AT_CENTER);
- assertEquals(mWindowMagnificationManager.getCenterX(TEST_DISPLAY), 100f);
- assertEquals(mWindowMagnificationManager.getCenterY(TEST_DISPLAY), 200f);
+ assertEquals(mMagnificationConnectionManager.getCenterX(TEST_DISPLAY), 100f);
+ assertEquals(mMagnificationConnectionManager.getCenterY(TEST_DISPLAY), 200f);
verify(mMockConnection.getConnection()).enableWindowMagnification(eq(TEST_DISPLAY), eq(3f),
eq(100f), eq(200f), eq(0f), eq(0f), notNull());
@@ -747,12 +754,12 @@ public class WindowMagnificationManagerTest {
@Test
public void centerGetter_enabledOnTestDisplayWindowAtLeftTop_expectedValues()
throws RemoteException {
- mWindowMagnificationManager.requestConnection(true);
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f,
- 100f, 200f, WindowMagnificationManager.WINDOW_POSITION_AT_TOP_LEFT);
+ mMagnificationConnectionManager.requestConnection(true);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f,
+ 100f, 200f, MagnificationConnectionManager.WINDOW_POSITION_AT_TOP_LEFT);
- assertEquals(mWindowMagnificationManager.getCenterX(TEST_DISPLAY), 100f);
- assertEquals(mWindowMagnificationManager.getCenterY(TEST_DISPLAY), 200f);
+ assertEquals(mMagnificationConnectionManager.getCenterX(TEST_DISPLAY), 100f);
+ assertEquals(mMagnificationConnectionManager.getCenterY(TEST_DISPLAY), 200f);
verify(mMockConnection.getConnection()).enableWindowMagnification(eq(TEST_DISPLAY), eq(3f),
eq(100f), eq(200f), eq(-1f), eq(-1f), notNull());
@@ -760,48 +767,48 @@ public class WindowMagnificationManagerTest {
@Test
public void magnifierGetters_disabled_expectedValues() {
- mWindowMagnificationManager.requestConnection(true);
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f,
- 100f, 200f, WindowMagnificationManager.WINDOW_POSITION_AT_CENTER);
+ mMagnificationConnectionManager.requestConnection(true);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f,
+ 100f, 200f, MagnificationConnectionManager.WINDOW_POSITION_AT_CENTER);
- mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false);
+ mMagnificationConnectionManager.disableWindowMagnification(TEST_DISPLAY, false);
- assertEquals(1f, mWindowMagnificationManager.getScale(TEST_DISPLAY), 0);
- assertTrue(Float.isNaN(mWindowMagnificationManager.getCenterX(TEST_DISPLAY)));
- assertTrue(Float.isNaN(mWindowMagnificationManager.getCenterY(TEST_DISPLAY)));
+ assertEquals(1f, mMagnificationConnectionManager.getScale(TEST_DISPLAY), 0);
+ assertTrue(Float.isNaN(mMagnificationConnectionManager.getCenterX(TEST_DISPLAY)));
+ assertTrue(Float.isNaN(mMagnificationConnectionManager.getCenterY(TEST_DISPLAY)));
final Region bounds = new Region();
- mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, bounds);
+ mMagnificationConnectionManager.getMagnificationSourceBounds(TEST_DISPLAY, bounds);
assertTrue(bounds.isEmpty());
}
@Test
public void onDisplayRemoved_enabledOnTestDisplay_disabled() {
- mWindowMagnificationManager.requestConnection(true);
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f, 100f, 200f);
+ mMagnificationConnectionManager.requestConnection(true);
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3f, 100f, 200f);
- mWindowMagnificationManager.onDisplayRemoved(TEST_DISPLAY);
+ mMagnificationConnectionManager.onDisplayRemoved(TEST_DISPLAY);
- assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
}
@Test
public void onWindowMagnificationActivationState_magnifierEnabled_notifyActivatedState() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN);
verify(mMockCallback).onWindowMagnificationActivationState(TEST_DISPLAY, true);
}
@Test
public void onWindowMagnificationActivationState_magnifierDisabled_notifyDeactivatedState() {
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN);
- mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false);
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN);
+ mMagnificationConnectionManager.disableWindowMagnification(TEST_DISPLAY, false);
verify(mMockCallback).onWindowMagnificationActivationState(TEST_DISPLAY, false);
Mockito.reset(mMockCallback);
- mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false);
+ mMagnificationConnectionManager.disableWindowMagnification(TEST_DISPLAY, false);
verify(mMockCallback, never()).onWindowMagnificationActivationState(eq(TEST_DISPLAY),
anyBoolean());
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionWrapperTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionWrapperTest.java
index cfd0289e5650..8f85f11b7c49 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionWrapperTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionWrapperTest.java
@@ -39,7 +39,7 @@ import org.mockito.MockitoAnnotations;
/**
* Tests for MagnificationConnectionWrapper. We don't test {@code
* MagnificationConnectionWrapper#linkToDeath(IBinder.DeathRecipient)} since it's tested in
- * {@link WindowMagnificationManagerTest}.
+ * {@link MagnificationConnectionManagerTest}.
*/
public class MagnificationConnectionWrapperTest {
@@ -73,9 +73,9 @@ public class MagnificationConnectionWrapperTest {
}
@Test
- public void setScale() throws RemoteException {
- mConnectionWrapper.setScale(TEST_DISPLAY, 3.0f);
- verify(mConnection).setScale(TEST_DISPLAY, 3.0f);
+ public void setScaleForWindowMagnification() throws RemoteException {
+ mConnectionWrapper.setScaleForWindowMagnification(TEST_DISPLAY, 3.0f);
+ verify(mConnection).setScaleForWindowMagnification(TEST_DISPLAY, 3.0f);
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
index d4c6fad99645..e8cdf35dee13 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
@@ -131,7 +131,7 @@ public class MagnificationControllerTest {
private ArgumentCaptor<MagnificationAnimationCallback> mCallbackArgumentCaptor;
private MockWindowMagnificationConnection mMockConnection;
- private WindowMagnificationManager mWindowMagnificationManager;
+ private MagnificationConnectionManager mMagnificationConnectionManager;
private MockContentResolver mMockResolver;
private MagnificationController mMagnificationController;
private final WindowMagnificationMgrCallbackDelegate
@@ -205,13 +205,14 @@ public class MagnificationControllerTest {
));
mScreenMagnificationController.register(TEST_DISPLAY);
- mWindowMagnificationManager = spy(new WindowMagnificationManager(mContext, globalLock,
- mWindowMagnificationCallbackDelegate, mTraceManager, mScaleProvider));
+ mMagnificationConnectionManager = spy(
+ new MagnificationConnectionManager(mContext, globalLock,
+ mWindowMagnificationCallbackDelegate, mTraceManager, mScaleProvider));
mMockConnection = new MockWindowMagnificationConnection(true);
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
mMagnificationController = spy(new MagnificationController(mService, globalLock, mContext,
- mScreenMagnificationController, mWindowMagnificationManager, mScaleProvider,
+ mScreenMagnificationController, mMagnificationConnectionManager, mScaleProvider,
ConcurrentUtils.DIRECT_EXECUTOR));
mMagnificationController.setMagnificationCapabilities(
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL);
@@ -254,8 +255,10 @@ public class MagnificationControllerTest {
mCallbackArgumentCaptor.getValue().onResult(true);
mMockConnection.invokeCallbacks();
verify(mTransitionCallBack).onResult(TEST_DISPLAY, true);
- assertEquals(MAGNIFIED_CENTER_X, mWindowMagnificationManager.getCenterX(TEST_DISPLAY), 0);
- assertEquals(MAGNIFIED_CENTER_Y, mWindowMagnificationManager.getCenterY(TEST_DISPLAY), 0);
+ assertEquals(MAGNIFIED_CENTER_X,
+ mMagnificationConnectionManager.getCenterX(TEST_DISPLAY), 0);
+ assertEquals(MAGNIFIED_CENTER_Y,
+ mMagnificationConnectionManager.getCenterY(TEST_DISPLAY), 0);
}
@Test
@@ -297,8 +300,10 @@ public class MagnificationControllerTest {
mMockConnection.invokeCallbacks();
verify(mTransitionCallBack).onResult(TEST_DISPLAY, true);
- assertEquals(MAGNIFIED_CENTER_X, mWindowMagnificationManager.getCenterX(TEST_DISPLAY), 0);
- assertEquals(MAGNIFIED_CENTER_Y, mWindowMagnificationManager.getCenterY(TEST_DISPLAY), 0);
+ assertEquals(MAGNIFIED_CENTER_X,
+ mMagnificationConnectionManager.getCenterX(TEST_DISPLAY), 0);
+ assertEquals(MAGNIFIED_CENTER_Y,
+ mMagnificationConnectionManager.getCenterY(TEST_DISPLAY), 0);
}
@Test
@@ -316,7 +321,7 @@ public class MagnificationControllerTest {
// The first time is triggered when window mode is activated.
// The second time is triggered when activating the window mode again.
// The third time is triggered when the transition is completed.
- verify(mWindowMagnificationManager, times(3)).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, times(3)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
}
@@ -330,7 +335,7 @@ public class MagnificationControllerTest {
mTransitionCallBack);
mMockConnection.invokeCallbacks();
- assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
verify(mScreenMagnificationController).setScaleAndCenter(TEST_DISPLAY,
DEFAULT_SCALE, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y,
true, MAGNIFICATION_GESTURE_HANDLER_ID);
@@ -350,7 +355,7 @@ public class MagnificationControllerTest {
mTransitionCallBack);
mMockConnection.invokeCallbacks();
- assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
verify(mScreenMagnificationController).setScaleAndCenter(TEST_DISPLAY, DEFAULT_SCALE,
magnificationBounds.exactCenterX(), magnificationBounds.exactCenterY(), true,
MAGNIFICATION_GESTURE_HANDLER_ID);
@@ -386,11 +391,11 @@ public class MagnificationControllerTest {
mTransitionCallBack);
// Enable window magnification while animating.
- mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, DEFAULT_SCALE,
+ mMagnificationConnectionManager.enableWindowMagnification(TEST_DISPLAY, DEFAULT_SCALE,
Float.NaN, Float.NaN, null, TEST_SERVICE_ID);
mMockConnection.invokeCallbacks();
- assertTrue(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertTrue(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
verify(mScreenMagnificationController, never()).setScaleAndCenter(TEST_DISPLAY,
DEFAULT_SCALE, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y,
true, MAGNIFICATION_GESTURE_HANDLER_ID);
@@ -408,8 +413,10 @@ public class MagnificationControllerTest {
verify(mScreenMagnificationController).reset(eq(TEST_DISPLAY), eq(false));
mMockConnection.invokeCallbacks();
- assertEquals(MAGNIFIED_CENTER_X, mWindowMagnificationManager.getCenterX(TEST_DISPLAY), 0);
- assertEquals(MAGNIFIED_CENTER_Y, mWindowMagnificationManager.getCenterY(TEST_DISPLAY), 0);
+ assertEquals(MAGNIFIED_CENTER_X,
+ mMagnificationConnectionManager.getCenterX(TEST_DISPLAY), 0);
+ assertEquals(MAGNIFIED_CENTER_Y,
+ mMagnificationConnectionManager.getCenterY(TEST_DISPLAY), 0);
}
@Test
@@ -438,7 +445,7 @@ public class MagnificationControllerTest {
animate, TEST_SERVICE_ID);
mMockConnection.invokeCallbacks();
- assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
verify(mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY),
eq(DEFAULT_SCALE), eq(MAGNIFIED_CENTER_X), eq(MAGNIFIED_CENTER_Y),
any(MagnificationAnimationCallback.class), eq(TEST_SERVICE_ID));
@@ -564,7 +571,7 @@ public class MagnificationControllerTest {
mMagnificationController.onDisplayRemoved(TEST_DISPLAY);
verify(mScreenMagnificationController).onDisplayRemoved(TEST_DISPLAY);
- verify(mWindowMagnificationManager).onDisplayRemoved(TEST_DISPLAY);
+ verify(mMagnificationConnectionManager).onDisplayRemoved(TEST_DISPLAY);
verify(mScaleProvider).onDisplayRemoved(TEST_DISPLAY);
}
@@ -573,7 +580,7 @@ public class MagnificationControllerTest {
mMagnificationController.updateUserIdIfNeeded(SECOND_USER_ID);
verify(mScreenMagnificationController).resetAllIfNeeded(false);
- verify(mWindowMagnificationManager).disableAllWindowMagnifiers();
+ verify(mMagnificationConnectionManager).disableAllWindowMagnifiers();
verify(mScaleProvider).onUserChanged(SECOND_USER_ID);
}
@@ -584,7 +591,7 @@ public class MagnificationControllerTest {
mMagnificationController.onRequestMagnificationSpec(TEST_DISPLAY, TEST_SERVICE_ID);
mMockConnection.invokeCallbacks();
- assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
+ assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY));
}
@Test
@@ -594,11 +601,11 @@ public class MagnificationControllerTest {
// The first time is trigger when fullscreen mode is activated.
// The second time is triggered when magnification spec is changed.
- verify(mWindowMagnificationManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_FULLSCREEN));
// Never call removeMagnificationSettingsPanel if it is allowed to show the settings panel
// in current capability and mode, and the magnification is activated.
- verify(mWindowMagnificationManager, never()).removeMagnificationSettingsPanel(
+ verify(mMagnificationConnectionManager, never()).removeMagnificationSettingsPanel(
eq(TEST_DISPLAY));
}
@@ -625,8 +632,8 @@ public class MagnificationControllerTest {
mMagnificationController.onPerformScaleAction(TEST_DISPLAY, newScale, updatePersistence);
- verify(mWindowMagnificationManager).setScale(eq(TEST_DISPLAY), eq(newScale));
- verify(mWindowMagnificationManager, never()).persistScale(eq(TEST_DISPLAY));
+ verify(mMagnificationConnectionManager).setScale(eq(TEST_DISPLAY), eq(newScale));
+ verify(mMagnificationConnectionManager, never()).persistScale(eq(TEST_DISPLAY));
}
@Test
@@ -669,7 +676,7 @@ public class MagnificationControllerTest {
assertEquals(config.getCenterY(), actualConfig.getCenterY(), 0);
assertEquals(config.getScale(), actualConfig.getScale(), 0);
- verify(mWindowMagnificationManager).onUserMagnificationScaleChanged(
+ verify(mMagnificationConnectionManager).onUserMagnificationScaleChanged(
/* userId= */ anyInt(), eq(TEST_DISPLAY), eq(config.getScale()));
}
@@ -677,11 +684,11 @@ public class MagnificationControllerTest {
public void onSourceBoundChanged_windowEnabled_notifyMagnificationChanged()
throws RemoteException {
setMagnificationEnabled(MODE_WINDOW);
- reset(mWindowMagnificationManager);
+ reset(mMagnificationConnectionManager);
mMagnificationController.onSourceBoundsChanged(TEST_DISPLAY, TEST_RECT);
- verify(mWindowMagnificationManager).onUserMagnificationScaleChanged(
+ verify(mMagnificationConnectionManager).onUserMagnificationScaleChanged(
/* userId= */ anyInt(), eq(TEST_DISPLAY), eq(DEFAULT_SCALE));
}
@@ -780,11 +787,11 @@ public class MagnificationControllerTest {
// The first time is triggered when window mode is activated.
// The second time is triggered when accessibility action performed.
- verify(mWindowMagnificationManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
// Never call removeMagnificationSettingsPanel if it is allowed to show the settings panel
// in current capability and mode, and the magnification is activated.
- verify(mWindowMagnificationManager, never()).removeMagnificationSettingsPanel(
+ verify(mMagnificationConnectionManager, never()).removeMagnificationSettingsPanel(
eq(TEST_DISPLAY));
}
@@ -799,10 +806,11 @@ public class MagnificationControllerTest {
// The first time is triggered when window mode is activated.
// The second time is triggered when accessibility action performed.
- verify(mWindowMagnificationManager, times(2)).removeMagnificationButton(eq(TEST_DISPLAY));
+ verify(mMagnificationConnectionManager, times(2))
+ .removeMagnificationButton(eq(TEST_DISPLAY));
// Never call removeMagnificationSettingsPanel if it is allowed to show the settings panel
// in current capability and mode, and the magnification is activated.
- verify(mWindowMagnificationManager, never()).removeMagnificationSettingsPanel(
+ verify(mMagnificationConnectionManager, never()).removeMagnificationSettingsPanel(
eq(TEST_DISPLAY));
}
@@ -816,7 +824,7 @@ public class MagnificationControllerTest {
public void deactivateWindowMagnification_windowActivated_triggerCallbackAndLogUsage()
throws RemoteException {
setMagnificationEnabled(MODE_WINDOW);
- mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, /* clear= */ true);
+ mMagnificationConnectionManager.disableWindowMagnification(TEST_DISPLAY, /* clear= */ true);
verify(mMagnificationController).onWindowMagnificationActivationState(
eq(TEST_DISPLAY), eq(false));
@@ -828,7 +836,7 @@ public class MagnificationControllerTest {
public void setPreferenceMagnificationFollowTypingEnabled_setPrefDisabled_disableAll() {
mMagnificationController.setMagnificationFollowTypingEnabled(false);
- verify(mWindowMagnificationManager).setMagnificationFollowTypingEnabled(eq(false));
+ verify(mMagnificationConnectionManager).setMagnificationFollowTypingEnabled(eq(false));
verify(mScreenMagnificationController).setMagnificationFollowTypingEnabled(eq(false));
}
@@ -850,7 +858,7 @@ public class MagnificationControllerTest {
verify(mScreenMagnificationController).onRectangleOnScreenRequested(eq(TEST_DISPLAY),
eq(TEST_RECT.left), eq(TEST_RECT.top), eq(TEST_RECT.right), eq(TEST_RECT.bottom));
- verify(mWindowMagnificationManager, never()).onRectangleOnScreenRequested(anyInt(),
+ verify(mMagnificationConnectionManager, never()).onRectangleOnScreenRequested(anyInt(),
anyInt(), anyInt(), anyInt(), anyInt());
}
@@ -867,7 +875,7 @@ public class MagnificationControllerTest {
verify(mScreenMagnificationController, never()).onRectangleOnScreenRequested(anyInt(),
anyInt(), anyInt(), anyInt(), anyInt());
- verify(mWindowMagnificationManager, never()).onRectangleOnScreenRequested(anyInt(),
+ verify(mMagnificationConnectionManager, never()).onRectangleOnScreenRequested(anyInt(),
anyInt(), anyInt(), anyInt(), anyInt());
}
@@ -880,7 +888,7 @@ public class MagnificationControllerTest {
verify(mScreenMagnificationController, never()).onRectangleOnScreenRequested(
eq(TEST_DISPLAY), anyInt(), anyInt(), anyInt(), anyInt());
- verify(mWindowMagnificationManager, never()).onRectangleOnScreenRequested(anyInt(),
+ verify(mMagnificationConnectionManager, never()).onRectangleOnScreenRequested(anyInt(),
anyInt(), anyInt(), anyInt(), anyInt());
}
@@ -895,7 +903,7 @@ public class MagnificationControllerTest {
verify(mScreenMagnificationController, never()).onRectangleOnScreenRequested(
eq(TEST_DISPLAY), anyInt(), anyInt(), anyInt(), anyInt());
- verify(mWindowMagnificationManager, never()).onRectangleOnScreenRequested(anyInt(),
+ verify(mMagnificationConnectionManager, never()).onRectangleOnScreenRequested(anyInt(),
anyInt(), anyInt(), anyInt(), anyInt());
}
@@ -970,7 +978,8 @@ public class MagnificationControllerTest {
mMagnificationController.onFullScreenMagnificationActivationState(TEST_DISPLAY, true);
- verify(mWindowMagnificationManager).disableWindowMagnification(eq(TEST_DISPLAY), eq(false));
+ verify(mMagnificationConnectionManager)
+ .disableWindowMagnification(eq(TEST_DISPLAY), eq(false));
}
@Test
@@ -983,11 +992,11 @@ public class MagnificationControllerTest {
// The first time is triggered when fullscreen mode is activated.
// The second time is triggered when magnification spec is changed.
// The third time is triggered when user interaction changed.
- verify(mWindowMagnificationManager, times(3)).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, times(3)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_FULLSCREEN));
// Never call removeMagnificationSettingsPanel if it is allowed to show the settings panel
// in current capability and mode, and the magnification is activated.
- verify(mWindowMagnificationManager, never()).removeMagnificationSettingsPanel(
+ verify(mMagnificationConnectionManager, never()).removeMagnificationSettingsPanel(
eq(TEST_DISPLAY));
}
@@ -1001,11 +1010,11 @@ public class MagnificationControllerTest {
// The first time is triggered when fullscreen mode is activated.
// The second time is triggered when magnification spec is changed.
// The third time is triggered when user interaction changed.
- verify(mWindowMagnificationManager, times(3)).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, times(3)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_FULLSCREEN));
// Never call removeMagnificationSettingsPanel if it is allowed to show the settings panel
// in current capability and mode, and the magnification is activated.
- verify(mWindowMagnificationManager, never()).removeMagnificationSettingsPanel(
+ verify(mMagnificationConnectionManager, never()).removeMagnificationSettingsPanel(
eq(TEST_DISPLAY));
}
@@ -1018,11 +1027,11 @@ public class MagnificationControllerTest {
// The first time is triggered when the window mode is activated.
// The second time is triggered when user interaction changed.
- verify(mWindowMagnificationManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
// Never call removeMagnificationSettingsPanel if it is allowed to show the settings panel
// in current capability and mode, and the magnification is activated.
- verify(mWindowMagnificationManager, never()).removeMagnificationSettingsPanel(
+ verify(mMagnificationConnectionManager, never()).removeMagnificationSettingsPanel(
eq(TEST_DISPLAY));
}
@@ -1035,11 +1044,11 @@ public class MagnificationControllerTest {
// The first time is triggered when the window mode is activated.
// The second time is triggered when user interaction changed.
- verify(mWindowMagnificationManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
// Never call removeMagnificationSettingsPanel if it is allowed to show the settings panel
// in current capability and mode, and the magnification is activated.
- verify(mWindowMagnificationManager, never()).removeMagnificationSettingsPanel(
+ verify(mMagnificationConnectionManager, never()).removeMagnificationSettingsPanel(
eq(TEST_DISPLAY));
}
@@ -1053,11 +1062,11 @@ public class MagnificationControllerTest {
mMagnificationController.onTouchInteractionStart(TEST_DISPLAY, MODE_FULLSCREEN);
mMagnificationController.onTouchInteractionEnd(TEST_DISPLAY, MODE_FULLSCREEN);
- verify(mWindowMagnificationManager, never()).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, never()).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_FULLSCREEN));
// The first time is triggered when fullscreen mode is activated.
// The second time is triggered when magnification spec is changed.
- verify(mWindowMagnificationManager, times(2)).removeMagnificationSettingsPanel(
+ verify(mMagnificationConnectionManager, times(2)).removeMagnificationSettingsPanel(
eq(TEST_DISPLAY));
}
@@ -1071,9 +1080,9 @@ public class MagnificationControllerTest {
mMagnificationController.onTouchInteractionStart(TEST_DISPLAY, MODE_FULLSCREEN);
mMagnificationController.onTouchInteractionEnd(TEST_DISPLAY, MODE_FULLSCREEN);
- verify(mWindowMagnificationManager, never()).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, never()).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_FULLSCREEN));
- verify(mWindowMagnificationManager, times(2)).removeMagnificationSettingsPanel(
+ verify(mMagnificationConnectionManager, times(2)).removeMagnificationSettingsPanel(
eq(TEST_DISPLAY));
}
@@ -1082,11 +1091,11 @@ public class MagnificationControllerTest {
throws RemoteException {
setMagnificationEnabled(MODE_WINDOW);
- verify(mWindowMagnificationManager).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
// Never call removeMagnificationSettingsPanel if it is allowed to show the settings panel
// in current capability and mode, and the magnification is activated.
- verify(mWindowMagnificationManager, never()).removeMagnificationSettingsPanel(
+ verify(mMagnificationConnectionManager, never()).removeMagnificationSettingsPanel(
eq(TEST_DISPLAY));
}
@@ -1100,11 +1109,11 @@ public class MagnificationControllerTest {
// The first time is triggered when fullscreen mode is activated.
// The second time is triggered when magnification spec is changed.
// The third time is triggered when fullscreen mode activation state is updated.
- verify(mWindowMagnificationManager, times(3)).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, times(3)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_FULLSCREEN));
// Never call removeMagnificationSettingsPanel if it is allowed to show the settings panel
// in current capability and mode, and the magnification is activated.
- verify(mWindowMagnificationManager, never()).removeMagnificationSettingsPanel(
+ verify(mMagnificationConnectionManager, never()).removeMagnificationSettingsPanel(
eq(TEST_DISPLAY));
}
@@ -1113,10 +1122,10 @@ public class MagnificationControllerTest {
throws RemoteException {
setMagnificationEnabled(MODE_WINDOW);
- mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false);
+ mMagnificationConnectionManager.disableWindowMagnification(TEST_DISPLAY, false);
- verify(mWindowMagnificationManager).removeMagnificationButton(eq(TEST_DISPLAY));
- verify(mWindowMagnificationManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
+ verify(mMagnificationConnectionManager).removeMagnificationButton(eq(TEST_DISPLAY));
+ verify(mMagnificationConnectionManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
}
@Test
@@ -1126,8 +1135,8 @@ public class MagnificationControllerTest {
setMagnificationEnabled(MODE_FULLSCREEN);
mScreenMagnificationController.reset(TEST_DISPLAY, /* animate= */ true);
- verify(mWindowMagnificationManager).removeMagnificationButton(eq(TEST_DISPLAY));
- verify(mWindowMagnificationManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
+ verify(mMagnificationConnectionManager).removeMagnificationButton(eq(TEST_DISPLAY));
+ verify(mMagnificationConnectionManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
}
@Test
@@ -1142,10 +1151,10 @@ public class MagnificationControllerTest {
// The first time is triggered when fullscreen mode is activated.
// The second time is triggered when magnification spec is changed.
// The third time is triggered when the disable-magnification callback is triggered.
- verify(mWindowMagnificationManager, times(3)).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, times(3)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_FULLSCREEN));
// It is triggered when the disable-magnification callback is triggered.
- verify(mWindowMagnificationManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
+ verify(mMagnificationConnectionManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
}
@Test
@@ -1163,10 +1172,10 @@ public class MagnificationControllerTest {
// The first time is triggered when window mode is activated.
// The second time is triggered when the disable-magnification callback is triggered.
- verify(mWindowMagnificationManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
+ verify(mMagnificationConnectionManager, times(2)).showMagnificationButton(eq(TEST_DISPLAY),
eq(MODE_WINDOW));
// It is triggered when the disable-magnification callback is triggered.
- verify(mWindowMagnificationManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
+ verify(mMagnificationConnectionManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
}
@Test
@@ -1174,9 +1183,9 @@ public class MagnificationControllerTest {
throws RemoteException {
setMagnificationEnabled(MODE_WINDOW);
- mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false);
+ mMagnificationConnectionManager.disableWindowMagnification(TEST_DISPLAY, false);
- verify(mWindowMagnificationManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
+ verify(mMagnificationConnectionManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
}
@Test
@@ -1185,7 +1194,7 @@ public class MagnificationControllerTest {
setMagnificationEnabled(MODE_FULLSCREEN);
mScreenMagnificationController.reset(TEST_DISPLAY, /* animate= */ true);
- verify(mWindowMagnificationManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
+ verify(mMagnificationConnectionManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY));
}
@Test
@@ -1260,17 +1269,17 @@ public class MagnificationControllerTest {
private void activateMagnifier(int displayId, int mode, float centerX, float centerY)
throws RemoteException {
- final boolean windowMagnifying = mWindowMagnificationManager.isWindowMagnifierEnabled(
+ final boolean windowMagnifying = mMagnificationConnectionManager.isWindowMagnifierEnabled(
displayId);
if (windowMagnifying) {
- mWindowMagnificationManager.disableWindowMagnification(displayId, false);
+ mMagnificationConnectionManager.disableWindowMagnification(displayId, false);
mMockConnection.invokeCallbacks();
}
if (mode == MODE_FULLSCREEN) {
mScreenMagnificationController.setScaleAndCenter(displayId, DEFAULT_SCALE, centerX,
centerY, true, AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID);
} else {
- mWindowMagnificationManager.enableWindowMagnification(displayId, DEFAULT_SCALE,
+ mMagnificationConnectionManager.enableWindowMagnification(displayId, DEFAULT_SCALE,
centerX, centerY, null, TEST_SERVICE_ID);
mMockConnection.invokeCallbacks();
}
@@ -1304,10 +1313,10 @@ public class MagnificationControllerTest {
}
private static class WindowMagnificationMgrCallbackDelegate implements
- WindowMagnificationManager.Callback {
- private WindowMagnificationManager.Callback mCallback;
+ MagnificationConnectionManager.Callback {
+ private MagnificationConnectionManager.Callback mCallback;
- public void setDelegate(WindowMagnificationManager.Callback callback) {
+ public void setDelegate(MagnificationConnectionManager.Callback callback) {
mCallback = callback;
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java
index 612a091a6b1b..c4be51f9ecbd 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java
@@ -92,7 +92,7 @@ public class WindowMagnificationGestureHandlerTest {
public final TestableContext mContext = new TestableContext(
InstrumentationRegistry.getInstrumentation().getContext());
- private WindowMagnificationManager mWindowMagnificationManager;
+ private MagnificationConnectionManager mMagnificationConnectionManager;
private MockWindowMagnificationConnection mMockConnection;
private SpyWindowMagnificationGestureHandler mWindowMagnificationGestureHandler;
private WindowMagnificationGestureHandler mMockWindowMagnificationGestureHandler;
@@ -104,23 +104,23 @@ public class WindowMagnificationGestureHandlerTest {
@Before
public void setUp() throws RemoteException {
MockitoAnnotations.initMocks(this);
- mWindowMagnificationManager = new WindowMagnificationManager(mContext, new Object(),
- mock(WindowMagnificationManager.Callback.class), mMockTrace,
+ mMagnificationConnectionManager = new MagnificationConnectionManager(mContext, new Object(),
+ mock(MagnificationConnectionManager.Callback.class), mMockTrace,
new MagnificationScaleProvider(mContext));
mMockConnection = new MockWindowMagnificationConnection();
mWindowMagnificationGestureHandler = new SpyWindowMagnificationGestureHandler(
- mContext, mWindowMagnificationManager, mMockTrace, mMockCallback,
+ mContext, mMagnificationConnectionManager, mMockTrace, mMockCallback,
/** detectSingleFingerTripleTap= */ true, /** detectTwoFingerTripleTap= */ true,
/** detectShortcutTrigger= */ true, DISPLAY_0);
mMockWindowMagnificationGestureHandler =
mWindowMagnificationGestureHandler.getMockGestureHandler();
- mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mMagnificationConnectionManager.setConnection(mMockConnection.getConnection());
mWindowMagnificationGestureHandler.setNext(strictMock(EventStreamTransformation.class));
}
@After
public void tearDown() {
- mWindowMagnificationManager.disableWindowMagnification(DISPLAY_0, true);
+ mMagnificationConnectionManager.disableWindowMagnification(DISPLAY_0, true);
}
@Test
@@ -378,7 +378,7 @@ public class WindowMagnificationGestureHandlerTest {
}
break;
case STATE_SHOW_MAGNIFIER_SHORTCUT: {
- mWindowMagnificationManager.disableWindowMagnification(DISPLAY_0, false);
+ mMagnificationConnectionManager.disableWindowMagnification(DISPLAY_0, false);
}
break;
case STATE_TWO_FINGERS_DOWN: {
@@ -423,7 +423,7 @@ public class WindowMagnificationGestureHandlerTest {
}
private boolean isWindowMagnifierEnabled(int displayId) {
- return mWindowMagnificationManager.isWindowMagnifierEnabled(displayId);
+ return mMagnificationConnectionManager.isWindowMagnifierEnabled(displayId);
}
private static String stateToString(int state) {
@@ -495,13 +495,14 @@ public class WindowMagnificationGestureHandlerTest {
private final WindowMagnificationGestureHandler mMockWindowMagnificationGestureHandler;
SpyWindowMagnificationGestureHandler(@UiContext Context context,
- WindowMagnificationManager windowMagnificationMgr,
+ MagnificationConnectionManager magnificationConnectionManager,
AccessibilityTraceManager trace,
Callback callback,
boolean detectSingleFingerTripleTap, boolean detectTwoFingerTripleTap,
boolean detectShortcutTrigger, int displayId) {
- super(context, windowMagnificationMgr, trace, callback, detectSingleFingerTripleTap,
- detectTwoFingerTripleTap, detectShortcutTrigger, displayId);
+ super(context, magnificationConnectionManager, trace, callback,
+ detectSingleFingerTripleTap, detectTwoFingerTripleTap,
+ detectShortcutTrigger, displayId);
mMockWindowMagnificationGestureHandler = mock(WindowMagnificationGestureHandler.class);
}
diff --git a/services/tests/servicestests/src/com/android/server/audio/LoudnessCodecHelperTest.java b/services/tests/servicestests/src/com/android/server/audio/LoudnessCodecHelperTest.java
index 749b07d16ebe..9c8276aac4dd 100644
--- a/services/tests/servicestests/src/com/android/server/audio/LoudnessCodecHelperTest.java
+++ b/services/tests/servicestests/src/com/android/server/audio/LoudnessCodecHelperTest.java
@@ -19,6 +19,16 @@ import static android.media.AudioManager.GET_DEVICES_OUTPUTS;
import static android.media.AudioPlaybackConfiguration.PLAYER_UPDATE_DEVICE_ID;
import static android.media.LoudnessCodecInfo.CodecMetadataType.CODEC_METADATA_TYPE_MPEG_4;
import static android.media.LoudnessCodecInfo.CodecMetadataType.CODEC_METADATA_TYPE_MPEG_D;
+import static android.media.MediaFormat.KEY_AAC_DRC_EFFECT_TYPE;
+import static android.media.MediaFormat.KEY_AAC_DRC_HEAVY_COMPRESSION;
+import static android.media.MediaFormat.KEY_AAC_DRC_TARGET_REFERENCE_LEVEL;
+
+import static com.android.server.audio.LoudnessCodecHelper.SPL_RANGE_LARGE;
+import static com.android.server.audio.LoudnessCodecHelper.SPL_RANGE_MEDIUM;
+import static com.android.server.audio.LoudnessCodecHelper.SPL_RANGE_SMALL;
+import static com.android.server.audio.LoudnessCodecHelper.SPL_RANGE_UNKNOWN;
+
+import static junit.framework.Assert.assertEquals;
import static org.junit.Assume.assumeTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -34,11 +44,15 @@ import android.media.ILoudnessCodecUpdatesDispatcher;
import android.media.LoudnessCodecInfo;
import android.media.PlayerBase;
import android.os.IBinder;
+import android.os.PersistableBundle;
import android.platform.test.annotations.Presubmit;
import android.util.Log;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.server.audio.LoudnessCodecHelper.DeviceSplRange;
+import com.android.server.audio.LoudnessCodecHelper.LoudnessCodecInputProperties;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -84,8 +98,7 @@ public class LoudnessCodecHelperTest {
mLoudnessHelper.registerLoudnessCodecUpdatesDispatcher(mDispatcher);
mLoudnessHelper.startLoudnessCodecUpdates(mInitialApcPiid,
- List.of(getLoudnessInfo(/*mediaCodecHash=*/111, /*isDownmixing=*/true,
- CODEC_METADATA_TYPE_MPEG_4)));
+ List.of(getLoudnessInfo(/*isDownmixing=*/true, CODEC_METADATA_TYPE_MPEG_4)));
verify(mDispatcher).dispatchLoudnessCodecParameterChange(eq(mInitialApcPiid), any());
}
@@ -96,8 +109,7 @@ public class LoudnessCodecHelperTest {
mLoudnessHelper.unregisterLoudnessCodecUpdatesDispatcher(mDispatcher);
mLoudnessHelper.startLoudnessCodecUpdates(mInitialApcPiid,
- List.of(getLoudnessInfo(/*mediaCodecHash=*/222, /*isDownmixing=*/false,
- CODEC_METADATA_TYPE_MPEG_D)));
+ List.of(getLoudnessInfo(/*isDownmixing=*/false, CODEC_METADATA_TYPE_MPEG_D)));
verify(mDispatcher, times(0)).dispatchLoudnessCodecParameterChange(eq(mInitialApcPiid),
any());
@@ -108,11 +120,9 @@ public class LoudnessCodecHelperTest {
mLoudnessHelper.registerLoudnessCodecUpdatesDispatcher(mDispatcher);
mLoudnessHelper.startLoudnessCodecUpdates(mInitialApcPiid,
- List.of(getLoudnessInfo(/*mediaCodecHash=*/111, /*isDownmixing=*/true,
- CODEC_METADATA_TYPE_MPEG_4)));
- mLoudnessHelper.addLoudnessCodecInfo(mInitialApcPiid,
- getLoudnessInfo(/*mediaCodecHash=*/222, /*isDownmixing=*/true,
- CODEC_METADATA_TYPE_MPEG_D));
+ List.of(getLoudnessInfo(/*isDownmixing=*/true, CODEC_METADATA_TYPE_MPEG_4)));
+ mLoudnessHelper.addLoudnessCodecInfo(mInitialApcPiid, /*mediaCodecHash=*/222,
+ getLoudnessInfo(/*isDownmixing=*/true, CODEC_METADATA_TYPE_MPEG_D));
verify(mDispatcher, times(2)).dispatchLoudnessCodecParameterChange(eq(mInitialApcPiid),
any());
@@ -124,11 +134,10 @@ public class LoudnessCodecHelperTest {
mLoudnessHelper.registerLoudnessCodecUpdatesDispatcher(mDispatcher);
mLoudnessHelper.startLoudnessCodecUpdates(mInitialApcPiid,
- List.of(getLoudnessInfo(/*mediaCodecHash=*/111, /*isDownmixing=*/true,
+ List.of(getLoudnessInfo(/*isDownmixing=*/true,
CODEC_METADATA_TYPE_MPEG_4)));
- mLoudnessHelper.addLoudnessCodecInfo(newPiid,
- getLoudnessInfo(/*mediaCodecHash=*/222, /*isDownmixing=*/true,
- CODEC_METADATA_TYPE_MPEG_D));
+ mLoudnessHelper.addLoudnessCodecInfo(newPiid, /*mediaCodecHash=*/222,
+ getLoudnessInfo(/*isDownmixing=*/true, CODEC_METADATA_TYPE_MPEG_D));
verify(mDispatcher, times(1)).dispatchLoudnessCodecParameterChange(eq(mInitialApcPiid),
any());
@@ -140,12 +149,10 @@ public class LoudnessCodecHelperTest {
mLoudnessHelper.registerLoudnessCodecUpdatesDispatcher(mDispatcher);
mLoudnessHelper.startLoudnessCodecUpdates(mInitialApcPiid,
- List.of(getLoudnessInfo(/*mediaCodecHash=*/111, /*isDownmixing=*/true,
- CODEC_METADATA_TYPE_MPEG_4)));
+ List.of(getLoudnessInfo(/*isDownmixing=*/true, CODEC_METADATA_TYPE_MPEG_4)));
//does not trigger dispatch since active apc list does not contain newPiid
mLoudnessHelper.startLoudnessCodecUpdates(newPiid,
- List.of(getLoudnessInfo(/*mediaCodecHash=*/222, /*isDownmixing=*/true,
- CODEC_METADATA_TYPE_MPEG_D)));
+ List.of(getLoudnessInfo(/*isDownmixing=*/true, CODEC_METADATA_TYPE_MPEG_D)));
verify(mDispatcher, times(1)).dispatchLoudnessCodecParameterChange(eq(mInitialApcPiid),
any());
@@ -157,9 +164,8 @@ public class LoudnessCodecHelperTest {
@Test
public void updateCodecParameters_noStartedPiids_noDispatch() throws Exception {
mLoudnessHelper.registerLoudnessCodecUpdatesDispatcher(mDispatcher);
- mLoudnessHelper.addLoudnessCodecInfo(mInitialApcPiid,
- getLoudnessInfo(/*mediaCodecHash=*/222, /*isDownmixing=*/true,
- CODEC_METADATA_TYPE_MPEG_D));
+ mLoudnessHelper.addLoudnessCodecInfo(mInitialApcPiid, /*mediaCodecHash=*/222,
+ getLoudnessInfo(/*isDownmixing=*/true, CODEC_METADATA_TYPE_MPEG_D));
mLoudnessHelper.updateCodecParameters(getApcListForPiids(mInitialApcPiid));
@@ -170,8 +176,8 @@ public class LoudnessCodecHelperTest {
@Test
public void updateCodecParameters_removedCodecInfo_noDispatch() throws Exception {
- final LoudnessCodecInfo info = getLoudnessInfo(/*mediaCodecHash=*/111,
- /*isDownmixing=*/true, CODEC_METADATA_TYPE_MPEG_4);
+ final LoudnessCodecInfo info = getLoudnessInfo(/*isDownmixing=*/true,
+ CODEC_METADATA_TYPE_MPEG_4);
mLoudnessHelper.registerLoudnessCodecUpdatesDispatcher(mDispatcher);
mLoudnessHelper.startLoudnessCodecUpdates(mInitialApcPiid, List.of(info));
@@ -186,8 +192,8 @@ public class LoudnessCodecHelperTest {
@Test
public void updateCodecParameters_stoppedPiids_noDispatch() throws Exception {
- final LoudnessCodecInfo info = getLoudnessInfo(/*mediaCodecHash=*/111,
- /*isDownmixing=*/true, CODEC_METADATA_TYPE_MPEG_4);
+ final LoudnessCodecInfo info = getLoudnessInfo(/*isDownmixing=*/true,
+ CODEC_METADATA_TYPE_MPEG_4);
mLoudnessHelper.registerLoudnessCodecUpdatesDispatcher(mDispatcher);
mLoudnessHelper.startLoudnessCodecUpdates(mInitialApcPiid, List.of(info));
@@ -200,6 +206,108 @@ public class LoudnessCodecHelperTest {
any());
}
+ @Test
+ public void checkParcelableBundle_forMpeg4CodecInputProperties() {
+ PersistableBundle loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_4, /*isDownmixing*/true,
+ SPL_RANGE_SMALL).createLoudnessParameters();
+ assertEquals(64, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(1, loudnessParameters.getInt(KEY_AAC_DRC_HEAVY_COMPRESSION));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_4, /*isDownmixing*/false,
+ SPL_RANGE_SMALL).createLoudnessParameters();
+ assertEquals(64, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(1, loudnessParameters.getInt(KEY_AAC_DRC_HEAVY_COMPRESSION));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_4, /*isDownmixing*/true,
+ SPL_RANGE_MEDIUM).createLoudnessParameters();
+ assertEquals(96, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(1, loudnessParameters.getInt(KEY_AAC_DRC_HEAVY_COMPRESSION));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_4, /*isDownmixing*/false,
+ SPL_RANGE_MEDIUM).createLoudnessParameters();
+ assertEquals(96, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(0, loudnessParameters.getInt(KEY_AAC_DRC_HEAVY_COMPRESSION));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_4, /*isDownmixing*/true,
+ SPL_RANGE_LARGE).createLoudnessParameters();
+ assertEquals(124, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(0, loudnessParameters.getInt(KEY_AAC_DRC_HEAVY_COMPRESSION));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_4, /*isDownmixing*/false,
+ SPL_RANGE_LARGE).createLoudnessParameters();
+ assertEquals(124, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(0, loudnessParameters.getInt(KEY_AAC_DRC_HEAVY_COMPRESSION));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_4, /*isDownmixing*/true,
+ SPL_RANGE_UNKNOWN).createLoudnessParameters();
+ assertEquals(96, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(1, loudnessParameters.getInt(KEY_AAC_DRC_HEAVY_COMPRESSION));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_4, /*isDownmixing*/false,
+ SPL_RANGE_UNKNOWN).createLoudnessParameters();
+ assertEquals(96, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(0, loudnessParameters.getInt(KEY_AAC_DRC_HEAVY_COMPRESSION));
+ }
+
+ @Test
+ public void checkParcelableBundle_forMpegDCodecInputProperties() {
+ PersistableBundle loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_D, /*isDownmixing*/true,
+ SPL_RANGE_SMALL).createLoudnessParameters();
+ assertEquals(64, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(3, loudnessParameters.getInt(KEY_AAC_DRC_EFFECT_TYPE));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_D, /*isDownmixing*/false,
+ SPL_RANGE_SMALL).createLoudnessParameters();
+ assertEquals(64, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(3, loudnessParameters.getInt(KEY_AAC_DRC_EFFECT_TYPE));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_D, /*isDownmixing*/true,
+ SPL_RANGE_MEDIUM).createLoudnessParameters();
+ assertEquals(96, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(6, loudnessParameters.getInt(KEY_AAC_DRC_EFFECT_TYPE));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_D, /*isDownmixing*/false,
+ SPL_RANGE_MEDIUM).createLoudnessParameters();
+ assertEquals(96, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(6, loudnessParameters.getInt(KEY_AAC_DRC_EFFECT_TYPE));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_D, /*isDownmixing*/true,
+ SPL_RANGE_LARGE).createLoudnessParameters();
+ assertEquals(124, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(6, loudnessParameters.getInt(KEY_AAC_DRC_EFFECT_TYPE));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_D, /*isDownmixing*/false,
+ SPL_RANGE_LARGE).createLoudnessParameters();
+ assertEquals(124, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(6, loudnessParameters.getInt(KEY_AAC_DRC_EFFECT_TYPE));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_D, /*isDownmixing*/true,
+ SPL_RANGE_UNKNOWN).createLoudnessParameters();
+ assertEquals(96, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(6, loudnessParameters.getInt(KEY_AAC_DRC_EFFECT_TYPE));
+
+ loudnessParameters = createInputProperties(
+ CODEC_METADATA_TYPE_MPEG_D, /*isDownmixing*/false,
+ SPL_RANGE_UNKNOWN).createLoudnessParameters();
+ assertEquals(96, loudnessParameters.getInt(KEY_AAC_DRC_TARGET_REFERENCE_LEVEL));
+ assertEquals(6, loudnessParameters.getInt(KEY_AAC_DRC_EFFECT_TYPE));
+ }
+
private List<AudioPlaybackConfiguration> getApcListForPiids(int... piids) {
final ArrayList<AudioPlaybackConfiguration> apcList = new ArrayList<>();
@@ -220,11 +328,15 @@ public class LoudnessCodecHelperTest {
return apcList;
}
- private static LoudnessCodecInfo getLoudnessInfo(int mediaCodecHash, boolean isDownmixing,
- int metadataType) {
+ private static LoudnessCodecInputProperties createInputProperties(
+ int metadataType, boolean isDownmixing, @DeviceSplRange int splRange) {
+ return new LoudnessCodecInputProperties.Builder().setMetadataType(
+ metadataType).setIsDownmixing(isDownmixing).setDeviceSplRange(splRange).build();
+ }
+
+ private static LoudnessCodecInfo getLoudnessInfo(boolean isDownmixing, int metadataType) {
LoudnessCodecInfo info = new LoudnessCodecInfo();
info.isDownmixing = isDownmixing;
- info.mediaCodecHashCode = mediaCodecHash;
info.metadataType = metadataType;
return info;
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java
index 437510595ecb..1b9e6fb6e247 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/log/BiometricContextProviderTest.java
@@ -179,6 +179,29 @@ public class BiometricContextProviderTest {
}
@Test
+ public void testSubscribesToFoldState() throws RemoteException {
+ final List<Integer> actual = new ArrayList<>();
+ final List<Integer> expected = List.of(FoldState.FULLY_CLOSED, FoldState.FULLY_OPENED,
+ FoldState.UNKNOWN, FoldState.HALF_OPENED);
+ mProvider.subscribe(mOpContext, ctx -> {
+ assertThat(ctx).isSameInstanceAs(mOpContext.toAidlContext());
+ assertThat(mProvider.getFoldState()).isEqualTo(ctx.foldState);
+ actual.add(ctx.foldState);
+ });
+
+ for (int v : expected) {
+ mListener.onFoldChanged(v);
+ }
+
+ assertThat(actual).containsExactly(
+ FoldState.FULLY_CLOSED,
+ FoldState.FULLY_OPENED,
+ FoldState.UNKNOWN,
+ FoldState.HALF_OPENED
+ ).inOrder();
+ }
+
+ @Test
public void testSubscribesToDisplayState() throws RemoteException {
final List<Integer> actual = new ArrayList<>();
final List<Integer> expected = List.of(AuthenticateOptions.DISPLAY_STATE_AOD,
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
index b5ba322b1a5e..9213601a6144 100644
--- a/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java
@@ -413,18 +413,24 @@ public class VirtualDeviceManagerServiceTest {
public void getDeviceIdForDisplayId_invalidDisplayId_returnsDefault() {
assertThat(mVdm.getDeviceIdForDisplayId(Display.INVALID_DISPLAY))
.isEqualTo(DEVICE_ID_DEFAULT);
+ assertThat(mLocalService.getDeviceIdForDisplayId(Display.INVALID_DISPLAY))
+ .isEqualTo(DEVICE_ID_DEFAULT);
}
@Test
public void getDeviceIdForDisplayId_defaultDisplayId_returnsDefault() {
assertThat(mVdm.getDeviceIdForDisplayId(Display.DEFAULT_DISPLAY))
.isEqualTo(DEVICE_ID_DEFAULT);
+ assertThat(mLocalService.getDeviceIdForDisplayId(Display.DEFAULT_DISPLAY))
+ .isEqualTo(DEVICE_ID_DEFAULT);
}
@Test
public void getDeviceIdForDisplayId_nonExistentDisplayId_returnsDefault() {
assertThat(mVdm.getDeviceIdForDisplayId(NON_EXISTENT_DISPLAY_ID))
.isEqualTo(DEVICE_ID_DEFAULT);
+ assertThat(mLocalService.getDeviceIdForDisplayId(NON_EXISTENT_DISPLAY_ID))
+ .isEqualTo(DEVICE_ID_DEFAULT);
}
@Test
@@ -433,6 +439,8 @@ public class VirtualDeviceManagerServiceTest {
assertThat(mVdm.getDeviceIdForDisplayId(DISPLAY_ID_1))
.isEqualTo(mDeviceImpl.getDeviceId());
+ assertThat(mLocalService.getDeviceIdForDisplayId(DISPLAY_ID_1))
+ .isEqualTo(mDeviceImpl.getDeviceId());
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/camera/VirtualCameraControllerTest.java b/services/tests/servicestests/src/com/android/server/companion/virtual/camera/VirtualCameraControllerTest.java
index 01922e08d71d..edfe1b416f22 100644
--- a/services/tests/servicestests/src/com/android/server/companion/virtual/camera/VirtualCameraControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/camera/VirtualCameraControllerTest.java
@@ -40,6 +40,7 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.Surface;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -77,6 +78,11 @@ public class VirtualCameraControllerTest {
when(mVirtualCameraServiceMock.registerCamera(any(), any())).thenReturn(true);
}
+ @After
+ public void tearDown() throws Exception {
+ mVirtualCameraController.close();
+ }
+
@Test
public void registerCamera_registersCamera() throws Exception {
mVirtualCameraController.registerCamera(createVirtualCameraConfig(
@@ -95,6 +101,8 @@ public class VirtualCameraControllerTest {
public void unregisterCamera_unregistersCamera() throws Exception {
VirtualCameraConfig config = createVirtualCameraConfig(
CAMERA_WIDTH_1, CAMERA_HEIGHT_1, CAMERA_FORMAT, CAMERA_DISPLAY_NAME_RES_ID_1);
+ mVirtualCameraController.registerCamera(config);
+
mVirtualCameraController.unregisterCamera(config);
verify(mVirtualCameraServiceMock).unregisterCamera(any());
@@ -107,9 +115,10 @@ public class VirtualCameraControllerTest {
mVirtualCameraController.registerCamera(createVirtualCameraConfig(
CAMERA_WIDTH_2, CAMERA_HEIGHT_2, CAMERA_FORMAT, CAMERA_DISPLAY_NAME_RES_ID_2));
+ mVirtualCameraController.close();
+
ArgumentCaptor<VirtualCameraConfiguration> configurationCaptor =
ArgumentCaptor.forClass(VirtualCameraConfiguration.class);
- mVirtualCameraController.close();
verify(mVirtualCameraServiceMock, times(2)).registerCamera(any(),
configurationCaptor.capture());
List<VirtualCameraConfiguration> virtualCameraConfigurations =
diff --git a/services/tests/servicestests/src/com/android/server/job/BiasSchedulingTest.java b/services/tests/servicestests/src/com/android/server/job/BiasSchedulingTest.java
index 1726ec18e45b..a33f35aa11d3 100644
--- a/services/tests/servicestests/src/com/android/server/job/BiasSchedulingTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/BiasSchedulingTest.java
@@ -29,6 +29,8 @@ import androidx.test.filters.FlakyTest;
import com.android.server.job.MockBiasJobService.TestEnvironment;
import com.android.server.job.MockBiasJobService.TestEnvironment.Event;
+import libcore.junit.util.compat.CoreCompatChangeRule;
+
import java.util.ArrayList;
@TargetApi(24)
@@ -61,6 +63,7 @@ public class BiasSchedulingTest extends AndroidTestCase {
}
@FlakyTest(bugId = 293589359)
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testLowerBiasJobPreempted() throws Exception {
for (int i = 0; i < JobConcurrencyManager.MAX_CONCURRENCY_LIMIT; ++i) {
JobInfo job = new JobInfo.Builder(100 + i, sJobServiceComponent)
@@ -92,6 +95,7 @@ public class BiasSchedulingTest extends AndroidTestCase {
assertTrue("Lower bias jobs were not preempted.", wasJobHigherExecuted);
}
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testHigherBiasJobNotPreempted() throws Exception {
for (int i = 0; i < JobConcurrencyManager.DEFAULT_CONCURRENCY_LIMIT; ++i) {
JobInfo job = new JobInfo.Builder(100 + i, sJobServiceComponent)
diff --git a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
index 46ead854bded..3069b673f8fc 100644
--- a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
@@ -3,6 +3,7 @@ package com.android.server.job;
import static android.net.NetworkCapabilities.NET_CAPABILITY_IMS;
import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PAID;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.text.format.DateUtils.HOUR_IN_MILLIS;
import static com.android.server.job.JobStore.JOB_FILE_SPLIT_PREFIX;
@@ -141,7 +142,7 @@ public class JobStoreTest {
final JobInfo task2 = new Builder(12, mComponent)
.setMinimumLatency(5000L)
.setBackoffCriteria(15000L, JobInfo.BACKOFF_POLICY_LINEAR)
- .setOverrideDeadline(30000L)
+ .setOverrideDeadline(4 * HOUR_IN_MILLIS)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.build();
@@ -194,7 +195,7 @@ public class JobStoreTest {
final JobInfo task2 = new Builder(12, mComponent)
.setMinimumLatency(5000L)
.setBackoffCriteria(15000L, JobInfo.BACKOFF_POLICY_LINEAR)
- .setOverrideDeadline(30000L)
+ .setOverrideDeadline(3 * HOUR_IN_MILLIS)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.build();
@@ -224,7 +225,7 @@ public class JobStoreTest {
final JobInfo task2 = new Builder(12, mComponent)
.setMinimumLatency(5000L)
.setBackoffCriteria(15000L, JobInfo.BACKOFF_POLICY_LINEAR)
- .setOverrideDeadline(30000L)
+ .setOverrideDeadline(5 * HOUR_IN_MILLIS)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.build();
@@ -330,7 +331,6 @@ public class JobStoreTest {
@Test
public void testMaybeWriteStatusToDisk() throws Exception {
int taskId = 5;
- long runByMillis = 20000L; // 20s
long runFromMillis = 2000L; // 2s
long initialBackoff = 10000L; // 10s
@@ -338,7 +338,7 @@ public class JobStoreTest {
.setRequiresCharging(true)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setBackoffCriteria(initialBackoff, JobInfo.BACKOFF_POLICY_EXPONENTIAL)
- .setOverrideDeadline(runByMillis)
+ .setOverrideDeadline(6 * HOUR_IN_MILLIS)
.setMinimumLatency(runFromMillis)
.setPersisted(true)
.build();
@@ -379,7 +379,7 @@ public class JobStoreTest {
final JobInfo task2 = new Builder(12, mComponent)
.setMinimumLatency(5000L)
.setBackoffCriteria(15000L, JobInfo.BACKOFF_POLICY_LINEAR)
- .setOverrideDeadline(30000L)
+ .setOverrideDeadline(7 * HOUR_IN_MILLIS)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.build();
@@ -542,7 +542,7 @@ public class JobStoreTest {
@Test
public void testBiasPersisted() throws Exception {
JobInfo.Builder b = new Builder(92, mComponent)
- .setOverrideDeadline(5000)
+ .setOverrideDeadline(8 * HOUR_IN_MILLIS)
.setBias(42)
.setPersisted(true);
final JobStatus js = JobStatus.createFromJobInfo(b.build(), SOME_UID, null, -1, null, null);
@@ -613,7 +613,7 @@ public class JobStoreTest {
@Test
public void testPriorityPersisted() throws Exception {
final JobInfo job = new Builder(92, mComponent)
- .setOverrideDeadline(5000)
+ .setOverrideDeadline(9 * HOUR_IN_MILLIS)
.setPriority(JobInfo.PRIORITY_MIN)
.setPersisted(true)
.build();
@@ -634,13 +634,13 @@ public class JobStoreTest {
@Test
public void testNonPersistedTaskIsNotPersisted() throws Exception {
JobInfo.Builder b = new Builder(42, mComponent)
- .setOverrideDeadline(10000)
+ .setOverrideDeadline(10 * HOUR_IN_MILLIS)
.setPersisted(false);
JobStatus jsNonPersisted = JobStatus.createFromJobInfo(b.build(),
SOME_UID, null, -1, null, null);
mTaskStoreUnderTest.add(jsNonPersisted);
b = new Builder(43, mComponent)
- .setOverrideDeadline(10000)
+ .setOverrideDeadline(11 * HOUR_IN_MILLIS)
.setPersisted(true);
JobStatus jsPersisted = JobStatus.createFromJobInfo(b.build(),
SOME_UID, null, -1, null, null);
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
index c7d80edc9c2d..8933c6c56797 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertThrows;
+import static org.testng.Assert.assertTrue;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
@@ -31,6 +32,7 @@ import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.content.pm.UserProperties;
import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
@@ -219,6 +221,8 @@ public final class UserManagerTest {
.isEqualTo(cloneUserProperties.isCredentialShareableWithParent());
assertThrows(SecurityException.class, cloneUserProperties::getDeleteAppWithParent);
assertThrows(SecurityException.class, cloneUserProperties::getAlwaysVisible);
+ compareDrawables(mUserManager.getUserBadge(),
+ Resources.getSystem().getDrawable(userTypeDetails.getBadgePlain()));
// Verify clone user parent
assertThat(mUserManager.getProfileParent(mainUserId)).isNull();
@@ -335,7 +339,8 @@ public final class UserManagerTest {
.isEqualTo(privateProfileUserProperties
.isAuthAlwaysRequiredToDisableQuietMode());
assertThrows(SecurityException.class, privateProfileUserProperties::getDeleteAppWithParent);
-
+ compareDrawables(mUserManager.getUserBadge(),
+ Resources.getSystem().getDrawable(userTypeDetails.getBadgePlain()));
// Verify private profile parent
assertThat(mUserManager.getProfileParent(mainUserId)).isNull();
UserInfo parentProfileInfo = mUserManager.getProfileParent(userInfo.id);
@@ -955,6 +960,8 @@ public final class UserManagerTest {
.isEqualTo(userTypeDetails.getBadgeNoBackground());
assertThat(mUserManager.getUserStatusBarIconResId(userId))
.isEqualTo(userTypeDetails.getStatusBarIcon());
+ compareDrawables(mUserManager.getUserBadge(),
+ Resources.getSystem().getDrawable(userTypeDetails.getBadgePlain()));
final int badgeIndex = userInfo.profileBadge;
assertThat(mUserManager.getUserBadgeColor(userId)).isEqualTo(
@@ -1762,4 +1769,10 @@ public final class UserManagerTest {
.getBoolean(com.android.internal.R.bool.config_isMainUserPermanentAdmin);
}
+ private void compareDrawables(Drawable actual, Drawable expected){
+ assertEquals(actual.getIntrinsicWidth(), expected.getIntrinsicWidth());
+ assertEquals(actual.getIntrinsicHeight(), expected.getIntrinsicHeight());
+ assertEquals(actual.getLevel(), expected.getLevel());
+ }
+
}
diff --git a/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java
index 44dad593810a..32bbc7a618d1 100644
--- a/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java
@@ -482,6 +482,35 @@ public class ThermalManagerServiceTest {
}
@Test
+ public void testGetThermalHeadroomThresholdsOnDefaultHalResult() throws Exception {
+ TemperatureWatcher watcher = mService.mTemperatureWatcher;
+ ArrayList<TemperatureThreshold> thresholds = new ArrayList<>();
+ mFakeHal.mTemperatureThresholdList = thresholds;
+ watcher.updateThresholds();
+ synchronized (watcher.mSamples) {
+ assertArrayEquals(
+ new float[]{Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN,
+ Float.NaN},
+ watcher.mHeadroomThresholds, 0.01f);
+ }
+ TemperatureThreshold nanThresholds = new TemperatureThreshold();
+ nanThresholds.name = "nan";
+ nanThresholds.type = Temperature.TYPE_SKIN;
+ nanThresholds.hotThrottlingThresholds = new float[ThrottlingSeverity.SHUTDOWN + 1];
+ nanThresholds.coldThrottlingThresholds = new float[ThrottlingSeverity.SHUTDOWN + 1];
+ Arrays.fill(nanThresholds.hotThrottlingThresholds, Float.NaN);
+ Arrays.fill(nanThresholds.coldThrottlingThresholds, Float.NaN);
+ thresholds.add(nanThresholds);
+ watcher.updateThresholds();
+ synchronized (watcher.mSamples) {
+ assertArrayEquals(
+ new float[]{Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN,
+ Float.NaN},
+ watcher.mHeadroomThresholds, 0.01f);
+ }
+ }
+
+ @Test
public void testTemperatureWatcherGetSlopeOf() throws RemoteException {
TemperatureWatcher watcher = mService.mTemperatureWatcher;
List<TemperatureWatcher.Sample> samples = new ArrayList<>();
diff --git a/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
index d09aa89179b8..ffb3bce33a27 100644
--- a/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
@@ -44,6 +44,7 @@ import android.os.IBinder;
import android.os.IHintSession;
import android.os.PerformanceHintManager;
import android.os.Process;
+import android.os.WorkDuration;
import android.util.Log;
import com.android.server.FgThread;
@@ -89,6 +90,11 @@ public class HintManagerServiceTest {
private static final long[] DURATIONS_ZERO = new long[] {};
private static final long[] TIMESTAMPS_ZERO = new long[] {};
private static final long[] TIMESTAMPS_TWO = new long[] {1L, 2L};
+ private static final WorkDuration[] WORK_DURATIONS_THREE = new WorkDuration[] {
+ new WorkDuration(1L, 11L, 8L, 4L, 1L),
+ new WorkDuration(2L, 13L, 8L, 6L, 2L),
+ new WorkDuration(3L, 333333333L, 8L, 333333333L, 3L),
+ };
@Mock private Context mContext;
@Mock private HintManagerService.NativeWrapper mNativeWrapperMock;
@@ -593,4 +599,56 @@ public class HintManagerServiceTest {
}
a.close();
}
+
+ @Test
+ public void testReportActualWorkDuration2() throws Exception {
+ HintManagerService service = createService();
+ IBinder token = new Binder();
+
+ AppHintSession a = (AppHintSession) service.getBinderServiceInstance()
+ .createHintSession(token, SESSION_TIDS_A, DEFAULT_TARGET_DURATION);
+
+ a.updateTargetWorkDuration(100L);
+ a.reportActualWorkDuration2(WORK_DURATIONS_THREE);
+ verify(mNativeWrapperMock, times(1)).halReportActualWorkDuration(anyLong(),
+ eq(WORK_DURATIONS_THREE));
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration2(new WorkDuration[] {});
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration2(
+ new WorkDuration[] {new WorkDuration(-1L, 11L, 8L, 4L, 1L)});
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration2(new WorkDuration[] {new WorkDuration(1L, 0L, 8L, 4L, 1L)});
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration2(new WorkDuration[] {new WorkDuration(1L, 11L, 0L, 4L, 1L)});
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration2(
+ new WorkDuration[] {new WorkDuration(1L, 11L, 8L, -1L, 1L)});
+ });
+
+ reset(mNativeWrapperMock);
+ // Set session to background, then the duration would not be updated.
+ service.mUidObserver.onUidStateChanged(
+ a.mUid, ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0, 0);
+
+ // Using CountDownLatch to ensure above onUidStateChanged() job was digested.
+ final CountDownLatch latch = new CountDownLatch(1);
+ FgThread.getHandler().post(() -> {
+ latch.countDown();
+ });
+ latch.await();
+
+ assertFalse(service.mUidObserver.isUidForeground(a.mUid));
+ a.reportActualWorkDuration2(WORK_DURATIONS_THREE);
+ verify(mNativeWrapperMock, never()).halReportActualWorkDuration(anyLong(), any(), any());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/usage/IntervalStatsTests.java b/services/tests/servicestests/src/com/android/server/usage/IntervalStatsTests.java
index 2be3f1e81897..517f48346b30 100644
--- a/services/tests/servicestests/src/com/android/server/usage/IntervalStatsTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/IntervalStatsTests.java
@@ -21,8 +21,11 @@ import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
+import android.app.usage.Flags;
import android.app.usage.UsageEvents;
+import android.app.usage.UsageStatsManager;
import android.content.res.Configuration;
+import android.os.PersistableBundle;
import android.test.suitebuilder.annotation.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -99,6 +102,17 @@ public class IntervalStatsTests {
case UsageEvents.Event.LOCUS_ID_SET:
event.mLocusId = "locus" + (i % 7); //"random" locus
break;
+ case UsageEvents.Event.USER_INTERACTION:
+ if (Flags.userInteractionTypeApi()) {
+ // "random" user interaction extras.
+ PersistableBundle extras = new PersistableBundle();
+ extras.putString(UsageStatsManager.EXTRA_EVENT_CATEGORY,
+ "fake.namespace.category" + (i % 13));
+ extras.putString(UsageStatsManager.EXTRA_EVENT_ACTION,
+ "fakeaction" + (i % 13));
+ event.mExtras = extras;
+ }
+ break;
}
intervalStats.addEvent(event);
diff --git a/services/tests/servicestests/src/com/android/server/usage/UsageStatsDatabaseTest.java b/services/tests/servicestests/src/com/android/server/usage/UsageStatsDatabaseTest.java
index 6ae26585fab2..cd29c8057706 100644
--- a/services/tests/servicestests/src/com/android/server/usage/UsageStatsDatabaseTest.java
+++ b/services/tests/servicestests/src/com/android/server/usage/UsageStatsDatabaseTest.java
@@ -24,11 +24,13 @@ import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
+import android.app.usage.Flags;
import android.app.usage.UsageEvents.Event;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.res.Configuration;
+import android.os.PersistableBundle;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.AtomicFile;
import android.util.LongSparseArray;
@@ -183,6 +185,17 @@ public class UsageStatsDatabaseTest {
case Event.LOCUS_ID_SET:
event.mLocusId = "locus" + (i % 7); //"random" locus
break;
+ case Event.USER_INTERACTION:
+ if (Flags.userInteractionTypeApi()) {
+ // "random" user interaction extras.
+ PersistableBundle extras = new PersistableBundle();
+ extras.putString(UsageStatsManager.EXTRA_EVENT_CATEGORY,
+ "fake.namespace.category" + (i % 13));
+ extras.putString(UsageStatsManager.EXTRA_EVENT_ACTION,
+ "fakeaction" + (i % 13));
+ event.mExtras = extras;
+ }
+ break;
}
mIntervalStats.addEvent(event);
@@ -295,6 +308,18 @@ public class UsageStatsDatabaseTest {
assertEquals(e1.mLocusIdToken, e2.mLocusIdToken,
"Usage event " + debugId);
break;
+ case Event.USER_INTERACTION:
+ if (Flags.userInteractionTypeApi()) {
+ PersistableBundle extras1 = e1.getExtras();
+ PersistableBundle extras2 = e2.getExtras();
+ assertEquals(extras1.getString(UsageStatsManager.EXTRA_EVENT_CATEGORY),
+ extras2.getString(UsageStatsManager.EXTRA_EVENT_CATEGORY),
+ "Usage event " + debugId);
+ assertEquals(extras1.getString(UsageStatsManager.EXTRA_EVENT_ACTION),
+ extras2.getString(UsageStatsManager.EXTRA_EVENT_ACTION),
+ "Usage event " + debugId);
+ }
+ break;
}
// fallthrough
case 4: // test fields added in version 4
diff --git a/services/tests/servicestests/src/com/android/server/utils/UserSettingDeviceConfigMediatorTest.java b/services/tests/servicestests/src/com/android/server/utils/UserSettingDeviceConfigMediatorTest.java
new file mode 100644
index 000000000000..377e4c3d6810
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/utils/UserSettingDeviceConfigMediatorTest.java
@@ -0,0 +1,235 @@
+/*
+ * 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 com.android.server.utils;
+
+import static org.junit.Assert.assertEquals;
+
+import android.provider.DeviceConfig;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Unit tests for {@link UserSettingDeviceConfigMediator}
+ */
+@RunWith(AndroidJUnit4.class)
+public class UserSettingDeviceConfigMediatorTest {
+ @Test
+ public void testDeviceConfigOnly() {
+ UserSettingDeviceConfigMediator mediator =
+ new UserSettingDeviceConfigMediator.SettingsOverridesIndividualMediator(',');
+
+ DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder("test")
+ .setInt("int", 1)
+ .setFloat("float", .5f)
+ .setBoolean("boolean", true)
+ .setLong("long", 123456789)
+ .setString("string", "abc123")
+ .build();
+
+ mediator.setDeviceConfigProperties(properties);
+
+ assertEquals(1, mediator.getInt("int", 123));
+ assertEquals(123, mediator.getInt("invalidKey", 123));
+ assertEquals(.5f, mediator.getFloat("float", .8f), 0.001);
+ assertEquals(.8f, mediator.getFloat("invalidKey", .8f), 0.001);
+ assertEquals(true, mediator.getBoolean("boolean", false));
+ assertEquals(true, mediator.getBoolean("invalidKey", true));
+ assertEquals(123456789, mediator.getLong("long", 987654321));
+ assertEquals(987654321, mediator.getInt("invalidKey", 987654321));
+ assertEquals("abc123", mediator.getString("string", "xyz987"));
+ assertEquals("xyz987", mediator.getString("invalidKey", "xyz987"));
+
+ // Clear the properties
+ mediator.setDeviceConfigProperties(null);
+
+ assertEquals(123, mediator.getInt("int", 123));
+ assertEquals(123, mediator.getInt("invalidKey", 123));
+ assertEquals(.8f, mediator.getFloat("float", .8f), 0.001);
+ assertEquals(.8f, mediator.getFloat("invalidKey", .8f), 0.001);
+ assertEquals(false, mediator.getBoolean("boolean", false));
+ assertEquals(true, mediator.getBoolean("invalidKey", true));
+ assertEquals(987654321, mediator.getLong("long", 987654321));
+ assertEquals(987654321, mediator.getInt("invalidKey", 987654321));
+ assertEquals("xyz987", mediator.getString("string", "xyz987"));
+ assertEquals("xyz987", mediator.getString("invalidKey", "xyz987"));
+ }
+
+ @Test
+ public void testSettingsOnly() {
+ UserSettingDeviceConfigMediator mediator =
+ new UserSettingDeviceConfigMediator.SettingsOverridesIndividualMediator(',');
+
+ String settings = "int=1,float=.5f,boolean=true,long=123456789,string=abc123";
+
+ mediator.setSettingsString(settings);
+
+ assertEquals(1, mediator.getInt("int", 123));
+ assertEquals(123, mediator.getInt("invalidKey", 123));
+ assertEquals(.5f, mediator.getFloat("float", .8f), 0.001);
+ assertEquals(.8f, mediator.getFloat("invalidKey", .8f), 0.001);
+ assertEquals(true, mediator.getBoolean("boolean", false));
+ assertEquals(true, mediator.getBoolean("invalidKey", true));
+ assertEquals(123456789, mediator.getLong("long", 987654321));
+ assertEquals(987654321, mediator.getInt("invalidKey", 987654321));
+ assertEquals("abc123", mediator.getString("string", "xyz987"));
+ assertEquals("xyz987", mediator.getString("invalidKey", "xyz987"));
+
+ // Clear the settings
+ mediator.setSettingsString(null);
+
+ assertEquals(123, mediator.getInt("int", 123));
+ assertEquals(123, mediator.getInt("invalidKey", 123));
+ assertEquals(.8f, mediator.getFloat("float", .8f), 0.001);
+ assertEquals(.8f, mediator.getFloat("invalidKey", .8f), 0.001);
+ assertEquals(false, mediator.getBoolean("boolean", false));
+ assertEquals(true, mediator.getBoolean("invalidKey", true));
+ assertEquals(987654321, mediator.getLong("long", 987654321));
+ assertEquals(987654321, mediator.getInt("invalidKey", 987654321));
+ assertEquals("xyz987", mediator.getString("string", "xyz987"));
+ assertEquals("xyz987", mediator.getString("invalidKey", "xyz987"));
+ }
+
+ @Test
+ public void testSettingsOverridesAll() {
+ UserSettingDeviceConfigMediator mediator =
+ new UserSettingDeviceConfigMediator.SettingsOverridesAllMediator(',');
+
+ String settings = "int=1,float=.5f,boolean=true,long=123456789,string=abc123,"
+ + "intOnlyInSettings=9,floatOnlyInSettings=.25f,booleanOnlyInSettings=true,"
+ + "longOnlyInSettings=53771465,stringOnlyInSettings=settingsString";
+ DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder("test")
+ .setInt("int", 10)
+ .setInt("intOnlyInDeviceConfig", 9001)
+ .setFloat("float", .7f)
+ .setFloat("floatOnlyInDeviceConfig", .9f)
+ .setBoolean("boolean", false)
+ .setBoolean("booleanOnlyInDeviceConfig", true)
+ .setLong("long", 60000001)
+ .setLong("longOnlyInDeviceConfig", 7357)
+ .setString("string", "xyz987")
+ .setString("stringOnlyInDeviceConfig", "deviceConfigString")
+ .build();
+
+ mediator.setSettingsString(settings);
+ mediator.setDeviceConfigProperties(properties);
+
+ // Since settings overrides all, anything in DeviceConfig should be ignored,
+ // even if settings doesn't have a value for it.
+ assertEquals(1, mediator.getInt("int", 123));
+ assertEquals(9, mediator.getInt("intOnlyInSettings", 123));
+ assertEquals(123, mediator.getInt("intOnlyInDeviceConfig", 123));
+ assertEquals(.5f, mediator.getFloat("float", .8f), 0.001);
+ assertEquals(.25f, mediator.getFloat("floatOnlyInSettings", .8f), 0.001);
+ assertEquals(.8f, mediator.getFloat("floatOnlyInDeviceConfig", .8f), 0.001);
+ assertEquals(true, mediator.getBoolean("boolean", false));
+ assertEquals(true, mediator.getBoolean("booleanOnlyInSettings", false));
+ assertEquals(false, mediator.getBoolean("booleanOnlyInDeviceConfig", false));
+ assertEquals(123456789, mediator.getLong("long", 987654321));
+ assertEquals(53771465, mediator.getLong("longOnlyInSettings", 987654321));
+ assertEquals(987654321, mediator.getLong("longOnlyInDeviceConfig", 987654321));
+ assertEquals("abc123", mediator.getString("string", "default"));
+ assertEquals("settingsString", mediator.getString("stringOnlyInSettings", "default"));
+ assertEquals("default", mediator.getString("stringOnlyInDeviceConfig", "default"));
+
+ // Nothing in settings, do DeviceConfig can be used.
+ mediator.setSettingsString("");
+
+ assertEquals(10, mediator.getInt("int", 123));
+ assertEquals(123, mediator.getInt("intOnlyInSettings", 123));
+ assertEquals(9001, mediator.getInt("intOnlyInDeviceConfig", 123));
+ assertEquals(.7f, mediator.getFloat("float", .8f), 0.001);
+ assertEquals(.8f, mediator.getFloat("floatOnlyInSettings", .8f), 0.001);
+ assertEquals(.9f, mediator.getFloat("floatOnlyInDeviceConfig", .8f), 0.001);
+ assertEquals(false, mediator.getBoolean("boolean", false));
+ assertEquals(false, mediator.getBoolean("booleanOnlyInSettings", false));
+ assertEquals(true, mediator.getBoolean("booleanOnlyInDeviceConfig", false));
+ assertEquals(60000001, mediator.getLong("long", 987654321));
+ assertEquals(987654321, mediator.getLong("longOnlyInSettings", 987654321));
+ assertEquals(7357, mediator.getLong("longOnlyInDeviceConfig", 987654321));
+ assertEquals("xyz987", mediator.getString("string", "default"));
+ assertEquals("default", mediator.getString("stringOnlyInSettings", "default"));
+ assertEquals("deviceConfigString",
+ mediator.getString("stringOnlyInDeviceConfig", "default"));
+
+ // Nothing in settings, do DeviceConfig can be used.
+ mediator.setSettingsString(null);
+
+ assertEquals(10, mediator.getInt("int", 123));
+ assertEquals(123, mediator.getInt("intOnlyInSettings", 123));
+ assertEquals(9001, mediator.getInt("intOnlyInDeviceConfig", 123));
+ assertEquals(.7f, mediator.getFloat("float", .8f), 0.001);
+ assertEquals(.8f, mediator.getFloat("floatOnlyInSettings", .8f), 0.001);
+ assertEquals(.9f, mediator.getFloat("floatOnlyInDeviceConfig", .8f), 0.001);
+ assertEquals(false, mediator.getBoolean("boolean", false));
+ assertEquals(false, mediator.getBoolean("booleanOnlyInSettings", false));
+ assertEquals(true, mediator.getBoolean("booleanOnlyInDeviceConfig", false));
+ assertEquals(60000001, mediator.getLong("long", 987654321));
+ assertEquals(987654321, mediator.getLong("longOnlyInSettings", 987654321));
+ assertEquals(7357, mediator.getLong("longOnlyInDeviceConfig", 987654321));
+ assertEquals("xyz987", mediator.getString("string", "default"));
+ assertEquals("default", mediator.getString("stringOnlyInSettings", "default"));
+ assertEquals("deviceConfigString",
+ mediator.getString("stringOnlyInDeviceConfig", "default"));
+ }
+
+ @Test
+ public void testSettingsOverridesIndividual() {
+ UserSettingDeviceConfigMediator mediator =
+ new UserSettingDeviceConfigMediator.SettingsOverridesIndividualMediator(',');
+
+ String settings = "int=1,float=.5f,boolean=true,long=123456789,string=abc123,"
+ + "intOnlyInSettings=9,floatOnlyInSettings=.25f,booleanOnlyInSettings=true,"
+ + "longOnlyInSettings=53771465,stringOnlyInSettings=settingsString";
+ DeviceConfig.Properties properties = new DeviceConfig.Properties.Builder("test")
+ .setInt("int", 10)
+ .setInt("intOnlyInDeviceConfig", 9001)
+ .setFloat("float", .7f)
+ .setFloat("floatOnlyInDeviceConfig", .9f)
+ .setBoolean("boolean", false)
+ .setBoolean("booleanOnlyInDeviceConfig", true)
+ .setLong("long", 60000001)
+ .setLong("longOnlyInDeviceConfig", 7357)
+ .setString("string", "xyz987")
+ .setString("stringOnlyInDeviceConfig", "deviceConfigString")
+ .build();
+
+ mediator.setSettingsString(settings);
+ mediator.setDeviceConfigProperties(properties);
+
+ // Since settings overrides individual, anything in DeviceConfig that doesn't exist in
+ // settings should be used.
+ assertEquals(1, mediator.getInt("int", 123));
+ assertEquals(9, mediator.getInt("intOnlyInSettings", 123));
+ assertEquals(9001, mediator.getInt("intOnlyInDeviceConfig", 123));
+ assertEquals(.5f, mediator.getFloat("float", .8f), 0.001);
+ assertEquals(.25f, mediator.getFloat("floatOnlyInSettings", .8f), 0.001);
+ assertEquals(.9f, mediator.getFloat("floatOnlyInDeviceConfig", .8f), 0.001);
+ assertEquals(true, mediator.getBoolean("boolean", false));
+ assertEquals(true, mediator.getBoolean("booleanOnlyInSettings", false));
+ assertEquals(true, mediator.getBoolean("booleanOnlyInDeviceConfig", false));
+ assertEquals(123456789, mediator.getLong("long", 987654321));
+ assertEquals(53771465, mediator.getLong("longOnlyInSettings", 987654321));
+ assertEquals(7357, mediator.getLong("longOnlyInDeviceConfig", 987654321));
+ assertEquals("abc123", mediator.getString("string", "default"));
+ assertEquals("settingsString", mediator.getString("stringOnlyInSettings", "default"));
+ assertEquals("deviceConfigString",
+ mediator.getString("stringOnlyInDeviceConfig", "default"));
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
index d00060564e74..32082e3d857e 100644
--- a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
@@ -28,6 +28,7 @@ import android.content.pm.Signature;
import android.os.Build;
import android.os.Bundle;
import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.test.suitebuilder.annotation.MediumTest;
@@ -1449,4 +1450,21 @@ public class WebViewUpdateServiceTest {
checkPreparationPhasesForPackage(currentSdkPackage.packageName,
1 /* first preparation phase */);
}
+
+ @Test
+ @RequiresFlagsEnabled("android.webkit.update_service_v2")
+ public void testDefaultWebViewPackageIsTheFirstAvailableByDefault() {
+ String nonDefaultPackage = "nonDefaultPackage";
+ String defaultPackage1 = "defaultPackage1";
+ String defaultPackage2 = "defaultPackage2";
+ WebViewProviderInfo[] packages =
+ new WebViewProviderInfo[] {
+ new WebViewProviderInfo(nonDefaultPackage, "", false, false, null),
+ new WebViewProviderInfo(defaultPackage1, "", true, false, null),
+ new WebViewProviderInfo(defaultPackage2, "", true, false, null)
+ };
+ setupWithPackages(packages);
+ assertEquals(
+ defaultPackage1, mWebViewUpdateServiceImpl.getDefaultWebViewPackage().packageName);
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 09ffe71a6758..ee08fd26d631 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -28,6 +28,7 @@ import static android.app.Notification.FLAG_AUTO_CANCEL;
import static android.app.Notification.FLAG_BUBBLE;
import static android.app.Notification.FLAG_CAN_COLORIZE;
import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
+import static android.app.Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
import static android.app.Notification.FLAG_NO_CLEAR;
import static android.app.Notification.FLAG_ONGOING_EVENT;
import static android.app.Notification.FLAG_ONLY_ALERT_ONCE;
@@ -320,6 +321,11 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
private static final int SECONDARY_DISPLAY_ID = 42;
private static final int TEST_PROFILE_USERHANDLE = 12;
+ private static final String ACTION_NOTIFICATION_TIMEOUT =
+ NotificationManagerService.class.getSimpleName() + ".TIMEOUT";
+ private static final String EXTRA_KEY = "key";
+ private static final String SCHEME_TIMEOUT = "timeout";
+
private final int mUid = Binder.getCallingUid();
private final @UserIdInt int mUserId = UserHandle.getUserId(mUid);
@@ -442,6 +448,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
MultiRateLimiter mToastRateLimiter;
BroadcastReceiver mPackageIntentReceiver;
BroadcastReceiver mUserSwitchIntentReceiver;
+ BroadcastReceiver mNotificationTimeoutReceiver;
NotificationRecordLoggerFake mNotificationRecordLogger = new NotificationRecordLoggerFake();
TestableNotificationManagerService.StrongAuthTrackerFake mStrongAuthTracker;
@@ -677,6 +684,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
verify(mContext, atLeastOnce()).registerReceiverAsUser(broadcastReceiverCaptor.capture(),
any(), intentFilterCaptor.capture(), any(), any());
verify(mContext, atLeastOnce()).registerReceiver(broadcastReceiverCaptor.capture(),
+ intentFilterCaptor.capture(), anyInt());
+ verify(mContext, atLeastOnce()).registerReceiver(broadcastReceiverCaptor.capture(),
intentFilterCaptor.capture());
List<BroadcastReceiver> broadcastReceivers = broadcastReceiverCaptor.getAllValues();
List<IntentFilter> intentFilters = intentFilterCaptor.getAllValues();
@@ -695,9 +704,14 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
mUserSwitchIntentReceiver = broadcastReceivers.get(i);
}
}
+ if (filter.hasAction(ACTION_NOTIFICATION_TIMEOUT)
+ && filter.hasDataScheme(SCHEME_TIMEOUT)) {
+ mNotificationTimeoutReceiver = broadcastReceivers.get(i);
+ }
}
assertNotNull("package intent receiver should exist", mPackageIntentReceiver);
assertNotNull("User-switch receiver should exist", mUserSwitchIntentReceiver);
+ assertNotNull("Notification timeout receiver should exist", mNotificationTimeoutReceiver);
// Pretend the shortcut exists
List<ShortcutInfo> shortcutInfos = new ArrayList<>();
@@ -2430,6 +2444,59 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testCancelWithTagDoesNotCancelLifetimeExtended() throws Exception {
+ mSetFlagsRule.enableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+ final NotificationRecord notif = generateNotificationRecord(null);
+ notif.getSbn().getNotification().flags =
+ Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+ mService.addNotification(notif);
+ final StatusBarNotification sbn = notif.getSbn();
+
+ assertThat(mBinderService.getActiveNotifications(sbn.getPackageName()).length).isEqualTo(1);
+ assertThat(mService.getNotificationRecordCount()).isEqualTo(1);
+
+ mBinderService.cancelNotificationWithTag(PKG, PKG, sbn.getTag(), sbn.getId(),
+ sbn.getUserId());
+ waitForIdle();
+
+ assertThat(mBinderService.getActiveNotifications(sbn.getPackageName()).length).isEqualTo(1);
+ assertThat(mService.getNotificationRecordCount()).isEqualTo(1);
+
+ mSetFlagsRule.disableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+ mBinderService.cancelNotificationWithTag(PKG, PKG, sbn.getTag(), sbn.getId(),
+ sbn.getUserId());
+ waitForIdle();
+
+ assertThat(mBinderService.getActiveNotifications(sbn.getPackageName()).length).isEqualTo(0);
+ assertThat(mService.getNotificationRecordCount()).isEqualTo(0);
+ }
+
+ @Test
+ public void testCancelAllDoesNotCancelLifetimeExtended() throws Exception {
+ mSetFlagsRule.enableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+ // Adds a lifetime extended notification.
+ final NotificationRecord notif = generateNotificationRecord(mTestNotificationChannel, 1,
+ null, false);
+ notif.getSbn().getNotification().flags =
+ Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+ mService.addNotification(notif);
+ // Adds a second, non-lifetime extended notification.
+ final NotificationRecord notifCancelable = generateNotificationRecord(
+ mTestNotificationChannel, 2, null, false);
+ mService.addNotification(notifCancelable);
+ // Verify that both notifications have been posted and are active.
+ assertThat(mBinderService.getActiveNotifications(PKG).length).isEqualTo(2);
+
+ mBinderService.cancelAllNotifications(PKG, notif.getSbn().getUserId());
+ waitForIdle();
+
+ // The non-lifetime extended notification, with id = 2, has been cancelled.
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ assertThat(notifs.length).isEqualTo(1);
+ assertThat(notifs[0].getId()).isEqualTo(1);
+ }
+
+ @Test
public void testCancelNotificationWithTag_fromApp_cannotCancelFgsChild()
throws Exception {
when(mAmi.applyForegroundServiceNotification(
@@ -2832,6 +2899,24 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testCancelNotificationsFromListener_clearAll_NoClearLifetimeExt()
+ throws Exception {
+ mSetFlagsRule.enableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+
+ final NotificationRecord notif = generateNotificationRecord(
+ mTestNotificationChannel, 1, null, false);
+ notif.getNotification().flags = FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+ mService.addNotification(notif);
+
+ mService.getBinderService().cancelNotificationsFromListener(null, null);
+ waitForIdle();
+
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(notif.getSbn().getPackageName());
+ assertThat(notifs.length).isEqualTo(1);
+ }
+
+ @Test
public void testCancelNotificationsFromListener_byKey_GroupWithOngoingParent()
throws Exception {
final NotificationRecord parent = generateNotificationRecord(
@@ -3036,6 +3121,22 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
}
@Test
+ public void testCancelNotificationsFromListener_byKey_NoClearLifetimeExt()
+ throws Exception {
+ mSetFlagsRule.enableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+ final NotificationRecord notif = generateNotificationRecord(
+ mTestNotificationChannel, 3, null, false);
+ notif.getNotification().flags |= FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+ mService.addNotification(notif);
+ String[] keys = {notif.getSbn().getKey()};
+ mService.getBinderService().cancelNotificationsFromListener(null, keys);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(notif.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
public void testGroupInstanceIds() throws Exception {
final NotificationRecord group1 = generateNotificationRecord(
mTestNotificationChannel, 1, "group1", true);
@@ -5298,6 +5399,79 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
anyInt());
}
+ private void simulateNotificationTimeoutBroadcast(String notificationKey) {
+ final Bundle extras = new Bundle();
+ extras.putString(EXTRA_KEY, notificationKey);
+ final Intent intent = new Intent(ACTION_NOTIFICATION_TIMEOUT);
+ intent.putExtras(extras);
+ mNotificationTimeoutReceiver.onReceive(getContext(), intent);
+ }
+
+ @Test
+ public void testTimeout_CancelsNotification() throws Exception {
+ final NotificationRecord notif = generateNotificationRecord(
+ mTestNotificationChannel, 1, null, false);
+ mService.addNotification(notif);
+
+ simulateNotificationTimeoutBroadcast(notif.getKey());
+ waitForIdle();
+
+ // Check that the notification was cancelled.
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ assertThat(notifsAfter.length).isEqualTo(0);
+ assertThat(mService.getNotificationRecord(notif.getKey())).isNull();
+ }
+
+ @Test
+ public void testTimeout_NoCancelForegroundServiceNotification() throws Exception {
+ // Creates a notification with FLAG_FOREGROUND_SERVICE
+ final NotificationRecord notif = generateNotificationRecord(null);
+ notif.getSbn().getNotification().flags = Notification.FLAG_FOREGROUND_SERVICE;
+ mService.addNotification(notif);
+
+ simulateNotificationTimeoutBroadcast(notif.getKey());
+ waitForIdle();
+
+ // Check that the notification was not cancelled.
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ assertThat(notifsAfter.length).isEqualTo(1);
+ assertThat(mService.getNotificationRecord(notif.getKey())).isEqualTo(notif);
+ }
+
+ @Test
+ public void testTimeout_NoCancelUserInitJobNotification() throws Exception {
+ // Create a notification with FLAG_USER_INITIATED_JOB
+ final NotificationRecord notif = generateNotificationRecord(null);
+ notif.getSbn().getNotification().flags = Notification.FLAG_USER_INITIATED_JOB;
+ mService.addNotification(notif);
+
+ simulateNotificationTimeoutBroadcast(notif.getKey());
+ waitForIdle();
+
+ // Check that the notification was not cancelled.
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ assertThat(notifsAfter.length).isEqualTo(1);
+ assertThat(mService.getNotificationRecord(notif.getKey())).isEqualTo(notif);
+ }
+
+ @Test
+ public void testTimeout_NoCancelLifetimeExtensionNotification() throws Exception {
+ mSetFlagsRule.enableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+ // Create a notification with FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY
+ final NotificationRecord notif = generateNotificationRecord(null);
+ notif.getSbn().getNotification().flags =
+ Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
+ mService.addNotification(notif);
+
+ simulateNotificationTimeoutBroadcast(notif.getKey());
+ waitForIdle();
+
+ // Check that the notification was not cancelled.
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ assertThat(notifsAfter.length).isEqualTo(1);
+ assertThat(mService.getNotificationRecord(notif.getKey())).isEqualTo(notif);
+ }
+
@Test
public void testBumpFGImportance_channelChangePreOApp() throws Exception {
String preOPkg = PKG_N_MR1;
@@ -7913,6 +8087,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Test
public void testOnNotificationSmartReplySent() {
+ mSetFlagsRule.enableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
final int replyIndex = 2;
final String reply = "Hello";
final boolean modifiedBeforeSending = true;
@@ -7930,6 +8105,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
assertEquals(1, mNotificationRecordLogger.numCalls());
assertEquals(NotificationRecordLogger.NotificationEvent.NOTIFICATION_SMART_REPLIED,
mNotificationRecordLogger.event(0));
+ // Check that r.recordSmartReplied was called.
+ assertThat(r.getSbn().getNotification().flags & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY)
+ .isGreaterThan(0);
+ assertThat(r.getStats().hasSmartReplied()).isTrue();
}
@Test
@@ -13116,6 +13295,20 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
eq("package"), anyString(), anyInt(), anyBoolean());
}
+ @Test
+ public void testFixNotification_clearsLifetimeExtendedFlag() throws Exception {
+ mSetFlagsRule.enableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+ Notification n = new Notification.Builder(mContext, "test")
+ .setFlag(FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY, true)
+ .build();
+
+ assertThat(n.flags & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isGreaterThan(0);
+
+ mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+
+ assertThat(n.flags & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isEqualTo(0);
+ }
+
private NotificationRecord createAndPostNotification(Notification.Builder nb, String testName)
throws RemoteException {
StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, testName, mUid, 0,
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
index f83a1df358bd..670d09795e12 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
@@ -29,6 +29,8 @@ import static android.service.notification.NotificationListenerService.Ranking.U
import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL;
import static android.service.notification.NotificationListenerService.Ranking.USER_SENTIMENT_POSITIVE;
+import static com.google.common.truth.Truth.assertThat;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
@@ -44,6 +46,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.app.ActivityManager;
+import android.app.Flags;
import android.app.Notification;
import android.app.Notification.Builder;
import android.app.NotificationChannel;
@@ -64,6 +67,7 @@ import android.os.Build;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.Vibrator;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.service.notification.Adjustment;
import android.service.notification.StatusBarNotification;
@@ -80,6 +84,7 @@ import com.android.server.UiServiceTestCase;
import com.android.server.uri.UriGrantsManagerInternal;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -122,6 +127,9 @@ public class NotificationRecordTest extends UiServiceTestCase {
private static final NotificationRecord.Light CUSTOM_LIGHT =
new NotificationRecord.Light(1, 2, 3);
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -651,6 +659,7 @@ public class NotificationRecordTest extends UiServiceTestCase {
@Test
public void testNotificationStats() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
false /* lights */, false /* defaultLights */, groupId /* group */);
@@ -690,6 +699,37 @@ public class NotificationRecordTest extends UiServiceTestCase {
record.recordDirectReplied();
assertTrue(record.getStats().hasDirectReplied());
+
+ record.recordSmartReplied();
+ assertThat(record.getStats().hasSmartReplied()).isTrue();
+ }
+
+ @Test
+ public void testDirectRepliedAddsLifetimeExtensionFlag() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+
+ StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+ record.recordDirectReplied();
+ assertThat(record.getSbn().getNotification().flags
+ & Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isGreaterThan(0);
+ }
+
+ @Test
+ public void testSmartRepliedAddsLifetimeExtensionFlag() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
+
+ StatusBarNotification sbn = getNotification(PKG_O, true /* noisy */,
+ true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+ false /* lights */, false /* defaultLights */, groupId /* group */);
+ NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+ record.recordSmartReplied();
+ assertThat(record.getSbn().getNotification().flags
+ & Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isGreaterThan(0);
}
@Test
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackCustomizationTest.java b/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackCustomizationTest.java
index 04158c4d4f93..2b23b1897f59 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackCustomizationTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackCustomizationTest.java
@@ -56,22 +56,22 @@ public class HapticFeedbackCustomizationTest {
@Rule public MockitoRule rule = MockitoJUnit.rule();
// Pairs of valid vibration XML along with their equivalent VibrationEffect.
- private static final String COMPOSITION_VIBRATION_XML = "<vibration>"
+ private static final String COMPOSITION_VIBRATION_XML = "<vibration-effect>"
+ "<primitive-effect name=\"tick\" scale=\"0.2497\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
private static final VibrationEffect COMPOSITION_VIBRATION =
VibrationEffect.startComposition().addPrimitive(PRIMITIVE_TICK, 0.2497f).compose();
private static final String PREDEFINED_VIBRATION_XML =
- "<vibration><predefined-effect name=\"click\"/></vibration>";
+ "<vibration-effect><predefined-effect name=\"click\"/></vibration-effect>";
private static final VibrationEffect PREDEFINED_VIBRATION =
VibrationEffect.createPredefined(EFFECT_CLICK);
- private static final String WAVEFORM_VIBRATION_XML = "<vibration>"
+ private static final String WAVEFORM_VIBRATION_XML = "<vibration-effect>"
+ "<waveform-effect>"
+ "<waveform-entry durationMs=\"123\" amplitude=\"254\"/>"
+ "</waveform-effect>"
- + "</vibration>";
+ + "</vibration-effect>";
private static final VibrationEffect WAVEFORM_VIBARTION =
VibrationEffect.createWaveform(new long[] {123}, new int[] {254}, -1);
@@ -259,13 +259,13 @@ public class HapticFeedbackCustomizationTest {
assertParseCustomizationsFails(
"<haptic-feedback-constants>"
+ "<constant id=\"10\">"
- + "<vibration>"
+ + "<vibration-effect>"
+ "<waveform-effect>"
+ "<repeating>"
+ "<waveform-entry durationMs=\"10\" amplitude=\"100\"/>"
+ "</repeating>"
+ "</waveform-effect>"
- + "</vibration>"
+ + "</vibration-effect>"
+ "</constant>"
+ "</haptic-feedback-constants>");
}
@@ -339,14 +339,14 @@ public class HapticFeedbackCustomizationTest {
assertParseCustomizationsFails(
"<haptic-feedback-constants>"
+ "<constant id=\"10\">"
- + "<bad-vibration></bad-vibration>"
+ + "<bad-vibration-effect></bad-vibration-effect>"
+ "</constant>"
+ "</haptic-feedback-constants>");
assertParseCustomizationsFails(
"<haptic-feedback-constants>"
+ "<constant id=\"10\">"
- + "<vibration><predefined-effect name=\"bad-effect-name\"/></vibration>"
+ + "<vibration-effect><predefined-effect name=\"bad-effect\"/></vibration-effect>"
+ "</constant>"
+ "</haptic-feedback-constants>");
@@ -354,14 +354,14 @@ public class HapticFeedbackCustomizationTest {
"<haptic-feedback-constants>"
+ "<constant id=\"10\">"
+ "<vibration-select>"
- + "<vibration><predefined-effect name=\"bad-effect-name\"/></vibration>"
+ + "<vibration-effect><predefined-effect name=\"bad-effect\"/></vibration-effect>"
+ "</constant>"
+ "</haptic-feedback-constants>");
assertParseCustomizationsFails(
"<haptic-feedback-constants>"
+ "<constant id=\"10\">"
- + "<vibration><predefined-effect name=\"bad-effect-name\"/></vibration>"
+ + "<vibration-effect><predefined-effect name=\"bad-effect\"/></vibration-effect>"
+ "</vibration-select>"
+ "</constant>"
+ "</haptic-feedback-constants>");
diff --git a/services/tests/wmtests/AndroidManifest.xml b/services/tests/wmtests/AndroidManifest.xml
index f2a1fe859634..a8d3fa110844 100644
--- a/services/tests/wmtests/AndroidManifest.xml
+++ b/services/tests/wmtests/AndroidManifest.xml
@@ -93,15 +93,13 @@
android:showWhenLocked="true"/>
<activity android:name="android.view.cts.surfacevalidator.CapturedActivity"/>
- <activity android:name="com.android.server.wm.SurfaceControlViewHostTests$TestActivity" />
-
<activity android:name="com.android.server.wm.SurfaceSyncGroupTests$TestActivity"
android:screenOrientation="locked"
android:turnScreenOn="true"
android:theme="@style/WhiteBackgroundTheme"
android:exported="true"/>
- <activity android:name="com.android.server.wm.TrustedPresentationCallbackTest$TestActivity"
+ <activity android:name="com.android.server.wm.TrustedPresentationListenerTest$TestActivity"
android:exported="true"
android:showWhenLocked="true"
android:turnScreenOn="true" />
@@ -122,6 +120,13 @@
<activity android:name="com.android.server.wm.ActivityRecordInputSinkTests$TestActivity"
android:exported="true">
</activity>
+
+ <activity android:name="com.android.server.wm.utils.TestActivity"
+ android:screenOrientation="locked"
+ android:turnScreenOn="true"
+ android:showWhenLocked="true"
+ android:theme="@style/WhiteBackgroundTheme"
+ android:exported="true" />
</application>
<instrumentation
diff --git a/services/tests/wmtests/AndroidTest.xml b/services/tests/wmtests/AndroidTest.xml
index f8ebeaddcb7e..46e87dceb8d4 100644
--- a/services/tests/wmtests/AndroidTest.xml
+++ b/services/tests/wmtests/AndroidTest.xml
@@ -30,4 +30,8 @@
<option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
<option name="hidden-api-checks" value="false" />
</test>
+
+ <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+ <option name="run-command" value="settings put secure immersive_mode_confirmations confirmed" />
+ </target_preparer>
</configuration>
diff --git a/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java b/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java
index 2c35cf0c4151..8d236eda5dc5 100644
--- a/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java
@@ -110,24 +110,6 @@ public class ModifierShortcutTests extends ShortcutKeyTestBase {
}
/**
- * META + SPACE to switch keyboard layout.
- */
- @Test
- public void testMetaSpace() {
- sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_SPACE}, 0);
- mPhoneWindowManager.assertSwitchKeyboardLayout(1);
- }
-
- /**
- * META + SHIFT + SPACE to switch keyboard layout backwards.
- */
- @Test
- public void testMetaShiftSpace() {
- sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_SHIFT_LEFT, KEYCODE_SPACE}, 0);
- mPhoneWindowManager.assertSwitchKeyboardLayout(-1);
- }
-
- /**
* CTRL + ALT + Z to enable accessibility service.
*/
@Test
diff --git a/services/tests/wmtests/src/com/android/server/policy/ShortcutLoggingTests.java b/services/tests/wmtests/src/com/android/server/policy/ShortcutLoggingTests.java
index 71098aa5e883..6853c4cdea0e 100644
--- a/services/tests/wmtests/src/com/android/server/policy/ShortcutLoggingTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/ShortcutLoggingTests.java
@@ -30,13 +30,13 @@ import androidx.test.filters.MediumTest;
import com.android.internal.annotations.Keep;
import com.android.server.input.KeyboardMetricsCollector.KeyboardLogEvent;
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import junitparams.JUnitParamsRunner;
-import junitparams.Parameters;
-
@Presubmit
@MediumTest
@RunWith(JUnitParamsRunner.class)
@@ -44,6 +44,7 @@ public class ShortcutLoggingTests extends ShortcutKeyTestBase {
private static final int VENDOR_ID = 0x123;
private static final int PRODUCT_ID = 0x456;
+ private static final int DEVICE_BUS = 0x789;
private static final int META_KEY = KeyEvent.KEYCODE_META_LEFT;
private static final int META_ON = MODIFIER.get(KeyEvent.KEYCODE_META_LEFT);
private static final int ALT_KEY = KeyEvent.KEYCODE_ALT_LEFT;
@@ -71,8 +72,8 @@ public class ShortcutLoggingTests extends ShortcutKeyTestBase {
KeyboardLogEvent.RECENT_APPS, KeyEvent.KEYCODE_TAB, ALT_ON},
{"BACK key -> Go back", new int[]{KeyEvent.KEYCODE_BACK}, KeyboardLogEvent.BACK,
KeyEvent.KEYCODE_BACK, 0},
- {"Meta + `(grave) -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_GRAVE},
- KeyboardLogEvent.BACK, KeyEvent.KEYCODE_GRAVE, META_ON},
+ {"Meta + Escape -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_ESCAPE},
+ KeyboardLogEvent.BACK, KeyEvent.KEYCODE_ESCAPE, META_ON},
{"Meta + Left arrow -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_DPAD_LEFT},
KeyboardLogEvent.BACK, KeyEvent.KEYCODE_DPAD_LEFT, META_ON},
{"Meta + Del -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_DEL},
@@ -132,13 +133,6 @@ public class ShortcutLoggingTests extends ShortcutKeyTestBase {
{"LANGUAGE_SWITCH key -> Switch Keyboard Language",
new int[]{KeyEvent.KEYCODE_LANGUAGE_SWITCH},
KeyboardLogEvent.LANGUAGE_SWITCH, KeyEvent.KEYCODE_LANGUAGE_SWITCH, 0},
- {"Meta + Space -> Switch Keyboard Language",
- new int[]{META_KEY, KeyEvent.KEYCODE_SPACE},
- KeyboardLogEvent.LANGUAGE_SWITCH, KeyEvent.KEYCODE_SPACE, META_ON},
- {"Meta + Shift + Space -> Switch Keyboard Language",
- new int[]{META_KEY, SHIFT_KEY, KeyEvent.KEYCODE_SPACE},
- KeyboardLogEvent.LANGUAGE_SWITCH, KeyEvent.KEYCODE_SPACE,
- META_ON | SHIFT_ON},
{"META key -> Open App Drawer in Accessibility mode", new int[]{META_KEY},
KeyboardLogEvent.ACCESSIBILITY_ALL_APPS, META_KEY, META_ON},
{"Meta + Alt -> Toggle CapsLock", new int[]{META_KEY, ALT_KEY},
@@ -298,7 +292,7 @@ public class ShortcutLoggingTests extends ShortcutKeyTestBase {
@Before
public void setUp() {
setUpPhoneWindowManager(/*supportSettingsUpdate*/ true);
- mPhoneWindowManager.overrideKeyEventSource(VENDOR_ID, PRODUCT_ID);
+ mPhoneWindowManager.overrideKeyEventSource(VENDOR_ID, PRODUCT_ID, DEVICE_BUS);
mPhoneWindowManager.overrideLaunchHome();
mPhoneWindowManager.overrideSearchKeyBehavior(
PhoneWindowManager.SEARCH_BEHAVIOR_TARGET_ACTIVITY);
@@ -318,7 +312,8 @@ public class ShortcutLoggingTests extends ShortcutKeyTestBase {
int expectedKey, int expectedModifierState) {
sendKeyCombination(testKeys, 0 /* duration */);
mPhoneWindowManager.assertShortcutLogged(VENDOR_ID, PRODUCT_ID, expectedLogEvent,
- expectedKey, expectedModifierState, "Failed while executing " + testName);
+ expectedKey, expectedModifierState, DEVICE_BUS,
+ "Failed while executing " + testName);
}
@Test
@@ -328,7 +323,8 @@ public class ShortcutLoggingTests extends ShortcutKeyTestBase {
mPhoneWindowManager.overrideLongPressOnHomeBehavior(longPressOnHomeBehavior);
sendLongPressKeyCombination(testKeys);
mPhoneWindowManager.assertShortcutLogged(VENDOR_ID, PRODUCT_ID, expectedLogEvent,
- expectedKey, expectedModifierState, "Failed while executing " + testName);
+ expectedKey, expectedModifierState, DEVICE_BUS,
+ "Failed while executing " + testName);
}
@Test
@@ -340,7 +336,8 @@ public class ShortcutLoggingTests extends ShortcutKeyTestBase {
sendKeyCombination(testKeys, 0 /* duration */);
sendKeyCombination(testKeys, 0 /* duration */);
mPhoneWindowManager.assertShortcutLogged(VENDOR_ID, PRODUCT_ID, expectedLogEvent,
- expectedKey, expectedModifierState, "Failed while executing " + testName);
+ expectedKey, expectedModifierState, DEVICE_BUS,
+ "Failed while executing " + testName);
}
@Test
@@ -351,6 +348,7 @@ public class ShortcutLoggingTests extends ShortcutKeyTestBase {
mPhoneWindowManager.overrideShortPressOnSettingsBehavior(shortPressOnSettingsBehavior);
sendKeyCombination(testKeys, 0 /* duration */);
mPhoneWindowManager.assertShortcutLogged(VENDOR_ID, PRODUCT_ID, expectedLogEvent,
- expectedKey, expectedModifierState, "Failed while executing " + testName);
+ expectedKey, expectedModifierState, DEVICE_BUS,
+ "Failed while executing " + testName);
}
}
diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
index 7788b339738b..43c47458d19f 100644
--- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
+++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
@@ -483,10 +483,15 @@ class TestPhoneWindowManager {
doReturn(mPackageManager).when(mContext).getPackageManager();
}
- void overrideKeyEventSource(int vendorId, int productId) {
- InputDevice device = new InputDevice.Builder().setId(1).setVendorId(vendorId).setProductId(
- productId).setSources(InputDevice.SOURCE_KEYBOARD).setKeyboardType(
- InputDevice.KEYBOARD_TYPE_ALPHABETIC).build();
+ void overrideKeyEventSource(int vendorId, int productId, int deviceBus) {
+ InputDevice device = new InputDevice.Builder()
+ .setId(1)
+ .setVendorId(vendorId)
+ .setProductId(productId)
+ .setDeviceBus(deviceBus)
+ .setSources(InputDevice.SOURCE_KEYBOARD)
+ .setKeyboardType(InputDevice.KEYBOARD_TYPE_ALPHABETIC)
+ .build();
doReturn(mInputManager).when(mContext).getSystemService(eq(InputManager.class));
doReturn(device).when(mInputManager).getInputDevice(anyInt());
}
@@ -682,11 +687,11 @@ class TestPhoneWindowManager {
}
void assertShortcutLogged(int vendorId, int productId, KeyboardLogEvent logEvent,
- int expectedKey, int expectedModifierState, String errorMsg) {
+ int expectedKey, int expectedModifierState, int deviceBus, String errorMsg) {
mTestLooper.dispatchAll();
verify(() -> FrameworkStatsLog.write(FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED,
vendorId, productId, logEvent.getIntValue(), new int[]{expectedKey},
- expectedModifierState), description(errorMsg));
+ expectedModifierState, deviceBus), description(errorMsg));
}
void assertSwitchToRecent(int persistentId) throws RemoteException {
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 f2e54bc572ae..7aa46a62b0f1 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -3727,6 +3727,24 @@ public class ActivityRecordTests extends WindowTestsBase {
verify(task).moveTaskToBack(any());
}
+ /**
+ * Verifies the {@link ActivityRecord#moveFocusableActivityToTop} returns {@code false} if
+ * there's a PIP task on top.
+ */
+ @Test
+ public void testMoveFocusableActivityToTop() {
+ // Create a Task
+ final Task task = createTask(mDisplayContent);
+ final ActivityRecord ar = createActivityRecord(task);
+
+ // Create a PIP Task on top
+ final Task pipTask = createTask(mDisplayContent);
+ doReturn(true).when(pipTask).inPinnedWindowingMode();
+
+ // Verifies that the Task is not moving-to-top.
+ assertFalse(ar.moveFocusableActivityToTop("test"));
+ }
+
private ICompatCameraControlCallback getCompatCameraControlCallback() {
return new ICompatCameraControlCallback.Stub() {
@Override
diff --git a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
index 9f584911aed7..9efbe3587ab2 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DimmerTests.java
@@ -25,8 +25,6 @@ import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_DIMMER;
import static com.android.server.wm.utils.LastCallVerifier.lastCall;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assume.assumeFalse;
-import static org.junit.Assume.assumeTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -36,11 +34,14 @@ import static org.mockito.Mockito.when;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
import com.android.server.testutils.StubTransaction;
import com.android.server.wm.utils.MockAnimationAdapter;
+import com.android.window.flags.Flags;
import org.junit.Before;
import org.junit.Test;
@@ -122,7 +123,8 @@ public class DimmerTests extends WindowTestsBase {
}
}
- static class MockAnimationAdapterFactory extends SmoothDimmer.AnimationAdapterFactory {
+ static class MockAnimationAdapterFactory extends DimmerAnimationHelper.AnimationAdapterFactory {
+ @Override
public AnimationAdapter get(LocalAnimationAdapter.AnimationSpec alphaAnimationSpec,
SurfaceAnimationRunner runner) {
return sTestAnimation;
@@ -175,8 +177,8 @@ public class DimmerTests extends WindowTestsBase {
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_INTRODUCE_SMOOTHER_DIMMER)
public void testDimBelowWithChildSurfaceCreatesSurfaceBelowChild_Smooth() {
- assumeTrue(Dimmer.DIMMER_REFACTOR);
final float alpha = 0.7f;
final int blur = 50;
mHost.addChild(mChild, 0);
@@ -195,8 +197,8 @@ public class DimmerTests extends WindowTestsBase {
}
@Test
+ @RequiresFlagsDisabled(Flags.FLAG_INTRODUCE_SMOOTHER_DIMMER)
public void testDimBelowWithChildSurfaceCreatesSurfaceBelowChild_Legacy() {
- assumeFalse(Dimmer.DIMMER_REFACTOR);
final float alpha = 0.7f;
mHost.addChild(mChild, 0);
mDimmer.adjustAppearance(mChild, alpha, 20);
@@ -210,8 +212,8 @@ public class DimmerTests extends WindowTestsBase {
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_INTRODUCE_SMOOTHER_DIMMER)
public void testDimBelowWithChildSurfaceDestroyedWhenReset_Smooth() {
- assumeTrue(Dimmer.DIMMER_REFACTOR);
mHost.addChild(mChild, 0);
final float alpha = 0.8f;
@@ -230,8 +232,8 @@ public class DimmerTests extends WindowTestsBase {
}
@Test
+ @RequiresFlagsDisabled(Flags.FLAG_INTRODUCE_SMOOTHER_DIMMER)
public void testDimBelowWithChildSurfaceDestroyedWhenReset_Legacy() {
- assumeFalse(Dimmer.DIMMER_REFACTOR);
mHost.addChild(mChild, 0);
final float alpha = 0.8f;
@@ -290,8 +292,8 @@ public class DimmerTests extends WindowTestsBase {
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_INTRODUCE_SMOOTHER_DIMMER)
public void testRemoveDimImmediately_Smooth() {
- assumeTrue(Dimmer.DIMMER_REFACTOR);
mHost.addChild(mChild, 0);
mDimmer.adjustAppearance(mChild, 1, 2);
mDimmer.adjustRelativeLayer(mChild, -1);
@@ -310,8 +312,8 @@ public class DimmerTests extends WindowTestsBase {
}
@Test
+ @RequiresFlagsDisabled(Flags.FLAG_INTRODUCE_SMOOTHER_DIMMER)
public void testRemoveDimImmediately_Legacy() {
- assumeFalse(Dimmer.DIMMER_REFACTOR);
mHost.addChild(mChild, 0);
mDimmer.adjustAppearance(mChild, 1, 0);
mDimmer.adjustRelativeLayer(mChild, -1);
@@ -330,8 +332,8 @@ public class DimmerTests extends WindowTestsBase {
}
@Test
+ @RequiresFlagsDisabled(Flags.FLAG_INTRODUCE_SMOOTHER_DIMMER)
public void testDimmerWithBlurUpdatesTransaction_Legacy() {
- assumeFalse(Dimmer.DIMMER_REFACTOR);
mHost.addChild(mChild, 0);
final int blurRadius = 50;
@@ -344,4 +346,120 @@ public class DimmerTests extends WindowTestsBase {
verify(mHost.getPendingTransaction()).setBackgroundBlurRadius(dimLayer, blurRadius);
verify(mHost.getPendingTransaction()).setRelativeLayer(dimLayer, mChild.mControl, -1);
}
+
+ /**
+ * mChild is requesting the dim values to be set directly. In this case, dim won't play the
+ * standard animation, but directly apply mChild's requests to the dim surface
+ */
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_INTRODUCE_SMOOTHER_DIMMER)
+ public void testContainerDimsOpeningAnimationByItself() {
+ mHost.addChild(mChild, 0);
+
+ mDimmer.resetDimStates();
+ mDimmer.adjustAppearance(mChild, 0.1f, 0);
+ mDimmer.adjustRelativeLayer(mChild, -1);
+ SurfaceControl dimLayer = mDimmer.getDimLayer();
+ mDimmer.updateDims(mTransaction);
+
+ mDimmer.resetDimStates();
+ mDimmer.adjustAppearance(mChild, 0.2f, 0);
+ mDimmer.adjustRelativeLayer(mChild, -1);
+ mDimmer.updateDims(mTransaction);
+
+ mDimmer.resetDimStates();
+ mDimmer.adjustAppearance(mChild, 0.3f, 0);
+ mDimmer.adjustRelativeLayer(mChild, -1);
+ mDimmer.updateDims(mTransaction);
+
+ verify(mTransaction).setAlpha(dimLayer, 0.2f);
+ verify(mTransaction).setAlpha(dimLayer, 0.3f);
+ verify(sTestAnimation, times(1)).startAnimation(
+ any(SurfaceControl.class), any(SurfaceControl.Transaction.class),
+ anyInt(), any(SurfaceAnimator.OnAnimationFinishedCallback.class));
+ }
+
+ /**
+ * Same as testContainerDimsOpeningAnimationByItself, but this is a more specific case in which
+ * alpha is animated to 0. This corner case is needed to verify that the layer is removed anyway
+ */
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_INTRODUCE_SMOOTHER_DIMMER)
+ public void testContainerDimsClosingAnimationByItself() {
+ mHost.addChild(mChild, 0);
+
+ mDimmer.resetDimStates();
+ mDimmer.adjustAppearance(mChild, 0.2f, 0);
+ mDimmer.adjustRelativeLayer(mChild, -1);
+ SurfaceControl dimLayer = mDimmer.getDimLayer();
+ mDimmer.updateDims(mTransaction);
+
+ mDimmer.resetDimStates();
+ mDimmer.adjustAppearance(mChild, 0.1f, 0);
+ mDimmer.adjustRelativeLayer(mChild, -1);
+ mDimmer.updateDims(mTransaction);
+
+ mDimmer.resetDimStates();
+ mDimmer.adjustAppearance(mChild, 0f, 0);
+ mDimmer.adjustRelativeLayer(mChild, -1);
+ mDimmer.updateDims(mTransaction);
+
+ mDimmer.resetDimStates();
+ mDimmer.updateDims(mTransaction);
+ verify(mTransaction).remove(dimLayer);
+ }
+
+ /**
+ * Check the handover of the dim between two windows and the consequent dim animation in between
+ */
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_INTRODUCE_SMOOTHER_DIMMER)
+ public void testMultipleContainersDimmingConsecutively() {
+ TestWindowContainer first = mChild;
+ TestWindowContainer second = new TestWindowContainer(mWm);
+ mHost.addChild(first, 0);
+ mHost.addChild(second, 1);
+
+ mDimmer.adjustAppearance(first, 0.5f, 0);
+ mDimmer.adjustRelativeLayer(first, -1);
+ SurfaceControl dimLayer = mDimmer.getDimLayer();
+ mDimmer.updateDims(mTransaction);
+
+ mDimmer.resetDimStates();
+ mDimmer.adjustAppearance(second, 0.9f, 0);
+ mDimmer.adjustRelativeLayer(second, -1);
+ mDimmer.updateDims(mTransaction);
+
+ verify(sTestAnimation, times(2)).startAnimation(
+ any(SurfaceControl.class), any(SurfaceControl.Transaction.class),
+ anyInt(), any(SurfaceAnimator.OnAnimationFinishedCallback.class));
+ verify(mTransaction).setAlpha(dimLayer, 0.5f);
+ verify(mTransaction).setAlpha(dimLayer, 0.9f);
+ }
+
+ /**
+ * Two windows are trying to modify the dim at the same time, but only the last request before
+ * updateDims will be satisfied
+ */
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_INTRODUCE_SMOOTHER_DIMMER)
+ public void testMultipleContainersDimmingAtTheSameTime() {
+ TestWindowContainer first = mChild;
+ TestWindowContainer second = new TestWindowContainer(mWm);
+ mHost.addChild(first, 0);
+ mHost.addChild(second, 1);
+
+ mDimmer.adjustAppearance(first, 0.5f, 0);
+ mDimmer.adjustRelativeLayer(first, -1);
+ SurfaceControl dimLayer = mDimmer.getDimLayer();
+ mDimmer.adjustAppearance(second, 0.9f, 0);
+ mDimmer.adjustRelativeLayer(second, -1);
+ mDimmer.updateDims(mTransaction);
+
+ verify(sTestAnimation, times(1)).startAnimation(
+ any(SurfaceControl.class), any(SurfaceControl.Transaction.class),
+ anyInt(), any(SurfaceAnimator.OnAnimationFinishedCallback.class));
+ verify(mTransaction, never()).setAlpha(dimLayer, 0.5f);
+ verify(mTransaction).setAlpha(dimLayer, 0.9f);
+ }
}
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 5a434988e548..0608cf4abfde 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -362,6 +362,8 @@ public class RootWindowContainerTests extends WindowTestsBase {
// Ensure a task has moved over.
ensureTaskPlacement(task, activity);
assertTrue(task.inPinnedWindowingMode());
+ assertFalse("Entering PiP activity must not affect SysUiFlags",
+ activity.canAffectSystemUiFlags());
// The activity with fixed orientation should not apply letterbox when entering PiP.
final int requestedOrientation = task.getConfiguration().orientation
diff --git a/services/tests/wmtests/src/com/android/server/wm/SurfaceControlViewHostTests.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceControlViewHostTests.java
index 8119fd486a87..ef427bb15039 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SurfaceControlViewHostTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceControlViewHostTests.java
@@ -23,15 +23,14 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static org.junit.Assert.assertTrue;
-import android.app.Activity;
import android.app.Instrumentation;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.PixelFormat;
-import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
+import android.server.wm.BuildUtils;
import android.view.Gravity;
import android.view.IWindow;
import android.view.SurfaceControl;
@@ -46,12 +45,12 @@ import android.widget.Button;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import com.android.server.wm.utils.CommonUtils;
+import com.android.server.wm.utils.TestActivity;
import org.junit.After;
import org.junit.Before;
@@ -59,11 +58,14 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
@Presubmit
@SmallTest
@RunWith(WindowTestRunner.class)
public class SurfaceControlViewHostTests {
+ private static final long WAIT_TIME_S = 5L * BuildUtils.HW_TIMEOUT_MULTIPLIER;
+
private static final String TAG = "SurfaceControlViewHostTests";
private final ActivityTestRule<TestActivity> mActivityRule = new ActivityTestRule<>(
@@ -76,6 +78,8 @@ public class SurfaceControlViewHostTests {
private SurfaceControlViewHost mScvh1;
private SurfaceControlViewHost mScvh2;
+ private SurfaceView mSurfaceView;
+
@Before
public void setUp() throws Exception {
mInstrumentation = InstrumentationRegistry.getInstrumentation();
@@ -96,15 +100,17 @@ public class SurfaceControlViewHostTests {
mView1 = new Button(mActivity);
mView2 = new Button(mActivity);
- mInstrumentation.runOnMainSync(() -> {
- try {
- mActivity.attachToSurfaceView(sc);
- } catch (InterruptedException e) {
- }
+ CountDownLatch svReadyLatch = new CountDownLatch(1);
+ mActivity.runOnUiThread(() -> addSurfaceView(svReadyLatch));
+ assertTrue("Failed to wait for SV to get created",
+ svReadyLatch.await(WAIT_TIME_S, TimeUnit.SECONDS));
+ new SurfaceControl.Transaction().reparent(sc, mSurfaceView.getSurfaceControl())
+ .show(sc).apply();
+ mInstrumentation.runOnMainSync(() -> {
TestWindowlessWindowManager wwm = new TestWindowlessWindowManager(
mActivity.getResources().getConfiguration(), sc,
- mActivity.mSurfaceView.getHostToken());
+ mSurfaceView.getHostToken());
mScvh1 = new SurfaceControlViewHost(mActivity, mActivity.getDisplay(),
wwm, "requestFocusWithMultipleWindows");
@@ -131,19 +137,29 @@ public class SurfaceControlViewHostTests {
wasVisible = waitForWindowVisible(mView2);
if (!wasVisible) {
- dumpWindowsOnScreen(TAG, "requestFocusWithMultipleWindows");
+ dumpWindowsOnScreen(TAG, "requestFocusWithMultipleWindows-not visible");
}
assertTrue("Failed to wait for view2", wasVisible);
- IWindow window = IWindow.Stub.asInterface(mActivity.mSurfaceView.getWindowToken());
+ IWindow window = IWindow.Stub.asInterface(mSurfaceView.getWindowToken());
WindowManagerGlobal.getWindowSession().grantEmbeddedWindowFocus(window,
mScvh1.getInputTransferToken(), true);
- assertTrue("Failed to gain focus for view1", waitForWindowFocus(mView1, true));
+
+ boolean gainedFocus = waitForWindowFocus(mView1, true);
+ if (!gainedFocus) {
+ dumpWindowsOnScreen(TAG, "requestFocusWithMultipleWindows-view1 not focus");
+ }
+ assertTrue("Failed to gain focus for view1", gainedFocus);
WindowManagerGlobal.getWindowSession().grantEmbeddedWindowFocus(window,
mScvh2.getInputTransferToken(), true);
- assertTrue("Failed to gain focus for view2", waitForWindowFocus(mView2, true));
+
+ gainedFocus = waitForWindowFocus(mView2, true);
+ if (!gainedFocus) {
+ dumpWindowsOnScreen(TAG, "requestFocusWithMultipleWindows-view2 not focus");
+ }
+ assertTrue("Failed to gain focus for view2", gainedFocus);
}
private static class TestWindowlessWindowManager extends WindowlessWindowManager {
@@ -162,43 +178,30 @@ public class SurfaceControlViewHostTests {
}
}
- public static class TestActivity extends Activity implements SurfaceHolder.Callback {
- private SurfaceView mSurfaceView;
- private final CountDownLatch mSvReadyLatch = new CountDownLatch(1);
-
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- final FrameLayout content = new FrameLayout(this);
- mSurfaceView = new SurfaceView(this);
- mSurfaceView.setBackgroundColor(Color.BLACK);
- mSurfaceView.setZOrderOnTop(true);
- final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(500, 500,
- Gravity.LEFT | Gravity.TOP);
- content.addView(mSurfaceView, lp);
- setContentView(content);
- mSurfaceView.getHolder().addCallback(this);
- }
+ private void addSurfaceView(CountDownLatch svReadyLatch) {
+ final FrameLayout content = mActivity.getParentLayout();
+ mSurfaceView = new SurfaceView(mActivity);
+ mSurfaceView.setZOrderOnTop(true);
+ final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(500, 500,
+ Gravity.LEFT | Gravity.TOP);
+ mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
+ @Override
+ public void surfaceCreated(@NonNull SurfaceHolder holder) {
+ svReadyLatch.countDown();
+ }
- @Override
- public void surfaceCreated(@NonNull SurfaceHolder holder) {
- mSvReadyLatch.countDown();
- }
+ @Override
+ public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width,
+ int height) {
- @Override
- public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width,
- int height) {
- }
+ }
- @Override
- public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
- }
+ @Override
+ public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
- public void attachToSurfaceView(SurfaceControl sc) throws InterruptedException {
- mSvReadyLatch.await();
- new SurfaceControl.Transaction().reparent(sc, mSurfaceView.getSurfaceControl())
- .show(sc).apply();
- }
+ }
+ });
+ content.addView(mSurfaceView, lp);
}
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServiceTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/SystemServiceTestsBase.java
index 3cb4a1d7b7ec..e65a9feed1aa 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SystemServiceTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SystemServiceTestsBase.java
@@ -19,6 +19,8 @@ package com.android.server.wm;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import android.os.Handler;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.platform.test.flag.junit.SetFlagsRule;
import android.testing.DexmakerShareClassLoaderRule;
@@ -39,6 +41,9 @@ class SystemServiceTestsBase {
public final SystemServicesTestRule mSystemServicesTestRule = new SystemServicesTestRule(
this::onBeforeSystemServicesCreated);
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
@WindowTestRunner.MethodWrapperRule
public final WindowManagerGlobalLockRule mLockRule =
new WindowManagerGlobalLockRule(mSystemServicesTestRule);
diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
index b1def8d0b3a6..51f0404e2396 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
@@ -444,7 +444,9 @@ public class SystemServicesTestRule implements TestRule {
SurfaceAnimationThread.dispose();
AnimationThread.dispose();
UiThread.dispose();
- mInputChannel.dispose();
+ if (mInputChannel != null) {
+ mInputChannel.dispose();
+ }
tearDownLocalServices();
// Reset priority booster because animation thread has been changed.
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java
index 8a90f127f4eb..06f29c262b42 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java
@@ -25,7 +25,9 @@ import static android.view.WindowManager.TRANSIT_CLOSE;
import static android.view.WindowManager.TRANSIT_NONE;
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.window.TaskFragmentOperation.OP_TYPE_CREATE_TASK_FRAGMENT;
+import static android.window.TaskFragmentOperation.OP_TYPE_CREATE_TASK_FRAGMENT_DECOR_SURFACE;
import static android.window.TaskFragmentOperation.OP_TYPE_DELETE_TASK_FRAGMENT;
+import static android.window.TaskFragmentOperation.OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE;
import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_BOTTOM_OF_TASK;
import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_FRONT;
import static android.window.TaskFragmentOperation.OP_TYPE_REORDER_TO_TOP_OF_TASK;
@@ -1759,6 +1761,40 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
}
@Test
+ public void testApplyTransaction_createTaskFragmentDecorSurface() {
+ // TODO(b/293654166) remove system organizer requirement once security review is cleared.
+ mController.unregisterOrganizer(mIOrganizer);
+ mController.registerOrganizerInternal(mIOrganizer, true /* isSystemOrganizer */);
+ final Task task = createTask(mDisplayContent);
+
+ final TaskFragment tf = createTaskFragment(task);
+ final TaskFragmentOperation operation = new TaskFragmentOperation.Builder(
+ OP_TYPE_CREATE_TASK_FRAGMENT_DECOR_SURFACE).build();
+ mTransaction.addTaskFragmentOperation(tf.getFragmentToken(), operation);
+
+ assertApplyTransactionAllowed(mTransaction);
+
+ verify(task).moveOrCreateDecorSurfaceFor(tf);
+ }
+
+ @Test
+ public void testApplyTransaction_removeTaskFragmentDecorSurface() {
+ // TODO(b/293654166) remove system organizer requirement once security review is cleared.
+ mController.unregisterOrganizer(mIOrganizer);
+ mController.registerOrganizerInternal(mIOrganizer, true /* isSystemOrganizer */);
+ final Task task = createTask(mDisplayContent);
+ final TaskFragment tf = createTaskFragment(task);
+
+ final TaskFragmentOperation operation = new TaskFragmentOperation.Builder(
+ OP_TYPE_REMOVE_TASK_FRAGMENT_DECOR_SURFACE).build();
+ mTransaction.addTaskFragmentOperation(tf.getFragmentToken(), operation);
+
+ assertApplyTransactionAllowed(mTransaction);
+
+ verify(task).removeDecorSurface();
+ }
+
+ @Test
public void testApplyTransaction_reorderToBottomOfTask_failsIfNotSystemOrganizer() {
testApplyTransaction_reorder_failsIfNotSystemOrganizer_common(
OP_TYPE_REORDER_TO_BOTTOM_OF_TASK);
@@ -1966,7 +2002,8 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
/** Setups the mock Task as the parent of the given TaskFragment. */
private static void setupMockParent(TaskFragment taskFragment, Task mockParent) {
doReturn(mockParent).when(taskFragment).getTask();
- doReturn(new TaskFragmentParentInfo(new Configuration(), DEFAULT_DISPLAY, true, true))
+ doReturn(new TaskFragmentParentInfo(
+ new Configuration(), DEFAULT_DISPLAY, true, true, null /* decorSurface */))
.when(mockParent).getTaskFragmentParentInfo();
// Task needs to be visible
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
index 5e531b4cbc4f..da7612b17dc9 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java
@@ -63,6 +63,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import android.app.ActivityManager;
@@ -82,6 +83,7 @@ import android.util.DisplayMetrics;
import android.util.Xml;
import android.view.Display;
import android.view.DisplayInfo;
+import android.view.SurfaceControl;
import android.window.TaskFragmentOrganizer;
import androidx.test.filters.MediumTest;
@@ -1619,6 +1621,185 @@ public class TaskTests extends WindowTestsBase {
assertFalse(task.isDragResizing());
}
+ @Test
+ public void testMoveOrCreateDecorSurface() {
+ final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
+ final Task task = new TaskBuilder(mSupervisor).setCreateActivity(true).build();
+ final ActivityRecord activity = task.getTopMostActivity();
+ final TaskFragment fragment = createTaskFragmentWithEmbeddedActivity(task, organizer);
+ doNothing().when(task).sendTaskFragmentParentInfoChangedIfNeeded();
+
+ // Decor surface should not be present initially.
+ assertNull(task.mDecorSurfaceContainer);
+ assertNull(task.getDecorSurface());
+ assertNull(task.getTaskFragmentParentInfo().getDecorSurface());
+
+ // Decor surface should be created.
+ clearInvocations(task);
+ task.moveOrCreateDecorSurfaceFor(fragment);
+
+ assertNotNull(task.mDecorSurfaceContainer);
+ assertNotNull(task.getDecorSurface());
+ verify(task).sendTaskFragmentParentInfoChangedIfNeeded();
+ assertNotNull(task.getTaskFragmentParentInfo().getDecorSurface());
+ assertEquals(fragment, task.mDecorSurfaceContainer.mOwnerTaskFragment);
+
+ // Decor surface should be removed.
+ clearInvocations(task);
+ task.removeDecorSurface();
+
+ assertNull(task.mDecorSurfaceContainer);
+ assertNull(task.getDecorSurface());
+ verify(task).sendTaskFragmentParentInfoChangedIfNeeded();
+ assertNull(task.getTaskFragmentParentInfo().getDecorSurface());
+ }
+
+ @Test
+ public void testMoveOrCreateDecorSurface_whenOwnerTaskFragmentRemoved() {
+ final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
+ final Task task = new TaskBuilder(mSupervisor).setCreateActivity(true).build();
+ final ActivityRecord activity = task.getTopMostActivity();
+ final TaskFragment fragment1 = createTaskFragmentWithEmbeddedActivity(task, organizer);
+ final TaskFragment fragment2 = createTaskFragmentWithEmbeddedActivity(task, organizer);
+ doNothing().when(task).sendTaskFragmentParentInfoChangedIfNeeded();
+
+ task.moveOrCreateDecorSurfaceFor(fragment1);
+
+ assertNotNull(task.mDecorSurfaceContainer);
+ assertNotNull(task.getDecorSurface());
+ assertEquals(fragment1, task.mDecorSurfaceContainer.mOwnerTaskFragment);
+
+ // Transfer ownership
+ task.moveOrCreateDecorSurfaceFor(fragment2);
+
+ assertNotNull(task.mDecorSurfaceContainer);
+ assertNotNull(task.getDecorSurface());
+ assertEquals(fragment2, task.mDecorSurfaceContainer.mOwnerTaskFragment);
+
+ // Safe surface should be removed when the owner TaskFragment is removed.
+ task.removeChild(fragment2);
+
+ verify(task).removeDecorSurface();
+ assertNull(task.mDecorSurfaceContainer);
+ assertNull(task.getDecorSurface());
+ }
+
+ @Test
+ public void testAssignChildLayers_decorSurfacePlacement() {
+ final TaskFragmentOrganizer organizer = new TaskFragmentOrganizer(Runnable::run);
+ final Task task = new TaskBuilder(mSupervisor).setCreateActivity(true).build();
+ final ActivityRecord unembeddedActivity = task.getTopMostActivity();
+
+ final TaskFragment fragment1 = createTaskFragmentWithEmbeddedActivity(task, organizer);
+ final TaskFragment fragment2 = createTaskFragmentWithEmbeddedActivity(task, organizer);
+ final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
+
+ doNothing().when(task).sendTaskFragmentParentInfoChangedIfNeeded();
+ spyOn(unembeddedActivity);
+ spyOn(fragment1);
+ spyOn(fragment2);
+
+ // Initially, the decor surface should not be placed.
+ task.assignChildLayers(t);
+ verify(unembeddedActivity).assignLayer(t, 0);
+ verify(fragment1).assignLayer(t, 1);
+ verify(fragment2).assignLayer(t, 2);
+
+ clearInvocations(t);
+ clearInvocations(unembeddedActivity);
+ clearInvocations(fragment1);
+ clearInvocations(fragment2);
+
+ // The decor surface should be placed just above the owner TaskFragment.
+ doReturn(true).when(unembeddedActivity).isUid(task.effectiveUid);
+ doReturn(true).when(fragment1).isAllowedToBeEmbeddedInTrustedMode();
+ doReturn(true).when(fragment2).isAllowedToBeEmbeddedInTrustedMode();
+ doReturn(true).when(fragment1).isVisible();
+
+ task.moveOrCreateDecorSurfaceFor(fragment1);
+ task.assignChildLayers(t);
+
+ verify(unembeddedActivity).assignLayer(t, 0);
+ verify(fragment1).assignLayer(t, 1);
+ verify(t).setLayer(task.mDecorSurfaceContainer.mContainerSurface, 2);
+ verify(fragment2).assignLayer(t, 3);
+ verify(t).setVisibility(task.mDecorSurfaceContainer.mContainerSurface, true);
+ verify(t, never()).setLayer(eq(task.getDecorSurface()), anyInt());
+
+ clearInvocations(t);
+ clearInvocations(unembeddedActivity);
+ clearInvocations(fragment1);
+ clearInvocations(fragment2);
+
+ // The decor surface should be invisible if the owner TaskFragment is invisible.
+ doReturn(true).when(unembeddedActivity).isUid(task.effectiveUid);
+ doReturn(true).when(fragment1).isAllowedToBeEmbeddedInTrustedMode();
+ doReturn(true).when(fragment2).isAllowedToBeEmbeddedInTrustedMode();
+ doReturn(false).when(fragment1).isVisible();
+
+ task.assignChildLayers(t);
+
+ verify(unembeddedActivity).assignLayer(t, 0);
+ verify(fragment1).assignLayer(t, 1);
+ verify(t).setLayer(task.mDecorSurfaceContainer.mContainerSurface, 2);
+ verify(fragment2).assignLayer(t, 3);
+ verify(t).setVisibility(task.mDecorSurfaceContainer.mContainerSurface, false);
+ verify(t, never()).setLayer(eq(task.getDecorSurface()), anyInt());
+
+ clearInvocations(t);
+ clearInvocations(unembeddedActivity);
+ clearInvocations(fragment1);
+ clearInvocations(fragment2);
+
+ // The decor surface should be placed on below activity from a different UID.
+ doReturn(false).when(unembeddedActivity).isUid(task.effectiveUid);
+ doReturn(true).when(fragment1).isAllowedToBeEmbeddedInTrustedMode();
+ doReturn(true).when(fragment2).isAllowedToBeEmbeddedInTrustedMode();
+ doReturn(true).when(fragment1).isVisible();
+
+ task.assignChildLayers(t);
+
+ verify(t).setLayer(task.mDecorSurfaceContainer.mContainerSurface, 0);
+ verify(unembeddedActivity).assignLayer(t, 1);
+ verify(fragment1).assignLayer(t, 2);
+ verify(fragment2).assignLayer(t, 3);
+ verify(t).setVisibility(task.mDecorSurfaceContainer.mContainerSurface, true);
+ verify(t, never()).setLayer(eq(task.getDecorSurface()), anyInt());
+
+ clearInvocations(t);
+ clearInvocations(unembeddedActivity);
+ clearInvocations(fragment1);
+ clearInvocations(fragment2);
+
+ // The decor surface should be placed below untrusted embedded TaskFragment.
+ doReturn(true).when(unembeddedActivity).isUid(task.effectiveUid);
+ doReturn(true).when(fragment1).isAllowedToBeEmbeddedInTrustedMode();
+ doReturn(false).when(fragment2).isAllowedToBeEmbeddedInTrustedMode();
+ doReturn(true).when(fragment1).isVisible();
+
+ task.assignChildLayers(t);
+
+ verify(unembeddedActivity).assignLayer(t, 0);
+ verify(fragment1).assignLayer(t, 1);
+ verify(t).setLayer(task.mDecorSurfaceContainer.mContainerSurface, 2);
+ verify(fragment2).assignLayer(t, 3);
+ verify(t).setVisibility(task.mDecorSurfaceContainer.mContainerSurface, true);
+ verify(t, never()).setLayer(eq(task.getDecorSurface()), anyInt());
+
+ clearInvocations(t);
+ clearInvocations(unembeddedActivity);
+ clearInvocations(fragment1);
+ clearInvocations(fragment2);
+
+ // The decor surface should not be placed after removal.
+ task.removeDecorSurface();
+ task.assignChildLayers(t);
+
+ verify(unembeddedActivity).assignLayer(t, 0);
+ verify(fragment1).assignLayer(t, 1);
+ verify(fragment2).assignLayer(t, 2);
+ }
+
private Task getTestTask() {
return new TaskBuilder(mSupervisor).setCreateActivity(true).build();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index dade3b91e0eb..71447e72de8c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -2015,6 +2015,9 @@ public class TransitionTests extends WindowTestsBase {
transition.collect(leafTaskA);
rootTaskA.moveToFront("test", leafTaskA);
+ // Test has order changes, a shallow check of order changes
+ assertTrue(transition.hasOrderChanges());
+
// All the tasks were already visible, so there shouldn't be any changes
ArrayList<Transition.ChangeInfo> targets = Transition.calculateTargets(
participants, changes);
diff --git a/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationCallbackTest.java b/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationCallbackTest.java
deleted file mode 100644
index c5dd447b5b0c..000000000000
--- a/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationCallbackTest.java
+++ /dev/null
@@ -1,154 +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 com.android.server.wm;
-
-import static android.server.wm.ActivityManagerTestBase.createFullscreenActivityScenarioRule;
-import static android.server.wm.BuildUtils.HW_TIMEOUT_MULTIPLIER;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.app.Activity;
-import android.platform.test.annotations.Presubmit;
-import android.server.wm.CtsWindowInfoUtils;
-import android.view.SurfaceControl;
-import android.view.SurfaceControl.TrustedPresentationThresholds;
-
-import androidx.annotation.GuardedBy;
-import androidx.test.ext.junit.rules.ActivityScenarioRule;
-
-import com.android.server.wm.utils.CommonUtils;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestName;
-
-import java.util.function.Consumer;
-
-/**
- * TODO (b/287076178): Move these tests to
- * {@link android.view.surfacecontrol.cts.TrustedPresentationCallbackTest} when API is made public
- */
-@Presubmit
-public class TrustedPresentationCallbackTest {
- private static final String TAG = "TrustedPresentationCallbackTest";
- private static final int STABILITY_REQUIREMENT_MS = 500;
- private static final long WAIT_TIME_MS = HW_TIMEOUT_MULTIPLIER * 2000L;
-
- private static final float FRACTION_VISIBLE = 0.1f;
-
- private final Object mResultsLock = new Object();
- @GuardedBy("mResultsLock")
- private boolean mResult;
- @GuardedBy("mResultsLock")
- private boolean mReceivedResults;
-
- @Rule
- public TestName mName = new TestName();
-
- @Rule
- public ActivityScenarioRule<TestActivity> mActivityRule = createFullscreenActivityScenarioRule(
- TestActivity.class);
-
- private TestActivity mActivity;
-
- @Before
- public void setup() {
- mActivityRule.getScenario().onActivity(activity -> mActivity = activity);
- }
-
- @After
- public void tearDown() {
- CommonUtils.waitUntilActivityRemoved(mActivity);
- }
-
- @Test
- public void testAddTrustedPresentationListenerOnWindow() throws InterruptedException {
- TrustedPresentationThresholds thresholds = new TrustedPresentationThresholds(
- 1 /* minAlpha */, FRACTION_VISIBLE, STABILITY_REQUIREMENT_MS);
- SurfaceControl.Transaction t = new SurfaceControl.Transaction();
- mActivity.getWindow().getRootSurfaceControl().addTrustedPresentationCallback(t, thresholds,
- Runnable::run, inTrustedPresentationState -> {
- synchronized (mResultsLock) {
- mResult = inTrustedPresentationState;
- mReceivedResults = true;
- mResultsLock.notify();
- }
- });
- t.apply();
- synchronized (mResultsLock) {
- assertResults();
- }
- }
-
- @Test
- public void testRemoveTrustedPresentationListenerOnWindow() throws InterruptedException {
- TrustedPresentationThresholds thresholds = new TrustedPresentationThresholds(
- 1 /* minAlpha */, FRACTION_VISIBLE, STABILITY_REQUIREMENT_MS);
- Consumer<Boolean> trustedPresentationCallback = inTrustedPresentationState -> {
- synchronized (mResultsLock) {
- mResult = inTrustedPresentationState;
- mReceivedResults = true;
- mResultsLock.notify();
- }
- };
- SurfaceControl.Transaction t = new SurfaceControl.Transaction();
- mActivity.getWindow().getRootSurfaceControl().addTrustedPresentationCallback(t, thresholds,
- Runnable::run, trustedPresentationCallback);
- t.apply();
-
- synchronized (mResultsLock) {
- if (!mReceivedResults) {
- mResultsLock.wait(WAIT_TIME_MS);
- }
- assertResults();
- // reset the state
- mReceivedResults = false;
- }
-
- mActivity.getWindow().getRootSurfaceControl().removeTrustedPresentationCallback(t,
- trustedPresentationCallback);
- t.apply();
-
- synchronized (mResultsLock) {
- if (!mReceivedResults) {
- mResultsLock.wait(WAIT_TIME_MS);
- }
- // Ensure we waited the full time and never received a notify on the result from the
- // callback.
- assertFalse("Should never have received a callback", mReceivedResults);
- // results shouldn't have changed.
- assertTrue(mResult);
- }
- }
-
- @GuardedBy("mResultsLock")
- private void assertResults() throws InterruptedException {
- mResultsLock.wait(WAIT_TIME_MS);
-
- if (!mReceivedResults) {
- CtsWindowInfoUtils.dumpWindowsOnScreen(TAG, "test " + mName.getMethodName());
- }
- // Make sure we received the results and not just timed out
- assertTrue("Timed out waiting for results", mReceivedResults);
- assertTrue(mResult);
- }
-
- public static class TestActivity extends Activity {
- }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationListenerTest.java b/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationListenerTest.java
new file mode 100644
index 000000000000..96b66bfd3bc0
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationListenerTest.java
@@ -0,0 +1,267 @@
+/*
+ * 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 com.android.server.wm;
+
+import static android.server.wm.ActivityManagerTestBase.createFullscreenActivityScenarioRule;
+import static android.server.wm.BuildUtils.HW_TIMEOUT_MULTIPLIER;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.fail;
+
+import android.app.Activity;
+import android.os.SystemClock;
+import android.platform.test.annotations.Presubmit;
+import android.server.wm.CtsWindowInfoUtils;
+import android.util.AndroidRuntimeException;
+import android.util.Log;
+import android.view.SurfaceControl;
+import android.view.SurfaceControlViewHost;
+import android.view.View;
+import android.view.WindowManager;
+import android.window.TrustedPresentationThresholds;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.test.ext.junit.rules.ActivityScenarioRule;
+
+import com.android.server.wm.utils.CommonUtils;
+
+import junit.framework.Assert;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestName;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+/**
+ * TODO (b/287076178): Move these tests to
+ * {@link android.view.surfacecontrol.cts.TrustedPresentationListenerTest} when API is made public
+ */
+@Presubmit
+public class TrustedPresentationListenerTest {
+ private static final String TAG = "TrustedPresentationListenerTest";
+ private static final int STABILITY_REQUIREMENT_MS = 500;
+ private static final long WAIT_TIME_MS = HW_TIMEOUT_MULTIPLIER * 2000L;
+
+ private static final float FRACTION_VISIBLE = 0.1f;
+
+ private final List<Boolean> mResults = Collections.synchronizedList(new ArrayList<>());
+ private CountDownLatch mReceivedResults = new CountDownLatch(1);
+
+ private TrustedPresentationThresholds mThresholds = new TrustedPresentationThresholds(
+ 1 /* minAlpha */, FRACTION_VISIBLE, STABILITY_REQUIREMENT_MS);
+
+ @Rule
+ public TestName mName = new TestName();
+
+ @Rule
+ public ActivityScenarioRule<TestActivity> mActivityRule = createFullscreenActivityScenarioRule(
+ TestActivity.class);
+
+ private TestActivity mActivity;
+
+ private SurfaceControlViewHost.SurfacePackage mSurfacePackage = null;
+
+ @Before
+ public void setup() {
+ mActivityRule.getScenario().onActivity(activity -> mActivity = activity);
+ mDefaultListener = new Listener(mReceivedResults);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSurfacePackage != null) {
+ new SurfaceControl.Transaction().remove(mSurfacePackage.getSurfaceControl()).apply(
+ true);
+ mSurfacePackage.release();
+ }
+ CommonUtils.waitUntilActivityRemoved(mActivity);
+
+ }
+
+ private class Listener implements Consumer<Boolean> {
+ final CountDownLatch mLatch;
+
+ Listener(CountDownLatch latch) {
+ mLatch = latch;
+ }
+
+ @Override
+ public void accept(Boolean inTrustedPresentationState) {
+ Log.d(TAG, "onTrustedPresentationChanged " + inTrustedPresentationState);
+ mResults.add(inTrustedPresentationState);
+ mLatch.countDown();
+ }
+ }
+
+ private Consumer<Boolean> mDefaultListener;
+
+ @Test
+ public void testAddTrustedPresentationListenerOnWindow() {
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+ windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds, Runnable::run,
+ mDefaultListener);
+ assertResults(List.of(true));
+ }
+
+ @Test
+ public void testRemoveTrustedPresentationListenerOnWindow() throws InterruptedException {
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+ windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds, Runnable::run,
+ mDefaultListener);
+ assertResults(List.of(true));
+ // reset the latch
+ mReceivedResults = new CountDownLatch(1);
+
+ windowManager.unregisterTrustedPresentationListener(mDefaultListener);
+ mReceivedResults.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS);
+ // Ensure we waited the full time and never received a notify on the result from the
+ // callback.
+ assertEquals("Should never have received a callback", mReceivedResults.getCount(), 1);
+ // results shouldn't have changed.
+ assertEquals(mResults, List.of(true));
+ }
+
+ @Test
+ public void testRemovingUnknownListenerIsANoop() {
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+ assertNotNull(windowManager);
+ windowManager.unregisterTrustedPresentationListener(mDefaultListener);
+ }
+
+ @Test
+ public void testAddDuplicateListenerThrowsException() {
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+ assertNotNull(windowManager);
+ windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds,
+ Runnable::run, mDefaultListener);
+ assertThrows(AndroidRuntimeException.class,
+ () -> windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds,
+ Runnable::run, mDefaultListener));
+ }
+
+ @Test
+ public void testAddDuplicateThresholds() {
+ mReceivedResults = new CountDownLatch(2);
+ mDefaultListener = new Listener(mReceivedResults);
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+ windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds,
+ Runnable::run, mDefaultListener);
+
+ Consumer<Boolean> mNewListener = new Listener(mReceivedResults);
+
+ windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds,
+ Runnable::run, mNewListener);
+ assertResults(List.of(true, true));
+ }
+
+ private void waitForViewAttach(View view) {
+ final CountDownLatch viewAttached = new CountDownLatch(1);
+ view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
+ @Override
+ public void onViewAttachedToWindow(@NonNull View v) {
+ viewAttached.countDown();
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(@NonNull View v) {
+
+ }
+ });
+ try {
+ viewAttached.await(2000, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ if (!wait(viewAttached, 2000 /* waitTimeMs */)) {
+ fail("Couldn't attach view=" + view);
+ }
+ }
+
+ @Test
+ public void testAddListenerToScvh() {
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+
+ var embeddedView = new View(mActivity);
+ mActivityRule.getScenario().onActivity(activity -> {
+ var attachedSurfaceControl =
+ mActivity.getWindow().getDecorView().getRootSurfaceControl();
+ var scvh = new SurfaceControlViewHost(mActivity, mActivity.getDisplay(),
+ attachedSurfaceControl.getHostToken());
+ mSurfacePackage = scvh.getSurfacePackage();
+ scvh.setView(embeddedView, mActivity.getWindow().getDecorView().getWidth(),
+ mActivity.getWindow().getDecorView().getHeight());
+ attachedSurfaceControl.buildReparentTransaction(
+ mSurfacePackage.getSurfaceControl());
+ });
+
+ waitForViewAttach(embeddedView);
+ windowManager.registerTrustedPresentationListener(embeddedView.getWindowToken(),
+ mThresholds,
+ Runnable::run, mDefaultListener);
+
+ assertResults(List.of(true));
+ }
+
+ private boolean wait(CountDownLatch latch, long waitTimeMs) {
+ while (true) {
+ long now = SystemClock.uptimeMillis();
+ try {
+ return latch.await(waitTimeMs, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ long elapsedTime = SystemClock.uptimeMillis() - now;
+ waitTimeMs = Math.max(0, waitTimeMs - elapsedTime);
+ }
+ }
+
+ }
+
+ @GuardedBy("mResultsLock")
+ private void assertResults(List<Boolean> results) {
+ if (!wait(mReceivedResults, WAIT_TIME_MS)) {
+ try {
+ CtsWindowInfoUtils.dumpWindowsOnScreen(TAG, "test " + mName.getMethodName());
+ } catch (InterruptedException e) {
+ Log.d(TAG, "Couldn't dump windows", e);
+ }
+ Assert.fail("Timed out waiting for results mReceivedResults.count="
+ + mReceivedResults.getCount() + "mReceivedResults=" + mReceivedResults);
+ }
+
+ // Make sure we received the results
+ assertEquals(results.toArray(), mResults.toArray());
+ }
+
+ public static class TestActivity extends Activity {
+ }
+}
diff --git a/services/tests/wmtests/src/com/android/server/wm/utils/TestActivity.java b/services/tests/wmtests/src/com/android/server/wm/utils/TestActivity.java
new file mode 100644
index 000000000000..c12dcddd1b36
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/utils/TestActivity.java
@@ -0,0 +1,68 @@
+/*
+ * 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 com.android.server.wm.utils;
+
+import static android.view.WindowInsets.Type.displayCutout;
+import static android.view.WindowInsets.Type.systemBars;
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import android.app.Activity;
+import android.app.KeyguardManager;
+import android.os.Bundle;
+import android.view.WindowInsetsController;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+
+import androidx.annotation.Nullable;
+
+/**
+ * TestActivity that will ensure it dismisses keyguard and shows as a fullscreen activity.
+ */
+public class TestActivity extends Activity {
+ private static final int sTypeMask = systemBars() | displayCutout();
+ private FrameLayout mParentLayout;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mParentLayout = new FrameLayout(this);
+ FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ FrameLayout.LayoutParams.MATCH_PARENT);
+ setContentView(mParentLayout, layoutParams);
+
+ WindowInsetsController windowInsetsController = getWindow().getInsetsController();
+ windowInsetsController.hide(sTypeMask);
+ WindowManager.LayoutParams params = getWindow().getAttributes();
+ params.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+ getWindow().setAttributes(params);
+ getWindow().setDecorFitsSystemWindows(false);
+
+ final KeyguardManager keyguardManager = getInstrumentation().getContext().getSystemService(
+ KeyguardManager.class);
+ if (keyguardManager != null && keyguardManager.isKeyguardLocked()) {
+ keyguardManager.requestDismissKeyguard(this, null);
+ }
+ }
+
+ public FrameLayout getParentLayout() {
+ return mParentLayout;
+ }
+}
diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java
index bfb159f766d5..dce4818e8ed2 100644
--- a/services/usage/java/com/android/server/usage/IntervalStats.java
+++ b/services/usage/java/com/android/server/usage/IntervalStats.java
@@ -31,6 +31,7 @@ import static android.app.usage.UsageEvents.Event.KEYGUARD_SHOWN;
import static android.app.usage.UsageEvents.Event.LOCUS_ID_SET;
import static android.app.usage.UsageEvents.Event.NOTIFICATION_INTERRUPTION;
import static android.app.usage.UsageEvents.Event.ROLLOVER_FOREGROUND_SERVICE;
+import static android.app.usage.UsageEvents.Event.USER_INTERACTION;
import static android.app.usage.UsageEvents.Event.SCREEN_INTERACTIVE;
import static android.app.usage.UsageEvents.Event.SCREEN_NON_INTERACTIVE;
import static android.app.usage.UsageEvents.Event.SHORTCUT_INVOCATION;
@@ -42,7 +43,9 @@ import android.app.usage.EventList;
import android.app.usage.EventStats;
import android.app.usage.UsageEvents.Event;
import android.app.usage.UsageStats;
+import android.app.usage.UsageStatsManager;
import android.content.res.Configuration;
+import android.os.PersistableBundle;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -575,6 +578,23 @@ public class IntervalStats {
continue;
}
break;
+ case USER_INTERACTION:
+ if (event.mUserInteractionExtrasToken != null) {
+ String category = packagesTokenData.getString(packageToken,
+ event.mUserInteractionExtrasToken.mCategoryToken);
+ String action = packagesTokenData.getString(packageToken,
+ event.mUserInteractionExtrasToken.mActionToken);
+ if (TextUtils.isEmpty(category) || TextUtils.isEmpty(action)) {
+ this.events.remove(i);
+ dataOmitted = true;
+ continue;
+ }
+ event.mExtras = new PersistableBundle();
+ event.mExtras.putString(UsageStatsManager.EXTRA_EVENT_CATEGORY, category);
+ event.mExtras.putString(UsageStatsManager.EXTRA_EVENT_ACTION, action);
+ event.mUserInteractionExtrasToken = null;
+ }
+ break;
}
}
if (dataOmitted) {
@@ -692,13 +712,30 @@ public class IntervalStats {
event.mPackage, event.mLocusId);
}
break;
+ case USER_INTERACTION:
+ if (event.mExtras != null && event.mExtras.size() != 0) {
+ final String category = event.mExtras.getString(
+ UsageStatsManager.EXTRA_EVENT_CATEGORY);
+ final String action = event.mExtras.getString(
+ UsageStatsManager.EXTRA_EVENT_ACTION);
+ if (!TextUtils.isEmpty(category) && !TextUtils.isEmpty(action)) {
+ event.mUserInteractionExtrasToken =
+ new Event.UserInteractionEventExtrasToken();
+ event.mUserInteractionExtrasToken.mCategoryToken =
+ packagesTokenData.getTokenOrAdd(packageToken, event.mPackage,
+ category);
+ event.mUserInteractionExtrasToken.mActionToken =
+ packagesTokenData.getTokenOrAdd(packageToken, event.mPackage,
+ action);
+ }
+ }
+ break;
}
}
}
/**
* Obfuscates the data in this instance of interval stats.
- *
* @hide
*/
public void obfuscateData(PackagesTokenData packagesTokenData) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsProtoV2.java b/services/usage/java/com/android/server/usage/UsageStatsProtoV2.java
index 81387471f4d6..d86534582358 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsProtoV2.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsProtoV2.java
@@ -17,8 +17,10 @@ package com.android.server.usage;
import android.app.usage.ConfigurationStats;
import android.app.usage.UsageEvents;
+import android.app.usage.UsageEvents.Event.UserInteractionEventExtrasToken;
import android.app.usage.UsageStats;
import android.content.res.Configuration;
+import android.os.PersistableBundle;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
@@ -26,6 +28,8 @@ import android.util.SparseIntArray;
import android.util.proto.ProtoInputStream;
import android.util.proto.ProtoOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -282,6 +286,16 @@ final class UsageStatsProtoV2 {
event.mLocusIdToken = proto.readInt(
EventObfuscatedProto.LOCUS_ID_TOKEN) - 1;
break;
+ case (int) EventObfuscatedProto.INTERACTION_EXTRAS:
+ try {
+ final long interactionExtrasToken = proto.start(
+ EventObfuscatedProto.INTERACTION_EXTRAS);
+ event.mUserInteractionExtrasToken = parseUserInteractionEventExtras(proto);
+ proto.end(interactionExtrasToken);
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to read some user interaction extras from proto.", e);
+ }
+ break;
case ProtoInputStream.NO_MORE_FIELDS:
return event.mPackageToken == PackagesTokenData.UNASSIGNED_TOKEN ? null : event;
}
@@ -386,7 +400,7 @@ final class UsageStatsProtoV2 {
}
private static void writeEvent(ProtoOutputStream proto, final long statsBeginTime,
- final UsageEvents.Event event) throws IllegalArgumentException {
+ final UsageEvents.Event event) throws IOException, IllegalArgumentException {
proto.write(EventObfuscatedProto.PACKAGE_TOKEN, event.mPackageToken + 1);
if (event.mClassToken != PackagesTokenData.UNASSIGNED_TOKEN) {
proto.write(EventObfuscatedProto.CLASS_TOKEN, event.mClassToken + 1);
@@ -429,6 +443,12 @@ final class UsageStatsProtoV2 {
event.mNotificationChannelIdToken + 1);
}
break;
+ case UsageEvents.Event.USER_INTERACTION:
+ if (event.mUserInteractionExtrasToken != null) {
+ writeUserInteractionEventExtras(proto, EventObfuscatedProto.INTERACTION_EXTRAS,
+ event.mUserInteractionExtrasToken);
+ }
+ break;
}
}
@@ -703,6 +723,9 @@ final class UsageStatsProtoV2 {
case (int) PendingEventProto.TASK_ROOT_CLASS:
event.mTaskRootClass = proto.readString(PendingEventProto.TASK_ROOT_CLASS);
break;
+ case (int) PendingEventProto.EXTRAS:
+ event.mExtras = parsePendingEventExtras(proto, PendingEventProto.EXTRAS);
+ break;
case ProtoInputStream.NO_MORE_FIELDS:
// Handle default values for certain events types
switch (event.mEventType) {
@@ -757,7 +780,7 @@ final class UsageStatsProtoV2 {
}
private static void writePendingEvent(ProtoOutputStream proto, UsageEvents.Event event)
- throws IllegalArgumentException {
+ throws IOException, IllegalArgumentException {
proto.write(PendingEventProto.PACKAGE_NAME, event.mPackage);
if (event.mClass != null) {
proto.write(PendingEventProto.CLASS_NAME, event.mClass);
@@ -794,6 +817,11 @@ final class UsageStatsProtoV2 {
event.mNotificationChannelId);
}
break;
+ case UsageEvents.Event.USER_INTERACTION:
+ if (event.mExtras != null && event.mExtras.size() != 0) {
+ writePendingEventExtras(proto, PendingEventProto.EXTRAS, event.mExtras);
+ }
+ break;
}
}
@@ -888,4 +916,52 @@ final class UsageStatsProtoV2 {
proto.end(token);
}
}
+
+ private static UserInteractionEventExtrasToken parseUserInteractionEventExtras(
+ ProtoInputStream proto) throws IOException {
+ UserInteractionEventExtrasToken interactionExtrasToken =
+ new UserInteractionEventExtrasToken();
+ while (true) {
+ switch (proto.nextField()) {
+ case (int) ObfuscatedUserInteractionExtrasProto.CATEGORY_TOKEN:
+ interactionExtrasToken.mCategoryToken = proto.readInt(
+ ObfuscatedUserInteractionExtrasProto.CATEGORY_TOKEN) - 1;
+ break;
+ case (int) ObfuscatedUserInteractionExtrasProto.ACTION_TOKEN:
+ interactionExtrasToken.mActionToken = proto.readInt(
+ ObfuscatedUserInteractionExtrasProto.ACTION_TOKEN) - 1;
+ break;
+ case ProtoInputStream.NO_MORE_FIELDS:
+ return interactionExtrasToken;
+ }
+ }
+ }
+
+ static void writeUserInteractionEventExtras(ProtoOutputStream proto, long fieldId,
+ UserInteractionEventExtrasToken interactionExtras) {
+ final long token = proto.start(fieldId);
+ proto.write(ObfuscatedUserInteractionExtrasProto.CATEGORY_TOKEN,
+ interactionExtras.mCategoryToken + 1);
+ proto.write(ObfuscatedUserInteractionExtrasProto.ACTION_TOKEN,
+ interactionExtras.mActionToken + 1);
+ proto.end(token);
+ }
+
+ /**
+ * Populates the extra details for pending interaction event from the protobuf stream.
+ */
+ private static PersistableBundle parsePendingEventExtras(ProtoInputStream proto, long fieldId)
+ throws IOException {
+ return PersistableBundle.readFromStream(new ByteArrayInputStream(proto.readBytes(fieldId)));
+ }
+
+ /**
+ * Write the extra details for pending interaction event to a protobuf stream.
+ */
+ static void writePendingEventExtras(ProtoOutputStream proto, long fieldId,
+ PersistableBundle eventExtras) throws IOException {
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ eventExtras.writeToStream(baos);
+ proto.write(fieldId, baos.toByteArray());
+ }
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 4c56f33af430..0e1e0c8e3ad3 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -83,6 +83,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
+import android.os.PersistableBundle;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
@@ -91,6 +92,7 @@ import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
+import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
@@ -193,6 +195,11 @@ public class UsageStatsService extends SystemService implements
private static final char TOKEN_DELIMITER = '/';
+ // The maximum length for extras {@link UsageStatsManager#EXTRA_EVENT_CATEGORY},
+ // {@link UsageStatsManager#EXTRA_EVENT_ACTION} in a {@link UsageEvents.Event#mExtras}.
+ // The value will be truncated at this limit.
+ private static final int MAX_TEXT_LENGTH = 127;
+
// Handler message types.
static final int MSG_REPORT_EVENT = 0;
static final int MSG_FLUSH_TO_DISK = 1;
@@ -1814,6 +1821,13 @@ public class UsageStatsService extends SystemService implements
mHandler.removeMessages(MSG_FLUSH_TO_DISK);
}
+ private String getTrimmedString(String input) {
+ if (input != null && input.length() > MAX_TEXT_LENGTH) {
+ return input.substring(0, MAX_TEXT_LENGTH);
+ }
+ return input;
+ }
+
/**
* Called by the Binder stub.
*/
@@ -2253,6 +2267,32 @@ public class UsageStatsService extends SystemService implements
}
}
+ private void reportUserInteractionInnerHelper(String packageName, @UserIdInt int userId,
+ PersistableBundle extras) {
+ if (Flags.reportUsageStatsPermission()) {
+ if (!canReportUsageStats()) {
+ throw new SecurityException(
+ "Only the system or holders of the REPORT_USAGE_STATS"
+ + " permission are allowed to call reportUserInteraction");
+ }
+ } else {
+ if (!isCallingUidSystem()) {
+ throw new SecurityException("Only system is allowed to call"
+ + " reportUserInteraction");
+ }
+ }
+
+ // Verify if this package exists before reporting an event for it.
+ if (mPackageManagerInternal.getPackageUid(packageName, 0, userId) < 0) {
+ throw new IllegalArgumentException("Package " + packageName + "not exist!");
+ }
+
+ final Event event = new Event(USER_INTERACTION, SystemClock.elapsedRealtime());
+ event.mPackage = packageName;
+ event.mExtras = extras;
+ reportEventOrAddToQueue(userId, event);
+ }
+
@Override
public ParceledListSlice<UsageStats> queryUsageStats(int bucketType, long beginTime,
long endTime, String callingPackage, int userId) {
@@ -2686,23 +2726,36 @@ public class UsageStatsService extends SystemService implements
@Override
public void reportUserInteraction(String packageName, int userId) {
+ reportUserInteractionInnerHelper(packageName, userId, null);
+ }
+
+ @Override
+ public void reportUserInteractionWithBundle(String packageName, @UserIdInt int userId,
+ PersistableBundle extras) {
Objects.requireNonNull(packageName);
- if (Flags.reportUsageStatsPermission()) {
- if (!canReportUsageStats()) {
- throw new SecurityException(
- "Only the system or holders of the REPORT_USAGE_STATS"
- + " permission are allowed to call reportUserInteraction");
- }
- } else {
- if (!isCallingUidSystem()) {
- throw new SecurityException("Only system is allowed to call"
- + " reportUserInteraction");
- }
+ if (extras == null || extras.size() == 0) {
+ throw new IllegalArgumentException("Emtry extras!");
}
- final Event event = new Event(USER_INTERACTION, SystemClock.elapsedRealtime());
- event.mPackage = packageName;
- reportEventOrAddToQueue(userId, event);
+ // Only category/action are allowed now, other unknown keys will be trimmed.
+ // Also, empty category/action is not meanful.
+ String category = extras.getString(UsageStatsManager.EXTRA_EVENT_CATEGORY);
+ if (TextUtils.isEmpty(category)) {
+ throw new IllegalArgumentException("Empty "
+ + UsageStatsManager.EXTRA_EVENT_CATEGORY);
+ }
+ String action = extras.getString(UsageStatsManager.EXTRA_EVENT_ACTION);
+ if (TextUtils.isEmpty(action)) {
+ throw new IllegalArgumentException("Empty "
+ + UsageStatsManager.EXTRA_EVENT_ACTION);
+ }
+
+ PersistableBundle extrasCopy = new PersistableBundle();
+ extrasCopy.putString(UsageStatsManager.EXTRA_EVENT_CATEGORY,
+ getTrimmedString(category));
+ extrasCopy.putString(UsageStatsManager.EXTRA_EVENT_ACTION, getTrimmedString(action));
+
+ reportUserInteractionInnerHelper(packageName, userId, extrasCopy);
}
@Override
@@ -3160,6 +3213,24 @@ public class UsageStatsService extends SystemService implements
}
@Override
+ public void reportUserInteractionEvent(@NonNull String pkgName, @UserIdInt int userId,
+ @NonNull PersistableBundle extras) {
+ if (extras != null && extras.size() != 0) {
+ // Truncate the value if necessary.
+ String category = extras.getString(UsageStatsManager.EXTRA_EVENT_CATEGORY);
+ String action = extras.getString(UsageStatsManager.EXTRA_EVENT_ACTION);
+ extras.putString(UsageStatsManager.EXTRA_EVENT_CATEGORY,
+ getTrimmedString(category));
+ extras.putString(UsageStatsManager.EXTRA_EVENT_ACTION, getTrimmedString(action));
+ }
+
+ Event event = new Event(USER_INTERACTION, SystemClock.elapsedRealtime());
+ event.mPackage = pkgName;
+ event.mExtras = extras;
+ reportEventOrAddToQueue(userId, event);
+ }
+
+ @Override
public boolean isAppIdle(String packageName, int uidForAppId, int userId) {
return mAppStandby.isAppIdleFiltered(packageName, uidForAppId,
userId, SystemClock.elapsedRealtime());
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index 9b67ab6d99c1..3bc77526a967 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -1110,6 +1110,10 @@ class UserUsageStatsService {
if (event.mNotificationChannelId != null) {
pw.printPair("channelId", event.mNotificationChannelId);
}
+
+ if ((event.mEventType == Event.USER_INTERACTION) && (event.mExtras != null)) {
+ pw.print(event.mExtras.toString());
+ }
pw.printHexPair("flags", event.mFlags);
pw.println();
}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
index b098e828fb5f..dc8b5a1ad6fa 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
@@ -179,6 +179,31 @@ final class HotwordDetectionConnection {
private final SparseArray<DetectorSession> mDetectorSessions =
new SparseArray<>();
+ /** Listens to changes to voice activation op. */
+ private final AppOpsManager.OnOpChangedListener mOnOpChangedListener =
+ new AppOpsManager.OnOpChangedListener() {
+ @Override
+ public void onOpChanged(String op, String packageName) {
+ if (op.equals(AppOpsManager.OPSTR_RECEIVE_SANDBOX_TRIGGER_AUDIO)) {
+ AppOpsManager appOpsManager =
+ mContext.getSystemService(AppOpsManager.class);
+ synchronized (mLock) {
+ int checkOp = appOpsManager.unsafeCheckOpNoThrow(
+ AppOpsManager.OPSTR_RECEIVE_SANDBOX_TRIGGER_AUDIO,
+ mVoiceInteractorIdentity.uid,
+ mVoiceInteractorIdentity.packageName);
+ // Voice activation app op disabled, safely shutdown hotword detection.
+ if (checkOp == AppOpsManager.MODE_ERRORED) {
+ Slog.i(TAG, "Shutdown hotword detection service on voice "
+ + "activation op disabled.");
+ safelyShutdownHotwordDetectionOnVoiceActivationDisabledLocked();
+ }
+ }
+ }
+ }
+ };
+
+
HotwordDetectionConnection(Object lock, Context context, int voiceInteractionServiceUid,
Identity voiceInteractorIdentity, ComponentName hotwordDetectionServiceName,
ComponentName visualQueryDetectionServiceName, int userId,
@@ -216,6 +241,10 @@ final class HotwordDetectionConnection {
mLastRestartInstant = Instant.now();
+ AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
+ appOpsManager.startWatchingMode(AppOpsManager.OP_RECEIVE_SANDBOX_TRIGGER_AUDIO,
+ mVoiceInteractorIdentity.packageName, mOnOpChangedListener);
+
if (mReStartPeriodSeconds <= 0) {
mCancellationTaskFuture = null;
} else {
@@ -299,7 +328,11 @@ final class HotwordDetectionConnection {
}
if (mAudioFlinger != null) {
mAudioFlinger.unlinkToDeath(mAudioServerDeathRecipient, /* flags= */ 0);
+ mAudioFlinger = null;
}
+ // Unregister the on op mode changed listener.
+ AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
+ appOpsManager.stopWatchingMode(mOnOpChangedListener);
}
@SuppressWarnings("GuardedBy")
@@ -553,6 +586,51 @@ final class HotwordDetectionConnection {
}
}
+ /**
+ * Shutdowns down hotword detection service, swallowing exceptions.
+ *
+ * Called when voice activation app-op has been disabled.
+ */
+ @SuppressWarnings("GuardedBy")
+ void safelyShutdownHotwordDetectionOnVoiceActivationDisabledLocked() {
+ Slog.v(TAG, "safelyShutdownHotwordDetectionOnVoiceActivationDisabled");
+ try {
+ clearDebugHotwordLoggingTimeoutLocked();
+ mRemoteExceptionListener = null;
+ runForEachDetectorSessionLocked((session) -> {
+ if (!(session instanceof VisualQueryDetectorSession)) {
+ // Inform all detector sessions that they got destroyed due to voice activation
+ // op being disabled.
+ session.reportErrorLocked(
+ new HotwordDetectionServiceFailure(
+ HotwordDetectionServiceFailure
+ .ERROR_CODE_SHUTDOWN_HDS_ON_VOICE_ACTIVATION_OP_DISABLED,
+ "Shutdown hotword detection service on voice "
+ + "activation op disabled!"));
+ session.destroyLocked();
+ }
+ });
+
+ // Remove hotword detection sessions.
+ mDetectorSessions.delete(HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_DSP);
+ mDetectorSessions.delete(HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_SOFTWARE);
+
+ mDebugHotwordLogging = false;
+ unbindHotwordDetectionService();
+ if (mCancellationTaskFuture != null) {
+ mCancellationTaskFuture.cancel(/* mayInterruptIfRunning= */ true);
+ }
+ if (mAudioFlinger != null) {
+ mAudioFlinger.unlinkToDeath(mAudioServerDeathRecipient, /* flags= */ 0);
+ mAudioFlinger = null;
+ }
+ } catch (Exception e) {
+ Slog.e(TAG, "Swallowing error while shutting down hotword detection."
+ + "Error message: " + e.getMessage());
+ }
+ }
+
+
static final class SoundTriggerCallback extends IRecognitionStatusCallback.Stub {
private final HotwordDetectionConnection mHotwordDetectionConnection;
private final IHotwordRecognitionStatusCallback mExternalCallback;
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index ede4885df097..1e686873c1b0 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -252,6 +252,7 @@ public class CarrierConfigManager {
*
* The default value is true.
*/
+ @FlaggedApi(Flags.FLAG_SHOW_CALL_ID_AND_CALL_WAITING_IN_ADDITIONAL_SETTINGS_MENU)
public static final String KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL =
"additional_settings_caller_id_visibility_bool";
@@ -261,6 +262,7 @@ public class CarrierConfigManager {
*
* The default value is true.
*/
+ @FlaggedApi(Flags.FLAG_SHOW_CALL_ID_AND_CALL_WAITING_IN_ADDITIONAL_SETTINGS_MENU)
public static final String KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL =
"additional_settings_call_waiting_visibility_bool";
@@ -3349,12 +3351,42 @@ public class CarrierConfigManager {
/**
* Determines whether we should show a notification when the phone established a data
* connection in roaming network, to warn users about possible roaming charges.
+ *
+ * @see #KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_EXCLUDED_MCCS_STRING_ARRAY
+ * @see #KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_INCLUDED_MCC_MNCS_STRING_ARRAY
* @hide
*/
public static final String KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL =
"show_data_connected_roaming_notification";
/**
+ * Determines what MCCs are exceptions for the value of
+ * {@link #KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL}.
+ * An empty list indicates that there are no exceptions.
+ *
+ * @see #KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL
+ * @see #KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_INCLUDED_MCC_MNCS_STRING_ARRAY
+ * @hide
+ */
+ public static final String
+ KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_EXCLUDED_MCCS_STRING_ARRAY =
+ "data_connected_roaming_notification_excluded_mccs_string_array";
+
+ /**
+ * Determines what MCC+MNCs are exceptions for the MCCs specified in
+ * {@link #KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_EXCLUDED_MCCS_STRING_ARRAY}, meaning the
+ * value for the MCC+MNC is {@link #KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL}.
+ * An empty list indicates that there are no MNC-specific exceptions.
+ *
+ * @see #KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL
+ * @see #KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_EXCLUDED_MCCS_STRING_ARRAY
+ * @hide
+ */
+ public static final String
+ KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_INCLUDED_MCC_MNCS_STRING_ARRAY =
+ "data_connected_roaming_notification_included_mcc_mncs_string_array";
+
+ /**
* A list of 4 LTE RSRP thresholds above which a signal level is considered POOR,
* MODERATE, GOOD, or EXCELLENT, to be used in SignalStrength reporting.
*
@@ -10336,6 +10368,11 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, false);
sDefaults.putBoolean(KEY_CHECK_PRICING_WITH_CARRIER_FOR_DATA_ROAMING_BOOL, false);
sDefaults.putBoolean(KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL, false);
+ sDefaults.putStringArray(KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_EXCLUDED_MCCS_STRING_ARRAY,
+ new String[0]);
+ sDefaults.putStringArray(
+ KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_INCLUDED_MCC_MNCS_STRING_ARRAY,
+ new String[0]);
sDefaults.putIntArray(KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY,
// Boundaries: [-140 dBm, -44 dBm]
new int[] {
diff --git a/telephony/java/android/telephony/CellularIdentifierDisclosure.java b/telephony/java/android/telephony/CellularIdentifierDisclosure.java
new file mode 100644
index 000000000000..7b2db6d59819
--- /dev/null
+++ b/telephony/java/android/telephony/CellularIdentifierDisclosure.java
@@ -0,0 +1,161 @@
+/*
+ * 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.telephony;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
+
+/**
+ * A single occurrence of a cellular identifier being disclosed in the clear before a security
+ * context is established.
+ *
+ * @hide
+ */
+public final class CellularIdentifierDisclosure implements Parcelable {
+ private static final String TAG = "CellularIdentifierDisclosure";
+
+ private @NasProtocolMessage int mNasProtocolMessage;
+ private @CellularIdentifier int mCellularIdentifier;
+ private String mPlmn;
+ private boolean mIsEmergency;
+
+ public CellularIdentifierDisclosure(@NasProtocolMessage int nasProtocolMessage,
+ @CellularIdentifier int cellularIdentifier, String plmn, boolean isEmergency) {
+ mNasProtocolMessage = nasProtocolMessage;
+ mCellularIdentifier = cellularIdentifier;
+ mPlmn = plmn;
+ mIsEmergency = isEmergency;
+ }
+
+ private CellularIdentifierDisclosure(Parcel in) {
+ readFromParcel(in);
+ }
+
+ public @NasProtocolMessage int getNasProtocolMessage() {
+ return mNasProtocolMessage;
+ }
+
+ public @CellularIdentifier int getCellularIdentifier() {
+ return mCellularIdentifier;
+ }
+
+ public String getPlmn() {
+ return mPlmn;
+ }
+
+ public boolean isEmergency() {
+ return mIsEmergency;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(mNasProtocolMessage);
+ out.writeInt(mCellularIdentifier);
+ out.writeBoolean(mIsEmergency);
+ out.writeString8(mPlmn);
+ }
+
+ public static final Parcelable.Creator<CellularIdentifierDisclosure> CREATOR =
+ new Parcelable.Creator<CellularIdentifierDisclosure>() {
+ public CellularIdentifierDisclosure createFromParcel(Parcel in) {
+ return new CellularIdentifierDisclosure(in);
+ }
+
+ public CellularIdentifierDisclosure[] newArray(int size) {
+ return new CellularIdentifierDisclosure[size];
+ }
+ };
+
+ @Override
+ public String toString() {
+ return TAG + ":{ mNasProtocolMessage = " + mNasProtocolMessage
+ + " mCellularIdentifier = " + mCellularIdentifier + " mIsEmergency = "
+ + mIsEmergency + " mPlmn = " + mPlmn;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof CellularIdentifierDisclosure)) return false;
+ CellularIdentifierDisclosure that = (CellularIdentifierDisclosure) o;
+ return mNasProtocolMessage == that.mNasProtocolMessage
+ && mCellularIdentifier == that.mCellularIdentifier
+ && mIsEmergency == that.mIsEmergency && mPlmn.equals(that.mPlmn);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mNasProtocolMessage, mCellularIdentifier, mIsEmergency,
+ mPlmn);
+ }
+
+ private void readFromParcel(@NonNull Parcel in) {
+ mNasProtocolMessage = in.readInt();
+ mCellularIdentifier = in.readInt();
+ mIsEmergency = in.readBoolean();
+ mPlmn = in.readString8();
+ }
+
+ public static final int NAS_PROTOCOL_MESSAGE_UNKNOWN = 0;
+ public static final int NAS_PROTOCOL_MESSAGE_ATTACH_REQUEST = 1;
+ public static final int NAS_PROTOCOL_MESSAGE_IDENTITY_RESPONSE = 2;
+ public static final int NAS_PROTOCOL_MESSAGE_DETACH_REQUEST = 3;
+ public static final int NAS_PROTOCOL_MESSAGE_TRACKING_AREA_UPDATE_REQUEST = 4;
+ public static final int NAS_PROTOCOL_MESSAGE_LOCATION_UPDATE_REQUEST = 5;
+ public static final int NAS_PROTOCOL_MESSAGE_AUTHENTICATION_AND_CIPHERING_RESPONSE = 6;
+ public static final int NAS_PROTOCOL_MESSAGE_REGISTRATION_REQUEST = 7;
+ public static final int NAS_PROTOCOL_MESSAGE_DEREGISTRATION_REQUEST = 8;
+ public static final int NAS_PROTOCOL_MESSAGE_CM_REESTABLISHMENT_REQUEST = 9;
+ public static final int NAS_PROTOCOL_MESSAGE_CM_SERVICE_REQUEST = 10;
+ public static final int NAS_PROTOCOL_MESSAGE_IMSI_DETACH_INDICATION = 11;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"NAS_PROTOCOL_MESSAGE_"}, value = {NAS_PROTOCOL_MESSAGE_UNKNOWN,
+ NAS_PROTOCOL_MESSAGE_ATTACH_REQUEST, NAS_PROTOCOL_MESSAGE_IDENTITY_RESPONSE,
+ NAS_PROTOCOL_MESSAGE_DETACH_REQUEST, NAS_PROTOCOL_MESSAGE_TRACKING_AREA_UPDATE_REQUEST,
+ NAS_PROTOCOL_MESSAGE_LOCATION_UPDATE_REQUEST,
+ NAS_PROTOCOL_MESSAGE_AUTHENTICATION_AND_CIPHERING_RESPONSE,
+ NAS_PROTOCOL_MESSAGE_REGISTRATION_REQUEST, NAS_PROTOCOL_MESSAGE_DEREGISTRATION_REQUEST,
+ NAS_PROTOCOL_MESSAGE_CM_REESTABLISHMENT_REQUEST,
+ NAS_PROTOCOL_MESSAGE_CM_SERVICE_REQUEST, NAS_PROTOCOL_MESSAGE_IMSI_DETACH_INDICATION})
+ public @interface NasProtocolMessage {
+ }
+
+ public static final int CELLULAR_IDENTIFIER_UNKNOWN = 0;
+ public static final int CELLULAR_IDENTIFIER_IMSI = 1;
+ public static final int CELLULAR_IDENTIFIER_IMEI = 2;
+ public static final int CELLULAR_IDENTIFIER_SUCI = 3;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"CELLULAR_IDENTIFIER_"}, value = {CELLULAR_IDENTIFIER_UNKNOWN,
+ CELLULAR_IDENTIFIER_IMSI, CELLULAR_IDENTIFIER_IMEI, CELLULAR_IDENTIFIER_SUCI})
+ public @interface CellularIdentifier {
+ }
+}
diff --git a/telephony/java/android/telephony/ims/RegistrationManager.java b/telephony/java/android/telephony/ims/RegistrationManager.java
index b528866371cb..54ceaed617ec 100644
--- a/telephony/java/android/telephony/ims/RegistrationManager.java
+++ b/telephony/java/android/telephony/ims/RegistrationManager.java
@@ -18,6 +18,7 @@ package android.telephony.ims;
import android.Manifest;
import android.annotation.CallbackExecutor;
+import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -34,6 +35,8 @@ import android.telephony.ims.aidl.IImsRegistrationCallback;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.util.Log;
+import com.android.internal.telephony.flags.Flags;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Map;
@@ -77,9 +80,11 @@ public interface RegistrationManager {
/** @hide */
@IntDef(prefix = {"SUGGESTED_ACTION_"},
value = {
- SUGGESTED_ACTION_NONE,
- SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK,
- SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT
+ SUGGESTED_ACTION_NONE,
+ SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK,
+ SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT,
+ SUGGESTED_ACTION_TRIGGER_RAT_BLOCK,
+ SUGGESTED_ACTION_TRIGGER_CLEAR_RAT_BLOCK
})
@Retention(RetentionPolicy.SOURCE)
public @interface SuggestedAction {}
@@ -109,6 +114,27 @@ public interface RegistrationManager {
@SystemApi
public static final int SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT = 2;
+ /**
+ * Indicates that the IMS registration on current RAT failed multiple times.
+ * The radio shall block the current RAT and search for other available RATs in the
+ * background. If no other RAT is available that meets the carrier requirements, the
+ * radio may remain on the current RAT for internet service. The radio clears all
+ * RATs marked as unavailable if the IMS service is registered to the carrier network.
+ * @hide
+ */
+ @SystemApi
+ @FlaggedApi(Flags.FLAG_ADD_RAT_RELATED_SUGGESTED_ACTION_TO_IMS_REGISTRATION)
+ int SUGGESTED_ACTION_TRIGGER_RAT_BLOCK = 3;
+
+ /**
+ * Indicates that the radio clears all RATs marked as unavailable and tries to find
+ * an available RAT that meets the carrier requirements.
+ * @hide
+ */
+ @SystemApi
+ @FlaggedApi(Flags.FLAG_ADD_RAT_RELATED_SUGGESTED_ACTION_TO_IMS_REGISTRATION)
+ int SUGGESTED_ACTION_TRIGGER_CLEAR_RAT_BLOCK = 4;
+
/**@hide*/
// Translate ImsRegistrationImplBase API to new AccessNetworkConstant because WLAN
// and WWAN are more accurate constants.
diff --git a/test-mock/Android.bp b/test-mock/Android.bp
index 22320fd53631..2ff74132ffbb 100644
--- a/test-mock/Android.bp
+++ b/test-mock/Android.bp
@@ -54,6 +54,29 @@ java_sdk_library {
dist_group: "android",
}
+java_library {
+ name: "android.test.mock.ravenwood",
+ srcs: [":android-test-mock-sources"],
+ visibility: [
+ "//frameworks/base",
+ ],
+}
+
+android_ravenwood_test {
+ name: "android.test.mock.ravenwood.tests",
+ libs: [
+ "android.test.mock.ravenwood",
+ ],
+ static_libs: [
+ "androidx.annotation_annotation",
+ "androidx.test.rules",
+ ],
+ srcs: [
+ "tests/**/*.java",
+ ],
+ auto_gen_config: true,
+}
+
// Make the current.txt available for use by the cts/tests/signature tests.
// ========================================================================
filegroup {
diff --git a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/Password.kt b/test-mock/tests/src/android/test/mock/MockContextTest.java
index 2fe4fd5a12e4..6e28267de46d 100644
--- a/packages/CredentialManager/shared/src/com/android/credentialmanager/model/Password.kt
+++ b/test-mock/tests/src/android/test/mock/MockContextTest.java
@@ -5,7 +5,7 @@
* 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.0N
+ * 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,
@@ -14,13 +14,17 @@
* limitations under the License.
*/
-package com.android.credentialmanager.model
+package android.test.mock;
-import android.credentials.ui.Entry
-import androidx.credentials.provider.PasswordCredentialEntry
+import androidx.test.runner.AndroidJUnit4;
-data class Password(
- val providerId: String,
- val entry: Entry,
- val passwordCredentialEntry: PasswordCredentialEntry,
-)
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class MockContextTest {
+ @Test
+ public void testConstructor() {
+ new MockContext();
+ }
+}
diff --git a/test-mock/tests/src/android/test/mock/MockPackageManagerTest.java b/test-mock/tests/src/android/test/mock/MockPackageManagerTest.java
new file mode 100644
index 000000000000..5b860f169193
--- /dev/null
+++ b/test-mock/tests/src/android/test/mock/MockPackageManagerTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.test.mock;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class MockPackageManagerTest {
+ @Test
+ public void testConstructor() {
+ new MockPackageManager();
+ }
+}
diff --git a/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/GraphicsActivity.java b/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/GraphicsActivity.java
index 1e5f33f26dc2..60b5ce75e2f7 100644
--- a/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/GraphicsActivity.java
+++ b/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/GraphicsActivity.java
@@ -235,13 +235,17 @@ public class GraphicsActivity extends Activity {
}
public int setFrameRate(float frameRate) {
+ return setFrameRate(frameRate, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT);
+ }
+
+ public int setFrameRate(
+ float frameRate, @Surface.FrameRateCompatibility int compatibility) {
Log.i(TAG,
String.format("Setting frame rate for %s: frameRate=%.2f", mName, frameRate));
int rc = 0;
try (SurfaceControl.Transaction transaction = new SurfaceControl.Transaction()) {
- transaction.setFrameRate(
- mSurfaceControl, frameRate, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT);
+ transaction.setFrameRate(mSurfaceControl, frameRate, compatibility);
transaction.apply();
}
return rc;
@@ -668,12 +672,34 @@ public class GraphicsActivity extends Activity {
}
}
- private void testSurfaceControlFrameRateCategoryInternal(int category)
- throws InterruptedException {
+ private void testSurfaceControlFrameRateCompatibilityInternal(
+ @Surface.FrameRateCompatibility int compatibility) throws InterruptedException {
+ runOneSurfaceTest((TestSurface surface) -> {
+ Log.i(TAG,
+ "**** Running testSurfaceControlFrameRateCompatibility with compatibility "
+ + compatibility);
+
+ float expectedFrameRate = getExpectedFrameRateForCompatibility(compatibility);
+ int initialNumEvents = mModeChangedEvents.size();
+ surface.setFrameRate(30.f, compatibility);
+ verifyExactAndStableFrameRate(expectedFrameRate, surface);
+ verifyModeSwitchesDontChangeResolution(initialNumEvents, mModeChangedEvents.size());
+ });
+ }
+
+ public void testSurfaceControlFrameRateCompatibility(
+ @Surface.FrameRateCompatibility int compatibility) throws InterruptedException {
+ runTestsWithPreconditions(
+ () -> testSurfaceControlFrameRateCompatibilityInternal(compatibility),
+ "frame rate compatibility=" + compatibility);
+ }
+
+ private void testSurfaceControlFrameRateCategoryInternal(
+ @Surface.FrameRateCategory int category) throws InterruptedException {
runOneSurfaceTest((TestSurface surface) -> {
Log.i(TAG, "**** Running testSurfaceControlFrameRateCategory for category " + category);
- float expectedFrameRate = getExpectedFrameRate(category);
+ float expectedFrameRate = getExpectedFrameRateForCategory(category);
int initialNumEvents = mModeChangedEvents.size();
surface.setFrameRateCategory(category);
verifyCompatibleAndStableFrameRate(expectedFrameRate, surface);
@@ -681,7 +707,8 @@ public class GraphicsActivity extends Activity {
});
}
- public void testSurfaceControlFrameRateCategory(int category) throws InterruptedException {
+ public void testSurfaceControlFrameRateCategory(@Surface.FrameRateCategory int category)
+ throws InterruptedException {
runTestsWithPreconditions(()
-> testSurfaceControlFrameRateCategoryInternal(category),
"frame rate category=" + category);
@@ -744,7 +771,24 @@ public class GraphicsActivity extends Activity {
"frame rate strategy=" + parentStrategy);
}
- private float getExpectedFrameRate(int category) {
+ private float getExpectedFrameRateForCompatibility(int compatibility) {
+ assumeTrue("**** testSurfaceControlFrameRateCompatibility SKIPPED for compatibility "
+ + compatibility,
+ compatibility == Surface.FRAME_RATE_COMPATIBILITY_GTE);
+
+ Display display = getDisplay();
+ Optional<Float> expectedFrameRate = getRefreshRates(display.getMode(), display)
+ .stream()
+ .filter(rate -> rate >= 30.f)
+ .min(Comparator.naturalOrder());
+
+ assumeTrue("**** testSurfaceControlFrameRateCompatibility SKIPPED because no refresh rate "
+ + "is >= 30",
+ expectedFrameRate.isPresent());
+ return expectedFrameRate.get();
+ }
+
+ private float getExpectedFrameRateForCategory(int category) {
Display display = getDisplay();
List<Float> frameRates = getRefreshRates(display.getMode(), display);
diff --git a/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/SurfaceControlTest.java b/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/SurfaceControlTest.java
index 29f6879f37c3..4b56c107cf22 100644
--- a/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/SurfaceControlTest.java
+++ b/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/SurfaceControlTest.java
@@ -81,6 +81,12 @@ public class SurfaceControlTest {
}
@Test
+ public void testSurfaceControlFrameRateCompatibilityGte() throws InterruptedException {
+ GraphicsActivity activity = mActivityRule.getActivity();
+ activity.testSurfaceControlFrameRateCompatibility(Surface.FRAME_RATE_COMPATIBILITY_GTE);
+ }
+
+ @Test
public void testSurfaceControlFrameRateCategoryHigh() throws InterruptedException {
GraphicsActivity activity = mActivityRule.getActivity();
activity.testSurfaceControlFrameRateCategory(Surface.FRAME_RATE_CATEGORY_HIGH);
diff --git a/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt b/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt
index 44de6a6ecbc3..9c335768de55 100644
--- a/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt
+++ b/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt
@@ -63,6 +63,7 @@ private fun createKeyboard(
deviceId: Int,
vendorId: Int,
productId: Int,
+ deviceBus: Int,
languageTag: String,
layoutType: String
): InputDevice =
@@ -75,6 +76,7 @@ private fun createKeyboard(
.setExternal(true)
.setVendorId(vendorId)
.setProductId(productId)
+ .setDeviceBus(deviceBus)
.setKeyboardLanguageTag(languageTag)
.setKeyboardLayoutType(layoutType)
.build()
@@ -94,6 +96,7 @@ class KeyboardLayoutManagerTests {
const val ENGLISH_QWERTY_DEVICE_ID = 4
const val DEFAULT_VENDOR_ID = 123
const val DEFAULT_PRODUCT_ID = 456
+ const val DEFAULT_DEVICE_BUS = 789
const val USER_ID = 4
const val IME_ID = "ime_id"
const val PACKAGE_NAME = "KeyboardLayoutManagerTests"
@@ -177,12 +180,14 @@ class KeyboardLayoutManagerTests {
Mockito.`when`(context.getSystemService(Mockito.eq(Context.INPUT_SERVICE)))
.thenReturn(inputManager)
- keyboardDevice = createKeyboard(DEVICE_ID, DEFAULT_VENDOR_ID, DEFAULT_PRODUCT_ID, "", "")
- vendorSpecificKeyboardDevice = createKeyboard(VENDOR_SPECIFIC_DEVICE_ID, 1, 1, "", "")
+ keyboardDevice = createKeyboard(DEVICE_ID, DEFAULT_VENDOR_ID, DEFAULT_PRODUCT_ID,
+ DEFAULT_DEVICE_BUS, "", "")
+ vendorSpecificKeyboardDevice = createKeyboard(VENDOR_SPECIFIC_DEVICE_ID, 1, 1,
+ 1, "", "")
englishDvorakKeyboardDevice = createKeyboard(ENGLISH_DVORAK_DEVICE_ID, DEFAULT_VENDOR_ID,
- DEFAULT_PRODUCT_ID, "en", "dvorak")
+ DEFAULT_PRODUCT_ID, DEFAULT_DEVICE_BUS, "en", "dvorak")
englishQwertyKeyboardDevice = createKeyboard(ENGLISH_QWERTY_DEVICE_ID, DEFAULT_VENDOR_ID,
- DEFAULT_PRODUCT_ID, "en", "qwerty")
+ DEFAULT_PRODUCT_ID, DEFAULT_DEVICE_BUS, "en", "qwerty")
Mockito.`when`(iInputManager.inputDeviceIds)
.thenReturn(intArrayOf(
DEVICE_ID,
@@ -861,7 +866,9 @@ class KeyboardLayoutManagerTests {
GERMAN_LAYOUT_NAME,
KeyboardMetricsCollector.LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD,
"de-Latn",
- LAYOUT_TYPE_QWERTZ))
+ LAYOUT_TYPE_QWERTZ),
+ ),
+ ArgumentMatchers.eq(keyboardDevice.deviceBus),
)
}
}
@@ -887,7 +894,8 @@ class KeyboardLayoutManagerTests {
ENGLISH_US_LAYOUT_NAME,
KeyboardMetricsCollector.LAYOUT_SELECTION_CRITERIA_DEVICE,
"de-Latn",
- LAYOUT_TYPE_QWERTZ))
+ LAYOUT_TYPE_QWERTZ)),
+ ArgumentMatchers.eq(keyboardDevice.deviceBus),
)
}
}
@@ -911,7 +919,9 @@ class KeyboardLayoutManagerTests {
"Default",
KeyboardMetricsCollector.LAYOUT_SELECTION_CRITERIA_DEFAULT,
KeyboardMetricsCollector.DEFAULT_LANGUAGE_TAG,
- LAYOUT_TYPE_DEFAULT))
+ LAYOUT_TYPE_DEFAULT),
+ ),
+ ArgumentMatchers.eq(keyboardDevice.deviceBus),
)
}
}
@@ -929,7 +939,8 @@ class KeyboardLayoutManagerTests {
ArgumentMatchers.anyBoolean(),
ArgumentMatchers.anyInt(),
ArgumentMatchers.anyInt(),
- ArgumentMatchers.any(ByteArray::class.java)
+ ArgumentMatchers.any(ByteArray::class.java),
+ ArgumentMatchers.anyInt(),
)
}, Mockito.times(0))
}
@@ -972,8 +983,13 @@ class KeyboardLayoutManagerTests {
}
private fun createByteArray(
- expectedLanguageTag: String, expectedLayoutType: Int, expectedLayoutName: String,
- expectedCriteria: Int, expectedImeLanguageTag: String, expectedImeLayoutType: Int): ByteArray {
+ expectedLanguageTag: String,
+ expectedLayoutType: Int,
+ expectedLayoutName: String,
+ expectedCriteria: Int,
+ expectedImeLanguageTag: String,
+ expectedImeLayoutType: Int
+ ): ByteArray {
val proto = ProtoOutputStream()
val keyboardLayoutConfigToken = proto.start(
KeyboardConfiguredProto.RepeatedKeyboardLayoutConfig.KEYBOARD_LAYOUT_CONFIG)
@@ -1001,7 +1017,7 @@ class KeyboardLayoutManagerTests {
KeyboardConfiguredProto.KeyboardLayoutConfig.IME_LAYOUT_TYPE,
expectedImeLayoutType
)
- proto.end(keyboardLayoutConfigToken);
+ proto.end(keyboardLayoutConfigToken)
return proto.bytes
}
diff --git a/tests/Input/src/com/android/server/input/KeyboardMetricsCollectorTests.kt b/tests/Input/src/com/android/server/input/KeyboardMetricsCollectorTests.kt
index 33ff09b55534..89a47b9b736a 100644
--- a/tests/Input/src/com/android/server/input/KeyboardMetricsCollectorTests.kt
+++ b/tests/Input/src/com/android/server/input/KeyboardMetricsCollectorTests.kt
@@ -30,6 +30,7 @@ private fun createKeyboard(
deviceId: Int,
vendorId: Int,
productId: Int,
+ deviceBus: Int,
languageTag: String?,
layoutType: String?
): InputDevice =
@@ -42,6 +43,7 @@ private fun createKeyboard(
.setExternal(true)
.setVendorId(vendorId)
.setProductId(productId)
+ .setDeviceBus(deviceBus)
.setKeyboardLanguageTag(languageTag)
.setKeyboardLayoutType(layoutType)
.build()
@@ -67,6 +69,7 @@ class KeyboardMetricsCollectorTests {
const val DEVICE_ID = 1
const val DEFAULT_VENDOR_ID = 123
const val DEFAULT_PRODUCT_ID = 456
+ const val DEFAULT_DEVICE_BUS = 789
}
@Test
@@ -77,6 +80,7 @@ class KeyboardMetricsCollectorTests {
DEVICE_ID,
DEFAULT_VENDOR_ID,
DEFAULT_PRODUCT_ID,
+ DEFAULT_DEVICE_BUS,
null,
null
)
@@ -92,6 +96,7 @@ class KeyboardMetricsCollectorTests {
DEVICE_ID,
DEFAULT_VENDOR_ID,
DEFAULT_PRODUCT_ID,
+ DEFAULT_DEVICE_BUS,
null,
null
)
@@ -107,6 +112,7 @@ class KeyboardMetricsCollectorTests {
DEVICE_ID,
DEFAULT_VENDOR_ID,
DEFAULT_PRODUCT_ID,
+ DEFAULT_DEVICE_BUS,
"de-CH",
"qwertz"
)
@@ -135,6 +141,11 @@ class KeyboardMetricsCollectorTests {
DEFAULT_PRODUCT_ID,
event.productId
)
+ assertEquals(
+ "KeyboardConfigurationEvent should pick device bus from provided InputDevice",
+ DEFAULT_DEVICE_BUS,
+ event.deviceBus
+ )
assertTrue(event.isFirstConfiguration)
assertEquals(
@@ -178,6 +189,7 @@ class KeyboardMetricsCollectorTests {
DEVICE_ID,
DEFAULT_VENDOR_ID,
DEFAULT_PRODUCT_ID,
+ DEFAULT_DEVICE_BUS,
"und", // Undefined language tag
"azerty"
)
diff --git a/tests/NetworkSecurityConfigTest/OWNERS b/tests/NetworkSecurityConfigTest/OWNERS
index aa87958f1d53..90e1bed9fb26 100644
--- a/tests/NetworkSecurityConfigTest/OWNERS
+++ b/tests/NetworkSecurityConfigTest/OWNERS
@@ -1 +1,2 @@
include /services/core/java/com/android/server/net/OWNERS
+include /core/java/android/security/net/OWNERS
diff --git a/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt b/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt
index 1dfd5c06167b..d0e56268a27d 100644
--- a/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt
+++ b/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt
@@ -93,7 +93,7 @@ class GrantAndRevokeTrustTest {
}
@Test
- @RequiresFlagsEnabled(android.security.Flags.FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS)
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS_V2)
fun grantCannotActivelyUnlockDevice() {
// On automotive, trust agents can actively unlock the device.
assumeFalse(packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE))
@@ -120,7 +120,7 @@ class GrantAndRevokeTrustTest {
}
@Test
- @RequiresFlagsDisabled(android.security.Flags.FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS)
+ @RequiresFlagsDisabled(android.security.Flags.FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS_V2)
fun grantCouldCauseWrongDeviceLockedStateDueToBug() {
// On automotive, trust agents can actively unlock the device.
assumeFalse(packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE))
diff --git a/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt b/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt
index 5a8f82827253..01218099f34c 100644
--- a/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt
+++ b/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt
@@ -36,7 +36,8 @@ import org.junit.runners.model.Statement
class LockStateTrackingRule : TestRule {
private val context: Context = getApplicationContext()
private val windowManager = checkNotNull(WindowManagerGlobal.getWindowManagerService())
- private val keyguardManager = context.getSystemService(KeyguardManager::class.java) as KeyguardManager
+ private val keyguardManager =
+ context.getSystemService(KeyguardManager::class.java) as KeyguardManager
@Volatile lateinit var trustState: TrustState
private set
@@ -63,7 +64,7 @@ class LockStateTrackingRule : TestRule {
wait("not trusted") { trustState.trusted == false }
}
- // TODO(b/299298338) remove this when removing FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS
+ // TODO(b/299298338) remove this when removing FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS_V2
fun assertUnlockedButNotReally() {
wait("device unlocked") { !keyguardManager.isDeviceLocked }
wait("not trusted") { trustState.trusted == false }
@@ -87,7 +88,7 @@ class LockStateTrackingRule : TestRule {
trustGrantedMessages: MutableList<String>
) {
Log.d(TAG, "Device became trusted=$enabled")
- trustState = trustState.copy(trusted=enabled)
+ trustState = trustState.copy(trusted = enabled)
}
}
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index 412aa9bf88ab..275a0e21fedd 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -92,10 +92,6 @@ cc_library_host_static {
srcs: [
"compile/IdAssigner.cpp",
"compile/InlineXmlFormatParser.cpp",
- "compile/NinePatch.cpp",
- "compile/Png.cpp",
- "compile/PngChunkFilter.cpp",
- "compile/PngCrunch.cpp",
"compile/PseudolocaleGenerator.cpp",
"compile/Pseudolocalizer.cpp",
"compile/XmlIdCollector.cpp",
@@ -112,9 +108,7 @@ cc_library_host_static {
"format/binary/XmlFlattener.cpp",
"format/proto/ProtoDeserialize.cpp",
"format/proto/ProtoSerialize.cpp",
- "io/BigBufferStream.cpp",
"io/File.cpp",
- "io/FileStream.cpp",
"io/FileSystem.cpp",
"io/StringStream.cpp",
"io/Util.cpp",
diff --git a/tools/aapt2/LoadedApk.cpp b/tools/aapt2/LoadedApk.cpp
index 6b1fd9ff11eb..d6502d82848f 100644
--- a/tools/aapt2/LoadedApk.cpp
+++ b/tools/aapt2/LoadedApk.cpp
@@ -18,12 +18,12 @@
#include "ResourceValues.h"
#include "ValueVisitor.h"
+#include "androidfw/BigBufferStream.h"
#include "format/Archive.h"
#include "format/binary/TableFlattener.h"
#include "format/binary/XmlFlattener.h"
#include "format/proto/ProtoDeserialize.h"
#include "format/proto/ProtoSerialize.h"
-#include "io/BigBufferStream.h"
#include "io/Util.h"
#include "xml/XmlDom.h"
@@ -48,7 +48,7 @@ static ApkFormat DetermineApkFormat(io::IFileCollection* apk) {
}
// First try in proto format.
- std::unique_ptr<io::InputStream> manifest_in = manifest_file->OpenInputStream();
+ std::unique_ptr<android::InputStream> manifest_in = manifest_file->OpenInputStream();
if (manifest_in != nullptr) {
pb::XmlNode pb_node;
io::ProtoInputStreamReader proto_reader(manifest_in.get());
@@ -102,7 +102,7 @@ std::unique_ptr<LoadedApk> LoadedApk::LoadProtoApkFromFileCollection(
io::IFile* table_file = collection->FindFile(kProtoResourceTablePath);
if (table_file != nullptr) {
pb::ResourceTable pb_table;
- std::unique_ptr<io::InputStream> in = table_file->OpenInputStream();
+ std::unique_ptr<android::InputStream> in = table_file->OpenInputStream();
if (in == nullptr) {
diag->Error(android::DiagMessage(source) << "failed to open " << kProtoResourceTablePath);
return {};
@@ -129,7 +129,7 @@ std::unique_ptr<LoadedApk> LoadedApk::LoadProtoApkFromFileCollection(
return {};
}
- std::unique_ptr<io::InputStream> manifest_in = manifest_file->OpenInputStream();
+ std::unique_ptr<android::InputStream> manifest_in = manifest_file->OpenInputStream();
if (manifest_in == nullptr) {
diag->Error(android::DiagMessage(source) << "failed to open " << kAndroidManifestPath);
return {};
@@ -262,7 +262,7 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
return false;
}
- io::BigBufferInputStream input_stream(&buffer);
+ android::BigBufferInputStream input_stream(&buffer);
if (!io::CopyInputStreamToArchive(context,
&input_stream,
path,
@@ -296,7 +296,7 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
}
uint32_t compression_flags = file->WasCompressed() ? ArchiveEntry::kCompress : 0u;
- io::BigBufferInputStream manifest_buffer_in(&buffer);
+ android::BigBufferInputStream manifest_buffer_in(&buffer);
if (!io::CopyInputStreamToArchive(context, &manifest_buffer_in, path, compression_flags,
writer)) {
return false;
@@ -321,7 +321,7 @@ std::unique_ptr<xml::XmlResource> LoadedApk::LoadXml(const std::string& file_pat
std::unique_ptr<xml::XmlResource> doc;
if (format_ == ApkFormat::kProto) {
- std::unique_ptr<io::InputStream> in = file->OpenInputStream();
+ std::unique_ptr<android::InputStream> in = file->OpenInputStream();
if (!in) {
diag->Error(android::DiagMessage() << "failed to open file");
return nullptr;
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index a0b4dab9b8e5..b351d6ee4f33 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -27,6 +27,7 @@
#include "Diagnostics.h"
#include "android-base/stringprintf.h"
#include "android-base/utf8.h"
+#include "androidfw/FileStream.h"
#include "androidfw/IDiagnostics.h"
#include "androidfw/StringPiece.h"
#include "cmd/ApkInfo.h"
@@ -37,7 +38,6 @@
#include "cmd/Dump.h"
#include "cmd/Link.h"
#include "cmd/Optimize.h"
-#include "io/FileStream.h"
#include "trace/TraceBuffer.h"
#include "util/Files.h"
#include "util/Util.h"
@@ -99,7 +99,7 @@ class MainCommand : public Command {
*/
class DaemonCommand : public Command {
public:
- explicit DaemonCommand(io::FileOutputStream* out, android::IDiagnostics* diagnostics)
+ explicit DaemonCommand(android::FileOutputStream* out, android::IDiagnostics* diagnostics)
: Command("daemon", "m"), out_(out), diagnostics_(diagnostics) {
SetDescription("Runs aapt in daemon mode. Each subsequent line is a single parameter to the\n"
"command. The end of an invocation is signaled by providing an empty line.");
@@ -147,7 +147,7 @@ class DaemonCommand : public Command {
}
private:
- io::FileOutputStream* out_;
+ android::FileOutputStream* out_;
android::IDiagnostics* diagnostics_;
std::optional<std::string> trace_folder_;
};
@@ -167,7 +167,7 @@ int MainImpl(int argc, char** argv) {
// Use a smaller buffer so that there is less latency for printing to stdout.
constexpr size_t kStdOutBufferSize = 1024u;
- aapt::io::FileOutputStream fout(STDOUT_FILENO, kStdOutBufferSize);
+ android::FileOutputStream fout(STDOUT_FILENO, kStdOutBufferSize);
aapt::text::Printer printer(&fout);
aapt::StdErrDiagnostics diagnostics;
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 728ba8aa4fdd..031dd5bb139c 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -25,13 +25,16 @@
#include "android-base/errors.h"
#include "android-base/file.h"
#include "android-base/utf8.h"
+#include "androidfw/BigBufferStream.h"
#include "androidfw/ConfigDescription.h"
+#include "androidfw/FileStream.h"
#include "androidfw/IDiagnostics.h"
+#include "androidfw/Image.h"
+#include "androidfw/Png.h"
#include "androidfw/StringPiece.h"
#include "cmd/Util.h"
#include "compile/IdAssigner.h"
#include "compile/InlineXmlFormatParser.h"
-#include "compile/Png.h"
#include "compile/PseudolocaleGenerator.h"
#include "compile/XmlIdCollector.h"
#include "format/Archive.h"
@@ -39,8 +42,6 @@
#include "format/proto/ProtoSerialize.h"
#include "google/protobuf/io/coded_stream.h"
#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
-#include "io/BigBufferStream.h"
-#include "io/FileStream.h"
#include "io/FileSystem.h"
#include "io/StringStream.h"
#include "io/Util.h"
@@ -52,9 +53,9 @@
#include "xml/XmlDom.h"
#include "xml/XmlPullParser.h"
-using ::aapt::io::FileInputStream;
using ::aapt::text::Printer;
using ::android::ConfigDescription;
+using ::android::FileInputStream;
using ::android::StringPiece;
using ::android::base::SystemErrorCodeToString;
using ::google::protobuf::io::CopyingOutputStreamAdaptor;
@@ -241,7 +242,7 @@ static bool CompileTable(IAaptContext* context, const CompileOptions& options,
}
if (options.generate_text_symbols_path) {
- io::FileOutputStream fout_text(options.generate_text_symbols_path.value());
+ android::FileOutputStream fout_text(options.generate_text_symbols_path.value());
if (fout_text.HadError()) {
context->GetDiagnostics()->Error(android::DiagMessage()
@@ -307,7 +308,7 @@ static bool CompileTable(IAaptContext* context, const CompileOptions& options,
}
static bool WriteHeaderAndDataToWriter(StringPiece output_path, const ResourceFile& file,
- io::KnownSizeInputStream* in, IArchiveWriter* writer,
+ android::KnownSizeInputStream* in, IArchiveWriter* writer,
android::IDiagnostics* diag) {
TRACE_CALL();
// Start the entry so we can write the header.
@@ -448,7 +449,7 @@ static bool CompileXml(IAaptContext* context, const CompileOptions& options,
}
if (options.generate_text_symbols_path) {
- io::FileOutputStream fout_text(options.generate_text_symbols_path.value());
+ android::FileOutputStream fout_text(options.generate_text_symbols_path.value());
if (fout_text.HadError()) {
context->GetDiagnostics()->Error(android::DiagMessage()
@@ -498,21 +499,22 @@ static bool CompilePng(IAaptContext* context, const CompileOptions& options,
}
android::BigBuffer crunched_png_buffer(4096);
- io::BigBufferOutputStream crunched_png_buffer_out(&crunched_png_buffer);
+ android::BigBufferOutputStream crunched_png_buffer_out(&crunched_png_buffer);
// Ensure that we only keep the chunks we care about if we end up
// using the original PNG instead of the crunched one.
const StringPiece content(reinterpret_cast<const char*>(data->data()), data->size());
- PngChunkFilter png_chunk_filter(content);
- std::unique_ptr<Image> image = ReadPng(context, path_data.source, &png_chunk_filter);
+ android::PngChunkFilter png_chunk_filter(content);
+ android::SourcePathDiagnostics source_diag(path_data.source, context->GetDiagnostics());
+ auto image = android::ReadPng(&png_chunk_filter, &source_diag);
if (!image) {
return false;
}
- std::unique_ptr<NinePatch> nine_patch;
+ std::unique_ptr<android::NinePatch> nine_patch;
if (path_data.extension == "9.png") {
std::string err;
- nine_patch = NinePatch::Create(image->rows.get(), image->width, image->height, &err);
+ nine_patch = android::NinePatch::Create(image->rows.get(), image->width, image->height, &err);
if (!nine_patch) {
context->GetDiagnostics()->Error(android::DiagMessage() << err);
return false;
@@ -537,7 +539,8 @@ static bool CompilePng(IAaptContext* context, const CompileOptions& options,
}
// Write the crunched PNG.
- if (!WritePng(context, image.get(), nine_patch.get(), &crunched_png_buffer_out, {})) {
+ if (!android::WritePng(image.get(), nine_patch.get(), &crunched_png_buffer_out, {},
+ &source_diag, context->IsVerbose())) {
return false;
}
@@ -557,7 +560,7 @@ static bool CompilePng(IAaptContext* context, const CompileOptions& options,
png_chunk_filter.Rewind();
android::BigBuffer filtered_png_buffer(4096);
- io::BigBufferOutputStream filtered_png_buffer_out(&filtered_png_buffer);
+ android::BigBufferOutputStream filtered_png_buffer_out(&filtered_png_buffer);
io::Copy(&filtered_png_buffer_out, &png_chunk_filter);
buffer.AppendBuffer(std::move(filtered_png_buffer));
}
@@ -567,7 +570,7 @@ static bool CompilePng(IAaptContext* context, const CompileOptions& options,
// This will help catch exotic cases where the new code may generate larger PNGs.
std::stringstream legacy_stream{std::string(content)};
android::BigBuffer legacy_buffer(4096);
- Png png(context->GetDiagnostics());
+ android::Png png(context->GetDiagnostics());
if (!png.process(path_data.source, &legacy_stream, &legacy_buffer, {})) {
return false;
}
@@ -578,7 +581,7 @@ static bool CompilePng(IAaptContext* context, const CompileOptions& options,
}
}
- io::BigBufferInputStream buffer_in(&buffer);
+ android::BigBufferInputStream buffer_in(&buffer);
return WriteHeaderAndDataToWriter(output_path, res_file, &buffer_in, writer,
context->GetDiagnostics());
}
diff --git a/tools/aapt2/cmd/Compile_test.cpp b/tools/aapt2/cmd/Compile_test.cpp
index 8880089d0e20..9337cb913a0b 100644
--- a/tools/aapt2/cmd/Compile_test.cpp
+++ b/tools/aapt2/cmd/Compile_test.cpp
@@ -341,7 +341,7 @@ TEST_F(CompilerTest, RelativePathTest) {
// Check resources.pb contains relative sources.
io::IFile* proto_file =
apk.get()->GetFileCollection()->FindFile("resources.pb");
- std::unique_ptr<io::InputStream> proto_stream = proto_file->OpenInputStream();
+ std::unique_ptr<android::InputStream> proto_stream = proto_file->OpenInputStream();
io::ProtoInputStreamReader proto_reader(proto_stream.get());
pb::ResourceTable pb_table;
proto_reader.ReadMessage(&pb_table);
diff --git a/tools/aapt2/cmd/Convert.cpp b/tools/aapt2/cmd/Convert.cpp
index 387dcfe2ddf3..c132792d374b 100644
--- a/tools/aapt2/cmd/Convert.cpp
+++ b/tools/aapt2/cmd/Convert.cpp
@@ -24,13 +24,13 @@
#include "android-base/file.h"
#include "android-base/macros.h"
#include "android-base/stringprintf.h"
+#include "androidfw/BigBufferStream.h"
#include "androidfw/StringPiece.h"
#include "cmd/Util.h"
#include "format/binary/TableFlattener.h"
#include "format/binary/XmlFlattener.h"
#include "format/proto/ProtoDeserialize.h"
#include "format/proto/ProtoSerialize.h"
-#include "io/BigBufferStream.h"
#include "io/Util.h"
#include "process/IResourceTableConsumer.h"
#include "process/SymbolTable.h"
@@ -80,7 +80,7 @@ class BinaryApkSerializer : public IApkSerializer {
return false;
}
- io::BigBufferInputStream input_stream(&buffer);
+ android::BigBufferInputStream input_stream(&buffer);
return io::CopyInputStreamToArchive(context_, &input_stream, path, compression_flags, writer);
}
@@ -91,14 +91,14 @@ class BinaryApkSerializer : public IApkSerializer {
return false;
}
- io::BigBufferInputStream input_stream(&buffer);
+ android::BigBufferInputStream input_stream(&buffer);
return io::CopyInputStreamToArchive(context_, &input_stream, kApkResourceTablePath,
ArchiveEntry::kAlign, writer);
}
bool SerializeFile(FileReference* file, IArchiveWriter* writer) override {
if (file->type == ResourceFile::Type::kProtoXml) {
- unique_ptr<io::InputStream> in = file->file->OpenInputStream();
+ unique_ptr<android::InputStream> in = file->file->OpenInputStream();
if (in == nullptr) {
context_->GetDiagnostics()->Error(android::DiagMessage(source_)
<< "failed to open file " << *file->path);
diff --git a/tools/aapt2/cmd/Dump.cpp b/tools/aapt2/cmd/Dump.cpp
index 864af06f187e..6fa9ecbfa544 100644
--- a/tools/aapt2/cmd/Dump.cpp
+++ b/tools/aapt2/cmd/Dump.cpp
@@ -19,19 +19,18 @@
#include <cinttypes>
#include <vector>
-#include "android-base/stringprintf.h"
-#include "androidfw/ConfigDescription.h"
-#include "androidfw/StringPiece.h"
-
#include "Debug.h"
#include "Diagnostics.h"
#include "LoadedApk.h"
#include "Util.h"
+#include "android-base/stringprintf.h"
+#include "androidfw/ConfigDescription.h"
+#include "androidfw/FileStream.h"
+#include "androidfw/StringPiece.h"
#include "format/Container.h"
#include "format/binary/BinaryResourceParser.h"
#include "format/binary/XmlFlattener.h"
#include "format/proto/ProtoDeserialize.h"
-#include "io/FileStream.h"
#include "io/ZipArchive.h"
#include "process/IResourceTableConsumer.h"
#include "text/Printer.h"
@@ -145,7 +144,7 @@ int DumpAPCCommand::Action(const std::vector<std::string>& args) {
bool error = false;
for (auto container : args) {
- io::FileInputStream input(container);
+ android::FileInputStream input(container);
if (input.HadError()) {
context.GetDiagnostics()->Error(android::DiagMessage(container)
<< "failed to open file: " << input.GetError());
diff --git a/tools/aapt2/cmd/Dump.h b/tools/aapt2/cmd/Dump.h
index 76d33d7aa3b2..119a59b28317 100644
--- a/tools/aapt2/cmd/Dump.h
+++ b/tools/aapt2/cmd/Dump.h
@@ -17,7 +17,7 @@
#ifndef AAPT2_DUMP_H
#define AAPT2_DUMP_H
-#include <io/FileStream.h>
+#include <androidfw/FileStream.h>
#include <io/ZipArchive.h>
#include "Command.h"
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index c638873873dc..9ca546fc8d89 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -35,6 +35,8 @@
#include "android-base/expected.h"
#include "android-base/file.h"
#include "android-base/stringprintf.h"
+#include "androidfw/BigBufferStream.h"
+#include "androidfw/FileStream.h"
#include "androidfw/IDiagnostics.h"
#include "androidfw/Locale.h"
#include "androidfw/StringPiece.h"
@@ -48,8 +50,6 @@
#include "format/binary/XmlFlattener.h"
#include "format/proto/ProtoDeserialize.h"
#include "format/proto/ProtoSerialize.h"
-#include "io/BigBufferStream.h"
-#include "io/FileStream.h"
#include "io/FileSystem.h"
#include "io/Util.h"
#include "io/ZipArchive.h"
@@ -73,8 +73,8 @@
#include "util/Files.h"
#include "xml/XmlDom.h"
-using ::aapt::io::FileInputStream;
using ::android::ConfigDescription;
+using ::android::FileInputStream;
using ::android::StringPiece;
using ::android::base::expected;
using ::android::base::StringPrintf;
@@ -263,7 +263,7 @@ static bool FlattenXml(IAaptContext* context, const xml::XmlResource& xml_res, S
return false;
}
- io::BigBufferInputStream input_stream(&buffer);
+ android::BigBufferInputStream input_stream(&buffer);
return io::CopyInputStreamToArchive(context, &input_stream, path, ArchiveEntry::kCompress,
writer);
} break;
@@ -284,7 +284,7 @@ static bool FlattenXml(IAaptContext* context, const xml::XmlResource& xml_res, S
static std::unique_ptr<xml::XmlResource> LoadXml(const std::string& path,
android::IDiagnostics* diag) {
TRACE_CALL();
- FileInputStream fin(path);
+ android::FileInputStream fin(path);
if (fin.HadError()) {
diag->Error(android::DiagMessage(path) << "failed to load XML file: " << fin.GetError());
return {};
@@ -687,7 +687,7 @@ bool ResourceFileFlattener::Flatten(ResourceTable* table, IArchiveWriter* archiv
static bool WriteStableIdMapToPath(android::IDiagnostics* diag,
const std::unordered_map<ResourceName, ResourceId>& id_map,
const std::string& id_map_path) {
- io::FileOutputStream fout(id_map_path);
+ android::FileOutputStream fout(id_map_path);
if (fout.HadError()) {
diag->Error(android::DiagMessage(id_map_path) << "failed to open: " << fout.GetError());
return false;
@@ -1197,7 +1197,7 @@ class Linker {
return false;
}
- io::BigBufferInputStream input_stream(&buffer);
+ android::BigBufferInputStream input_stream(&buffer);
return io::CopyInputStreamToArchive(context_, &input_stream, kApkResourceTablePath,
ArchiveEntry::kAlign, writer);
} break;
@@ -1221,7 +1221,7 @@ class Linker {
}
std::string out_path;
- std::unique_ptr<io::FileOutputStream> fout;
+ std::unique_ptr<android::FileOutputStream> fout;
if (options_.generate_java_class_path) {
out_path = options_.generate_java_class_path.value();
file::AppendPath(&out_path, file::PackageToPath(out_package));
@@ -1233,7 +1233,7 @@ class Linker {
file::AppendPath(&out_path, "R.java");
- fout = util::make_unique<io::FileOutputStream>(out_path);
+ fout = util::make_unique<android::FileOutputStream>(out_path);
if (fout->HadError()) {
context_->GetDiagnostics()->Error(android::DiagMessage()
<< "failed writing to '" << out_path
@@ -1242,9 +1242,9 @@ class Linker {
}
}
- std::unique_ptr<io::FileOutputStream> fout_text;
+ std::unique_ptr<android::FileOutputStream> fout_text;
if (out_text_symbols_path) {
- fout_text = util::make_unique<io::FileOutputStream>(out_text_symbols_path.value());
+ fout_text = util::make_unique<android::FileOutputStream>(out_text_symbols_path.value());
if (fout_text->HadError()) {
context_->GetDiagnostics()->Error(android::DiagMessage()
<< "failed writing to '" << out_text_symbols_path.value()
@@ -1386,7 +1386,7 @@ class Linker {
file::AppendPath(&out_path, "Manifest.java");
- io::FileOutputStream fout(out_path);
+ android::FileOutputStream fout(out_path);
if (fout.HadError()) {
context_->GetDiagnostics()->Error(android::DiagMessage() << "failed to open '" << out_path
<< "': " << fout.GetError());
@@ -1412,7 +1412,7 @@ class Linker {
}
const std::string& out_path = out.value();
- io::FileOutputStream fout(out_path);
+ android::FileOutputStream fout(out_path);
if (fout.HadError()) {
context_->GetDiagnostics()->Error(android::DiagMessage() << "failed to open '" << out_path
<< "': " << fout.GetError());
@@ -1601,7 +1601,7 @@ class Linker {
}
}
- std::unique_ptr<io::InputStream> input_stream = file->OpenInputStream();
+ std::unique_ptr<android::InputStream> input_stream = file->OpenInputStream();
if (input_stream == nullptr) {
context_->GetDiagnostics()->Error(android::DiagMessage(src) << "failed to open file");
return false;
diff --git a/tools/aapt2/cmd/Optimize.cpp b/tools/aapt2/cmd/Optimize.cpp
index f045dad6d11a..762441ee1872 100644
--- a/tools/aapt2/cmd/Optimize.cpp
+++ b/tools/aapt2/cmd/Optimize.cpp
@@ -30,6 +30,7 @@
#include "ValueVisitor.h"
#include "android-base/file.h"
#include "android-base/stringprintf.h"
+#include "androidfw/BigBufferStream.h"
#include "androidfw/ConfigDescription.h"
#include "androidfw/IDiagnostics.h"
#include "androidfw/ResourceTypes.h"
@@ -39,7 +40,6 @@
#include "filter/AbiFilter.h"
#include "format/binary/TableFlattener.h"
#include "format/binary/XmlFlattener.h"
-#include "io/BigBufferStream.h"
#include "io/Util.h"
#include "optimize/MultiApkGenerator.h"
#include "optimize/Obfuscator.h"
@@ -249,7 +249,7 @@ class Optimizer {
return false;
}
- io::BigBufferInputStream manifest_buffer_in(&manifest_buffer);
+ android::BigBufferInputStream manifest_buffer_in(&manifest_buffer);
if (!io::CopyInputStreamToArchive(context_, &manifest_buffer_in, "AndroidManifest.xml",
ArchiveEntry::kCompress, writer)) {
return false;
@@ -297,7 +297,7 @@ class Optimizer {
return false;
}
- io::BigBufferInputStream table_buffer_in(&table_buffer);
+ android::BigBufferInputStream table_buffer_in(&table_buffer);
return io::CopyInputStreamToArchive(context_, &table_buffer_in, "resources.arsc",
ArchiveEntry::kAlign, writer);
}
diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp
index a2b48187c24f..a5962292b5b0 100644
--- a/tools/aapt2/dump/DumpManifest.cpp
+++ b/tools/aapt2/dump/DumpManifest.cpp
@@ -29,8 +29,8 @@
#include "SdkConstants.h"
#include "ValueVisitor.h"
#include "androidfw/ConfigDescription.h"
+#include "androidfw/FileStream.h"
#include "io/File.h"
-#include "io/FileStream.h"
#include "process/IResourceTableConsumer.h"
#include "xml/XmlDom.h"
diff --git a/tools/aapt2/format/Archive.cpp b/tools/aapt2/format/Archive.cpp
index e9a93d8b12ad..91768a09ea59 100644
--- a/tools/aapt2/format/Archive.cpp
+++ b/tools/aapt2/format/Archive.cpp
@@ -91,7 +91,7 @@ class DirectoryWriter : public IArchiveWriter {
return true;
}
- bool WriteFile(StringPiece path, uint32_t flags, io::InputStream* in) override {
+ bool WriteFile(StringPiece path, uint32_t flags, android::InputStream* in) override {
if (!StartEntry(path, flags)) {
return false;
}
@@ -182,7 +182,7 @@ class ZipFileWriter : public IArchiveWriter {
return true;
}
- bool WriteFile(StringPiece path, uint32_t flags, io::InputStream* in) override {
+ bool WriteFile(StringPiece path, uint32_t flags, android::InputStream* in) override {
while (true) {
if (!StartEntry(path, flags)) {
return false;
diff --git a/tools/aapt2/format/Archive.h b/tools/aapt2/format/Archive.h
index 6cde753a255d..3c3d0ab74c52 100644
--- a/tools/aapt2/format/Archive.h
+++ b/tools/aapt2/format/Archive.h
@@ -24,9 +24,9 @@
#include "androidfw/BigBuffer.h"
#include "androidfw/IDiagnostics.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
-#include "io/Io.h"
#include "util/Files.h"
namespace aapt {
@@ -46,7 +46,7 @@ class IArchiveWriter : public ::google::protobuf::io::CopyingOutputStream {
public:
virtual ~IArchiveWriter() = default;
- virtual bool WriteFile(android::StringPiece path, uint32_t flags, io::InputStream* in) = 0;
+ virtual bool WriteFile(android::StringPiece path, uint32_t flags, android::InputStream* in) = 0;
// Starts a new entry and allows caller to write bytes to it sequentially.
// Only use StartEntry if code you do not control needs to write to a CopyingOutputStream.
diff --git a/tools/aapt2/format/Archive_test.cpp b/tools/aapt2/format/Archive_test.cpp
index fd50af92ceee..df105f8a83e5 100644
--- a/tools/aapt2/format/Archive_test.cpp
+++ b/tools/aapt2/format/Archive_test.cpp
@@ -95,7 +95,7 @@ void VerifyDirectory(const std::string& path, const std::string& file, const uin
void VerifyZipFile(const std::string& output_path, const std::string& file, const uint8_t array[]) {
std::unique_ptr<io::ZipFileCollection> zip = io::ZipFileCollection::Create(output_path, nullptr);
- std::unique_ptr<io::InputStream> stream = zip->FindFile(file)->OpenInputStream();
+ std::unique_ptr<android::InputStream> stream = zip->FindFile(file)->OpenInputStream();
std::vector<uint8_t> buffer;
const void* data;
diff --git a/tools/aapt2/format/Container.cpp b/tools/aapt2/format/Container.cpp
index 1ff6c4996b91..cb4a225c73e7 100644
--- a/tools/aapt2/format/Container.cpp
+++ b/tools/aapt2/format/Container.cpp
@@ -94,7 +94,7 @@ bool ContainerWriter::AddResTableEntry(const pb::ResourceTable& table) {
}
bool ContainerWriter::AddResFileEntry(const pb::internal::CompiledFile& file,
- io::KnownSizeInputStream* in) {
+ android::KnownSizeInputStream* in) {
if (current_entry_count_ >= total_entry_count_) {
error_ = "too many entries being serialized";
return false;
@@ -264,7 +264,7 @@ std::string ContainerReaderEntry::GetError() const {
return reader_->GetError();
}
-ContainerReader::ContainerReader(io::InputStream* in)
+ContainerReader::ContainerReader(android::InputStream* in)
: in_(in),
adaptor_(in),
coded_in_(&adaptor_),
diff --git a/tools/aapt2/format/Container.h b/tools/aapt2/format/Container.h
index 121c592537bf..c5d567697a5a 100644
--- a/tools/aapt2/format/Container.h
+++ b/tools/aapt2/format/Container.h
@@ -22,9 +22,9 @@
#include "Resources.pb.h"
#include "ResourcesInternal.pb.h"
#include "androidfw/BigBuffer.h"
+#include "androidfw/Streams.h"
#include "google/protobuf/io/coded_stream.h"
#include "google/protobuf/io/zero_copy_stream.h"
-#include "io/Io.h"
#include "io/Util.h"
namespace aapt {
@@ -39,7 +39,7 @@ class ContainerWriter {
explicit ContainerWriter(::google::protobuf::io::ZeroCopyOutputStream* out, size_t entry_count);
bool AddResTableEntry(const pb::ResourceTable& table);
- bool AddResFileEntry(const pb::internal::CompiledFile& file, io::KnownSizeInputStream* in);
+ bool AddResFileEntry(const pb::internal::CompiledFile& file, android::KnownSizeInputStream* in);
bool HadError() const;
std::string GetError() const;
@@ -79,7 +79,7 @@ class ContainerReaderEntry {
class ContainerReader {
public:
- explicit ContainerReader(io::InputStream* in);
+ explicit ContainerReader(android::InputStream* in);
ContainerReaderEntry* Next();
@@ -91,7 +91,7 @@ class ContainerReader {
friend class ContainerReaderEntry;
- io::InputStream* in_;
+ android::InputStream* in_;
io::ZeroCopyInputAdaptor adaptor_;
::google::protobuf::io::CodedInputStream coded_in_;
size_t total_entry_count_;
diff --git a/tools/aapt2/io/Data.h b/tools/aapt2/io/Data.h
index db91a77a5ae6..29f523aeff1b 100644
--- a/tools/aapt2/io/Data.h
+++ b/tools/aapt2/io/Data.h
@@ -20,15 +20,14 @@
#include <memory>
#include "android-base/macros.h"
+#include "androidfw/Streams.h"
#include "utils/FileMap.h"
-#include "io/Io.h"
-
namespace aapt {
namespace io {
// Interface for a block of contiguous memory. An instance of this interface owns the data.
-class IData : public KnownSizeInputStream {
+class IData : public android::KnownSizeInputStream {
public:
virtual ~IData() = default;
diff --git a/tools/aapt2/io/File.cpp b/tools/aapt2/io/File.cpp
index b4f1ff3a5b49..4dfdb5bb8ad9 100644
--- a/tools/aapt2/io/File.cpp
+++ b/tools/aapt2/io/File.cpp
@@ -39,7 +39,7 @@ std::unique_ptr<IData> FileSegment::OpenAsData() {
return {};
}
-std::unique_ptr<io::InputStream> FileSegment::OpenInputStream() {
+std::unique_ptr<android::InputStream> FileSegment::OpenInputStream() {
return OpenAsData();
}
diff --git a/tools/aapt2/io/File.h b/tools/aapt2/io/File.h
index 673d1b75e660..248756b51f2e 100644
--- a/tools/aapt2/io/File.h
+++ b/tools/aapt2/io/File.h
@@ -43,7 +43,7 @@ class IFile {
// Returns nullptr on failure.
virtual std::unique_ptr<IData> OpenAsData() = 0;
- virtual std::unique_ptr<io::InputStream> OpenInputStream() = 0;
+ virtual std::unique_ptr<android::InputStream> OpenInputStream() = 0;
// Returns the source of this file. This is for presentation to the user and
// may not be a valid file system path (for example, it may contain a '@' sign to separate
@@ -78,7 +78,7 @@ class FileSegment : public IFile {
: file_(file), offset_(offset), len_(len) {}
std::unique_ptr<IData> OpenAsData() override;
- std::unique_ptr<io::InputStream> OpenInputStream() override;
+ std::unique_ptr<android::InputStream> OpenInputStream() override;
const android::Source& GetSource() const override {
return file_->GetSource();
diff --git a/tools/aapt2/io/FileSystem.cpp b/tools/aapt2/io/FileSystem.cpp
index 6a692e497816..03fabcc4dcce 100644
--- a/tools/aapt2/io/FileSystem.cpp
+++ b/tools/aapt2/io/FileSystem.cpp
@@ -22,9 +22,9 @@
#include <sys/stat.h>
#include "android-base/errors.h"
+#include "androidfw/FileStream.h"
#include "androidfw/Source.h"
#include "androidfw/StringPiece.h"
-#include "io/FileStream.h"
#include "util/Files.h"
#include "util/Util.h"
#include "utils/FileMap.h"
@@ -49,8 +49,8 @@ std::unique_ptr<IData> RegularFile::OpenAsData() {
return {};
}
-std::unique_ptr<io::InputStream> RegularFile::OpenInputStream() {
- return util::make_unique<FileInputStream>(source_.path);
+std::unique_ptr<android::InputStream> RegularFile::OpenInputStream() {
+ return util::make_unique<android::FileInputStream>(source_.path);
}
const android::Source& RegularFile::GetSource() const {
diff --git a/tools/aapt2/io/FileSystem.h b/tools/aapt2/io/FileSystem.h
index f975196b9cfa..d6ecfebab67d 100644
--- a/tools/aapt2/io/FileSystem.h
+++ b/tools/aapt2/io/FileSystem.h
@@ -30,7 +30,7 @@ class RegularFile : public IFile {
explicit RegularFile(const android::Source& source);
std::unique_ptr<IData> OpenAsData() override;
- std::unique_ptr<io::InputStream> OpenInputStream() override;
+ std::unique_ptr<android::InputStream> OpenInputStream() override;
const android::Source& GetSource() const override;
bool GetModificationTime(struct tm* buf) const override;
diff --git a/tools/aapt2/io/StringStream.cpp b/tools/aapt2/io/StringStream.cpp
index 9c497882b99b..bb3911b20175 100644
--- a/tools/aapt2/io/StringStream.cpp
+++ b/tools/aapt2/io/StringStream.cpp
@@ -51,6 +51,23 @@ size_t StringInputStream::TotalSize() const {
return str_.size();
}
+bool StringInputStream::ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) {
+ if (byte_count == 0) {
+ return true;
+ }
+ if (offset < 0) {
+ return false;
+ }
+ if (offset > std::numeric_limits<off64_t>::max() - byte_count) {
+ return false;
+ }
+ if (offset + byte_count > str_.size()) {
+ return false;
+ }
+ memcpy(data, str_.data() + offset, byte_count);
+ return true;
+}
+
StringOutputStream::StringOutputStream(std::string* str, size_t buffer_capacity)
: str_(str),
buffer_capacity_(buffer_capacity),
diff --git a/tools/aapt2/io/StringStream.h b/tools/aapt2/io/StringStream.h
index f7bdecca0dee..7e1abe583170 100644
--- a/tools/aapt2/io/StringStream.h
+++ b/tools/aapt2/io/StringStream.h
@@ -17,17 +17,16 @@
#ifndef AAPT_IO_STRINGSTREAM_H
#define AAPT_IO_STRINGSTREAM_H
-#include "io/Io.h"
-
#include <memory>
#include "android-base/macros.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
namespace aapt {
namespace io {
-class StringInputStream : public KnownSizeInputStream {
+class StringInputStream : public android::KnownSizeInputStream {
public:
explicit StringInputStream(android::StringPiece str);
@@ -47,6 +46,8 @@ class StringInputStream : public KnownSizeInputStream {
size_t TotalSize() const override;
+ bool ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) override;
+
private:
DISALLOW_COPY_AND_ASSIGN(StringInputStream);
@@ -54,7 +55,7 @@ class StringInputStream : public KnownSizeInputStream {
size_t offset_;
};
-class StringOutputStream : public OutputStream {
+class StringOutputStream : public android::OutputStream {
public:
explicit StringOutputStream(std::string* str, size_t buffer_capacity = 4096u);
diff --git a/tools/aapt2/io/Util.cpp b/tools/aapt2/io/Util.cpp
index 79d8d527fe8b..9616e479eda0 100644
--- a/tools/aapt2/io/Util.cpp
+++ b/tools/aapt2/io/Util.cpp
@@ -26,8 +26,9 @@ using ::google::protobuf::io::ZeroCopyOutputStream;
namespace aapt {
namespace io {
-bool CopyInputStreamToArchive(IAaptContext* context, InputStream* in, std::string_view out_path,
- uint32_t compression_flags, IArchiveWriter* writer) {
+bool CopyInputStreamToArchive(IAaptContext* context, android::InputStream* in,
+ std::string_view out_path, uint32_t compression_flags,
+ IArchiveWriter* writer) {
TRACE_CALL();
if (context->IsVerbose()) {
context->GetDiagnostics()->Note(android::DiagMessage()
@@ -91,7 +92,7 @@ bool CopyProtoToArchive(IAaptContext* context, ::google::protobuf::Message* prot
return false;
}
-bool Copy(OutputStream* out, InputStream* in) {
+bool Copy(android::OutputStream* out, android::InputStream* in) {
TRACE_CALL();
const void* in_buffer;
size_t in_len;
@@ -110,7 +111,7 @@ bool Copy(OutputStream* out, InputStream* in) {
return !in->HadError();
}
-bool Copy(OutputStream* out, StringPiece in) {
+bool Copy(android::OutputStream* out, StringPiece in) {
const char* in_buffer = in.data();
size_t in_len = in.size();
while (in_len != 0) {
@@ -129,7 +130,7 @@ bool Copy(OutputStream* out, StringPiece in) {
return true;
}
-bool Copy(ZeroCopyOutputStream* out, InputStream* in) {
+bool Copy(ZeroCopyOutputStream* out, android::InputStream* in) {
OutputStreamAdaptor adaptor(out);
return Copy(&adaptor, in);
}
diff --git a/tools/aapt2/io/Util.h b/tools/aapt2/io/Util.h
index 685f522a2e71..25aa8f8d1916 100644
--- a/tools/aapt2/io/Util.h
+++ b/tools/aapt2/io/Util.h
@@ -19,18 +19,19 @@
#include <string_view>
+#include "androidfw/Streams.h"
#include "format/Archive.h"
#include "google/protobuf/io/coded_stream.h"
#include "google/protobuf/message.h"
#include "io/File.h"
-#include "io/Io.h"
#include "process/IResourceTableConsumer.h"
namespace aapt {
namespace io {
-bool CopyInputStreamToArchive(IAaptContext* context, InputStream* in, std::string_view out_path,
- uint32_t compression_flags, IArchiveWriter* writer);
+bool CopyInputStreamToArchive(IAaptContext* context, android::InputStream* in,
+ std::string_view out_path, uint32_t compression_flags,
+ IArchiveWriter* writer);
bool CopyFileToArchive(IAaptContext* context, IFile* file, std::string_view out_path,
uint32_t compression_flags, IArchiveWriter* writer);
@@ -44,11 +45,11 @@ bool CopyProtoToArchive(IAaptContext* context, ::google::protobuf::Message* prot
// Copies the data from in to out. Returns false if there was an error.
// If there was an error, check the individual streams' HadError/GetError methods.
-bool Copy(OutputStream* out, InputStream* in);
-bool Copy(OutputStream* out, android::StringPiece in);
-bool Copy(::google::protobuf::io::ZeroCopyOutputStream* out, InputStream* in);
+bool Copy(android::OutputStream* out, android::InputStream* in);
+bool Copy(android::OutputStream* out, android::StringPiece in);
+bool Copy(::google::protobuf::io::ZeroCopyOutputStream* out, android::InputStream* in);
-class OutputStreamAdaptor : public io::OutputStream {
+class OutputStreamAdaptor : public android::OutputStream {
public:
explicit OutputStreamAdaptor(::google::protobuf::io::ZeroCopyOutputStream* out) : out_(out) {
}
@@ -84,7 +85,7 @@ class OutputStreamAdaptor : public io::OutputStream {
class ZeroCopyInputAdaptor : public ::google::protobuf::io::ZeroCopyInputStream {
public:
- explicit ZeroCopyInputAdaptor(io::InputStream* in) : in_(in) {
+ explicit ZeroCopyInputAdaptor(android::InputStream* in) : in_(in) {
}
bool Next(const void** data, int* size) override {
@@ -119,12 +120,13 @@ class ZeroCopyInputAdaptor : public ::google::protobuf::io::ZeroCopyInputStream
private:
DISALLOW_COPY_AND_ASSIGN(ZeroCopyInputAdaptor);
- io::InputStream* in_;
+ android::InputStream* in_;
};
class ProtoInputStreamReader {
public:
- explicit ProtoInputStreamReader(io::InputStream* in) : in_(in) { }
+ explicit ProtoInputStreamReader(android::InputStream* in) : in_(in) {
+ }
/** Deserializes a Message proto from the current position in the input stream.*/
template <typename T> bool ReadMessage(T *message) {
@@ -135,7 +137,7 @@ class ProtoInputStreamReader {
}
private:
- io::InputStream* in_;
+ android::InputStream* in_;
};
} // namespace io
diff --git a/tools/aapt2/io/ZipArchive.cpp b/tools/aapt2/io/ZipArchive.cpp
index cb5bbe96b8b7..e44d61e08899 100644
--- a/tools/aapt2/io/ZipArchive.cpp
+++ b/tools/aapt2/io/ZipArchive.cpp
@@ -63,7 +63,7 @@ std::unique_ptr<IData> ZipFile::OpenAsData() {
}
}
-std::unique_ptr<io::InputStream> ZipFile::OpenInputStream() {
+std::unique_ptr<android::InputStream> ZipFile::OpenInputStream() {
return OpenAsData();
}
diff --git a/tools/aapt2/io/ZipArchive.h b/tools/aapt2/io/ZipArchive.h
index ac125d097983..a53c4a2e39f8 100644
--- a/tools/aapt2/io/ZipArchive.h
+++ b/tools/aapt2/io/ZipArchive.h
@@ -35,7 +35,7 @@ class ZipFile : public IFile {
ZipFile(::ZipArchiveHandle handle, const ::ZipEntry& entry, const android::Source& source);
std::unique_ptr<IData> OpenAsData() override;
- std::unique_ptr<io::InputStream> OpenInputStream() override;
+ std::unique_ptr<android::InputStream> OpenInputStream() override;
const android::Source& GetSource() const override;
bool WasCompressed() override;
bool GetModificationTime(struct tm* buf) const override;
diff --git a/tools/aapt2/java/ClassDefinition.cpp b/tools/aapt2/java/ClassDefinition.cpp
index 98f3bd2018b0..db7aa35d5ad4 100644
--- a/tools/aapt2/java/ClassDefinition.cpp
+++ b/tools/aapt2/java/ClassDefinition.cpp
@@ -111,7 +111,7 @@ constexpr static const char* sWarningHeader =
" */\n\n";
void ClassDefinition::WriteJavaFile(const ClassDefinition* def, StringPiece package, bool final,
- bool strip_api_annotations, io::OutputStream* out) {
+ bool strip_api_annotations, android::OutputStream* out) {
Printer printer(out);
printer.Print(sWarningHeader).Print("package ").Print(package).Println(";");
printer.Println();
diff --git a/tools/aapt2/java/ClassDefinition.h b/tools/aapt2/java/ClassDefinition.h
index 63c99821a836..84e3f33db941 100644
--- a/tools/aapt2/java/ClassDefinition.h
+++ b/tools/aapt2/java/ClassDefinition.h
@@ -241,7 +241,7 @@ enum class ClassQualifier { kNone, kStatic };
class ClassDefinition : public ClassMember {
public:
static void WriteJavaFile(const ClassDefinition* def, android::StringPiece package, bool final,
- bool strip_api_annotations, io::OutputStream* out);
+ bool strip_api_annotations, android::OutputStream* out);
ClassDefinition(android::StringPiece name, ClassQualifier qualifier, bool createIfEmpty)
: name_(name), qualifier_(qualifier), create_if_empty_(createIfEmpty) {
diff --git a/tools/aapt2/java/JavaClassGenerator.cpp b/tools/aapt2/java/JavaClassGenerator.cpp
index 7665d0e8d9cb..58f656458177 100644
--- a/tools/aapt2/java/JavaClassGenerator.cpp
+++ b/tools/aapt2/java/JavaClassGenerator.cpp
@@ -37,8 +37,8 @@
#include "java/ClassDefinition.h"
#include "process/SymbolTable.h"
-using ::aapt::io::OutputStream;
using ::aapt::text::Printer;
+using ::android::OutputStream;
using ::android::StringPiece;
using ::android::base::StringPrintf;
diff --git a/tools/aapt2/java/JavaClassGenerator.h b/tools/aapt2/java/JavaClassGenerator.h
index 234df04472ce..9909eeccb6ac 100644
--- a/tools/aapt2/java/JavaClassGenerator.h
+++ b/tools/aapt2/java/JavaClassGenerator.h
@@ -19,11 +19,10 @@
#include <string>
-#include "androidfw/StringPiece.h"
-
#include "ResourceTable.h"
#include "ResourceValues.h"
-#include "io/Io.h"
+#include "androidfw/Streams.h"
+#include "androidfw/StringPiece.h"
#include "process/IResourceTableConsumer.h"
#include "process/SymbolTable.h"
#include "text/Printer.h"
@@ -70,12 +69,12 @@ class JavaClassGenerator {
// All symbols technically belong to a single package, but linked libraries will
// have their names mangled, denoting that they came from a different package.
// We need to generate these symbols in a separate file. Returns true on success.
- bool Generate(android::StringPiece package_name_to_generate, io::OutputStream* out,
- io::OutputStream* out_r_txt = nullptr);
+ bool Generate(android::StringPiece package_name_to_generate, android::OutputStream* out,
+ android::OutputStream* out_r_txt = nullptr);
bool Generate(android::StringPiece package_name_to_generate,
- android::StringPiece output_package_name, io::OutputStream* out,
- io::OutputStream* out_r_txt = nullptr);
+ android::StringPiece output_package_name, android::OutputStream* out,
+ android::OutputStream* out_r_txt = nullptr);
const std::string& GetError() const;
diff --git a/tools/aapt2/java/ProguardRules.cpp b/tools/aapt2/java/ProguardRules.cpp
index 80a46d553960..aef48fc102d7 100644
--- a/tools/aapt2/java/ProguardRules.cpp
+++ b/tools/aapt2/java/ProguardRules.cpp
@@ -29,8 +29,8 @@
#include "util/Util.h"
#include "xml/XmlDom.h"
-using ::aapt::io::OutputStream;
using ::aapt::text::Printer;
+using ::android::OutputStream;
namespace aapt {
namespace proguard {
diff --git a/tools/aapt2/java/ProguardRules.h b/tools/aapt2/java/ProguardRules.h
index 267f7ede274a..876ef48042f5 100644
--- a/tools/aapt2/java/ProguardRules.h
+++ b/tools/aapt2/java/ProguardRules.h
@@ -26,8 +26,8 @@
#include "ResourceTable.h"
#include "ValueVisitor.h"
#include "androidfw/Source.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
-#include "io/Io.h"
#include "process/IResourceTableConsumer.h"
#include "xml/XmlDom.h"
@@ -69,7 +69,7 @@ class KeepSet {
}
private:
- friend void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out, bool minimal_keep,
+ friend void WriteKeepSet(const KeepSet& keep_set, android::OutputStream* out, bool minimal_keep,
bool no_location_reference);
friend bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set,
@@ -89,7 +89,7 @@ bool CollectProguardRules(IAaptContext* context, xml::XmlResource* res, KeepSet*
bool CollectResourceReferences(IAaptContext* context, ResourceTable* table, KeepSet* keep_set);
-void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out, bool minimal_keep,
+void WriteKeepSet(const KeepSet& keep_set, android::OutputStream* out, bool minimal_keep,
bool no_location_reference);
bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set,
diff --git a/tools/aapt2/test/Common.h b/tools/aapt2/test/Common.h
index e48668cf96a3..04379804d8ee 100644
--- a/tools/aapt2/test/Common.h
+++ b/tools/aapt2/test/Common.h
@@ -90,7 +90,7 @@ class TestFile : public io::IFile {
return {};
}
- std::unique_ptr<io::InputStream> OpenInputStream() override {
+ std::unique_ptr<android::InputStream> OpenInputStream() override {
return OpenAsData();
}
diff --git a/tools/aapt2/test/Fixture.cpp b/tools/aapt2/test/Fixture.cpp
index 428372f31d0d..b91abe572306 100644
--- a/tools/aapt2/test/Fixture.cpp
+++ b/tools/aapt2/test/Fixture.cpp
@@ -20,6 +20,7 @@
#include <android-base/file.h>
#include <android-base/stringprintf.h>
#include <android-base/utf8.h>
+#include <androidfw/FileStream.h>
#include <androidfw/StringPiece.h>
#include <dirent.h>
#include <gmock/gmock.h>
@@ -28,7 +29,6 @@
#include "Diagnostics.h"
#include "cmd/Compile.h"
#include "cmd/Link.h"
-#include "io/FileStream.h"
#include "util/Files.h"
using testing::Eq;
diff --git a/tools/aapt2/text/Printer.cpp b/tools/aapt2/text/Printer.cpp
index 8e491aca794d..c2fa8cccd536 100644
--- a/tools/aapt2/text/Printer.cpp
+++ b/tools/aapt2/text/Printer.cpp
@@ -20,7 +20,7 @@
#include "io/Util.h"
-using ::aapt::io::OutputStream;
+using ::android::OutputStream;
using ::android::StringPiece;
namespace aapt {
diff --git a/tools/aapt2/text/Printer.h b/tools/aapt2/text/Printer.h
index f7ad98bfd981..44f0fc546c7c 100644
--- a/tools/aapt2/text/Printer.h
+++ b/tools/aapt2/text/Printer.h
@@ -18,17 +18,16 @@
#define AAPT_TEXT_PRINTER_H
#include "android-base/macros.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
-#include "io/Io.h"
-
namespace aapt {
namespace text {
// An indenting Printer that helps write formatted text to the OutputStream.
class Printer {
public:
- explicit Printer(::aapt::io::OutputStream* out) : out_(out) {
+ explicit Printer(android::OutputStream* out) : out_(out) {
}
Printer& Print(android::StringPiece str);
@@ -41,7 +40,7 @@ class Printer {
private:
DISALLOW_COPY_AND_ASSIGN(Printer);
- ::aapt::io::OutputStream* out_;
+ android::OutputStream* out_;
int indent_level_ = 0;
bool needs_indent_ = false;
bool error_ = false;
diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp
index 8dea8ea52f92..49807db26bb7 100644
--- a/tools/aapt2/xml/XmlDom.cpp
+++ b/tools/aapt2/xml/XmlDom.cpp
@@ -30,7 +30,7 @@
#include "XmlPullParser.h"
#include "util/Util.h"
-using ::aapt::io::InputStream;
+using ::android::InputStream;
using ::android::StringPiece;
using ::android::StringPiece16;
diff --git a/tools/aapt2/xml/XmlDom.h b/tools/aapt2/xml/XmlDom.h
index c253b0a1f4a9..9668b6a6e8ef 100644
--- a/tools/aapt2/xml/XmlDom.h
+++ b/tools/aapt2/xml/XmlDom.h
@@ -24,8 +24,8 @@
#include "Resource.h"
#include "ResourceValues.h"
#include "androidfw/IDiagnostics.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
-#include "io/Io.h"
#include "util/Util.h"
#include "xml/XmlUtil.h"
@@ -152,7 +152,7 @@ class XmlResource {
};
// Inflates an XML DOM from an InputStream, logging errors to the logger.
-std::unique_ptr<XmlResource> Inflate(io::InputStream* in, android::IDiagnostics* diag,
+std::unique_ptr<XmlResource> Inflate(android::InputStream* in, android::IDiagnostics* diag,
const android::Source& source);
// Inflates an XML DOM from a binary ResXMLTree.
diff --git a/tools/aapt2/xml/XmlPullParser.cpp b/tools/aapt2/xml/XmlPullParser.cpp
index d79446bfae6f..203832d2dbe8 100644
--- a/tools/aapt2/xml/XmlPullParser.cpp
+++ b/tools/aapt2/xml/XmlPullParser.cpp
@@ -21,7 +21,7 @@
#include "xml/XmlPullParser.h"
#include "xml/XmlUtil.h"
-using ::aapt::io::InputStream;
+using ::android::InputStream;
using ::android::StringPiece;
namespace aapt {
diff --git a/tools/aapt2/xml/XmlPullParser.h b/tools/aapt2/xml/XmlPullParser.h
index fe4cd018d808..655e6dc93e75 100644
--- a/tools/aapt2/xml/XmlPullParser.h
+++ b/tools/aapt2/xml/XmlPullParser.h
@@ -27,11 +27,10 @@
#include <string>
#include <vector>
+#include "Resource.h"
#include "android-base/macros.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
-
-#include "Resource.h"
-#include "io/Io.h"
#include "process/IResourceTableConsumer.h"
#include "xml/XmlUtil.h"
@@ -66,7 +65,7 @@ class XmlPullParser : public IPackageDeclStack {
static bool SkipCurrentElement(XmlPullParser* parser);
static bool IsGoodEvent(Event event);
- explicit XmlPullParser(io::InputStream* in);
+ explicit XmlPullParser(android::InputStream* in);
~XmlPullParser();
/**
@@ -179,7 +178,7 @@ class XmlPullParser : public IPackageDeclStack {
std::vector<Attribute> attributes;
};
- io::InputStream* in_;
+ android::InputStream* in_;
XML_Parser parser_;
std::queue<EventData> event_queue_;
std::string error_;
diff --git a/tools/hoststubgen/README.md b/tools/hoststubgen/README.md
index b0a126292063..3455b0af4360 100644
--- a/tools/hoststubgen/README.md
+++ b/tools/hoststubgen/README.md
@@ -2,19 +2,27 @@
## Overview
-This directory contains tools / sample code / investigation for host side test support.
+HostStubGen is a tool built for ravenwood. It can read an Android framework jar file
+(such as `framework-minus-apex.jar` or `framework-all.jar`) and
+converts them, so that they can be used on the Ravenwood environment.
+This directory contains the HostStubGen source code, tests and some library source files
+used at runtime.
+
+- HostStubGen itself is design to be agnostic to Android. It doesn't use any Android APIs
+(hidden or not). But it may use Android specific knowledge -- e.g. as of now,
+AndroidHeuristicsFilter has hardcoded heuristics to detect AIDL generated classes.
+
+- `test-tiny-framework/` contains basic tests that are agnostic to Android.
+
+- More Android specific build files and code are stored in `frameworks/base/Ravenwood.bp`
+ `frameworks/base/ravenwood`.
## Directories and files
- `hoststubgen/`
Contains source code of the "hoststubgen" tool and relevant code
- - `framework-policy-override.txt`
- This file contains "policy overrides", which allows to control what goes to stub/impl without
- having to touch the target java files. This allows quicker iteration, because you can skip
- having to rebuild framework.jar.
-
- `src/`
HostStubGen tool source code.
@@ -26,14 +34,12 @@ This directory contains tools / sample code / investigation for host side test s
- `test-tiny-framework/` See `README.md` in it.
- - `test-framework` See `README.md` in it.
+ - `test-framework`
+ This directory was used during the prototype phase, but now that we have real ravenwood tests,
+ this directory is obsolete and should be deleted.
-- `scripts`
- - `run-host-test.sh`
-
- Run a host side test. Use it instead of `atest` for now. (`atest` works "mostly" but it has
- problems.)
+- `scripts`
- `dump-jar.sh`
A script to dump the content of `*.class` and `*.jar` files.
@@ -53,8 +59,8 @@ m hoststubgen
### Run the tests
-- Run all relevant tests and test scripts. Some of thests are still expected to fail,
- but this should print "finished, with no unexpected failures" at the end.
+- Run all relevant tests and test scripts. All of it is expected to pass, and it'll print
+ "Ready to submit" at the end.
However, because some of the script it executes depend on internal file paths to Soong's
intermediate directory, some of it might fail when something changes in the build system.
@@ -74,3 +80,7 @@ $ ./scripts/run-all-tests.sh
(or at least check it.)
- The `HostStubGenTest-framework-test-host-test-lib` jar somehow contain all ASM classes? Figure out where the dependency is coming from.
+
+- At some point, we can move or delete all Android specific code to `frameworks/base/ravenwood`.
+ - `helper-framework-*-src` should be moved to `frameworks/base/ravenwood`
+ - `test-framework` should be deleted. \ No newline at end of file
diff --git a/tools/hoststubgen/TEST_MAPPING b/tools/hoststubgen/TEST_MAPPING
index 192b6f2b5e25..eca258c5a74d 100644
--- a/tools/hoststubgen/TEST_MAPPING
+++ b/tools/hoststubgen/TEST_MAPPING
@@ -1,11 +1,13 @@
{
- "presubmit": [
- { "name": "tiny-framework-dump-test" },
- { "name": "hoststubgentest" },
- { "name": "hoststubgen-invoke-test" }
-
- // As a smoke test.
- // TODO: Enable it once the infra knows how to run it.
- // { "name": "CtsUtilTestCasesRavenwood" }
- ]
+ "presubmit": [
+ { "name": "tiny-framework-dump-test" },
+ { "name": "hoststubgentest" },
+ { "name": "hoststubgen-invoke-test" }
+ ],
+ "ravenwood-presubmit": [
+ {
+ "name": "CtsUtilTestCasesRavenwood",
+ "host": true
+ }
+ ]
}
diff --git a/tools/hoststubgen/hoststubgen/Android.bp b/tools/hoststubgen/hoststubgen/Android.bp
index 5949bca2f9a3..0e2e158c327e 100644
--- a/tools/hoststubgen/hoststubgen/Android.bp
+++ b/tools/hoststubgen/hoststubgen/Android.bp
@@ -274,6 +274,22 @@ java_library_host {
],
}
+java_library_host {
+ name: "hoststubgen-helper-libcore-runtime",
+ defaults: ["hoststubgen-for-prototype-only-java"],
+ srcs: [
+ "helper-framework-runtime-src/libcore-fake/**/*.java",
+ ],
+}
+
+java_host_for_device {
+ name: "hoststubgen-helper-libcore-runtime.ravenwood",
+ defaults: ["hoststubgen-for-prototype-only-java"],
+ libs: [
+ "hoststubgen-helper-libcore-runtime",
+ ],
+}
+
java_library {
name: "hoststubgen-helper-framework-runtime.ravenwood",
defaults: ["hoststubgen-for-prototype-only-java"],
@@ -286,6 +302,7 @@ java_library {
],
static_libs: [
"core-xml-for-device",
+ "hoststubgen-helper-libcore-runtime.ravenwood",
],
}
diff --git a/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/android/system/ErrnoException.java b/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/android/system/ErrnoException.java
new file mode 100644
index 000000000000..388156aa3694
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/android/system/ErrnoException.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2011 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.system;
+
+import java.io.IOException;
+import java.net.SocketException;
+
+/**
+ * A checked exception thrown when {@link Os} methods fail. This exception contains the native
+ * errno value, for comparison against the constants in {@link OsConstants}, should sophisticated
+ * callers need to adjust their behavior based on the exact failure.
+ */
+public final class ErrnoException extends Exception {
+ private final String functionName;
+
+ /**
+ * The errno value, for comparison with the {@code E} constants in {@link OsConstants}.
+ */
+ public final int errno;
+
+ /**
+ * Constructs an instance with the given function name and errno value.
+ */
+ public ErrnoException(String functionName, int errno) {
+ this.functionName = functionName;
+ this.errno = errno;
+ }
+
+ /**
+ * Constructs an instance with the given function name, errno value, and cause.
+ */
+ public ErrnoException(String functionName, int errno, Throwable cause) {
+ super(cause);
+ this.functionName = functionName;
+ this.errno = errno;
+ }
+
+ /**
+ * Converts the stashed function name and errno value to a human-readable string.
+ * We do this here rather than in the constructor so that callers only pay for
+ * this if they need it.
+ */
+ @Override public String getMessage() {
+ return functionName + " failed: " + errno;
+ }
+
+ /**
+ * Throws an {@link IOException} with a message based on {@link #getMessage()} and with this
+ * instance as the cause.
+ *
+ * <p>This method always terminates by throwing the exception. Callers can write
+ * {@code throw e.rethrowAsIOException()} to make that clear to the compiler.
+ */
+ public IOException rethrowAsIOException() throws IOException {
+ IOException newException = new IOException(getMessage());
+ newException.initCause(this);
+ throw newException;
+ }
+
+ /**
+ * Throws a {@link SocketException} with a message based on {@link #getMessage()} and with this
+ * instance as the cause.
+ *
+ * <p>This method always terminates by throwing the exception. Callers can write
+ * {@code throw e.rethrowAsIOException()} to make that clear to the compiler.
+ */
+ public SocketException rethrowAsSocketException() throws SocketException {
+ throw new SocketException(getMessage());
+ }
+}
diff --git a/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/libcore/io/IoUtils.java b/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/libcore/io/IoUtils.java
new file mode 100644
index 000000000000..65c285e06bf8
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/libcore/io/IoUtils.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2010 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 libcore.io;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.Socket;
+
+/** @hide */
+public final class IoUtils {
+ private IoUtils() {
+ }
+
+ public static void closeQuietly(AutoCloseable closeable) {
+ if (closeable != null) {
+ try {
+ closeable.close();
+ } catch (RuntimeException rethrown) {
+ throw rethrown;
+ } catch (Exception ignored) {
+ }
+ }
+ }
+
+ public static void closeQuietly(Socket socket) {
+ if (socket != null) {
+ try {
+ socket.close();
+ } catch (RuntimeException rethrown) {
+ throw rethrown;
+ } catch (Exception ignored) {
+ }
+ }
+ }
+
+ public static void deleteContents(File dir) throws IOException {
+ File[] files = dir.listFiles();
+ if (files != null) {
+ for (File file : files) {
+ if (file.isDirectory()) {
+ deleteContents(file);
+ }
+ file.delete();
+ }
+ }
+ }
+}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInImpl.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInImpl.java
new file mode 100644
index 000000000000..2cc500f527c0
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInImpl.java
@@ -0,0 +1,35 @@
+/*
+ * 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 com.android.hoststubgen.hosthelper;
+
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation injected to all classes/methods/fields that are kept in the "impl" jar.
+ */
+@Target({TYPE, METHOD, CONSTRUCTOR, FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface HostStubGenKeptInImpl {
+ String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenKeptInImpl.class);
+ String CLASS_DESCRIPTOR = "L" + CLASS_INTERNAL_NAME + ";";
+}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInStub.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInStub.java
new file mode 100644
index 000000000000..12b9875fcf53
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInStub.java
@@ -0,0 +1,38 @@
+/*
+ * 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 com.android.hoststubgen.hosthelper;
+
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation injected to all classes/methods/fields that are kept in the "stub" jar.
+ *
+ * All items in the stub jar are automatically kept in the impl jar as well, so
+ * the items with this annotation will all have {@link HostStubGenKeptInImpl} too.
+ */
+@Target({TYPE, METHOD, CONSTRUCTOR, FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface HostStubGenKeptInStub {
+ String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenKeptInStub.class);
+ String CLASS_DESCRIPTOR = "L" + CLASS_INTERNAL_NAME + ";";
+}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedStubClass.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsIgnore.java
index e598da0a3cb9..cb50404c96d9 100644
--- a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedStubClass.java
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsIgnore.java
@@ -15,18 +15,20 @@
*/
package com.android.hoststubgen.hosthelper;
-import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.METHOD;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
- * Annotation added to all "stub" classes generated by HostStubGen.
+ * Annotation injected to all methods processed as "ignore".
+ *
+ * (This annotation is only added in the impl jar, but not the stub jar)
*/
-@Target({TYPE})
+@Target({METHOD})
@Retention(RetentionPolicy.RUNTIME)
-public @interface HostStubGenProcessedStubClass {
- String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedStubClass.class);
+public @interface HostStubGenProcessedAsIgnore {
+ String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedAsIgnore.class);
String CLASS_DESCRIPTOR = "L" + CLASS_INTERNAL_NAME + ";";
}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsSubstitute.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsSubstitute.java
new file mode 100644
index 000000000000..cfa4896fdfa0
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsSubstitute.java
@@ -0,0 +1,38 @@
+/*
+ * 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 com.android.hoststubgen.hosthelper;
+
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation injected to all methods that are processed as "substitute".
+ *
+ * (This annotation is only added in the impl jar, but not the stub jar)
+ */
+@Target({TYPE, METHOD, CONSTRUCTOR, FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface HostStubGenProcessedAsSubstitute {
+ String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(
+ HostStubGenProcessedAsSubstitute.class);
+ String CLASS_DESCRIPTOR = "L" + CLASS_INTERNAL_NAME + ";";
+}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsThrow.java
index 7ada961d710f..0d2da114da97 100644
--- a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsThrow.java
@@ -15,18 +15,20 @@
*/
package com.android.hoststubgen.hosthelper;
-import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.METHOD;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
- * Annotation added to all "stub" classes generated by HostStubGen.
+ * Annotation injected to all methods that are processed as "throw".
+ *
+ * (This annotation is only added in the impl jar, but not the stub jar)
*/
-@Target({TYPE})
+@Target({METHOD})
@Retention(RetentionPolicy.RUNTIME)
-public @interface HostStubGenProcessedKeepClass {
- String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedKeepClass.class);
+public @interface HostStubGenProcessedAsThrow {
+ String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedAsThrow.class);
String CLASS_DESCRIPTOR = "L" + CLASS_INTERNAL_NAME + ";";
}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java
index c770b9ccc800..7c6aa25bf5ea 100644
--- a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java
@@ -23,8 +23,6 @@ import java.util.HashMap;
import javax.annotation.concurrent.GuardedBy;
-import org.junit.AssumptionViolatedException;
-
/**
* Utilities used in the host side test environment.
*/
@@ -128,7 +126,7 @@ public class HostTestUtils {
}
}
// All processed classes have this annotation.
- var allowed = clazz.getAnnotation(HostStubGenProcessedKeepClass.class) != null;
+ var allowed = clazz.getAnnotation(HostStubGenKeptInImpl.class) != null;
// Java classes should be able to access any methods. (via callbacks, etc.)
if (!allowed) {
diff --git a/tools/hoststubgen/hoststubgen/invoketest/hoststubgen-invoke-test.sh b/tools/hoststubgen/hoststubgen/invoketest/hoststubgen-invoke-test.sh
index 91e6814ed243..d97dd7c18045 100755
--- a/tools/hoststubgen/hoststubgen/invoketest/hoststubgen-invoke-test.sh
+++ b/tools/hoststubgen/hoststubgen/invoketest/hoststubgen-invoke-test.sh
@@ -235,10 +235,6 @@ EXTRA_ARGS="--in-jar abc" run_hoststubgen_for_failure "Duplicate arg" \
"Duplicate or conflicting argument found: --in-jar" \
""
-EXTRA_ARGS="--quiet" run_hoststubgen_for_failure "Conflicting arg" \
- "Duplicate or conflicting argument found: --quiet" \
- ""
-
echo "All tests passed"
exit 0 \ No newline at end of file
diff --git a/tools/hoststubgen/hoststubgen/jarjar-rules.txt b/tools/hoststubgen/hoststubgen/jarjar-rules.txt
index 4e61ba6f67b3..b1f2fc21c8e9 100644
--- a/tools/hoststubgen/hoststubgen/jarjar-rules.txt
+++ b/tools/hoststubgen/hoststubgen/jarjar-rules.txt
@@ -1,2 +1,2 @@
# Rename guava
-rule com.google.common.** com.android.hoststubgen.x.@0 \ No newline at end of file
+rule com.google.** com.android.hoststubgen.x.google.@0 \ No newline at end of file
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
index dbcf3a5207e5..4db583f109d2 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
@@ -158,7 +158,7 @@ class HostStubGen(val options: HostStubGenOptions) {
// This is used when a member (methods, fields, nested classes) don't get any polices
// from upper filters. e.g. when a method has no annotations, then this filter will apply
// the class-wide policy, if any. (if not, we'll fall back to the above filter.)
- filter = ClassWidePolicyPropagatingFilter(filter)
+ filter = ClassWidePolicyPropagatingFilter(allClasses, filter)
// Inject default hooks from options.
filter = DefaultHookInjectingFilter(
@@ -239,7 +239,7 @@ class HostStubGen(val options: HostStubGenOptions) {
errors: HostStubGenErrors,
) {
log.i("Converting %s into [stub: %s, impl: %s] ...", inJar, outStubJar, outImplJar)
- log.i("Checker is %s", if (enableChecker) "enabled" else "disabled")
+ log.i("ASM CheckClassAdapter is %s", if (enableChecker) "enabled" else "disabled")
val start = System.currentTimeMillis()
@@ -264,7 +264,7 @@ class HostStubGen(val options: HostStubGenOptions) {
}
}
val end = System.currentTimeMillis()
- log.v("Done transforming the jar in %.1f second(s).", (end - start) / 1000.0)
+ log.i("Done transforming the jar in %.1f second(s).", (end - start) / 1000.0)
}
private fun <T> maybeWithZipOutputStream(filename: String?, block: (ZipOutputStream?) -> T): T {
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenLogger.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenLogger.kt
index 5e71a3690700..18065ba56c52 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenLogger.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenLogger.kt
@@ -15,10 +15,12 @@
*/
package com.android.hoststubgen
-import java.io.OutputStream
-import java.io.PrintStream
+import java.io.BufferedOutputStream
+import java.io.FileOutputStream
+import java.io.PrintWriter
+import java.io.Writer
-val log: HostStubGenLogger = HostStubGenLogger()
+val log: HostStubGenLogger = HostStubGenLogger().setConsoleLogLevel(LogLevel.Info)
/** Logging level */
enum class LogLevel {
@@ -30,15 +32,13 @@ enum class LogLevel {
Debug,
}
-/** Simple logging class. */
-class HostStubGenLogger(
- private var out: PrintStream = System.out!!,
- var level: LogLevel = LogLevel.Info,
-) {
- companion object {
- private val sNullPrintStream: PrintStream = PrintStream(OutputStream.nullOutputStream())
- }
-
+/**
+ * Simple logging class.
+ *
+ * By default, it has no printers set. Use [setConsoleLogLevel] or [addFilePrinter] to actually
+ * write log.
+ */
+class HostStubGenLogger {
private var indentLevel: Int = 0
get() = field
set(value) {
@@ -47,6 +47,56 @@ class HostStubGenLogger(
}
private var indent: String = ""
+ private val printers: MutableList<LogPrinter> = mutableListOf()
+
+ private var consolePrinter: LogPrinter? = null
+
+ private var maxLogLevel = LogLevel.None
+
+ private fun updateMaxLogLevel() {
+ maxLogLevel = LogLevel.None
+
+ printers.forEach {
+ if (maxLogLevel < it.logLevel) {
+ maxLogLevel = it.logLevel
+ }
+ }
+ }
+
+ private fun addPrinter(printer: LogPrinter) {
+ printers.add(printer)
+ updateMaxLogLevel()
+ }
+
+ private fun removePrinter(printer: LogPrinter) {
+ printers.remove(printer)
+ updateMaxLogLevel()
+ }
+
+ fun setConsoleLogLevel(level: LogLevel): HostStubGenLogger {
+ // If there's already a console log printer set, remove it, and then add a new one
+ consolePrinter?.let {
+ removePrinter(it)
+ }
+ val cp = StreamPrinter(level, PrintWriter(System.out))
+ addPrinter(cp)
+ consolePrinter = cp
+
+ return this
+ }
+
+ fun addFilePrinter(level: LogLevel, logFilename: String): HostStubGenLogger {
+ addPrinter(StreamPrinter(level, PrintWriter(BufferedOutputStream(
+ FileOutputStream(logFilename)))))
+
+ return this
+ }
+
+ /** Flush all the printers */
+ fun flush() {
+ printers.forEach { it.flush() }
+ }
+
fun indent() {
indentLevel++
}
@@ -68,92 +118,71 @@ class HostStubGenLogger(
}
fun isEnabled(level: LogLevel): Boolean {
- return level.ordinal <= this.level.ordinal
+ return level.ordinal <= maxLogLevel.ordinal
}
- private fun println(message: String) {
- out.print(indent)
- out.println(message)
+ private fun println(level: LogLevel, message: String) {
+ printers.forEach {
+ if (it.logLevel.ordinal >= level.ordinal) {
+ it.println(level, indent, message)
+ }
+ }
+ }
+
+ private fun println(level: LogLevel, format: String, vararg args: Any?) {
+ if (isEnabled(level)) {
+ println(level, String.format(format, *args))
+ }
}
/** Log an error. */
fun e(message: String) {
- if (level.ordinal < LogLevel.Error.ordinal) {
- return
- }
- println(message)
+ println(LogLevel.Error, message)
}
/** Log an error. */
fun e(format: String, vararg args: Any?) {
- if (level.ordinal < LogLevel.Error.ordinal) {
- return
- }
- e(String.format(format, *args))
+ println(LogLevel.Error, format, *args)
}
/** Log a warning. */
fun w(message: String) {
- if (level.ordinal < LogLevel.Warn.ordinal) {
- return
- }
- println(message)
+ println(LogLevel.Warn, message)
}
/** Log a warning. */
fun w(format: String, vararg args: Any?) {
- if (level.ordinal < LogLevel.Warn.ordinal) {
- return
- }
- w(String.format(format, *args))
+ println(LogLevel.Warn, format, *args)
}
/** Log an info message. */
fun i(message: String) {
- if (level.ordinal < LogLevel.Info.ordinal) {
- return
- }
- println(message)
+ println(LogLevel.Info, message)
}
- /** Log a debug message. */
+ /** Log an info message. */
fun i(format: String, vararg args: Any?) {
- if (level.ordinal < LogLevel.Warn.ordinal) {
- return
- }
- i(String.format(format, *args))
+ println(LogLevel.Info, format, *args)
}
/** Log a verbose message. */
fun v(message: String) {
- if (level.ordinal < LogLevel.Verbose.ordinal) {
- return
- }
- println(message)
+ println(LogLevel.Verbose, message)
}
/** Log a verbose message. */
fun v(format: String, vararg args: Any?) {
- if (level.ordinal < LogLevel.Verbose.ordinal) {
- return
- }
- v(String.format(format, *args))
+ println(LogLevel.Verbose, format, *args)
}
/** Log a debug message. */
fun d(message: String) {
- if (level.ordinal < LogLevel.Debug.ordinal) {
- return
- }
- println(message)
+ println(LogLevel.Debug, message)
}
/** Log a debug message. */
fun d(format: String, vararg args: Any?) {
- if (level.ordinal < LogLevel.Warn.ordinal) {
- return
- }
- d(String.format(format, *args))
+ println(LogLevel.Debug, format, *args)
}
inline fun forVerbose(block: () -> Unit) {
@@ -168,31 +197,65 @@ class HostStubGenLogger(
}
}
- /** Return a stream for error. */
- fun getErrorPrintStream(): PrintStream {
- if (level.ordinal < LogLevel.Error.ordinal) {
- return sNullPrintStream
+ /** Return a Writer for a given log level. */
+ fun getWriter(level: LogLevel): Writer {
+ return MultiplexingWriter(level)
+ }
+
+ private inner class MultiplexingWriter(val level: LogLevel) : Writer() {
+ private inline fun forPrinters(callback: (LogPrinter) -> Unit) {
+ printers.forEach {
+ if (it.logLevel.ordinal >= level.ordinal) {
+ callback(it)
+ }
+ }
}
- // TODO Apply indent
- return PrintStream(out)
- }
+ override fun close() {
+ flush()
+ }
- /** Return a stream for verbose messages. */
- fun getVerbosePrintStream(): PrintStream {
- if (level.ordinal < LogLevel.Verbose.ordinal) {
- return sNullPrintStream
+ override fun flush() {
+ forPrinters {
+ it.flush()
+ }
}
- // TODO Apply indent
- return PrintStream(out)
- }
- /** Return a stream for debug messages. */
- fun getInfoPrintStream(): PrintStream {
- if (level.ordinal < LogLevel.Info.ordinal) {
- return sNullPrintStream
+ override fun write(cbuf: CharArray, off: Int, len: Int) {
+ // TODO Apply indent
+ forPrinters {
+ it.write(cbuf, off, len)
+ }
}
- // TODO Apply indent
- return PrintStream(out)
}
-} \ No newline at end of file
+}
+
+private interface LogPrinter {
+ val logLevel: LogLevel
+
+ fun println(logLevel: LogLevel, indent: String, message: String)
+
+ // TODO: This should be removed once MultiplexingWriter starts applying indent, at which point
+ // println() should be used instead.
+ fun write(cbuf: CharArray, off: Int, len: Int)
+
+ fun flush()
+}
+
+private class StreamPrinter(
+ override val logLevel: LogLevel,
+ val out: PrintWriter,
+) : LogPrinter {
+ override fun println(logLevel: LogLevel, indent: String, message: String) {
+ out.print(indent)
+ out.println(message)
+ }
+
+ override fun write(cbuf: CharArray, off: Int, len: Int) {
+ out.write(cbuf, off, len)
+ }
+
+ override fun flush() {
+ out.flush()
+ }
+}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
index 0ae52afb73e4..d2ead18b5492 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
@@ -101,9 +101,7 @@ class HostStubGenOptions(
var defaultPolicy: SetOnce<FilterPolicy> = SetOnce(FilterPolicy.Remove),
- var logLevel: SetOnce<LogLevel> = SetOnce(LogLevel.Info),
-
- var cleanUpOnError: SetOnce<Boolean> = SetOnce(true),
+ var cleanUpOnError: SetOnce<Boolean> = SetOnce(false),
var enableClassChecker: SetOnce<Boolean> = SetOnce(false),
var enablePreTrace: SetOnce<Boolean> = SetOnce(false),
@@ -143,6 +141,11 @@ class HostStubGenOptions(
return name
}
+ fun setLogFile(level: LogLevel, filename: String) {
+ log.addFilePrinter(level, filename)
+ log.i("$level log file: $filename")
+ }
+
while (true) {
val arg = ai.nextArgOptional()
if (arg == null) {
@@ -161,9 +164,9 @@ class HostStubGenOptions(
// TODO: Write help
"-h", "--help" -> TODO("Help is not implemented yet")
- "-v", "--verbose" -> ret.logLevel.set(LogLevel.Verbose)
- "-d", "--debug" -> ret.logLevel.set(LogLevel.Debug)
- "-q", "--quiet" -> ret.logLevel.set(LogLevel.None)
+ "-v", "--verbose" -> log.setConsoleLogLevel(LogLevel.Verbose)
+ "-d", "--debug" -> log.setConsoleLogLevel(LogLevel.Debug)
+ "-q", "--quiet" -> log.setConsoleLogLevel(LogLevel.None)
"--in-jar" -> ret.inJar.setNextStringArg().ensureFileExists()
"--out-stub-jar" -> ret.outStubJar.setNextStringArg()
@@ -211,7 +214,7 @@ class HostStubGenOptions(
ret.keepStaticInitializerAnnotations.addUniqueAnnotationArg()
"--package-redirect" ->
- ret.packageRedirects += parsePackageRedirect(ai.nextArgRequired(arg))
+ ret.packageRedirects += parsePackageRedirect(nextArg())
"--annotation-allowed-classes-file" ->
ret.annotationAllowedClassesFile.setNextStringArg()
@@ -246,13 +249,15 @@ class HostStubGenOptions(
"--gen-input-dump-file" -> ret.inputJarDumpFile.setNextStringArg()
+ "--verbose-log" -> setLogFile(LogLevel.Verbose, nextArg())
+ "--debug-log" -> setLogFile(LogLevel.Debug, nextArg())
+
else -> throw ArgumentsException("Unknown option: $arg")
}
} catch (e: SetOnce.SetMoreThanOnceException) {
throw ArgumentsException("Duplicate or conflicting argument found: $arg")
}
}
- log.w(ret.toString())
if (!ret.inJar.isSet) {
throw ArgumentsException("Required option missing: --in-jar")
@@ -377,7 +382,6 @@ class HostStubGenOptions(
intersectStubJars=$intersectStubJars,
policyOverrideFile=$policyOverrideFile,
defaultPolicy=$defaultPolicy,
- logLevel=$logLevel,
cleanUpOnError=$cleanUpOnError,
enableClassChecker=$enableClassChecker,
enablePreTrace=$enablePreTrace,
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt
index 38ba0ccfd14f..4882c00d2b3c 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt
@@ -17,6 +17,8 @@
package com.android.hoststubgen
+import java.io.PrintWriter
+
const val COMMAND_NAME = "HostStubGen"
/**
@@ -25,13 +27,12 @@ const val COMMAND_NAME = "HostStubGen"
fun main(args: Array<String>) {
var success = false
var clanupOnError = false
+
try {
// Parse the command line arguments.
val options = HostStubGenOptions.parseArgs(args)
clanupOnError = options.cleanUpOnError.get
- log.level = options.logLevel.get
-
log.v("HostStubGen started")
log.v("Options: $options")
@@ -39,17 +40,18 @@ fun main(args: Array<String>) {
HostStubGen(options).run()
success = true
- } catch (e: Exception) {
+ } catch (e: Throwable) {
log.e("$COMMAND_NAME: Error: ${e.message}")
if (e !is UserErrorException) {
- e.printStackTrace(log.getErrorPrintStream())
+ e.printStackTrace(PrintWriter(log.getWriter(LogLevel.Error)))
}
if (clanupOnError) {
- TODO("clanupOnError is not implemented yet")
+ TODO("Remove output jars here")
}
+ } finally {
+ log.i("$COMMAND_NAME finished")
+ log.flush()
}
- log.v("HostStubGen finished")
-
System.exit(if (success) 0 else 1 )
}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt
index d7aa0af13ce2..6262fa19141c 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt
@@ -17,6 +17,8 @@ package com.android.hoststubgen.asm
import com.android.hoststubgen.ClassParseException
import com.android.hoststubgen.HostStubGenInternalException
+import org.objectweb.asm.ClassVisitor
+import org.objectweb.asm.FieldVisitor
import org.objectweb.asm.MethodVisitor
import org.objectweb.asm.Opcodes
import org.objectweb.asm.Type
@@ -108,7 +110,7 @@ fun isAnonymousInnerClass(cn: ClassNode): Boolean {
* Otherwise, return null.
*/
fun getDirectOuterClassName(className: String): String? {
- val pos = className.indexOf('$')
+ val pos = className.lastIndexOf('$')
if (pos < 0) {
return null
}
@@ -283,3 +285,36 @@ fun isAutoGeneratedEnumMember(fn: FieldNode): Boolean {
}
return false
}
+
+/**
+ * Class to help handle [ClassVisitor], [MethodVisitor] and [FieldVisitor] in a unified way.
+ */
+abstract class UnifiedVisitor {
+ abstract fun visitAnnotation(descriptor: String, visible: Boolean)
+
+ companion object {
+ fun on(target: ClassVisitor): UnifiedVisitor {
+ return object : UnifiedVisitor() {
+ override fun visitAnnotation(descriptor: String, visible: Boolean) {
+ target.visitAnnotation(descriptor, visible)
+ }
+ }
+ }
+
+ fun on(target: MethodVisitor): UnifiedVisitor {
+ return object : UnifiedVisitor() {
+ override fun visitAnnotation(descriptor: String, visible: Boolean) {
+ target.visitAnnotation(descriptor, visible)
+ }
+ }
+ }
+
+ fun on(target: FieldVisitor): UnifiedVisitor {
+ return object : UnifiedVisitor() {
+ override fun visitAnnotation(descriptor: String, visible: Boolean) {
+ target.visitAnnotation(descriptor, visible)
+ }
+ }
+ }
+ }
+}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/AndroidHeuristicsFilter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/AndroidHeuristicsFilter.kt
index 356e1fa1327c..8354d985abfd 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/AndroidHeuristicsFilter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/AndroidHeuristicsFilter.kt
@@ -39,5 +39,5 @@ class AndroidHeuristicsFilter(
private fun ClassNodes.isAidlClass(className: String): Boolean {
return hasClass(className) &&
hasClass("$className\$Stub") &&
- hasClass("$className\$Proxy")
+ hasClass("$className\$Stub\$Proxy")
} \ No newline at end of file
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ClassWidePolicyPropagatingFilter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ClassWidePolicyPropagatingFilter.kt
index 6aac3d88b8b1..47790b10782a 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ClassWidePolicyPropagatingFilter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ClassWidePolicyPropagatingFilter.kt
@@ -15,6 +15,7 @@
*/
package com.android.hoststubgen.filters
+import com.android.hoststubgen.asm.ClassNodes
import com.android.hoststubgen.asm.getDirectOuterClassName
/**
@@ -22,22 +23,38 @@ import com.android.hoststubgen.asm.getDirectOuterClassName
* (obtained from [outermostFilter]) to the fields and methods.
*/
class ClassWidePolicyPropagatingFilter(
- fallback: OutputFilter,
+ private val classes: ClassNodes,
+ fallback: OutputFilter,
) : DelegatingFilter(fallback) {
private fun getClassWidePolicy(className: String, resolve: Boolean): FilterPolicyWithReason? {
var currentClass = className
+
+ // If the class name is `a.b.c.A$B$C`, then we try to get the class wide policy
+ // from a.b.c.A$B$C, then a.b.c.A$B, and then a.b.c.A.
while (true) {
- outermostFilter.getPolicyForClass(className).let { policy ->
- if (policy.policy.isClassWidePolicy) {
- val p = if (resolve) policy.policy.resolveClassWidePolicy() else policy.policy
+ // Sometimes a class name has a `$` in it but not as a nest class name separator --
+ // e.g. class name like "MyClass$$". In this case, `MyClass$` may not actually be
+ // a class name.
+ // So before getting the class policy on a nonexistent class, which may cause an
+ // incorrect result, we make sure if className actually exists.
+ if (classes.hasClass(className)) {
+ outermostFilter.getPolicyForClass(className).let { policy ->
+ if (policy.policy.isClassWidePolicy) {
+ val p = if (resolve) {
+ policy.policy.resolveClassWidePolicy()
+ } else {
+ policy.policy
+ }
- return p.withReason(policy.reason).wrapReason("class-wide in $currentClass")
- }
- // If the class's policy is remove, then remove it.
- if (policy.policy == FilterPolicy.Remove) {
- return FilterPolicy.Remove.withReason("class-wide in $currentClass")
+ return p.withReason(policy.reason)
+ .wrapReason("class-wide in $currentClass")
+ }
+ // If the class's policy is remove, then remove it.
+ if (policy.policy == FilterPolicy.Remove) {
+ return FilterPolicy.Remove.withReason("class-wide in $currentClass")
+ }
}
}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/DelegatingFilter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/DelegatingFilter.kt
index 45f61c5b2c22..cdd24e809ff8 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/DelegatingFilter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/DelegatingFilter.kt
@@ -19,7 +19,7 @@ package com.android.hoststubgen.filters
* Base class for an [OutputFilter] that uses another filter as a fallback.
*/
abstract class DelegatingFilter(
- // fallback shouldn't be used by subclasses, so make it private.
+ // fallback shouldn't be used by subclasses directly, so make it private.
// They should instead be calling into `super` or `outermostFilter`.
private val fallback: OutputFilter
) : OutputFilter() {
@@ -27,11 +27,21 @@ abstract class DelegatingFilter(
fallback.outermostFilter = this
}
+ /**
+ * Returns the outermost filter in a filter chain.
+ *
+ * When methods in a subclass needs to refer to a policy on an item (class, fields, methods)
+ * that are not the "subject" item -- e.g.
+ * in [ClassWidePolicyPropagatingFilter.getPolicyForField], when it checks the
+ * class policy -- [outermostFilter] must be used, rather than the super's method.
+ * The former will always return the correct policy, but the later won't consult outer
+ * filters than the current filter.
+ */
override var outermostFilter: OutputFilter = this
get() = field
set(value) {
field = value
- // Propagate the inner filters.
+ // Propagate to the inner filters.
fallback.outermostFilter = value
}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt
index 84856aca84cc..ea7d1d0ff391 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ImplicitOutputFilter.kt
@@ -149,7 +149,7 @@ class ImplicitOutputFilter(
val fallback = super.getPolicyForField(className, fieldName)
val cn = classes.getClass(className)
- val classPolicy = super.getPolicyForClass(className)
+ val classPolicy = outermostFilter.getPolicyForClass(className)
log.d("Class ${cn.name} Class policy: $classPolicy")
if (classPolicy.policy.needsInImpl) {
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt
index f25e862d6095..18dd4c25368a 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt
@@ -16,6 +16,8 @@
package com.android.hoststubgen.visitors
import com.android.hoststubgen.HostStubGenErrors
+import com.android.hoststubgen.LogLevel
+import com.android.hoststubgen.asm.UnifiedVisitor
import com.android.hoststubgen.asm.ClassNodes
import com.android.hoststubgen.asm.getPackageNameFromClassName
import com.android.hoststubgen.asm.resolveClassName
@@ -23,8 +25,8 @@ import com.android.hoststubgen.asm.toJvmClassName
import com.android.hoststubgen.filters.FilterPolicy
import com.android.hoststubgen.filters.FilterPolicyWithReason
import com.android.hoststubgen.filters.OutputFilter
-import com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
-import com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+import com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
+import com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
import com.android.hoststubgen.log
import org.objectweb.asm.ClassVisitor
import org.objectweb.asm.FieldVisitor
@@ -63,6 +65,18 @@ abstract class BaseAdapter (
*/
protected abstract fun shouldEmit(policy: FilterPolicy): Boolean
+ /**
+ * Inject [HostStubGenKeptInStub] and [HostStubGenKeptInImpl] as needed to an item.
+ */
+ protected fun injectInStubAndKeepAnnotations(policy: FilterPolicy, v: UnifiedVisitor) {
+ if (policy.needsInStub) {
+ v.visitAnnotation(HostStubGenKeptInStub.CLASS_DESCRIPTOR, true)
+ }
+ if (policy.needsInImpl) {
+ v.visitAnnotation(HostStubGenKeptInImpl.CLASS_DESCRIPTOR, true)
+ }
+ }
+
override fun visit(
version: Int,
access: Int,
@@ -99,12 +113,7 @@ abstract class BaseAdapter (
nativeSubstitutionClass = fullClassName
}
// Inject annotations to generated classes.
- if (classPolicy.policy.needsInStub) {
- visitAnnotation(HostStubGenProcessedStubClass.CLASS_DESCRIPTOR, true)
- }
- if (classPolicy.policy.needsInImpl) {
- visitAnnotation(HostStubGenProcessedKeepClass.CLASS_DESCRIPTOR, true)
- }
+ injectInStubAndKeepAnnotations(classPolicy.policy, UnifiedVisitor.on(this))
}
override fun visitEnd() {
@@ -147,7 +156,11 @@ abstract class BaseAdapter (
}
log.v("Emitting field: %s %s %s", name, descriptor, policy)
- return super.visitField(access, name, descriptor, signature, value)
+ val ret = super.visitField(access, name, descriptor, signature, value)
+
+ injectInStubAndKeepAnnotations(policy.policy, UnifiedVisitor.on(ret))
+
+ return ret
}
}
@@ -194,8 +207,15 @@ abstract class BaseAdapter (
// it can do so inside visitMethodInner().
val newAccess = updateAccessFlags(access, name, descriptor)
- return visitMethodInner(access, newName, descriptor, signature, exceptions, policy,
- super.visitMethod(newAccess, newName, descriptor, signature, exceptions))
+ val ret = visitMethodInner(access, newName, descriptor, signature, exceptions, policy,
+ substituteTo != null,
+ super.visitMethod(newAccess, newName, descriptor, signature, exceptions))
+
+ ret?.let {
+ injectInStubAndKeepAnnotations(policy.policy, UnifiedVisitor.on(ret))
+ }
+
+ return ret
}
}
@@ -214,6 +234,7 @@ abstract class BaseAdapter (
signature: String?,
exceptions: Array<String>?,
policy: FilterPolicyWithReason,
+ substituted: Boolean,
superVisitor: MethodVisitor?,
): MethodVisitor?
@@ -229,7 +250,7 @@ abstract class BaseAdapter (
): ClassVisitor {
var next = nextVisitor
- val verbosePrinter = PrintWriter(log.getVerbosePrintStream())
+ val verbosePrinter = PrintWriter(log.getWriter(LogLevel.Verbose))
// Inject TraceClassVisitor for debugging.
if (options.enablePostTrace) {
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt
index 88db15b86143..9274a96ed9f2 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt
@@ -25,6 +25,9 @@ import com.android.hoststubgen.asm.writeByteCodeToReturn
import com.android.hoststubgen.filters.FilterPolicy
import com.android.hoststubgen.filters.FilterPolicyWithReason
import com.android.hoststubgen.filters.OutputFilter
+import com.android.hoststubgen.hosthelper.HostStubGenProcessedAsIgnore
+import com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+import com.android.hoststubgen.hosthelper.HostStubGenProcessedAsThrow
import com.android.hoststubgen.hosthelper.HostTestUtils
import com.android.hoststubgen.log
import org.objectweb.asm.ClassVisitor
@@ -135,6 +138,7 @@ class ImplGeneratingAdapter(
signature: String?,
exceptions: Array<String>?,
policy: FilterPolicyWithReason,
+ substituted: Boolean,
superVisitor: MethodVisitor?,
): MethodVisitor? {
// Inject method log, if needed.
@@ -182,16 +186,23 @@ class ImplGeneratingAdapter(
)
}
+ fun MethodVisitor.withAnnotation(descriptor: String): MethodVisitor {
+ this.visitAnnotation(descriptor, true)
+ return this
+ }
+
log.withIndent {
if ((access and Opcodes.ACC_NATIVE) != 0 && nativeSubstitutionClass != null) {
log.v("Rewriting native method...")
return NativeSubstitutingMethodAdapter(
access, name, descriptor, signature, exceptions, innerVisitor)
+ .withAnnotation(HostStubGenProcessedAsSubstitute.CLASS_DESCRIPTOR)
}
if (policy.policy == FilterPolicy.Throw) {
log.v("Making method throw...")
return ThrowingMethodAdapter(
access, name, descriptor, signature, exceptions, innerVisitor)
+ .withAnnotation(HostStubGenProcessedAsThrow.CLASS_DESCRIPTOR)
}
if (policy.policy == FilterPolicy.Ignore) {
when (Type.getReturnType(descriptor)) {
@@ -199,6 +210,7 @@ class ImplGeneratingAdapter(
log.v("Making method ignored...")
return IgnoreMethodAdapter(
access, name, descriptor, signature, exceptions, innerVisitor)
+ .withAnnotation(HostStubGenProcessedAsIgnore.CLASS_DESCRIPTOR)
}
else -> {
throw RuntimeException("Ignored policy only allowed for void methods")
@@ -206,6 +218,9 @@ class ImplGeneratingAdapter(
}
}
}
+ if (substituted && innerVisitor != null) {
+ innerVisitor.withAnnotation(HostStubGenProcessedAsSubstitute.CLASS_DESCRIPTOR)
+ }
return innerVisitor
}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/StubGeneratingAdapter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/StubGeneratingAdapter.kt
index 37e2a888969d..fc20f2832d28 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/StubGeneratingAdapter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/StubGeneratingAdapter.kt
@@ -45,6 +45,7 @@ class StubGeneratingAdapter(
signature: String?,
exceptions: Array<String>?,
policy: FilterPolicyWithReason,
+ substituted: Boolean,
superVisitor: MethodVisitor?,
): MethodVisitor? {
return StubMethodVisitor(access, name, descriptor, signature, exceptions, superVisitor)
diff --git a/tools/hoststubgen/hoststubgen/test-framework/README.md b/tools/hoststubgen/hoststubgen/test-framework/README.md
index f616ad61d219..26a9ad13f746 100644
--- a/tools/hoststubgen/hoststubgen/test-framework/README.md
+++ b/tools/hoststubgen/hoststubgen/test-framework/README.md
@@ -1,20 +1,21 @@
-# HostStubGen: real framework test
+# HostStubGen: (obsolete) real framework test
This directory contains tests against the actual framework.jar code. The tests were
copied from somewhere else in the android tree. We use this directory to quickly run existing
tests.
+This directory was used during the prototype phase, but now that we have real ravenwood tests,
+this directory is obsolete and should be deleted.
+
## How to run
- With `atest`. This is the proper way to run it, but it may fail due to atest's known problems.
- See the top level README.md on why `--no-bazel-mode` is needed (for now).
-
```
-$ atest --no-bazel-mode HostStubGenTest-framework-test-host-test
+$ atest HostStubGenTest-framework-all-test-host-test
```
-- Advanced option: `run-test-without-atest.sh` runs the test without using `atest` or `run-ravenwood-test`
+- Advanced option: `run-test-without-atest.sh` runs the test without using `atest`
```
$ ./run-test-without-atest.sh
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/README.md b/tools/hoststubgen/hoststubgen/test-tiny-framework/README.md
index 3bfad9bd673b..344b4e953b23 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/README.md
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/README.md
@@ -2,7 +2,7 @@
This directory contains a small classes that "simulates" framework.jar, and tests against it.
-This test doesn't use the actual android framework code.
+This test is agnostic to Android, and it doesn't use any android framework code or knowledge.
## How to run
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt
index 214de59bbb4d..3956893ee7ed 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/01-hoststubgen-test-tiny-framework-orig-dump.txt
@@ -223,16 +223,16 @@ RuntimeVisibleAnnotations:
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD]
)
-## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy.class
+## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy.class
Compiled from "IPretendingAidl.java"
-public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
+public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub$Proxy
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
- this_class: #x // com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
+ this_class: #x // com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
super_class: #x // java/lang/Object
interfaces: 0, fields: 0, methods: 2, attributes: 3
- public com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy();
+ public com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub$Proxy();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
@@ -243,7 +243,7 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
LineNumberTable:
LocalVariableTable:
Start Length Slot Name Signature
- 0 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy;
+ 0 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy;
public static int addTwo(int);
descriptor: (I)I
@@ -262,7 +262,8 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
SourceFile: "IPretendingAidl.java"
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
InnerClasses:
- public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub.class
Compiled from "IPretendingAidl.java"
public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub
@@ -303,6 +304,7 @@ SourceFile: "IPretendingAidl.java"
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl.class
Compiled from "IPretendingAidl.java"
public interface com.android.hoststubgen.test.tinyframework.IPretendingAidl
@@ -315,11 +317,11 @@ public interface com.android.hoststubgen.test.tinyframework.IPretendingAidl
}
SourceFile: "IPretendingAidl.java"
NestMembers:
- com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
+ com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
InnerClasses:
- public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
- public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.class
Compiled from "TinyFrameworkCallerCheck.java"
class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
index 90312289db1c..ebe14225a825 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
@@ -1,13 +1,13 @@
-## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy.class
+## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy.class
Compiled from "IPretendingAidl.java"
-public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
+public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub$Proxy
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
- this_class: #x // com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
+ this_class: #x // com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
super_class: #x // java/lang/Object
interfaces: 0, fields: 0, methods: 2, attributes: 4
- public com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy();
+ public com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub$Proxy();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
@@ -17,6 +17,11 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addTwo(int);
descriptor: (I)I
@@ -28,15 +33,21 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
- public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub.class
Compiled from "IPretendingAidl.java"
@@ -57,6 +68,11 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addOne(int);
descriptor: (I)I
@@ -68,15 +84,21 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl.class
Compiled from "IPretendingAidl.java"
@@ -89,17 +111,17 @@ public interface com.android.hoststubgen.test.tinyframework.IPretendingAidl
interfaces: 0, fields: 0, methods: 0, attributes: 4
}
InnerClasses:
- public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
- public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestMembers:
- com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
+ com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.class
Compiled from "TinyFrameworkCallerCheck.java"
class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
@@ -119,6 +141,11 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOneStub();
descriptor: ()I
@@ -130,6 +157,11 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -139,9 +171,9 @@ InnerClasses:
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck.class
Compiled from "TinyFrameworkCallerCheck.java"
@@ -162,6 +194,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_withCheck();
descriptor: ()I
@@ -173,6 +210,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_noCheck();
descriptor: ()I
@@ -184,15 +226,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
private static #x= #x of #x; // Impl=class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl of class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -210,6 +257,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -224,6 +276,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -238,6 +295,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -252,6 +314,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -263,6 +330,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -274,6 +346,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -281,9 +358,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
SourceFile: "TinyFrameworkClassAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -303,14 +380,29 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int remove;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassWideAnnotations();
descriptor: ()V
@@ -322,6 +414,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -333,6 +430,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -344,6 +446,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void toBeRemoved(java.lang.String);
descriptor: (Ljava/lang/String;)V
@@ -355,6 +462,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -366,6 +478,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -377,6 +494,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -388,6 +510,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -399,13 +526,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassClassWideAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -422,6 +554,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
descriptor: Ljava/util/Set;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/Set<Ljava/lang/Class<*>;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook();
descriptor: ()V
@@ -433,6 +570,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static void onClassLoaded(java.lang.Class<?>);
descriptor: (Ljava/lang/Class;)V
@@ -445,6 +587,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // (Ljava/lang/Class<*>;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -456,13 +603,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -478,6 +630,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -485,6 +642,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -493,9 +655,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -511,6 +673,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -518,6 +685,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -526,9 +698,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x(#x=s#x)
android.hosttest.annotation.HostSideTestClassLoadHook(
@@ -550,6 +722,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex RED;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -557,6 +734,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex GREEN;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -564,6 +746,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex BLUE;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -571,6 +758,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -582,6 +774,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -593,6 +790,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
@@ -605,6 +807,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // (Ljava/lang/String;Ljava/lang/String;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -619,6 +826,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -633,6 +845,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -647,6 +864,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -658,14 +880,19 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;>;
SourceFile: "TinyFrameworkEnumComplex.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -681,6 +908,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple CAT;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -688,6 +920,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple DOG;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -695,6 +932,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -706,6 +948,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -717,6 +964,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple();
descriptor: (Ljava/lang/String;I)V
@@ -729,6 +981,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -740,6 +997,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -751,14 +1013,19 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;>;
SourceFile: "TinyFrameworkEnumSimple.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -781,6 +1048,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTe
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int testException();
descriptor: ()I
@@ -792,13 +1064,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTe
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkExceptionTester.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -814,6 +1091,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPolicy();
descriptor: ()V
@@ -825,6 +1107,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -836,6 +1123,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -847,6 +1139,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -858,6 +1155,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -869,13 +1171,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkForTextPolicy.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested.class
Compiled from "TinyFrameworkLambdas.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nested
@@ -889,6 +1196,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -897,6 +1209,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -911,6 +1228,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -926,6 +1248,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -941,6 +1268,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -955,6 +1287,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -966,6 +1303,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -977,6 +1319,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -988,6 +1335,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -995,9 +1347,9 @@ InnerClasses:
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1017,6 +1369,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1025,6 +1382,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1039,6 +1401,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1054,6 +1421,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1069,6 +1441,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1083,6 +1460,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -1094,6 +1476,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -1105,6 +1492,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -1116,6 +1508,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -1123,9 +1520,9 @@ InnerClasses:
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1145,6 +1542,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
int value;
descriptor: I
flags: (0x0000)
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNative();
descriptor: ()V
@@ -1156,10 +1558,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static native int nativeAddTwo(int);
descriptor: (I)I
flags: (0x0109) ACC_PUBLIC, ACC_STATIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo_should_be_like_this(int);
descriptor: (I)I
@@ -1171,10 +1583,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static native long nativeLongPlus(long, long);
descriptor: (JJ)J
flags: (0x0109) ACC_PUBLIC, ACC_STATIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus_should_be_like_this(long, long);
descriptor: (JJ)J
@@ -1186,6 +1608,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void setValue(int);
descriptor: (I)V
@@ -1197,10 +1624,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public native int nativeNonStaticAddToValue(int);
descriptor: (I)I
flags: (0x0101) ACC_PUBLIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue_should_be_like_this(int);
descriptor: (I)I
@@ -1212,13 +1649,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1238,6 +1680,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$BaseClass(int);
descriptor: (I)V
@@ -1249,15 +1696,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -1271,10 +1723,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$InnerClass(com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;)V
@@ -1286,15 +1748,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public #x= #x of #x; // InnerClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1311,6 +1778,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$StaticNestedClass();
descriptor: ()V
@@ -1322,6 +1794,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -1334,6 +1811,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -1341,9 +1823,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1367,6 +1849,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -1374,9 +1861,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -1391,11 +1878,21 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static final java.util.function.Supplier<java.lang.Integer> sSupplier;
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses();
descriptor: ()V
@@ -1407,6 +1904,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.util.function.Supplier<java.lang.Integer> getSupplier();
descriptor: ()Ljava/util/function/Supplier;
@@ -1419,6 +1921,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -1431,6 +1938,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1442,6 +1954,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -1456,9 +1973,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1491,6 +2008,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedi
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int foo(int);
descriptor: (I)I
@@ -1502,13 +2024,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedi
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkPackageRedirect.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1531,6 +2058,11 @@ public class com.unsupported.UnsupportedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -1542,13 +2074,18 @@ public class com.unsupported.UnsupportedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
index e01f49baf320..4cb2a9f326f9 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
@@ -10,11 +10,14 @@ public interface android.hosttest.annotation.HostSideTestClassLoadHook extends j
public abstract java.lang.String value();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -36,7 +39,7 @@ public interface android.hosttest.annotation.HostSideTestKeep extends java.lang.
SourceFile: "HostSideTestKeep.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -57,11 +60,14 @@ public interface android.hosttest.annotation.HostSideTestNativeSubstitutionClass
public abstract java.lang.String value();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestNativeSubstitutionClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -83,7 +89,7 @@ public interface android.hosttest.annotation.HostSideTestRemove extends java.lan
SourceFile: "HostSideTestRemove.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -105,7 +111,7 @@ public interface android.hosttest.annotation.HostSideTestStub extends java.lang.
SourceFile: "HostSideTestStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -126,11 +132,14 @@ public interface android.hosttest.annotation.HostSideTestSubstitute extends java
public abstract java.lang.String suffix();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestSubstitute.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.METHOD]
@@ -152,7 +161,7 @@ public interface android.hosttest.annotation.HostSideTestThrow extends java.lang
SourceFile: "HostSideTestThrow.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -174,7 +183,7 @@ public interface android.hosttest.annotation.HostSideTestWholeClassKeep extends
SourceFile: "HostSideTestWholeClassKeep.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -196,7 +205,7 @@ public interface android.hosttest.annotation.HostSideTestWholeClassStub extends
SourceFile: "HostSideTestWholeClassStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -205,16 +214,16 @@ RuntimeVisibleAnnotations:
java.lang.annotation.Retention(
value=Ljava/lang/annotation/RetentionPolicy;.CLASS
)
-## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy.class
+## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy.class
Compiled from "IPretendingAidl.java"
-public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
+public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub$Proxy
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
- this_class: #x // com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
+ this_class: #x // com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
super_class: #x // java/lang/Object
interfaces: 0, fields: 0, methods: 2, attributes: 4
- public com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy();
+ public com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub$Proxy();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
@@ -225,7 +234,12 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
LineNumberTable:
LocalVariableTable:
Start Length Slot Name Signature
- 0 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy;
+ 0 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addTwo(int);
descriptor: (I)I
@@ -240,15 +254,21 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 a I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
- public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub.class
Compiled from "IPretendingAidl.java"
@@ -271,6 +291,11 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addOne(int);
descriptor: (I)I
@@ -285,15 +310,21 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 a I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl.class
Compiled from "IPretendingAidl.java"
@@ -306,17 +337,17 @@ public interface com.android.hoststubgen.test.tinyframework.IPretendingAidl
interfaces: 0, fields: 0, methods: 0, attributes: 4
}
InnerClasses:
- public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
- public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestMembers:
- com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
+ com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.class
Compiled from "TinyFrameworkCallerCheck.java"
class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
@@ -338,6 +369,11 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOneKeep();
descriptor: ()I
@@ -353,6 +389,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
x: iconst_1
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -365,6 +404,11 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
x: iconst_1
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -374,9 +418,9 @@ InnerClasses:
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck.class
Compiled from "TinyFrameworkCallerCheck.java"
@@ -399,6 +443,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_withCheck();
descriptor: ()I
@@ -408,6 +457,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.getOneKeep:()I
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_noCheck();
descriptor: ()I
@@ -417,15 +471,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.getOneStub:()I
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
private static #x= #x of #x; // Impl=class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl of class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -443,6 +502,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -450,6 +514,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -482,6 +549,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
LocalVariableTable:
Start Length Slot Name Signature
0 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -500,6 +572,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
0 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -524,6 +601,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
Start Length Slot Name Signature
15 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
15 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -542,6 +622,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
Start Length Slot Name Signature
0 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
0 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -556,6 +643,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -574,6 +668,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Unreachable
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsThrow
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestThrow
@@ -590,6 +689,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -597,9 +701,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
SourceFile: "TinyFrameworkClassAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -619,14 +723,29 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int remove;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassWideAnnotations();
descriptor: ()V
@@ -646,6 +765,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
LocalVariableTable:
Start Length Slot Name Signature
0 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -661,6 +785,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
0 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -676,6 +805,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
Start Length Slot Name Signature
0 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
0 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void toBeRemoved(java.lang.String);
descriptor: (Ljava/lang/String;)V
@@ -691,6 +825,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
Start Length Slot Name Signature
0 8 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
0 8 1 foo Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -706,6 +845,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
Start Length Slot Name Signature
0 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
0 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -720,6 +866,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -732,6 +885,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
LocalVariableTable:
Start Length Slot Name Signature
0 3 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -745,13 +903,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassClassWideAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -768,6 +931,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
descriptor: Ljava/util/Set;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/Set<Ljava/lang/Class<*>;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook();
descriptor: ()V
@@ -781,6 +949,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassLoadHook;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static void onClassLoaded(java.lang.Class<?>);
descriptor: (Ljava/lang/Class;)V
@@ -800,6 +973,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
Start Length Slot Name Signature
0 11 0 clazz Ljava/lang/Class<*>;
Signature: #x // (Ljava/lang/Class<*>;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -812,13 +990,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
x: putstatic #x // Field sLoadedClasses:Ljava/util/Set;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -834,6 +1017,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -841,6 +1029,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -849,9 +1042,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -867,6 +1060,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -874,6 +1072,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -894,13 +1097,16 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
x: putstatic #x // Field sObject:Ljava/lang/Object;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x(#x=s#x)
android.hosttest.annotation.HostSideTestClassLoadHook(
@@ -922,6 +1128,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex RED;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -929,6 +1140,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex GREEN;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -936,6 +1152,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex BLUE;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -943,6 +1164,9 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
private final java.lang.String mLongName;
descriptor: Ljava/lang/String;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -950,6 +1174,9 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
private final java.lang.String mShortName;
descriptor: Ljava/lang/String;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -957,6 +1184,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -968,6 +1200,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: checkcast #x // class "[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;"
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -983,6 +1220,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 name Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
@@ -1007,6 +1249,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
0 18 3 longName Ljava/lang/String;
0 18 4 shortName Ljava/lang/String;
Signature: #x // (Ljava/lang/String;Ljava/lang/String;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1023,6 +1270,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1039,6 +1291,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1064,6 +1321,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: aastore
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1098,14 +1360,19 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: putstatic #x // Field $VALUES:[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;>;
SourceFile: "TinyFrameworkEnumComplex.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1121,6 +1388,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple CAT;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1128,6 +1400,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple DOG;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1135,6 +1412,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1146,6 +1428,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: checkcast #x // class "[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;"
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1161,6 +1448,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 name Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple();
descriptor: (Ljava/lang/String;I)V
@@ -1177,6 +1469,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
Start Length Slot Name Signature
0 7 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
Signature: #x // ()V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1195,6 +1492,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: aastore
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1217,14 +1519,19 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: putstatic #x // Field $VALUES:[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;>;
SourceFile: "TinyFrameworkEnumSimple.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1249,6 +1556,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTe
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkExceptionTester;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int testException();
descriptor: ()I
@@ -1277,13 +1589,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTe
LocalVariableTable:
Start Length Slot Name Signature
11 11 0 e Ljava/lang/Exception;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkExceptionTester.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1299,10 +1616,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -1332,6 +1657,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
LocalVariableTable:
Start Length Slot Name Signature
0 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -1347,6 +1677,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
0 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -1368,6 +1703,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
Start Length Slot Name Signature
15 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
15 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -1383,6 +1721,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
Start Length Slot Name Signature
0 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
0 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -1397,6 +1742,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -1415,6 +1767,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Unreachable
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsThrow
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -1428,13 +1785,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkForTextPolicy.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested.class
Compiled from "TinyFrameworkLambdas.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nested
@@ -1448,6 +1810,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1456,6 +1823,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1475,6 +1847,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
LocalVariableTable:
Start Length Slot Name Signature
0 14 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1491,6 +1868,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1504,6 +1886,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1517,6 +1904,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -1527,6 +1919,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -1537,6 +1934,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -1547,6 +1949,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1557,6 +1964,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -1564,9 +1974,9 @@ InnerClasses:
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1607,6 +2017,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1615,6 +2030,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1634,6 +2054,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
LocalVariableTable:
Start Length Slot Name Signature
0 14 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1650,6 +2075,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1663,6 +2093,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1676,6 +2111,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -1686,6 +2126,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -1696,6 +2141,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -1706,6 +2156,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1716,6 +2171,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -1723,9 +2181,9 @@ InnerClasses:
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1766,6 +2224,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
int value;
descriptor: I
flags: (0x0000)
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNative();
descriptor: ()V
@@ -1779,6 +2242,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo(int);
descriptor: (I)I
@@ -1788,6 +2256,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: iload_0
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeAddTwo:(I)I
x: ireturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo_should_be_like_this(int);
descriptor: (I)I
@@ -1801,6 +2276,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus(long, long);
descriptor: (JJ)J
@@ -1811,6 +2291,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: lload_2
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeLongPlus:(JJ)J
x: lreturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus_should_be_like_this(long, long);
descriptor: (JJ)J
@@ -1826,6 +2313,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
Start Length Slot Name Signature
0 6 0 arg1 J
0 6 2 arg2 J
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void setValue(int);
descriptor: (I)V
@@ -1841,6 +2333,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
0 6 1 v I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue(int);
descriptor: (I)I
@@ -1851,6 +2348,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: iload_1
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeNonStaticAddToValue:(Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;I)I
x: ireturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue_should_be_like_this(int);
descriptor: (I)I
@@ -1866,13 +2370,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
0 6 1 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1907,6 +2416,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative_host
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo(int);
descriptor: (I)I
@@ -1927,6 +2439,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative_host
LocalVariableTable:
Start Length Slot Name Signature
15 4 0 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus(long, long);
descriptor: (JJ)J
@@ -1948,6 +2463,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative_host
Start Length Slot Name Signature
15 4 0 arg1 J
15 4 2 arg2 J
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeNonStaticAddToValue(com.android.hoststubgen.test.tinyframework.TinyFrameworkNative, int);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;I)I
@@ -1970,11 +2488,14 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative_host
Start Length Slot Name Signature
15 7 0 source Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
15 7 1 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative_host.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassKeep
@@ -1990,6 +2511,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$1 ex
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$1(com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;)V
@@ -2007,6 +2531,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$1 ex
Start Length Slot Name Signature
0 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
0 10 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2026,6 +2553,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$1 ex
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2045,6 +2575,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$1 ex
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -2053,7 +2586,7 @@ Signature: #x // Ljava/lang/Object;Ljava/util/function
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2076,6 +2609,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$2 ex
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2095,6 +2631,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$2 ex
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2114,6 +2653,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$2 ex
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2
@@ -2122,7 +2664,7 @@ Signature: #x // Ljava/lang/Object;Ljava/util/function
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2136,6 +2678,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$3 ex
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$3(com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;)V
@@ -2153,6 +2698,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$3 ex
Start Length Slot Name Signature
0 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
0 10 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2172,6 +2720,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$3 ex
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2191,6 +2742,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$3 ex
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3
@@ -2199,7 +2753,7 @@ Signature: #x // Ljava/lang/Object;Ljava/util/function
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2222,6 +2776,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$4 ex
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2241,6 +2798,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$4 ex
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2260,6 +2820,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$4 ex
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4
@@ -2268,7 +2831,7 @@ Signature: #x // Ljava/lang/Object;Ljava/util/function
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2282,6 +2845,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$BaseClass(int);
descriptor: (I)V
@@ -2299,15 +2867,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
Start Length Slot Name Signature
0 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass;
0 10 1 x I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2321,10 +2894,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$InnerClass(com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;)V
@@ -2345,15 +2928,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
Start Length Slot Name Signature
0 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass;
0 15 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public #x= #x of #x; // InnerClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -2379,6 +2967,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$Stat
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2398,6 +2989,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$Stat
LocalVariableTable:
Start Length Slot Name Signature
15 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2417,6 +3011,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$Stat
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -2426,7 +3023,7 @@ Signature: #x // Ljava/lang/Object;Ljava/util/function
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2440,6 +3037,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$StaticNestedClass();
descriptor: ()V
@@ -2456,6 +3058,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -2468,6 +3075,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -2475,9 +3087,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -2505,6 +3117,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$SubClass;
0 6 1 x I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -2512,9 +3129,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2529,11 +3146,21 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static final java.util.function.Supplier<java.lang.Integer> sSupplier;
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses();
descriptor: ()V
@@ -2553,6 +3180,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
LocalVariableTable:
Start Length Slot Name Signature
0 17 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.util.function.Supplier<java.lang.Integer> getSupplier();
descriptor: ()Ljava/util/function/Supplier;
@@ -2569,6 +3201,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
Start Length Slot Name Signature
0 9 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -2581,6 +3218,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -2593,6 +3235,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -2607,9 +3254,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -2644,6 +3291,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedi
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int foo(int);
descriptor: (I)I
@@ -2660,13 +3312,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedi
LocalVariableTable:
Start Length Slot Name Signature
0 12 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkPackageRedirect.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -2682,6 +3339,9 @@ public class com.supported.UnsupportedClass
private final int mValue;
descriptor: I
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.supported.UnsupportedClass(int);
descriptor: (I)V
@@ -2705,6 +3365,9 @@ public class com.supported.UnsupportedClass
Start Length Slot Name Signature
15 10 0 this Lcom/supported/UnsupportedClass;
15 10 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -2724,11 +3387,14 @@ public class com.supported.UnsupportedClass
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/supported/UnsupportedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassKeep
@@ -2758,6 +3424,11 @@ public class com.unsupported.UnsupportedClass
Start Length Slot Name Signature
0 14 0 this Lcom/unsupported/UnsupportedClass;
0 14 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -2773,13 +3444,18 @@ public class com.unsupported.UnsupportedClass
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this Lcom/unsupported/UnsupportedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
index 90312289db1c..ebe14225a825 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
@@ -1,13 +1,13 @@
-## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy.class
+## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy.class
Compiled from "IPretendingAidl.java"
-public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
+public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub$Proxy
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
- this_class: #x // com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
+ this_class: #x // com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
super_class: #x // java/lang/Object
interfaces: 0, fields: 0, methods: 2, attributes: 4
- public com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy();
+ public com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub$Proxy();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
@@ -17,6 +17,11 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addTwo(int);
descriptor: (I)I
@@ -28,15 +33,21 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
- public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub.class
Compiled from "IPretendingAidl.java"
@@ -57,6 +68,11 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addOne(int);
descriptor: (I)I
@@ -68,15 +84,21 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl.class
Compiled from "IPretendingAidl.java"
@@ -89,17 +111,17 @@ public interface com.android.hoststubgen.test.tinyframework.IPretendingAidl
interfaces: 0, fields: 0, methods: 0, attributes: 4
}
InnerClasses:
- public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
- public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestMembers:
- com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
+ com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.class
Compiled from "TinyFrameworkCallerCheck.java"
class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
@@ -119,6 +141,11 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOneStub();
descriptor: ()I
@@ -130,6 +157,11 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -139,9 +171,9 @@ InnerClasses:
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck.class
Compiled from "TinyFrameworkCallerCheck.java"
@@ -162,6 +194,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_withCheck();
descriptor: ()I
@@ -173,6 +210,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_noCheck();
descriptor: ()I
@@ -184,15 +226,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
private static #x= #x of #x; // Impl=class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl of class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -210,6 +257,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -224,6 +276,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -238,6 +295,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -252,6 +314,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -263,6 +330,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -274,6 +346,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -281,9 +358,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
SourceFile: "TinyFrameworkClassAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -303,14 +380,29 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int remove;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassWideAnnotations();
descriptor: ()V
@@ -322,6 +414,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -333,6 +430,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -344,6 +446,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void toBeRemoved(java.lang.String);
descriptor: (Ljava/lang/String;)V
@@ -355,6 +462,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -366,6 +478,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -377,6 +494,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -388,6 +510,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -399,13 +526,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassClassWideAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -422,6 +554,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
descriptor: Ljava/util/Set;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/Set<Ljava/lang/Class<*>;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook();
descriptor: ()V
@@ -433,6 +570,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static void onClassLoaded(java.lang.Class<?>);
descriptor: (Ljava/lang/Class;)V
@@ -445,6 +587,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // (Ljava/lang/Class<*>;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -456,13 +603,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -478,6 +630,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -485,6 +642,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -493,9 +655,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -511,6 +673,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -518,6 +685,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -526,9 +698,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x(#x=s#x)
android.hosttest.annotation.HostSideTestClassLoadHook(
@@ -550,6 +722,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex RED;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -557,6 +734,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex GREEN;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -564,6 +746,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex BLUE;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -571,6 +758,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -582,6 +774,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -593,6 +790,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
@@ -605,6 +807,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // (Ljava/lang/String;Ljava/lang/String;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -619,6 +826,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -633,6 +845,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -647,6 +864,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -658,14 +880,19 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;>;
SourceFile: "TinyFrameworkEnumComplex.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -681,6 +908,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple CAT;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -688,6 +920,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple DOG;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -695,6 +932,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -706,6 +948,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -717,6 +964,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple();
descriptor: (Ljava/lang/String;I)V
@@ -729,6 +981,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -740,6 +997,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -751,14 +1013,19 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;>;
SourceFile: "TinyFrameworkEnumSimple.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -781,6 +1048,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTe
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int testException();
descriptor: ()I
@@ -792,13 +1064,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTe
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkExceptionTester.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -814,6 +1091,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPolicy();
descriptor: ()V
@@ -825,6 +1107,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -836,6 +1123,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -847,6 +1139,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -858,6 +1155,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -869,13 +1171,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkForTextPolicy.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested.class
Compiled from "TinyFrameworkLambdas.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nested
@@ -889,6 +1196,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -897,6 +1209,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -911,6 +1228,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -926,6 +1248,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -941,6 +1268,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -955,6 +1287,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -966,6 +1303,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -977,6 +1319,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -988,6 +1335,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -995,9 +1347,9 @@ InnerClasses:
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1017,6 +1369,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1025,6 +1382,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1039,6 +1401,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1054,6 +1421,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1069,6 +1441,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1083,6 +1460,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -1094,6 +1476,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -1105,6 +1492,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -1116,6 +1508,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -1123,9 +1520,9 @@ InnerClasses:
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1145,6 +1542,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
int value;
descriptor: I
flags: (0x0000)
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNative();
descriptor: ()V
@@ -1156,10 +1558,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static native int nativeAddTwo(int);
descriptor: (I)I
flags: (0x0109) ACC_PUBLIC, ACC_STATIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo_should_be_like_this(int);
descriptor: (I)I
@@ -1171,10 +1583,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static native long nativeLongPlus(long, long);
descriptor: (JJ)J
flags: (0x0109) ACC_PUBLIC, ACC_STATIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus_should_be_like_this(long, long);
descriptor: (JJ)J
@@ -1186,6 +1608,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void setValue(int);
descriptor: (I)V
@@ -1197,10 +1624,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public native int nativeNonStaticAddToValue(int);
descriptor: (I)I
flags: (0x0101) ACC_PUBLIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue_should_be_like_this(int);
descriptor: (I)I
@@ -1212,13 +1649,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1238,6 +1680,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$BaseClass(int);
descriptor: (I)V
@@ -1249,15 +1696,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -1271,10 +1723,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$InnerClass(com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;)V
@@ -1286,15 +1748,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public #x= #x of #x; // InnerClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1311,6 +1778,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$StaticNestedClass();
descriptor: ()V
@@ -1322,6 +1794,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -1334,6 +1811,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -1341,9 +1823,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1367,6 +1849,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -1374,9 +1861,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -1391,11 +1878,21 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static final java.util.function.Supplier<java.lang.Integer> sSupplier;
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses();
descriptor: ()V
@@ -1407,6 +1904,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.util.function.Supplier<java.lang.Integer> getSupplier();
descriptor: ()Ljava/util/function/Supplier;
@@ -1419,6 +1921,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -1431,6 +1938,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1442,6 +1954,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -1456,9 +1973,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1491,6 +2008,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedi
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int foo(int);
descriptor: (I)I
@@ -1502,13 +2024,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedi
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkPackageRedirect.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1531,6 +2058,11 @@ public class com.unsupported.UnsupportedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -1542,13 +2074,18 @@ public class com.unsupported.UnsupportedClass
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
index 5246355fb777..49be4db4eb9b 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
@@ -20,11 +20,14 @@ public interface android.hosttest.annotation.HostSideTestClassLoadHook extends j
public abstract java.lang.String value();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -55,7 +58,7 @@ public interface android.hosttest.annotation.HostSideTestKeep extends java.lang.
SourceFile: "HostSideTestKeep.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -86,11 +89,14 @@ public interface android.hosttest.annotation.HostSideTestNativeSubstitutionClass
public abstract java.lang.String value();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestNativeSubstitutionClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -121,7 +127,7 @@ public interface android.hosttest.annotation.HostSideTestRemove extends java.lan
SourceFile: "HostSideTestRemove.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -152,7 +158,7 @@ public interface android.hosttest.annotation.HostSideTestStub extends java.lang.
SourceFile: "HostSideTestStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -183,11 +189,14 @@ public interface android.hosttest.annotation.HostSideTestSubstitute extends java
public abstract java.lang.String suffix();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestSubstitute.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.METHOD]
@@ -218,7 +227,7 @@ public interface android.hosttest.annotation.HostSideTestThrow extends java.lang
SourceFile: "HostSideTestThrow.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -249,7 +258,7 @@ public interface android.hosttest.annotation.HostSideTestWholeClassKeep extends
SourceFile: "HostSideTestWholeClassKeep.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -280,7 +289,7 @@ public interface android.hosttest.annotation.HostSideTestWholeClassStub extends
SourceFile: "HostSideTestWholeClassStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -289,13 +298,13 @@ RuntimeVisibleAnnotations:
java.lang.annotation.Retention(
value=Ljava/lang/annotation/RetentionPolicy;.CLASS
)
-## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy.class
+## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy.class
Compiled from "IPretendingAidl.java"
-public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
+public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub$Proxy
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
- this_class: #x // com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
+ this_class: #x // com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
super_class: #x // java/lang/Object
interfaces: 0, fields: 0, methods: 3, attributes: 4
private static {};
@@ -303,17 +312,17 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
flags: (0x000a) ACC_PRIVATE, ACC_STATIC
Code:
stack=2, locals=0, args_size=0
- x: ldc #x // class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
+ x: ldc #x // class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logClassLoaded
x: invokestatic #x // Method com/android/hoststubgen/hosthelper/HostTestUtils.onClassLoaded:(Ljava/lang/Class;Ljava/lang/String;)V
x: return
- public com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy();
+ public com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub$Proxy();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=4, locals=1, args_size=1
- x: ldc #x // class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
+ x: ldc #x // class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
x: ldc #x // String <init>
x: ldc #x // String ()V
x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
@@ -324,14 +333,19 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
LineNumberTable:
LocalVariableTable:
Start Length Slot Name Signature
- 11 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy;
+ 11 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addTwo(int);
descriptor: (I)I
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=4, locals=1, args_size=1
- x: ldc #x // class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
+ x: ldc #x // class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
x: ldc #x // String addTwo
x: ldc #x // String (I)I
x: ldc #x // String com.android.hoststubgen.hosthelper.HostTestUtils.logMethodCall
@@ -344,15 +358,21 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Proxy
LocalVariableTable:
Start Length Slot Name Signature
11 4 0 a I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
- public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub.class
Compiled from "IPretendingAidl.java"
@@ -390,6 +410,11 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addOne(int);
descriptor: (I)I
@@ -409,15 +434,21 @@ public class com.android.hoststubgen.test.tinyframework.IPretendingAidl$Stub
LocalVariableTable:
Start Length Slot Name Signature
11 4 0 a I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl.class
Compiled from "IPretendingAidl.java"
@@ -439,17 +470,17 @@ public interface com.android.hoststubgen.test.tinyframework.IPretendingAidl
x: return
}
InnerClasses:
- public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
+ public static #x= #x of #x; // Proxy=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy of class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestMembers:
- com/android/hoststubgen/test/tinyframework/IPretendingAidl$Proxy
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
+ com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.class
Compiled from "TinyFrameworkCallerCheck.java"
class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
@@ -486,6 +517,11 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOneKeep();
descriptor: ()I
@@ -506,6 +542,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
x: iconst_1
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -523,6 +562,11 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck$Impl
x: iconst_1
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -532,9 +576,9 @@ InnerClasses:
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck.class
Compiled from "TinyFrameworkCallerCheck.java"
@@ -572,6 +616,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_withCheck();
descriptor: ()I
@@ -586,6 +635,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.getOneKeep:()I
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_noCheck();
descriptor: ()I
@@ -600,15 +654,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkCallerCheck
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.getOneStub:()I
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
private static #x= #x of #x; // Impl=class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl of class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -626,6 +685,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -633,6 +697,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -673,6 +740,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
LocalVariableTable:
Start Length Slot Name Signature
11 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -696,6 +768,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
11 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -725,6 +802,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
Start Length Slot Name Signature
26 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
26 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -748,6 +828,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
Start Length Slot Name Signature
11 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
11 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -767,6 +854,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
LocalVariableTable:
Start Length Slot Name Signature
11 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -790,6 +884,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
x: ldc #x // String Unreachable
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsThrow
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestThrow
@@ -811,6 +910,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -818,9 +922,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassAnnota
SourceFile: "TinyFrameworkClassAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -840,14 +944,29 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int remove;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -882,6 +1001,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
LocalVariableTable:
Start Length Slot Name Signature
11 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -902,6 +1026,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
11 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -922,6 +1051,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
Start Length Slot Name Signature
11 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
11 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void toBeRemoved(java.lang.String);
descriptor: (Ljava/lang/String;)V
@@ -942,6 +1076,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
Start Length Slot Name Signature
11 8 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
11 8 1 foo Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -962,6 +1101,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
Start Length Slot Name Signature
11 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
11 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -981,6 +1127,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
LocalVariableTable:
Start Length Slot Name Signature
11 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -998,6 +1151,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
LocalVariableTable:
Start Length Slot Name Signature
11 3 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -1016,13 +1174,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassW
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassClassWideAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1039,6 +1202,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
descriptor: Ljava/util/Set;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/Set<Ljava/lang/Class<*>;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook();
descriptor: ()V
@@ -1057,6 +1225,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassLoadHook;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static void onClassLoaded(java.lang.Class<?>);
descriptor: (Ljava/lang/Class;)V
@@ -1081,6 +1254,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
Start Length Slot Name Signature
11 11 0 clazz Ljava/lang/Class<*>;
Signature: #x // (Ljava/lang/Class<*>;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1101,13 +1279,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHo
x: putstatic #x // Field sLoadedClasses:Ljava/util/Set;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1123,6 +1306,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1130,6 +1318,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1138,9 +1331,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1156,6 +1349,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1163,6 +1361,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1191,13 +1394,16 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkClassWithIn
x: putstatic #x // Field sObject:Ljava/lang/Object;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x(#x=s#x)
android.hosttest.annotation.HostSideTestClassLoadHook(
@@ -1219,6 +1425,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex RED;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1226,6 +1437,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex GREEN;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1233,6 +1449,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex BLUE;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1240,6 +1461,9 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
private final java.lang.String mLongName;
descriptor: Ljava/lang/String;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -1247,6 +1471,9 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
private final java.lang.String mShortName;
descriptor: Ljava/lang/String;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -1254,6 +1481,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -1270,6 +1502,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: checkcast #x // class "[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;"
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -1290,6 +1527,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
LocalVariableTable:
Start Length Slot Name Signature
11 10 0 name Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
@@ -1319,6 +1561,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
11 18 3 longName Ljava/lang/String;
11 18 4 shortName Ljava/lang/String;
Signature: #x // (Ljava/lang/String;Ljava/lang/String;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1340,6 +1587,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1361,6 +1613,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1391,6 +1648,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: aastore
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1433,14 +1695,19 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumC
x: putstatic #x // Field $VALUES:[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;>;
SourceFile: "TinyFrameworkEnumComplex.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1456,6 +1723,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple CAT;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1463,6 +1735,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple DOG;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1470,6 +1747,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1486,6 +1768,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: checkcast #x // class "[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;"
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1506,6 +1793,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
LocalVariableTable:
Start Length Slot Name Signature
11 10 0 name Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple();
descriptor: (Ljava/lang/String;I)V
@@ -1527,6 +1819,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
Start Length Slot Name Signature
11 7 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
Signature: #x // ()V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1550,6 +1847,11 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: aastore
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1580,14 +1882,19 @@ public final class com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumS
x: putstatic #x // Field $VALUES:[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;>;
SourceFile: "TinyFrameworkEnumSimple.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1627,6 +1934,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTe
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkExceptionTester;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int testException();
descriptor: ()I
@@ -1660,13 +1972,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkExceptionTe
LocalVariableTable:
Start Length Slot Name Signature
22 11 0 e Ljava/lang/Exception;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkExceptionTester.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1682,10 +1999,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -1723,6 +2048,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
LocalVariableTable:
Start Length Slot Name Signature
11 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -1743,6 +2073,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
11 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -1769,6 +2104,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
Start Length Slot Name Signature
26 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
26 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -1789,6 +2127,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
Start Length Slot Name Signature
11 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
11 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -1808,6 +2153,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
LocalVariableTable:
Start Length Slot Name Signature
11 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -1831,6 +2183,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
x: ldc #x // String Unreachable
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsThrow
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -1849,13 +2206,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPoli
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkForTextPolicy.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested.class
Compiled from "TinyFrameworkLambdas.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nested
@@ -1869,6 +2231,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1877,6 +2244,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1901,6 +2273,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
LocalVariableTable:
Start Length Slot Name Signature
11 14 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1922,6 +2299,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1940,6 +2322,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1958,6 +2345,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -1973,6 +2365,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -1988,6 +2385,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -2003,6 +2405,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -2021,6 +2428,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nes
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -2028,9 +2438,9 @@ InnerClasses:
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2071,6 +2481,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2079,6 +2494,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2103,6 +2523,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
LocalVariableTable:
Start Length Slot Name Signature
11 14 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2124,6 +2549,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2142,6 +2572,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2160,6 +2595,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -2175,6 +2615,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -2190,6 +2635,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -2205,6 +2655,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -2223,6 +2678,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -2230,9 +2688,9 @@ InnerClasses:
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2273,6 +2731,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
int value;
descriptor: I
flags: (0x0000)
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -2301,6 +2764,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo(int);
descriptor: (I)I
@@ -2310,6 +2778,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: iload_0
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeAddTwo:(I)I
x: ireturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo_should_be_like_this(int);
descriptor: (I)I
@@ -2328,6 +2803,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus(long, long);
descriptor: (JJ)J
@@ -2338,6 +2818,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: lload_2
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeLongPlus:(JJ)J
x: lreturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus_should_be_like_this(long, long);
descriptor: (JJ)J
@@ -2358,6 +2845,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
Start Length Slot Name Signature
11 6 0 arg1 J
11 6 2 arg2 J
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void setValue(int);
descriptor: (I)V
@@ -2378,6 +2870,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
11 6 1 v I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue(int);
descriptor: (I)I
@@ -2388,6 +2885,13 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
x: iload_1
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeNonStaticAddToValue:(Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;I)I
x: ireturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue_should_be_like_this(int);
descriptor: (I)I
@@ -2408,13 +2912,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
11 6 1 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -2464,6 +2973,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative_host
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo(int);
descriptor: (I)I
@@ -2489,6 +3001,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative_host
LocalVariableTable:
Start Length Slot Name Signature
26 4 0 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus(long, long);
descriptor: (JJ)J
@@ -2515,6 +3030,9 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative_host
Start Length Slot Name Signature
26 4 0 arg1 J
26 4 2 arg2 J
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeNonStaticAddToValue(com.android.hoststubgen.test.tinyframework.TinyFrameworkNative, int);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;I)I
@@ -2542,11 +3060,14 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNative_host
Start Length Slot Name Signature
26 7 0 source Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
26 7 1 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative_host.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassKeep
@@ -2562,6 +3083,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$1 ex
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -2594,6 +3118,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$1 ex
Start Length Slot Name Signature
11 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
11 10 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2618,6 +3145,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$1 ex
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2642,6 +3172,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$1 ex
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -2650,7 +3183,7 @@ Signature: #x // Ljava/lang/Object;Ljava/util/function
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2688,6 +3221,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$2 ex
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2712,6 +3248,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$2 ex
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2736,6 +3275,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$2 ex
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2
@@ -2744,7 +3286,7 @@ Signature: #x // Ljava/lang/Object;Ljava/util/function
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2758,6 +3300,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$3 ex
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -2790,6 +3335,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$3 ex
Start Length Slot Name Signature
11 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
11 10 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2814,6 +3362,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$3 ex
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2838,6 +3389,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$3 ex
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3
@@ -2846,7 +3400,7 @@ Signature: #x // Ljava/lang/Object;Ljava/util/function
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2884,6 +3438,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$4 ex
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2908,6 +3465,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$4 ex
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2932,6 +3492,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$4 ex
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4
@@ -2940,7 +3503,7 @@ Signature: #x // Ljava/lang/Object;Ljava/util/function
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2954,6 +3517,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -2986,15 +3554,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
Start Length Slot Name Signature
11 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass;
11 10 1 x I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -3008,10 +3581,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -3047,15 +3630,20 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
Start Length Slot Name Signature
11 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass;
11 15 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public #x= #x of #x; // InnerClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -3096,6 +3684,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$Stat
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -3120,6 +3711,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$Stat
LocalVariableTable:
Start Length Slot Name Signature
26 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -3144,6 +3738,9 @@ class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$Stat
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -3153,7 +3750,7 @@ Signature: #x // Ljava/lang/Object;Ljava/util/function
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -3167,6 +3764,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -3198,6 +3800,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
LocalVariableTable:
Start Length Slot Name Signature
11 11 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -3215,6 +3822,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -3222,9 +3834,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -3267,6 +3879,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$SubClass;
11 6 1 x I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -3274,9 +3891,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -3291,11 +3908,21 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static final java.util.function.Supplier<java.lang.Integer> sSupplier;
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses();
descriptor: ()V
@@ -3320,6 +3947,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
LocalVariableTable:
Start Length Slot Name Signature
11 17 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.util.function.Supplier<java.lang.Integer> getSupplier();
descriptor: ()Ljava/util/function/Supplier;
@@ -3341,6 +3973,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
Start Length Slot Name Signature
11 9 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -3358,6 +3995,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -3378,6 +4020,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClass
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -3392,9 +4039,9 @@ InnerClasses:
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -3444,6 +4091,11 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedi
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int foo(int);
descriptor: (I)I
@@ -3465,13 +4117,18 @@ public class com.android.hoststubgen.test.tinyframework.TinyFrameworkPackageRedi
LocalVariableTable:
Start Length Slot Name Signature
11 12 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkPackageRedirect.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -3487,6 +4144,9 @@ public class com.supported.UnsupportedClass
private final int mValue;
descriptor: I
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -3525,6 +4185,9 @@ public class com.supported.UnsupportedClass
Start Length Slot Name Signature
26 10 0 this Lcom/supported/UnsupportedClass;
26 10 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -3549,11 +4212,14 @@ public class com.supported.UnsupportedClass
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/supported/UnsupportedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassKeep
@@ -3598,6 +4264,11 @@ public class com.unsupported.UnsupportedClass
Start Length Slot Name Signature
11 14 0 this Lcom/unsupported/UnsupportedClass;
11 14 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -3618,13 +4289,18 @@ public class com.unsupported.UnsupportedClass
LocalVariableTable:
Start Length Slot Name Signature
11 10 0 this Lcom/unsupported/UnsupportedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/IPretendingAidl.java b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/IPretendingAidl.java
index 583e13c5573b..0a07c2b91fc3 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/IPretendingAidl.java
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-framework/src/com/android/hoststubgen/test/tinyframework/IPretendingAidl.java
@@ -25,11 +25,12 @@ public interface IPretendingAidl {
public static int addOne(int a) {
return a + 1;
}
- }
- public static class Proxy {
- public static int addTwo(int a) {
- return a + 2;
+ public static class Proxy {
+ public static int addTwo(int a) {
+ return a + 2;
+ }
}
}
+
}
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java
index 0d527915ef63..d3501057163d 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/tiny-test/src/com/android/hoststubgen/test/tinyframework/TinyFrameworkClassTest.java
@@ -289,6 +289,6 @@ public class TinyFrameworkClassTest {
@Test
public void testAidlHeuristics() {
assertThat(IPretendingAidl.Stub.addOne(1)).isEqualTo(2);
- assertThat(IPretendingAidl.Proxy.addTwo(1)).isEqualTo(3);
+ assertThat(IPretendingAidl.Stub.Proxy.addTwo(1)).isEqualTo(3);
}
}
diff --git a/tools/hoststubgen/hoststubgen/test/com/android/hoststubgen/utils/AsmUtilsTest.kt b/tools/hoststubgen/hoststubgen/test/com/android/hoststubgen/utils/AsmUtilsTest.kt
new file mode 100644
index 000000000000..66624d17ab54
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/test/com/android/hoststubgen/utils/AsmUtilsTest.kt
@@ -0,0 +1,34 @@
+/*
+ * 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 com.android.hoststubgen.utils
+
+import com.android.hoststubgen.asm.getDirectOuterClassName
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+
+class AsmUtilsTest {
+ private fun checkGetDirectOuterClassName(input: String, expected: String?) {
+ assertThat(getDirectOuterClassName(input)).isEqualTo(expected)
+ }
+
+ @Test
+ fun testGetDirectOuterClassName() {
+ checkGetDirectOuterClassName("a", null)
+ checkGetDirectOuterClassName("a\$x", "a")
+ checkGetDirectOuterClassName("a.b.c\$x", "a.b.c")
+ checkGetDirectOuterClassName("a.b.c\$x\$y", "a.b.c\$x")
+ }
+} \ No newline at end of file
diff --git a/tools/hoststubgen/scripts/run-all-tests.sh b/tools/hoststubgen/scripts/run-all-tests.sh
index 82faa91e2cac..c7007db6028e 100755
--- a/tools/hoststubgen/scripts/run-all-tests.sh
+++ b/tools/hoststubgen/scripts/run-all-tests.sh
@@ -18,6 +18,8 @@ source "${0%/*}"/../common.sh
# Move to the top directory of hoststubgen
cd ..
+ATEST_ARGS="--host"
+
# These tests are known to pass.
READY_TEST_MODULES=(
HostStubGenTest-framework-all-test-host-test
@@ -34,7 +36,7 @@ MUST_BUILD_MODULES=(
run m "${MUST_BUILD_MODULES[@]}"
# Run the hoststubgen unittests / etc
-run atest hoststubgentest hoststubgen-invoke-test
+run atest $ATEST_ARGS hoststubgentest hoststubgen-invoke-test
# Next, run the golden check. This should always pass too.
# The following scripts _should_ pass too, but they depend on the internal paths to soong generated
@@ -44,13 +46,13 @@ run ./hoststubgen/test-tiny-framework/diff-and-update-golden.sh
run ./hoststubgen/test-framework/run-test-without-atest.sh
run ./hoststubgen/test-tiny-framework/run-test-manually.sh
-run atest tiny-framework-dump-test
+run atest $ATEST_ARGS tiny-framework-dump-test
run ./scripts/build-framework-hostside-jars-and-extract.sh
# This script is already broken on goog/master
# run ./scripts/build-framework-hostside-jars-without-genrules.sh
# These tests should all pass.
-run atest ${READY_TEST_MODULES[*]}
+run atest $ATEST_ARGS ${READY_TEST_MODULES[*]}
-echo ""${0##*/}" finished, with no unexpected failures. Ready to submit!" \ No newline at end of file
+echo ""${0##*/}" finished, with no failures. Ready to submit!" \ No newline at end of file